这是我参与更文挑战的第12天,活动详情查看: 更文挑战。
微信官方云:除付款码支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按
Native、JSAPI、APP等不同场景生成交易串调起支付。
翻译官方这段话,大概含义就是除了特殊场景,完成微信支付都是执行以下步骤。
- 统一下单获取支付参数
- 前端使用这些支付参数(包括自定义支付成功回调通知服务网地址)调起微信的支付页面
- 用户支付完成,微信服务器通知应用服务器的支付成功回调通知服务
一、环境准备
先在微信官方注册公众号、商户号。
然后拉取开源代码。
#感谢binarywang,大佬github的地址为https://github.com/binarywang
#此项目基于微信开发文档2.0,也就是参数格式为XML
git clone git@github.com:binarywang/weixin-java-pay-demo.git
1.项目结构
2.项目配置
logging:
level:
org.springframework.web: info
com.github.binarywang.demo.wx.pay: debug
com.github.binarywang.wxpay: debug
wx:
pay:
appId: #微信公众号或者小程序等的appid
mchId: #微信支付商户号
mchKey: #微信支付商户密钥
subAppId: #服务商模式下的子商户公众账号ID
subMchId: #服务商模式下的子商户号
keyPath: # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
logging配置打印发送给微信服务器的参数和接收到微信服务器的参数,在调试开发阶段很有用。
支付相关的配置,如果微信公众号主体和微信商户号主体是一致话,完成支付只需要配置appId,mchId,mchKey。如果是特约商户模式,就需要配置subAppId,subMchId。
注意:mchKey一定要配置,否则微信服务器会报签名错误。
3.接口介绍
在WxpayController中,第一个重要的接口是unifiedOrder,这是一个原生的统一下单接口,入参见微信官方文档
统一下单接口
,返回值是返回给前端拉起支付页面的参数。
/**
* 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
* 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"
* 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder
*
* @param request 请求对象,注意一些参数如appid、mchid等不用设置,方法内会自动从配置对象中获取到(前提是对应配置中已经设置)
*/
@ApiOperation(value = "原生的统一下单接口")
@PostMapping("/unifiedOrder")
public WxPayUnifiedOrderResult unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
return this.wxService.unifiedOrder(request);
}
第二个接口是parseOrderNotifyResult支付回调通知处理。也就是支付成功后,微信服务器回调通知应用方的接口。
@ApiOperation(value = "支付回调通知处理")
@PostMapping("/notify/order")
public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
final WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
// TODO 根据自己业务场景需要构造返回对象
return WxPayNotifyResponse.success("成功");
}
其它接口,包括退款,关闭订单也会是用到。按照微信官方文档使用即可。
4.服务配置
首先要满足微信公众号基础配置,需要在微信官方后台配置一个JS接口安全域名和网页授权域名,这配置的都是前端对外暴露的域名。后端没有特殊的配置,无需关心。
二、实践
执行统一下单接口,入参和返回值为
【请求地址】:https://api.mch.weixin.qq.com/pay/unifiedorder
【请求数据】:<xml>
<appid>{appid}</appid>
<mch_id>{mch_id}</mch_id>
<nonce_str>16234041212437-8-0-25-00010000000</nonce_str>
<sign>2783ED6508ACK66C89D41717F08FCCD</sign>
<body>0</body>
<out_trade_no>1623214123437-8-0-25-00000000000</out_trade_no>
<fee_type>CNY</fee_type>
<total_fee>100100</total_fee>
<spbill_create_ip>127.0.0.1</spbill_create_ip>
<time_start>20210611173523</time_start>
<notify_url>{notify_url}</notify_url>
<trade_type>JSAPI</trade_type>
<openid>oiwYCjzf3JF5345sdfsuSzMAdnd7Ak</openid>
</xml>
【响应数据】:<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<result_code><![CDATA[SUCCESS]]></result_code>
<mch_id><![CDATA[{mch_id}]]></mch_id>
<appid><![CDATA[{appid}]]></appid>
<nonce_str><![CDATA[PjzJGtkA3JYHAlAx]]></nonce_str>
<sign><![CDATA[2783ED6508ACK66C89D41717F08FCCD]]></sign>
<prepay_id><![CDATA[wx11173511111111111111111115002bc90000]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
</xml>
一些参数涉及到隐私,统一特殊处理。
附上开源项目的地址微信支付项目,再次感谢大佬。