在发起支付之前,后台会生成商户订单,调用统一下单API,得到预支付信息。
我是使用的是这个SDK
com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; //统一下单返回结果类
com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest //统一下单所需参数类
/**
* 发起与支付
* 调用统一下单接口,获取“预支付交易会话标识”
*/
@PostMapping("/unifiedOrder")
public ModelAndView unifiedOrder(@RequestBody String orderId,
@RequestBody HttpServletRequest request,
Map<String, Object>map) throws WxPayException {
OrderDTO orderDTO = orderService.findOne(orderId); //OrderDTO为自定义的订单信息类
WxPayUnifiedOrderRequest orderRequest = payService.create(orderDTO, request);
WxPayUnifiedOrderResult orderResult = wxPayService.unifiedOrder(orderRequest); //调用统一下单接口
map.put("orderRequest", orderRequest);
map.put("orderResult", orderResult);
map.put("timeStamp", payUtil.getTimeStamp());
map.put("nonceStr", payUtil.getNonceStr());
return new ModelAndView("pay/unifiedOrder", map); //用到了参数动态注入,将参数传给wx.requestPayment{},之后会讲
}
public WxPayUnifiedOrderRequest create(OrderDTO orderDTO, HttpServletRequest request) {
try {
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); //商户订单类
orderRequest.setBody("微信支付");
orderRequest.setOpenid(orderDTO.getBuyerOpenId());
//元转成分
orderRequest.setTotalFee(PriceUtil.yuanToFee(orderDTO.getOrderAmount())); //注意:传入的金额参数单位为分
//outTradeNo 订单号
orderRequest.setOutTradeNo(orderDTO.getOrderId());
//tradeType 支付方式
orderRequest.setTradeType(PayTypeEnum.WX_PAY.getMsg());
//用户IP地址
orderRequest.setSpbillCreateIp(IpUtil.getIP(request));
return wxPayService.createOrder(orderRequest);
} catch (Exception e) {
log.error("【微信支付】支付失败 订单号={} 原因={}", orderDTO.getOrderId(), e.getMessage());
e.printStackTrace();
return null;
}
}