/**
* 支付成功后的微信支付异步通知
*/
@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();
}