-
-
Notifications
You must be signed in to change notification settings - Fork 8.8k
微信支付
Binary Wang edited this page Aug 29, 2017
·
32 revisions
使用老版本的,请注意,WxPayJsSDKCallback类已被WxPayOrderNotifyResult所替代。 另外,各种接口使用方法可以参考微信支付Demo项目
- 首先,在项目pom中使用maven引入依赖(自己可以替换更新版本)
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>2.7.8</version>
</dependency>
- 配置config类,并构建微信支付服务类,方式如下:
WxPayConfig payConfig = new WxPayConfig();
....
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
-
在WxPayService接口中定义了微信支付相关的接口,具体的接口参见代码详细;
-
微信统一下单接口使用方式如下(Spring MVC 示例):
- 代码中Result为自定义返回对象,WxPayUnifiedOrderRequest 中还有一些参数会根据配置文件的配置自动填充,不需要单独设置,例如:appId、partnerId、notifyURL、tradeType等参数。
- 订单创建成功之后会自动调用校验方法,校验微信返回的结果。例如校验签名,校验返回的业务代码是否正常。所以代码中不需要手动校验订单创建结果,只需要处理下异常情况即可!
@ResponseBody
@RequestMapping(value = "wxpay")
public Result pay(HttpServletRequest request, String orderNo, String subject) {
try {
Order order = OrderService.findOne(orderNo);
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setBody("主题");
orderRequest.setOutTradeNo("订单号");
orderRequest.setTotalFee(WxPayBaseRequest.yuanToFee(order.getTotalFee()));//元转成分
orderRequest.setOpenid("openId");
orderRequest.setSpbillCreateIp("userIp");
orderRequest.setTimeStart("yyyyMMddHHmmss");
orderRequest.setTimeExpire("yyyyMMddHHmmss");
WxMpPayService wxMpPayService = wxMpService.getPayService();
return Result.ok(wxMpPayService.getPayInfo(orderRequest));
} catch (Exception e) {
log.error("微信支付失败!订单号:{},原因:{}", orderNo, e.getMessage());
e.printStackTrace();
return Result.fail("支付失败,请稍后重试!");
}
}
5.订单支付完成之后异步回调代码如下:
- 异步回调接口代码内部会自动校验结果签名和业务代码,您需要做的就是拿到结果之后直接处理就行了;
- 需要处理下异常信息;
- 回调返回接口可以直接使用WxPayOrderNotifyResponse 返回处理成功,还是失败!
@ResponseBody
@RequestMapping("/wx")
public String payNotify(HttpServletRequest request, HttpServletResponse response) {
WxMpPayService wxMpPayService = wxMpService.getPayService();
try {
String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
WxPayOrderNotifyResult result = wxMpPayService.getOrderNotifyResult(xmlResult);
// 结果正确
String orderId = result.getOutTradeNo();
String tradeNo = result.getTransactionId();
String totalFee = WxPayBaseResult.feeToYuan(result.getTotalFee());
//自己处理订单的业务逻辑,需要判断订单是否已经支付过,否则可能会重复调用
return WxPayOrderNotifyResponse.success("处理成功!");
} catch (Exception e) {
log.error("微信回调结果异常,异常原因{}", e.getMessage());
return WxPayOrderNotifyResponse.fail(e.getMessage());
}
}