微信付款码支付

1.微信付款码支付,相比微信小程序支付和微信Native支付,不用传trade_type,需要多传一个auth_code(付款码code) ,调用微信支付sdk的microPay()方法
2.频繁使用付款码支付的话会让输入密码,输入密码的同时扫码付款不会阻塞住而是会直接返回付款失败,这时候需要重新扫码付款,如果用户扣款成功了,商户会显示付款成功

后端代码

@PostMapping("/scanCodePayOrder")
    @ApiOperation("微信扫码支付")
    public R scanCodePayOrder(@RequestBody ScanCodePayOrderForm form,@RequestHeader Map<String,Object> header){
        ValidatorUtils.validateEntity(form);
        String token = header.get("token").toString();
        Integer userId = Integer.parseInt(jwtUtils.getClaimByToken(token).getSubject());
        LambdaQueryWrapper<UserEntity> uew = new LambdaQueryWrapper<>();
        uew.eq(UserEntity::getUserId, userId);
        UserEntity user = userService.getOne(uew);
        if (user == null) {
            return R.error("用户不存在!");
        }
        LambdaQueryWrapper<Order> oew = new LambdaQueryWrapper<>();
        Integer orderId = form.getOrderId();
        oew.eq(Order::getId, orderId);
        Order order = orderService.getOne(oew);
        if (order == null) {
            return R.error("该用户没有此订单!");
        }
        if (!Objects.equals(order.getStatus(), EnumUtil.PAY_STATUS_NO_PAY.getCode())) {
            return R.error("该订单已支付!");
        }
        //判断优惠券是否过期


        //判断活动是否过期


        //向微信平台发送创建支付订单的请求

        try {
            //微信支付的单位是分,要转换一下
            String amount = String.valueOf(order.getAmount().multiply(BigDecimal.valueOf(100)).intValue());
            WXPay wxPay = new WXPay(wxPayConfig);
            Map<String, String> paramMap = new HashMap<>();
            String nonceStr = WXPayUtil.generateNonceStr();
            paramMap.put("nonce_str", nonceStr);    //随机字符串
            paramMap.put("body", "商品备注信息");
            paramMap.put("out_trade_no", order.getCode());   //商品订单流水号,必须为一
            paramMap.put("total_fee", amount);              //订单金额
            paramMap.put("spbill_create_ip", "127.0.0.1");
            paramMap.put("auth_code", form.getAuthCode());
            String sign = WXPayUtil.generateSignature(paramMap, wxConfiguration.getMchKey());
            paramMap.put("sign", sign);
            Map<String, String> result = wxPay.microPay(paramMap);
            log.info("result:{}",result);
            String resultCode = result.get("result_code");
            String returnCode = result.get("return_code");
            if (!"SUCCESS".equals(resultCode) || !"SUCCESS".equals(returnCode)) {
                return R.error("付款失败");
            }

            //支付订单Id
            String prepayId = result.get("transaction_id");
            if (StringUtils.isNotBlank(prepayId)) {
                order.setPrepayId(prepayId);
                order.setStatus(EnumUtil.PAY_STATUS_PAIED.getCode());
                order.setPaymentType(EnumUtil.WX.getCode());
                orderService.updateById(order);
                return R.ok("付款成功");
            }else {
                log.error("微信支付出现异常,订单号:{}",orderId);
                return R.error("微信支付出现异常,订单号:{}" + orderId);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("微信支付出现异常,订单号:{}",orderId);
            return R.error("微信支付出现异常,订单号:{}" + orderId);
        }
    }

前端js代码

$(function () {
  /* 查询订单详情 */
  $.ajax({
    url: wxUrl.searchOrderById,
    type: 'post',
    dataType: 'json',
    contentType: 'application/json',
    beforeSend: function (request) {
      request.setRequestHeader('token', localStorage.getItem('token'));
    },
    data: JSON.stringify({
      orderId: 2,
    }),
    success(res) {
      // console.log(res);
      if (res.code == 0) {
        let order = res.order;
        if (order.status === 1) {
          order.status = '未付款';
        } else if (order.status == 2) {
          order.status = '已付款';
        } else if (order.status == 3) {
          order.status = '已发货';
        } else if (order.status == 4) {
          order.status = '已签收';
        }
        let code = order.code;
        let amount = order.amount;
        let status = order.status;
        let date = order.createTime;
        $('#code').text(code);
        $('#status').text(status);
        $('#amount').text(amount);
        $('#pay').text(amount);
        $('#date').text(date);
        $('.pay-btn').attr('data-order-id', order.id);
        if (status == '已付款') {
          $('pay-btn').attr('disabled', true);
          $('.pay-btn').css({
            'background-color': '#666',
          });
        }
      }
    },
  });
  /* 点击付款,使用键盘事件输入付款码的authCode 进行扣款 */
  $('.pay-btn').click(function () {
    $('.pay-btn').attr('disabled', true);
    $('.message').text('扫码中,请不要做其他操作!');
    let authCode = '';
    //给当前页面绑定键盘事件输入authCode
    $(document).bind('keydown', function (event) {
      //authCode输入完成之后,点击回车
      if (event.keyCode == 13) {
        console.log('authCode' + authCode);
        let orderId = $('.pay-btn').data('order-id');
        $.ajax({
          url: wxUrl.scanCodePayOrder,
          type: 'post',
          dataType: 'json',
          contentType: 'application/json',
          beforeSend: function (request) {
            request.setRequestHeader('token', localStorage.getItem('token'));
          },
          data: JSON.stringify({
            orderId: orderId,
            authCode: authCode,
          }),
          success(res) {
            console.log(res);
            if (res.msg == '付款成功') {
              $(document).unbind('keydown');
              $('.message').text('付款成功!');
              setTimeout(() => {
                location.reload();
              }, 1000);
            } else {
              $('.message').text('付款失败!');
            }
          },
        });
        /* 如果让输入密码,则会直接返回支付失败,此时按esc键,重新扫码支付即可,不会重复支付此订单 */
      } else if (event.keyCode == 27) {
        $(document).unbind('keydown');
        $('.message').text('支付设备已经准备好');
        $('.pay-btn').removeAttr('disabled');
      }
      let ch = String.fromCharCode(event.keyCode);
      authCode += ch;
    });
  });
});

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值