Skip to content
Binary Wang edited this page Aug 29, 2017 · 32 revisions

使用老版本的,请注意,WxPayJsSDKCallback类已被WxPayOrderNotifyResult所替代。 另外,各种接口使用方法可以参考微信支付Demo项目


这里重点说下微信JSSDK支付与回调,其他接口使用方式类似,可以自行研究。

  1. 首先,在项目pom中使用maven引入依赖(自己可以替换更新版本)
<dependency>
  <groupId>com.github.binarywang</groupId>
  <artifactId>weixin-java-pay</artifactId>
  <version>2.7.8</version>
</dependency>
  1. 配置config类,并构建微信支付服务类,方式如下:
   WxPayConfig payConfig = new WxPayConfig();
   ....
   WxPayService wxPayService = new WxPayServiceImpl();
   wxPayService.setConfig(payConfig);
  1. 在WxPayService接口中定义了微信支付相关的接口,具体的接口参见代码详细;

  2. 微信统一下单接口使用方式如下(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());
	}
}
Clone this wiki locally