Skip to content
Binary Wang edited this page Feb 20, 2017 · 32 revisions

使用老版本的,请注意,WxPayJsSDKCallback类已被WxPayOrderNotifyResult所替代


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

  1. 首先获取微信支付服务类,方式如下:
   WxMpPayService payService = wxMpService.getPayService();

2.在WxMpPayService接口中定义了微信支付相关的接口,具体的接口参见代码详细;

3.微信统一下单接口使用方式如下(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("支付失败,请稍后重试!");
		}
	}

4.订单支付完成之后异步回调代码如下:

  • 异步回调接口代码内部会自动校验结果签名和业务代码,您需要做的就是拿到结果之后直接处理就行了;
  • 需要处理下异常信息;
  • 回调返回接口可以直接使用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