微信小程序最新版支付接口wx.requestOrderPayment()对接流程

原文链接

 

新开了一个小程序,在体验版支付流程一切顺利,发布后却不能支付,报错:"requestPayment:fail check tichet rejected"

提示为:Please use wx. requestOrderPayment,之前好好怎么就不能用了并且微信没有任何通知,结果发现很多人都遇到类似的问题

 

微信的文档并没有详细的流程说明,并且服务商的功能在最新版不能使用不得不说微信真是坑结果花了一天时间才把前后端全部调整完。新版的支付调用事务1400毫秒左右,之前300左右,在客户端半天弹不了支付框体验极差,微信端声称提高用户体验,实际主要是为了限制商家

 

以下为微信小程序最新版支付接口wx.requestOrderPayment()小程序支付管理对接流程:

------------------------------------------------------------------------------------------------------

1.微信支付已经隐藏了,最新菜单为支付管理,只需要在小程序申请就行了,不需要在微信商户号中做任何事

申请审核时间说的是2个工作日,结果足足等了10天,所以申请要称早

 

2.开发服务端下单接口,和开发公众号调用方式一致

文档:

https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/ministore/wxafunds/API/order/create_order.html

需要使用两个接口:

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":"ku5o7iV2F1ZrebEpyhG7H571.........0p/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.新增支付回调处理

文档:

https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/ministore/wxafunds/callback/create_order.html

 

在微信小程序:开发管理>开发设置>消息推送 开启消息推送功能

 

以下是我们服务端的相关代码:

@RequestMapping(value = "/message")
@ResponseBody
public String message(String signature, String echostr, String timestamp, String nonce) throws Exception {

log.info("微信验证:signature={}&echostr={}&timestamp={}&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.html
log.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 "";
}