golang gin 实现微信小程序支付

更新日期: 2021-08-23 阅读次数: 6134 字数: 727 分类: 微信小程序

微信小程序支付最多关联多少个三方商户

50 个。

https://developers.weixin.qq.com/community/develop/doc/000a0a92e50360b6554aa165b5a400

获取微信商户的 MchID(商户 id)和 MchKey(商户密钥)

  • MchID(商户 id)左侧菜单里的商户信息里查找
  • MchKey(商户密钥)左侧菜单里的 API 安全里生成,共 32 位

微信支付 golang 库

最新的是 V3 版本。

官方提供了 golang 版本的库,良心。。。(官方同时提供了 java, php, golang 三种语言)

https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml

golang github 项目地址:

https://github.com/wechatpay-apiv3/wechatpay-go

不过感觉还是三方的库,看起来更容易理解,而且支持 V2 版本 (我决定暂时用这个)

https://github.com/wleven/wxpay

还有一个三方库,虽然 star 人数多一些,但是年久失修,怕有坑

https://github.com/objcoding/wxpay

小程序端 API

https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestPayment.html

参数:

  • timeStamp
  • nonceStr
  • package (prepay_id=***)
  • signType 默认 md5, 而 v3 不再使用 md5,改用 RSA (仅在 v3 版本接口适用)
  • paySign 签名

V2 哪些接口需要证书

  • 普通支付不需要证书
  • 退款接口需要部署证书

v3 版本都需要证书么

似乎相对 V2,都需要证书。感觉是我的理解有误。

从2018年底开始,微信支付新入驻机构及商户都将使用CA签发证书,在证书申请页面上点击“下载证书”

只是说用 CA 证书,没有说都需要。

V3 版本相对 V2 的变化

https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay-1.shtml

相较于之前的微信支付API,主要区别是:

  • 遵循统一的 REST ful 的设计风格
  • 使用 JSON 作为数据交互的格式,不再使用 XML
  • 使用基于非对称密钥的 SHA256-RSA 的数字签名算法,不再使用 MD5 或 HMAC-SHA256
  • 不再要求 HTTPS 客户端证书
  • 使用 AES-256-GCM,对回调中的关键信息进行加密保护

是否有必要使用 v3 的接口替代 v2

我感觉 v3 的接口非常复杂,相对而言 v2 简单多了。

是否有必要使用 v3 接口?

感觉暂时没有必要。

服务端的预支付接口

https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml

返回给小程序端的 golang 函数在这里:

https://github.com/wechatpay-apiv3/wechatpay-go/blob/7e058b2aae2ea884a152fccd0c10b14deef7bd47/services/payments/jsapi/api_jsapi_request_payment.go

预支付函数 Prepay:

https://github.com/wechatpay-apiv3/wechatpay-go/blob/main/services/payments/jsapi/api_jsapi.go

支付成功回调的数据结构

回调参数说明文档:

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7

解析函数

https://github.com/wleven/wxpay/blob/master/src/V2/pay.go

// NotifyFormat 通知数据解析
func NotifyFormat(data string) map[string]string {
	return utils.XML2MAP([]byte(data))
}

商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄露导致出现“假通知”,造成资金损失。

可以参考这里,及 wxpay 的其他请求的返回处理方式,但是需要加上签名验证

https://github.com/liyoung1992/wechatpay

关于分账

无意间看到一个分账的功能:

https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=24_1

TODO

  • [X] 由于预支付需要用到用户 open_id,所以需要先将登录分离
  • [X] 先实现预支付
  • [X] 预支付返回的参数,传给小程序端,前端进行支付
  • [X] 将测试参数,修改为真实参数
  • [X] 支付成功回调,需要调整为支持分的订单
  • [ ] appid 的全局配置。login 一处,预支付一处,改起来麻烦

参考

  • 小程序支付流程 https://segmentfault.com/a/1190000022606064
  • 支付流程 V3 版本,官方文档 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml
  • 支付流程 V2 旧版本,官方文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式