forked from chanjarster/weixin-java-tools
-
-
Notifications
You must be signed in to change notification settings - Fork 8.5k
微信支付
Binary Wang edited this page Aug 28, 2019
·
32 revisions
本文中提到的接口和未提到的其他接口的使用方法,都还可以参考微信支付Demo项目
- 首先,在项目pom中使用maven引入依赖(自己可以替换更新版本)
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>xxxx</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(###注意:需要根据自己业务需要实现Result类###) pay(HttpServletRequest request, String orderNo, String subject) {
try {
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setBody("主题");
orderRequest.setOutTradeNo("订单号");
orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(order.getTotalFee()));//元转成分
orderRequest.setOpenid("openId");
orderRequest.setSpbillCreateIp("userIp");
orderRequest.setTimeStart("yyyyMMddHHmmss");
orderRequest.setTimeExpire("yyyyMMddHHmmss");
return Result.ok(wxPayService.createOrder(orderRequest));
} catch (Exception e) {
log.error("微信支付失败!订单号:{},原因:{}", orderNo, e.getMessage());
e.printStackTrace();
return Result.fail("支付失败,请稍后重试!");
}
}
- 订单支付完成之后异步回调代码如下:
- 异步回调接口代码内部会自动校验签名,您需要做的就是拿到结果之后直接根据业务逻辑进行处理就行了;
- 需要处理下异常信息;
- 回调返回接口可以直接使用WxPayNotifyResponse 返回处理成功,还是失败!
@ResponseBody
@RequestMapping("/wx")
public String payNotify(HttpServletRequest request, HttpServletResponse response) {
try {
String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(xmlResult);
// 加入自己处理订单的业务逻辑,需要判断订单是否已经支付过,否则可能会重复调用
String orderId = result.getOutTradeNo();
String tradeNo = result.getTransactionId();
String totalFee = BaseWxPayResult.fenToYuan(result.getTotalFee());
return WxPayNotifyResponse.success("处理成功!");
} catch (Exception e) {
log.error("微信回调结果异常,异常原因{}", e.getMessage());
return WxPayNotifyResponse.fail(e.getMessage());
}
}
String encType = request.getParameter("encrypt_type");
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
String msgSignature = request.getParameter("msg_signature");
String signature = request.getParameter("signature");
String openid = request.getParameter("openid");
log.info("接收微信请求:[openid=[{}], [openid=[{}],[signature=[{}], encType=[{}], msgSignature=[{}],"
+ " timestamp=[{}], nonce=[{}], requestBody=[{}] ",
appid, openid, signature, encType, msgSignature, timestamp, nonce, requestBody);
// 请求里面没有对应信息。 // if (!this.wxMpService.switchover(appid)) { //appid // throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid)); // }
if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
}
return ResponseEntity.ok("");