发布时间:2025-12-09 17:21:00 浏览次数:4
原文链接
新开了一个小程序,在体验版支付流程一切顺利,发布后却不能支付,报错:"requestPayment:fail check tichet rejected"
提示为:Please use wx. requestOrderPayment,之前好好怎么就不能用了,结果发现很多人都遇到类似的问题无法解决,并且微信没有任何通知
微信的文档并没有详细的流程说明,并且服务商的功能在最新版不能使用,不得不说微信真是坑。结果花了一天时间才把前后端全部调整完。新版的支付调用事务1400毫秒左右,之前300左右,在客户端半天弹不了支付框体验极差,微信端声称提高用户体验,实际主要是为了限制商家,流氓公司
以下为微信小程序最新版支付接口wx.requestOrderPayment()小程序支付管理对接流程:
------------------------------------------------------------------------------------------------------
1.之前的微信支付已经隐藏了,最新菜单为支付管理,只需要在小程序申请就行了,不需要在微信商户号中做任何事
申请审核时间说的是2个工作日,结果足足等了10天,所以申请要称早
2.开发服务端下单接口,和开发公众号调用方式一致
文档:
创建订单 | 微信开放文档
需要使用两个接口:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=小程序APPID&secret=小程序密钥
https://api.weixin.qq.com/shop/pay/createorder?access_token=上一个接口返回的accessKey
注意:
1.和之前的不同这里不需要设置回调地址,回调是通过小程序公众平台事件的方式(具体怎么弄往下看)
2.订单号生成的修改,如果超过20位需要调整订单号的生成规则
相对之前的统一下单接口要简单一些,不需要处理响应数据,返回的数据就是小程序调起支付所需要的数据:
{
"errcode":0,
"errmsg":"ok",
"payment_params":{
"timeStamp":"1657947031",
"nonceStr":"lsdHnNNSvKHzJowTog43Cw0YYmWxcoie",
"package":"prepay_id=up_wx16125030978396ab0985753e810aec0000",
"paySign":"ku5o7iV2F1ZrebEpyhG7H571LRKDmMHx/raXleiCOHFVO9qH/yoWzLxozFeZBVBaWui6YC9ECRc0WTWXcGeNtI6nUABT11yVdfUp0XvhgBlBwGx3Nb7lZGq+55ISCl5hj1g5yjoamYjzn42k9OysL2or8uY/Mwe+rF79jKKSl7f0T9hFUdvekXnFqBNUJ75sv+Bwj3Loei2rzoGOg4/3+czpIU7zfiLDZQF2bmI36UW941sM/ujVIWE1eBJYRLSjgGfFaG9rmrPH5nV3SEWnxvCMGHHhBIXlZjfJdukSChZWa3vov8Rkm5MCY0p/GipNpJoJxfOXWR2c405DF8bsog==",
"signType":"RSA"
}
}
3.小程序端修改
小程序端修改比较简单:将wx.requestPayment 改为 wx.requestOrderPayment 然后做一下兼容处理
let paymentType='uni';
//#ifdef MP-WEIXIN
if (wx.requestOrderPayment) {//判断接口是否可用,兼容判断
paymentType='mp';
}
//#endif
if(paymentType==='mp'){
wx.requestOrderPayment({
// orderInfo: {},
timeStamp: data.timeStamp + '',
nonceStr: data.nonceStr,
package: data.package,
signType: data.signType,
paySign: data.sign || data.paySign,
success (res) {
lln.tips({title:data.successTip||'支付成功',duration:duration},function(){callback && callback(true);});
},
fail (res) {
let title = '支付失败';
if (res.errMsg === "requestOrderPayment:fail cancel") {
title = '用户取消支付';
}
console.log(res)
lln.tips({title:title,duration:duration},function(){callback && callback(false);});
}
})
}else{
uni.requestPayment({//微信原生开发用wx.requestPayment
'appId': appId,
'timeStamp': data.timeStamp + '',
'nonceStr': data.nonceStr,
'package': data.package,
'signType': data.signType,
'paySign': data.sign,
success: function(res) {
lln.tips({title:data.successTip||'支付成功',duration:duration},function(){callback && callback(true);});
},
fail: function(res) {
let title = '支付失败';
if (res.errMsg === "requestPayment:fail cancel") {
title = '用户取消支付';
}
console.log(res)
lln.tips({title:title,duration:duration},function(){callback && callback(false);});
}
});
}
4.新增订单查询接口
文档:
https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/ministore/wxafunds/API/order/get_order_detail.html
https://api.weixin.qq.com/shop/pay/getorder?access_token=和第一步的获取方式一致
请求参数:{"trade_no":"商户自己的订单号"}
注意:响应数据中如果包含transaction_id字段则标识交易成功,真坑
5.新增支付回调处理
文档:
订单支付成功通知 | 微信开放文档
在微信小程序:开发管理>开发设置>消息推送 开启消息推送功能
以下是我们服务端的相关代码:
@RequestMapping(value = "/message")@ResponseBodypublic String message(String signature, String echostr, String timestamp, String nonce) throws Exception {log.info("微信验证:signature={}&echostr={}×tamp={}&nonce={}", signature, echostr, timestamp, nonce);if (StringUtils.isBlank(signature) || StringUtils.isBlank(timestamp) || StringUtils.isBlank(nonce)) {return "false";}Channel channel = DatagramHandlerUtil.getChannel(ChannelEnum.Code.WX_GZH.name());if (channel == null || channel.getConfigs()==null || channel.getConfigs().getStr("token")==null) {log.error("微信公众号信息未配置,请检查");return "false";}//验证签名if (!SignatureCheckKit.me.checkSignature(signature, channel.getConfigs().getStr("token"), timestamp, nonce)) {log.warn("Wechat: The request signature is invalid");return "false";}//首次服务器验证if(echostr!=null){log.info("服务器验证成功");return echostr;}log.info("收到微信推送消息");Kv param= TradeUtils.getWechatNotify(request);log.info("收到微信推送消息:{}",param);log.info("处理微信推送消息");String msgType=param.getStr("MsgType");//事件if("event".equals(msgType)){String event=param.getStr("Event");String openId=param.getStr("FromUserName");Integer status=CommonEnum.YN.YES.getFlag();if(WxmpEventConstant.unsubscribe.equals(event)){//用户订阅通知status=CommonEnum.YN.NO.getFlag();}else if(WxmpEventConstant.funds_order_pay.equals(event)){//小程序支付管理支付成功//https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/ministore/wxafunds/callback/create_order.htmllog.info("公众平台支付回调参数:{}",param);Kv order=param.getAs("order_info");if(order==null){log.error("公众平台支付回调参数错误:{}",param);return "fail";}String tradeNo = order.getStr("trade_no");if(StringUtil.isBlank(tradeNo)){log.error("公众平台支付回调参数错误:{}",param);return "fail";}Trade trade = tradeService.queryByTradeNo(tradeNo);if(trade!=null){if(TradeEnum.Status.PROCESSING.getCode().equals(trade.getOrderStatus())){//调用查询接口tradeService.queryResult(trade);return "success";}else {log.warn("公众平台支付回调,交易状态已改变:{}",tradeNo);return "success";}}else{log.warn("公众平台支付回调,交易不存在:{}",tradeNo);return "success";}}//更新关注状态userSpreadService.updateStatus(ChannelEnum.Code.WX_GZH.getCode(),openId,status);}else if("text".equals(msgType)){}return "";}