微信支付是小程序开发中很重要的一个环节,下面会结合实战进行分析总结
环境准备
- https服务器
微信小程序只支持https请求,因此需要配置https的单向认证服务(请参考 另一篇文章https受信证书配置) - 微信公众平台账号
- 已认证的商户资料(请参考微信支付商户认证)
流程
- 小程序内调用登录接口,获取到用户的openid,api参见公共api【小程序登录API】
- 商户server调用支付统一下单,api参见公共api【统一下单API】
- 商户server调用再次签名,api参见公共api【再次签名】
- 商户server接收支付通知,api参见公共api【支付结果通知API】
- 商户server查询支付结果,api参见公共api【查询订单API】
支付
payment:function(event){
var that = this;
wx.login({
success: function(res) {
if (res.code) {
//发起网络请求
wx.request({
url: app.data.basepath+"/api/payment/openid",//发送后台,获取openid
data: {code:res.code},
method: 'GET',
success: function (res) {
that.unifiedorder(res.data);
},
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
});
},
unifiedorder:function(openid){//调用微信统一下单,并进行二次加密
var that = this;
wx.request({
url:app.data.basepath+"/api/payment/unifiedorder",
data:{openid:openid},
metthod:'get',
success:function(res){
that.payreq(res);
}
});
},
payreq:function(res){
var that = this;
wx.requestPayment({
timeStamp: res.data.timeStamp,
nonceStr: res.data.nonceStr,
package: res.data.package,
signType: res.data.signType,
paySign: res.data.paySign,
success:function(r){
wx.showToast({
title: '支付成功',
icon: 'success',
duration: 2000
})
}
})
}
公共方法
private static String post(String url,String param){
//使用jodd的HttpRequest接口
jodd.http.HttpRequest request = HttpRequest.post(url).body(params);
String reponse = new String(request.send().bodyText().getBytes(CharEncoding.ISO_8859_1), CharEncoding.UTF_8);
return reponse;
}
获取openid逻辑
//获取openid
public String getOpenId(String code){
String param = initOpenIdParam(code);
String openIdUrl = PaymentConstants.OPEN_ID_URL;
String response = HTTPUtils.post(openIdUrl,param);
Map result = JSON.parseObject(response);
return result.get("openid").toString();
}
private String initOpenIdParam(String code){
Map<String,String> map = new HashMap<>();
map.put("appid","小程序appid");
map.put("secret","小程序密钥");
map.put("js_code",code);
map.put("grant_typ","authorization_code");
return HTTPUtils.parseParam(map);//将map转换为"key1=val1&key2=val2"的格式
}
签名错误
有个大坑
拼接密钥那一步用的key是微信支付的key,不是小程序app的密钥,切记