一.前期准备
微信后台申请微信支付:微信支付-商务号关联(个人信息 填写,操作密码)-》api密钥设置
得到appid AppSecret 商户号 api密钥等
微信支付接口签名校验工具
二大概流程
1)登录,获取code(一个code只能用一次)
2)通过code获取openid(通过请求服务器,由服务器请求微信获取并返回小程序)。微信登录+获取openid接口
wx.login({
success: function(res) {
if (res.code) {
let params={
code:res.code,
}
Api.getWxUserInfo(params).then(res => {
if(res.success==true){
let userOpen={
openId:res.data.openId,
userId:res.data.userId
}
wx.setStorageSync('userOpenInfo',userOpen);
}
});
}else {
wx.showToast({
title: '获取用户登录失败请重新关注',
icon: 'none',
duration: 5000
});
}
}
});
注意这边openid 是后端加密后的,
3)前端把openid,订单数据(支付金额等)的传给服务端
4)服务端根据请求订单数据、生成第三方订单号,调用微信的统一下单接口 、第一次签名、第一次签名成功后返回再一次签名,最后后端这些参数('timeStamp','nonceStr','package','signType','paySign')返回给前端,
5)前端发起支付(wx.requestPayment),并支付完成
6)服务器收到回调
let payParams = {
tempId:wx.getStorageSync('tempId'),
totalMoney:mythis.data.totalMoney,//总金额
openId:wx.getStorageSync('userOpenInfo').openId
}
Api.pay(payParams).then(datas => {
if(datas.success == true){
console.log('获取参数', datas.data);
let dataInfo = JSON.parse(datas.data);
wx.requestPayment({
'timeStamp': dataInfo.timeStamp,//时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间
'nonceStr': dataInfo.nonceStr,//随机字符串,长度为32个字符以下
'package':dataInfo.package,//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=***
'signType': dataInfo.signType,//MD5 签名算法
'paySign': dataInfo.sign,//签名
'success': function (data) {
console.log('成功',data)
},
'fail': function (data) {
console.log('失败',data)
}
})
}
}).catch((err) => {
console.log('异常',err)
wx.hideLoading();
wx.showToast({
title: '数据支付有异常',
icon: 'none',
duration: 5000
});
});
注意服务端返回的数据要注意大小写
二.遇到问题
1.微信支付遇到调用支付JSAPI缺少参数:total_fee(高效精准解决方法)
2. errMsg: "requestPayment:fail 支付验证签名失败"
这个是签名paySign 获取失败 有可能是后端返回的字段大小有关
3.小程序发起支付请求,在未到达支付商户时,将金额拆分两部分,分别到两个不同的商户号进行入账。
这样是不行的。分账必须走服务商
4.小程序可以绑定多个商户号,同时调起多个支付 (验证成功,都是同主题的)
比如:a按钮可以把钱支付给A商户号 b按钮可以把钱支付给B商户号
5.小程序主体市医院与商户号主体是企业,这个前提下,医院的小程序关联了企业的商户号支付能成功。
6.小程序主体与商户号主体不一致可以绑定吗?如果不能有什么解决方案?
不可以绑定,但是可以用不同的主体收款,但是需要做联合运营,可以参考https://pay.weixin.qq.com/index.php/public/cms/content_detail?platformType=0&lang=zh&id=35001