注释:1、2为准备工作
1.微信支付规则
2.参数规定
3.调用接口
第一步需要先生成一个签名:
第二步在微信端进行调用wx.requestPayment(OBJECT)发起微信支付
现在进行梳理支付,首先暴露一个流程,大家经过研读也应该有看到,这里将对于没有看过开发文档的看客观看:
**
- 1.需要先微信小程序端使用调用登录方法,获取一个code
**
App({
onLaunch: function() {
wx.login({
success: function(res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'https://test.com/onLogin',
data: {
code: res.code
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
});
}
})
- 2.后端需要相应的调用登录api根据code进行获取一个openid,这个是需要之后在支付中使用
public static JSONObject getSessionKeyOropenid(ReceivePayInfoUtil receivePayInfoUtil,String code) {
//微信端登录code值获取oppenid
String requestUrl = receivePayInfoUtil.url;
Map<String, String> requestUrlParam = new LinkedHashMap<String, String>();
requestUrlParam.put("appid", receivePayInfoUtil.getAppid());
requestUrlParam.put("secret", receivePayInfoUtil.getSecret());
requestUrlParam.put("js_code", code);
requestUrlParam.put("grant_type", "authorization_code");
//发送post请求读取调用微信 https://api.weixin.qq.com/sns/jscode2session 接口获取openid用户唯一标识
JSONObject jsonObject = JSON.parseObject(HttpSendUtil.sendPostOpen(requestUrl, requestUrlParam));
return jsonObject;
}
注:最后的JSONObject方法体重是自定义的http请求,自己封装即可
- 3.根据获取的openid先进行生成一个签名(个人经验–这个签名与之后你发起请求的吧包体字段除去*户key,其他字段一致)
例如:sign=a+b+c+商户key;;;;发送的包体中需要a+b+c+sign(生成的签名)
//证书签名
String A = "appid=" + appid +"&attach="+attach
+ "&body="+body+"&mch_id=" + mch_id + "&nonce_str=" + nonce_str+"¬ify_url="+notify_url
+"&openid="+openid+"&out_trade_no="+out_trade_no
+"&total_fee="+total_fee
+"&trade_type="+trade_type;
String SignTemp = A + "&key=" + receivePayInfoUtil.getKey();
String signmd5 = PayServiceUtil.getStrMd5(SignTemp).toUpperCase();
//根据升序转化成XML
Map<String, Object> parameters = new LinkedHashMap<String, Object>();
parameters.put("appid", appid);
parameters.put("attach", attach);
parameters.put("body", body);
parameters.put("mch_id", mch_id);
parameters.put("nonce_str", nonce_str);
parameters.put("notify_url", notify_url);
parameters.put("openid", openid);
parameters.put("out_trade_no", out_trade_no);
parameters.put("total_fee", total_fee);
parameters.put("trade_type", trade_type);
parameters.put("sign", signmd5);
String requestXML = XML.getMap2Xml(parameters);
String a = HttpSendUtil.sendPost(payUrl, requestXML);
JSONObject jsonObject1 = XML.toJSONObject(a);
jsonObject1.put("key",receivePayInfoUtil.getKey());
注:此demo全部为自己封装使用,没有使用太多jar包,相信大家可以看懂,不懂可以直接博客评论私信都可以
- 4.生成签名方式在开发文档中有,拼接,进行md5,然后生成的md5.toUpperCase();
此处写的不好,上面代码有此内容,如果再次粘贴,可能大家会出现更多疑问点,会再次斟酌重写此篇文章
到此,最后再就是微信端调用此处返回的信息,进行再次签名,根据开发文档的再次签名即可,进行使用微信支付接口即可
wx.requestPayment({
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){
},
'fail':function(res){
}
})
微信支付就这样到此为止了,最后告诉大家一个坑,appid,这个id的i为大写,这个问题发生在返回信息的再次签名中(微信的小坑)