为了账号安全,请及时绑定邮箱和手机立即绑定
首页 手记 【九月打卡】第14天 Java支付全家桶...

【九月打卡】第14天 Java支付全家桶 企业级各类支付手段一站式解决方案(6-2)

2022.09.18 18:57 36浏览

课程名称:Java支付全家桶 企业级各类支付手段一站式解决方案

主讲老师:神思者

课程内容:

今天课程学习的主要知识点内容包括:
微信官方的付款码规则、收款码付款的表单请求表单参数的设计、编写收款码付款支付的后端接口方法 、使用 Swagger 接口对收款码付款支付进行测试、收款码付款支付失败情况的处理。

课程收获:

1、微信官方的付款码规则:
微信用户付款码条形码规则:18 位的数字,以 10、11、12、13、14、15 开头;

2、收款码付款的表单请求表单参数的设计
编写 ScanCodePayOrderForm.java 类,其主要的核心代码如下:

@Data
@ApiModel(value = "支付订单表单")
public class ScanCodeOrderForm {

    @ApiModelProperty(value = "订单id")
    @NotNull(message = "订单id不能为空")
    private Long orderId;

    @NotBlank(message = "付款吗不能为空")
    @Pattern(regexp = "^1[0-5][0-9]{16}$", message = "付款吗不符合正则表达式")
    private String authCode;

}

3、编写收款码付款支付的后端接口方法
在后端的 controller 层,进行后端扫码支付接口方法的编写,注意这里需要调用的不是创建订单的 unifiedOrder 接口,而是 microPay 接口,因为收款码付款支付的创建订单和支付的接口是一体的。其主要核心代码如下:

@Login
@PostMapping("/scanCodePayOrder")
@ApiModelProperty("收款码付款支付")
public R scanCodePayOrder(@RequestBody ScanCodeOrderForm form, @RequestHeader HashMap header) {
    ValidatorUtils.validateEntity(form);
    String token = header.get("token").toString();
    long userId = Convert.toLong(jwtUtils.getClaimByToken(token).getSubject());
    long orderId = form.getOrderId();
    OrderEntity order = orderService.getOne(
            Wrappers.<OrderEntity>lambdaQuery()
                    .eq(OrderEntity::getId, orderId)
                    .eq(OrderEntity::getUserId, userId)
                    .eq(OrderEntity::getStatus, 1)
    );
    if (null == order) {
        R.error("不是有效订单");
    }
    String amount = Convert.toStr(order.getAmount().multiply(new BigDecimal(100)).intValue());
    // 其他校验
    // 验证购物券是否有效
    // 验证团购活动是否有效
    // 向微信平台发送请求,创建支付订单
    try {
        String code = IdUtil.fastSimpleUUID();
        code = "5b88863eec5f4a3ba09653f00dd08bc4";
        System.out.println(code);
        order.setCode(code);
        orderService.updateById(order);
        WXPay wxPay = new WXPay(myWXPayConfig);
        Map<String, String> map = new HashMap();
        map.put("out_trade_no", code);
        map.put("total_fee", amount);
        map.put("attach", "附加数据-xx分店");
        map.put("body", "订单备注-扫码支付测试");
        map.put("nonce_str", WXPayUtil.generateNonceStr());
        map.put("spbill_create_ip", "127.0.0.1");
        map.put("auth_code", form.getAuthCode());
        Map<String, String> result = wxPay.microPay(map);
        String returnCode = result.get("return_code");
        String resultCode = result.get("result_code");
        if ("SUCCESS".equals(returnCode) && "SUCCESS".equals(resultCode)) {
            String prepayId = result.get("transaction_id");
            order.setCode(code);
            order.setPrepayId(prepayId);
            order.setPaymentType(2);
            order.setStatus(2);
            orderService.updateById(order);
            return R.ok("微信付款成功");
        } else {
            return R.error("微信支付模块故障");
        }
    } catch (Exception e) {
        e.printStackTrace();
        return R.error("微信支付模块故障");
    }
}

4、收款码付款支付失败情况的处理
使用 Swagger 接口对收款码付款支付进行测试,这里有一个重要的注意点是,如果客户在同一段时间内,使用付款码多次进行支付,那么收款码付款支付时候,微信平台会要求客户输入支付密码,在等待客户输入支付密码的过程中,微信侧是不会出于阻塞状态的,而是会直接放回支付失败给商户平台。
遇到这种情况时,在客户输入密码完成支付后,可以再次对同一个订单(code一致)发起收款码付款支付请求,此时微信发现这订单已经支付成功,会返回支付成功的结果,不会重复扣款(见下图2和图3,图2失败,图3成功)。

点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
手记
粉丝
0
获赞与收藏
7

关注TA,一起探索更多经验知识

同主题相似文章浏览排行榜

风间影月说签约讲师

50篇手记,涉及Java、MySQL、Redis、Spring等方向

进入讨论

Tony Bai 说签约讲师

146篇手记,涉及Go、C、Java、Python等方向

进入讨论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消