在开发中我们会经常遇到微信支付的场景,不管是 从微信付钱到商户,还是从商户提现到微信 都属于支付。都需要在微信开放平台注册应用,申请支付权限,对接SDK。下面,我们就来了解一下具体的支付流程。
对于支付过程,请看开放平台文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Resource_Center_Homepage.html?action=dir_list&t=resource%2Fres_list&verify=1&lang=zh_CN
支付模式
- 付款码支付
付款码支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要用于线下的面对面收银的场景。 - Native 支付
Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付,实体店单品或订单支付,媒体广告支付等场景。 - JSAPI支付
JSAPI支付 是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
1> 用户在微信公众号内进入商家公众号,打开某个页面,完成支付。
2> 用户的好友在朋友圈,聊天窗口等分享商家页面链接,用户点击链接打开商家页面,完成支付
3> 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付。 - APP支付
APP 支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式 - H5支付
H5支付主要是在手机,iPad等移动设备中通过浏览器来唤起微信支付产品 - 小程序支付
小程序支付是专门被定义使用在小程序中的支付产品。目前在小程序中能且只能使用小程序支付的方式来唤起微信支付。
接口规则
- 传输方式
为保证交易安全性,采用HTTPS传输 - 提交方式
采用post方法提交 - 数据格式
提交和返回数据都为xml 格式,节点为xml - 字符编码
微信支付API 仅支持UTF-8 字符编码的一个子集: 使用一到三个字节编码的字符。也就是说 不支持Unicode辅助平面中的四至六字节编码的字符 - 签名算法
MD5 - 签名要求
请求和接收数据均需要校验签名 - 证书要求
调用申请退款,撤销订单接口需要商户证书 - 判断逻辑
先判断协议字段返回,再判断业务返回,最后判断交易状态
签名算法 (https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3)
- 设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(key1=value1&key2=value2),拼接成字符串stringA
- 在stringA最后拼接上key得到stringSing temp 字符串,并对stringSign Temp 进行MD5云算,再将得到的字符串所有字符转换为大写,得到sign值 signValue。注意 秘钥的长度为32字节
**** key 设置路径:审核后的邮件有返回 或者 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
例如: 传送的参数如下
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
1> 对参数按照key = value 的格式,并按照参数名ASCII字典排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
2> 拼接API秘钥
MD5签名方式:
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" [//注:key为商户平台设置的密钥key](https://kf.qq.com/faq/180830UVRZR7180830Ij6ZZz.html)
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式
3> 最终得到最终发送的数据:
<xml>
<appid>wxd930ea5d5a258f4f</appid>
<mch_id>10000100</mch_id>
<device_info>1000</device_info>
<body>test</body>
<nonce_str>ibuaiVcKdpRxkhJA</nonce_str>
<sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>
</xml>
以下就是APP 支付流程图:
image.png
-
用户使用商户APP 客户端,选择商品进行下单,将订单信息给 商户后台系统,请求生成支付订单
-
商户后台收到用户订单信息,生成平台订单,调用微信支付统一下单接口,请求创建订单
-
微信统一下单接口 会返回正常的prepay_id, 然后再按照签名规范重新生成签名,将数据传输给APP。参与签名的字段为,appid, partnerid,prepayid,noncestr,timestamp,package,其中package 的格式为Sign=WXPay
这些参数都会返回给APP
123.png -
商户APP 用这些参数,调起微信客户端,发起支付
-
微信客户端向微信后台发起支付请求,微信后台验证支付授权权限,向微信客户端返回支付授权
-
用户输入密码,提交授权,微信后台验证授权,完成支付
-
获取支付结果
在方法onResq 中会获取回调,如果支付成功,则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
参考:
[1] https://blog.csdn.net/zhouxiangyu666666/article/details/71136906
[2] https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
网友评论