手记

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

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

课程章节:4-9 封装主动查询订单支付结果

主讲老师:神思者

课程内容:

今天课程学习的主要知识点内容包括:
为什么需要主动查询、主动查询支付结果的触发时机、主动查询支付结果代码实现。

课程收获:

1、为什么需要主动查询?
因为商户系统不一定会接收到支付通知,原因可能会有多种,比如:
(1)由于网络不稳定或者故障,导致商户系统接收不到支付结果的通知;
(2)如果微信平台出现故障,有可能用户支付成功以后,没有发送支付通知给商户系统;

2、主动查询支付结果的触发时机
(1)应该在什么时机触发主动查询?
当小程序上面支付成功后,则可以向商户系统发出请求,通知商户系统去微信平台查询订单支付的结果。
(2)为了确认该笔支付是确实完成支付了,不能直接用前端传输的结果(因为有伪造的可能),需要后端自动向微信平台进行查询验证,以微信商户的信息为准。

3、主动查询支付结果代码实现
主要核心实现步骤和代码如下:
(1)定义接收类

@Data
@ApiModel(value = "更新订单状态的表单")
public class UpdateOrderStatusForm {
    @ApiModelProperty(value = "订单ID")
    @Min(1)
    private Integer orderId;
}

(2)向微信商户平台发起验证的主要实现逻辑

@Login
@PostMapping("/updateOrderPayStatus")
@ApiOperation("更新商品支付订单状态")
private R updateOrderPayStatus(@RequestBody UpdateOrderStatusForm form, @RequestHeader Map header) {
    ValidatorUtils.validateEntity(form);
    String token = header.get("token").toString();
    int userId = Integer.parseInt(jwtUtils.getClaimByToken(token).getSubject());
    int orderId = form.getOrderId();
    OrderEntity order = orderService.getOne(
            Wrappers.<OrderEntity>lambdaQuery()
                    .eq(OrderEntity::getId, orderId)
                    .eq(OrderEntity::getUserId, userId)
                    .last("limit 1")
    );
    if (null == order) {
        return R.error("用户与订单不匹配");
    }
    try {
        Map map = new HashMap();
        map.put("out_trade_no", order.getCode());
        WXPay wxPay = new WXPay(myWXPayConfig);
        Map<String, String> result = wxPay.orderQuery(map);
        String returnCode = result.get("return_code");
        String resultCode = result.get("result_code");
        String tradeState = result.get("trade_state");
        if ("SUCCESS".equals(returnCode) && "SUCCESS".equals(resultCode) && "SUCCESS".equals(tradeState)) {
            order.setStatus(2);
            order.setPaymentType(1);
            orderService.updateById(order);
            return R.ok("订单状态已修改");
        }
    } catch (Exception e) {
        e.printStackTrace();
        return R.error("查询支付订单失败");
    }
    return R.error("订单状态未修改");
}

0人推荐
随时随地看视频
慕课网APP