说一说微信支付的大致流程,
申请之类的流程我就不说了,网上一大堆。
主要讲一下 代码流程
当获得了开放平台的支付权限后,就可以开始测试了。
因为我是前端,所以后端代码,还需要自己去找。
首先是统一下单。
页面逻辑是在点击购买的时候,将商品数据,或者商品id,一些相关字段,传递到后台
后台生成签名的时候一定要用签名工具测试,是否一致
后台生成统一下单的 prepayid
然后再根据这个 prepayid 从新生成 调起支付接口的字段
这里要注意,时间戳和随机字符串。。。
然后从新根据 统一下单生成签名的方法 ,重新生成签名。
将这些数据返回给前端,由前端调起支付,
这种方法是不需要 openid的,微信只需要知道是谁付了款,不需要知道是谁下的单,到时候退款也只是钱回流到支付微信账号里面。
前端调起支付的代码其实也很简单。
逻辑有两种,一种就是先获取所有支付通道,让用户先选择,第二种,就是 点击下单后再获取支付通道,然后再让用户选择支付方式。都可以
var channel = null; //支付通道
mui.init();
mui.plusReady(function(){
//获取支付通道
getChannels();
});
//获取支付通道的方法
function getChannels(){
plus.payment.getChannels(function(channels) {
for (var i = 0; i < channels.length; i++) {
if (channels[i].id == "wxpay") {
channel = channels[i];
}
}
//plus.ui.toast("使用支付方式:" + channel.id);
}, function(e) {
plus.ui.toast("获取支付通道失败!");
console.log("获取支付通道失败!");
})
}
然后是下单和支付
//下单获取 调取支付的参数
function orderAdd(){
var num = g("num").value||1;
var data = {
url:"/api/Order/orderAdd",
data:{
access_token:acctoken(),
bid:4||sid,
address_id:29||addid,
preference:g("preference").value||"",
num:num,
}
}
ajax(data,function(res){
console.log(res);
var data = {
"appid":res.data[0].appid,
"noncestr":res.data[0].nonce_str,
"package":"Sign=WXPay",
"partnerid":res.data[0].mch_id,
"prepayid":res.data[0].prepay_id,
"timestamp":res.data[0].timestamp,
"sign":res.data[0].sign,
}
ajax_success_callback(data);
//pay(data);
})
}
//获取微信支付参数成功的回调函数
function ajax_success_callback(resObj){
console.log("请求微信支付参数成功,返回的json:");
var res_str=JSON.stringify(resObj);
console.log(res_str);
//用返回参数 发起微信支付请求
plus.payment.request(channel,res_str,wxpay_success,wxpay_error);
}
//获取微信支付参数失败的回调函数
function ajax_error_callback(e){
console.log("ajax获取参数失败");
}
//微信支付成功回调
function wxpay_success(result){
plus.ui.alert("支付成功!",function()
{
mui.back();
})
}
//微信支付失败回调
function wxpay_error(error){
console.log(JSON.stringify(error))
plus.ui.alert(JSON.stringify(error));
plus.ui.alert("支付失败!");
}
至于里面的一些 封装的函数就不写出来,逻辑,流程知道就可以了。
后面再列出一些微信支付的bug 和 解决思路
1,appid 和 密钥
2,包名签名问题
3,统一下单 参数body 里面不要有中文,
4,如果碰到code -100 微信 -1 的时候
将之前的参数全部检查一次,如果还没有发现问题,可以先写一个微信分享,如果可以分享,那么就和签名没有关系。
那么可能就是传入的参数有bug,这里就需要仔细对比研究了。
5,微信可以退出登录,清楚一下缓存,或者更换手机测试,以免微信的缓存问题导致很长时间无效的调试。
6.调起微信支付传入的 参数必须是字符串 不能是json对象
7.其他的问题,暂时没有碰到了
以上就是mui微信支付碰到的一些bug,可以减少大家的一些调试时间。
如果感兴趣,也可以关注我的微信公众号,因为刚起步,所以只有几篇文章,之后会慢慢更新。