因业务需要,开发微信支付功能,涉及三种支付方式:
- JSAPI 支付:微信内网页支付,需要开通微信服务号
- 小程序支付:在小程序中支付,需要开通小程序
- H5 支付:在手机浏览器(出微信内网爷)中网页支付
使用微信支付的前提必开通微信商户号,要使用到那种的支付方式要前需在商户平台开通(要审核)。
支付的钱最终都会到商户号里(一般由公司财务开通)。
开发微信支付的过程中大大小小坑还是踩了不少,终于做完了,整理下开发流程。
参考:
- 微信支付-接入指引
- 微信支付-开发文档
小程序支付
开发流程
- 小程序端请求创建订单接口,后端统一下单获取 orderId 并返回
- 小程序端获取通过wx.login()获取code
- 小程序端拿这code和orderId请求后端接口,获取支付所需数据
- 获取支付所需数据之后,小程序端调用wx.requestPayment()接口,直接调用起支付页面
- 判断是否支付成功后的逻辑
伪代码
1 | async function wxPay(goodId) { |
注意事项
- 申请微信小程序账号
申请成功可拿到 AppID(小程序 id)和 AppSecret(小程序密钥)
申请类型为企业性质,否则无法接入微信支付
- 微信小程序认证
通过认证的小程序才能接入微信支付和绑定商户平台
- 申请商户平台账号
需要第一步申请的 AppID
申请成功可拿到 MchID(商户 id)和 MchKey(商户密钥)
- 信小程序关联商户号
微信和商户都认证成功后,在微信后台微信支付菜单中进行关联
接入微信支付
在微信后台微信支付菜单中进行接入
参考
- 前端端请求创建订单接口,后端统一下单获取 orderId 并返回
- 前端带着 orderId 请求支付接口,获得 mweb_url,
- 然后跳转 mweb_url 会跳转微信自动调用微信支付
支付后返回支付页,判断是否支付成功(需发送请求后端查询)
刷新页面,获取最新的支付(订单)状态。
设置一个的按钮”我已支付”,让用户点击自动查询状态。
伪代码
1 | async function wxH5Pay(goodId) { |
注意事项
- 在商户平台设置正确的支付域名
- 调试需要在线上,如果嫌麻烦可以使用内网穿透(Ngrok 或花生壳)
- 需对redirect_url进行urlencode处理
H5 支付不能直接在微信客户端内调起,请在外部浏览器调起。
参考微信支付-H5 支付-开发步骤
JSAPI 支付(微信内网页支付)
开发流程
商品页
- 第一次进入页面,判断是否路径中有 code
- 没有 code,请求数据跳转授权页面,code 会通过回调地址一起返回回来
- 拿到 code,发送给后端,后端解析到 openid,保存好。
点击确定支付按钮,触发 wxPay() 方法
发送 orderId 给后端,获取 wxData
- wxData 中包含 wx.config 和 wx.chooseWXPay 两个接口的数据。
先调用 wx.config()然后在调用 wx.chooseWXPay(),如果一切正常,支付页面就会弹出。
支付状态通过后端去查询
伪代码
1 | 商品页 |
同时支持 H5 支付和 JSAPI 支付
1 | // 在创建订单之后,就判断环境使用哪种方法支付。 |
注意事项
开通微信商户号 - 设置支付目录(如果是 Vue 这类 SPA 页面,到根目录即可,也就是#号之前的地址)