微信支付 - 支付中心回调通知

    科技2025-02-09  19

    /** * 支付成功后的微信支付异步通知 */ @RequestMapping(value="/wxpay") public void wxpay(HttpServletRequest request, HttpServletResponse response) throws Exception { log.info("支付成功后的微信支付异步通知"); // 获取微信支付结果 PayResult payResult = wxOrderService.getWxPayResult(request.getInputStream()); boolean isPaid = payResult.getReturn_code().equals("SUCCESS") ? true : false; // 查询该笔订单在微信那边是否成功支付 // 支付成功,商户处理后同步返回给微信参数 PrintWriter writer = response.getWriter(); if (isPaid) { String merchantOrderId = payResult.getOut_trade_no(); // 商户订单号 String wxFlowId = payResult.getTransaction_id(); Integer paidAmount = payResult.getTotal_fee(); // System.out.println("================================= 支付成功 ================================="); // ====================== 操作商户自己的业务,比如修改订单状态等 start ========================== String merchantReturnUrl = paymentOrderService.updateOrderPaid(merchantOrderId, paidAmount); // ============================================ 业务结束, end ================================== log.info("************* 支付成功(微信支付异步通知) - 时间: {} *************", DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN)); log.info("* 商户订单号: {}", merchantOrderId); log.info("* 微信订单号: {}", wxFlowId); log.info("* 实际支付金额: {}", paidAmount); log.info("*****************************************************************************"); // 通知天天吃货服务端订单已支付 // String url = "http://192.168.1.2:8088/orders/notifyMerchantOrderPaid"; MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>(); requestEntity.add("merchantOrderId", merchantOrderId); String httpStatus = restTemplate.postForObject(merchantReturnUrl, requestEntity, String.class); log.info("*** 通知天天吃货后返回的状态码 httpStatus: {} ***", httpStatus); // 通知微信已经收到消息,不要再给我发消息了,否则微信会10连击调用本接口 String noticeStr = setXML("SUCCESS", ""); writer.write(noticeStr); writer.flush(); } else { System.out.println("================================= 支付失败 ================================="); // 支付失败 String noticeStr = setXML("FAIL", ""); writer.write(noticeStr); writer.flush(); } } /** * @Description: 支付结果封装类 */ public class PayResult { private String return_code; // 返回状态码 private String appid; // 公众账号ID private String mch_id; // 商户号 private String nonce_str; // 随机字符串 private String sign; // 签名 private String result_code; // 业务结果 private String openid; // 用户标识 private String trade_type; // 交易类型 private String bank_type; // 付款银行 private int total_fee; // 总金额 private int cash_fee; // 现金支付金额 private String transaction_id; // 微信支付订单号 private String out_trade_no; // 商户订单号 private String time_end; // 支付完成时间 private String return_msg; // 返回信息 private String device_info; // 设备号 private String err_code; // 错误代码 private String err_code_des; // 错误代码描述 private String is_subscribe; // 是否关注公众账号 private String fee_type; // 货币种类 private String cash_fee_type; // 现金支付货币类型 private String coupon_fee; // 代金券或立减优惠金额 private String coupon_count; // 代金券或立减优惠使用数量 private String coupon_id_$n; // 代金券或立减优惠ID private String coupon_fee_$n; // 单个代金券或立减优惠支付金额 private String attach; // 商家数据包 } @Transactional(propagation=Propagation.REQUIRED) @Override public String updateOrderPaid(String merchantOrderId, Integer paidAmount) { Example example = new Example(Orders.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("merchantOrderId", merchantOrderId); Orders paidOrder = new Orders(); paidOrder.setPayStatus(PaymentStatus.PAID.type); paidOrder.setAmount(paidAmount); int result = ordersMapper.updateByExampleSelective(paidOrder, example); return queryMerchantReturnUrl(merchantOrderId); } /** * @Description: 支付中心的支付状态 10:未支付 20:已支付 30:支付失败 40:已退款 */ public enum PaymentStatus { WAIT_PAY(10, "未支付"), PAID(20, "已支付"), PAY_FAILED(30, "支付失败"), SUCCESS(40, "已退款"); public final Integer type; public final String value; PaymentStatus(Integer type, String value){ this.type = type; this.value = value; } } @PostMapping("notifyMerchantOrderPaid") public Integer notifyMerchantOrderPaid(String merchantOrderId) { orderService.updateOrderStatus(merchantOrderId, OrderStatusEnum.WAIT_DELIVER.type); return HttpStatus.OK.value(); }

     

    Processed: 0.012, SQL: 8