JAVA全系列 教程
3762个小节阅读:7095.3k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
请求URL:/api/wx-pay/native/{orderNo}
请求方式:POST
参数名 | 变量 | 必填 |
---|---|---|
订单编号 | orderNo | 是 |
商户端发起支付请求,微信端创建支付订单并生成支付二维码链接,微信端将支付二维码返回给商户端,商户端显示支付二维码,用户使用微信客户端扫码后发起支付。Native支付开发指引
xxxxxxxxxx
package com.itbaizhan.controller;
import com.itbaizhan.service.IWxPaymentService;
import com.itbaizhan.vo.BaseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
* 微信支付接口
*/
@RestController
@RequestMapping("/api/wx-pay")
public class WxPayController {
@Autowired
private IWxPaymentService iWxPaymentService;
/**
* Native下单
* weixin://wxpay/bizpayurl?pr=e5ta1spzz
* @param orderNo
* @return
*/
@PostMapping("/native/{orderNo}")
public BaseResult nativePay(@PathVariable String orderNo) throws Exception {
BaseResult baseResult = iWxPaymentService.nativePay(orderNo);
return baseResult;
}
}
xxxxxxxxxx
public interface WxPayService {
/**
* 微信Native支付
* @param paymentDTO
* @return
* @throws Exception
*/
Map<String, Object> nativePay(PaymentDTO paymentDTO)throws Exception;
}
xxxxxxxxxx
package com.itbaizhan.service.impl;
import com.alibaba.fastjson.JSON;
import com.itbaizhan.config.WxPayConfig;
import com.itbaizhan.entity.OrderInfo;
import com.itbaizhan.enums.wx.WxApiType;
import com.itbaizhan.service.IOrderInfoService;
import com.itbaizhan.service.IWxPaymentService;
import com.itbaizhan.vo.BaseResult;
import com.itbaizhan.vo.CodeEnum;
import com.itbaizhan.vo.PayInfoVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* 微信支付
*/
@Slf4j
@Service
public class WxPaymentServiceImpl implements IWxPaymentService {
@Autowired
private IOrderInfoService iOrderInfoService;// 订单接口
@Autowired
WxPayConfig wxPayConfig;// 微信支付配置参数
@Autowired
CloseableHttpClient wxPayClient;
/**
* Native下单
*
* @param orderNo
* @return
*/
@Override
public BaseResult nativePay(String orderNo) throws Exception {
log.info("*********** 开始 Native下单 *********");
// 1. 根据订单编号查询订单信息
OrderInfo orderInfo = iOrderInfoService.findByOrderNo(orderNo);
if (orderInfo == null) {
return BaseResult.error(CodeEnum.ORDER_ERROR);
}
// 2. 调用统一下载API https://api.mch.weixin.qq.com/v3/pay/transactions/native
HttpPost httpPost = new HttpPost(wxPayConfig.getDomain().concat(WxApiType.NATIVE_PAY.getType()));
// 3. 组装请求参数
HashMap<String, Object> paramsMap = new HashMap<>();
paramsMap.put("appid", wxPayConfig.getAppid());// 应用id
paramsMap.put("mchid", wxPayConfig.getMchId());// 商户id
paramsMap.put("description", "test");// 商品描述
paramsMap.put("out_trade_no", orderInfo.getOrderNo());// 订单编号
paramsMap.put("notify_url", wxPayConfig.getDomain().concat(wxPayConfig.getNotifyDomain()));// 通知地址
HashMap<String, Object> amountMap = new HashMap<>();
amountMap.put("total", orderInfo.getTotalFee());
paramsMap.put("amount", amountMap);// 订单金额
// 4. 将参数转换为json字符串
String jsonString = JSON.toJSONString(paramsMap);
log.info("Native下单参数=======>{}" + jsonString);
// 5. 准备消息 boby
StringEntity entity = new StringEntity(jsonString, "UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
// 6. 准备请求头
httpPost.setHeader("Accept", "application/json");
// 7.完成签名并执行请求
CloseableHttpResponse response = wxPayClient.execute(httpPost);
try {
// 8. 拿出body 响应体
String bodyString = EntityUtils.toString(response.getEntity());
// 9. 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
// 10 判断响应码
if (statusCode == 200) {
HashMap<String, String> responseMap = JSON.parseObject(bodyString, HashMap.class);
// 11 取出code_url
String codeUrl = responseMap.get("code_url");
PayInfoVO payInfoVO = new PayInfoVO();
payInfoVO.setCodeUrl(codeUrl);
payInfoVO.setOrderNo(orderInfo.getOrderNo());
return BaseResult.ok(payInfoVO);
} else {
log.error("Native 下单失败响应码 " + statusCode + "返回结果" + bodyString);
return BaseResult.error(CodeEnum.PAYMENT_ERROR);
}
} finally {
response.close();
}
}
}