Java - 扫呗支付遇到的问题和解决方案

问题:小程序支付成功后,不点击完成,不会进入到success回调。

        此时微信虽然显示已经支付完成,但是后台其实还未完成支付回调,此笔订单的业务状态可能还是未支付状态。

        上一篇文章说了,我们的扫呗微信小程序支付时请求的是预支付接口,预支付返回的参数直接调用微信支付API,通过JS直接拉起了微信付款的界面做支付的最后一步,当支付成功后就会出现上述图片的情况,下方有一个完成,点击完成后微信才会进入success处理订单的一个状态更新和后续业务,不点完成的情况下会出现已支付但是订单状态未改变,由于wx.requestPayment的回调函数是异步执行的,所以可能微信的支付已经完成,但是我们在success中去写订单更新会导致用户没有点击完成的情况下而无法进入success代码,从而更新失败。

wx.requestPayment({
   'timeStamp': '',
   'nonceStr': '',
   'package': '',
   'signType': 'MD5',
   'paySign': '',
   'success':function(res){
        wx.reLaunch({
            url: '../../orderSuccess',
         })
   },
   'fail':function(res){
   },
  'complete':function(res){
   }
})

        可以参考:pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5

(1)使用支付查询

/**
 * 支付查询
 * *******
 *
 * @param dto 入参
 * @return 返回结果
 */
@PostMapping("/query")
public ResultData query(@Validated @RequestBody SaoBeiQueryDto dto) {

        SaobeiApiClient<SaobeiTradeQueryRequest, SaobeiTradeQueryResponse> client = new DefaultSaobeiApiClient<>(dto.getAccessToken());

        SaobeiTradeQueryRequest request = new SaobeiTradeQueryRequest();
        request.setPay_ver(PAY_VER);
        request.setPay_type(dto.getPayType());
        request.setService_id(ServerIdEnum.FIVE.getType());
        request.setMerchant_no(dto.getMerchantNo());
        request.setTerminal_id(dto.getTerminalId());
        request.setTerminal_trace(dto.getTerminalTrace());
        request.setTerminal_time(dto.getTerminalTime());
        request.setOut_trade_no(dto.getOutTradeNo());


        log.info("请求报文: {}" + JSON.toJSONString(request));
        SaobeiTradeQueryResponse response = client.execute(request);

        log.info("返回报文: {}" + JSON.toJSONString(response));

        return ResultData.createSuccessJsonResult(response);
}

        这是一个比较简单的处理办法,可以直接调用扫呗的订单查询,在前端调用预支付成功后开始轮询这个接口三分钟,也可以根据自己的业务需求来调整这个轮询的时间,最好是和订单待支付超时时间一致。这样我们就可以最准确的查询到订单的状态,当然这个也需要根据情况而定。

(2)异步回调通知

       支付完成后,将该笔订单的变更信息,沿着商户调用预下单请求时所传入的异步通知地址 notify_url,当微信异步回调后同步做出回调,将订单信息和success状态推送到前端。

/**
 * 异步回调通知
 * *******
 */
@RequestMapping("/payOrder")
public void payOrderNotify() throws IOException {

        //请求参数
        JSONObject params = getReqParamJSON();

        String mchNo = params.getString("mchNo");
        String appId = params.getString("appId");
        String sign = params.getString("sign");
        MchApp mchApp = mchAppService.getById(appId);
        if(mchApp == null || !mchApp.getMchNo().equals(mchNo)){
            response.getWriter().print("app is not exists");
            return;
        }

        params.remove("sign");
        if(!JeepayKit.getSign(params, mchApp.getAppSecret()).equalsIgnoreCase(sign)){
            response.getWriter().print("sign fail");
            return;
        }

        JSONObject msg = new JSONObject();
        msg.put("state", params.getIntValue("state"));
        msg.put("errCode", params.getString("errCode"));
        msg.put("errMsg", params.getString("errMsg"));

        //推送到前端
        WsPayOrderServer.sendMsgByOrderId(params.getString("payOrderId"), msg.toJSONString());

        response.getWriter().print("SUCCESS");
}

       

        当然可能还有其他的一些方法可以解决方案,目前我遇见的仅仅只是小程序支付上面的一些问题。

        还有其他的聚合码支付、正反扫支付、公众号支付等等,如果遇见了什么问题都可以一起讨论解决哦!

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值