课程名称: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("订单状态未修改");
}