关键点:小程序支付也是用的JSAPI接口。微信支付商户平台需要把小程序关联起来。
需要用到的微信端数据:APPID(小程序ID)、APPSECRET(小程序密钥)、MCHID(商户号)、KEY(商户号登录密码进行MD5加密32位小写)。
具体流程如下:
1. 前端(小程序前端,下同)调用wx.login获取code。
2. 后端(.NET/JAVA/PHP/nodejs等,下同)通过code、APPID、APPSECRET三个参数调用微信接口获取用户openid,调用接口:
string url = "https://api.weixin.qq.com/sns/jscode2session?" + "appid=" + appId + "&secret=" + secret + "&grant_type=authorization_code&js_code=" + jObject["Code"].ToString();
3. 前端下单,后端生成订单,订单包含订单编号(唯一,后面会需要反查)、订单信息、金额等等并回传前端。
4. 前端拿到openid和订单编号,发给后端生成预付单。
5. 后端根据预付单信息生成prepay_id。方法大概就是后端去调用微信支付的统一支付接口,参数是由订单信息、回调通知URL、服务器IP地址、openid等拼接一个XML格式数据。然后从返回的XML数据中提取prepay_id。统一支付接口:
/// <summary>
/// 统一支付接口
/// </summary>
const string UnifiedPayUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
6. 最后得到appId(小程序ID)、timeStamp(时间戳)、nonceStr(随机生成的字符串)、package(数据包,格式为prepay_id= wx2017033010242291fcfe0db70013231072)、signType(固定为MD5)、paySign(签名,这个是由前面几个再加上KEY进行MD5大写加密后的字符串,拼接方式如:appId=wx4f0148eef3c588ea&nonceStr=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&package=prepay_id=wx2017033010242291fcfe0db70013231072&signType=MD5&timeStamp=1490840662&key=926b9f4a15a087531308b60ed3b1edad,顺序一定不能错,否则加密字符串对不上)。
7. 后端把第6点生成的数据传给前端,前端调用wx.requestPayment发起支付,代码如下:
wx.requestPayment(
{
"timeStamp":"1490840662",
"nonceStr": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS ",
"package": " prepay_id=wx2017033010242291fcfe0db70013231072",
"signType": "MD5",
"paySign": "922981E42679E92A31EBBE7866A5EAE3",
"success":function(res){},
"fail":function(res){},
"complete":function(res){}
})
8. 微信那边如果支付成功,会把信息以XML的格式通知后端,如果失败它会一直通知,直到后端通知微信收到信息为止。