阅读 503

器 | 快速实现微信公众号支付

这是我参与更文挑战的第12天,活动详情查看: 更文挑战

微信官方云:除付款码支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按NativeJSAPIAPP等不同场景生成交易串调起支付。

翻译官方这段话,大概含义就是除了特殊场景,完成微信支付都是执行以下步骤。

  • 统一下单获取支付参数
  • 前端使用这些支付参数(包括自定义支付成功回调通知服务网地址)调起微信的支付页面
  • 用户支付完成,微信服务器通知应用服务器的支付成功回调通知服务

一、环境准备

先在微信官方注册公众号、商户号。

然后拉取开源代码。

#感谢binarywang,大佬github的地址为https://github.com/binarywang
#此项目基于微信开发文档2.0,也就是参数格式为XML
git clone git@github.com:binarywang/weixin-java-pay-demo.git
复制代码

1.项目结构

项目结构.png

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配置打印发送给微信服务器的参数和接收到微信服务器的参数,在调试开发阶段很有用。

支付相关的配置,如果微信公众号主体和微信商户号主体是一致话,完成支付只需要配置appIdmchIdmchKey。如果是特约商户模式,就需要配置subAppIdsubMchId

注意: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>
复制代码

一些参数涉及到隐私,统一特殊处理。

附上开源项目的地址微信支付项目,再次感谢大佬。

文章分类
后端
文章标签