关键词

详解APP微信支付(java后台_统一下单和回调)

详解APP微信支付(java后台_统一下单和回调)

一、前言

在移动APP中,使用微信支付功能是非常常见的需求,而且使用微信支付也是比较方便和快捷的。本文将详细介绍如何在Java后台中实现微信支付的功能。主要包括两部分:统一下单和回调。本文介绍的支付接口都是官方的API接口,并采用了最新的V3版本。

二、统一下单

下单接口是微信支付功能的核心,接口名称为:https://api.mch.weixin.qq.com/v3/pay/transactions/app 。调用下单接口需要提供一些必填参数,如下:

{
    "amount": {
        "currency": "CNY",
        "total": 1
    },
    "appid": "wx8888888888888888",
    "mchid": "1234567890",
    "description": "商品描述",
    "notify_url": "https://www.example.com",
    "out_trade_no": "1217752501201407033233368018",
    "attach": "附加数据"
}

其中,参数amount表示支付金额,appid表示应用ID,mchid表示微信商户号,notify_url表示支付结果回调通知URL。

下面是一个完整的统一下单接口的Java实现示例:

PublicKey opensslPublicKey = WxPayUtils.loadPublicKey("wechatpay_certificate.pem");
PrivateKey merchantPrivateKey = WxPayUtils.loadPrivateKey("merchant_private_key.pem");

//准备请求体
JsonObject requestBody = new JsonObject();
requestBody.addProperty("appid", WXPayConfig.APP_ID);
requestBody.addProperty("mchid", WXPayConfig.MCH_ID);
requestBody.addProperty("description", "Test Product");
requestBody.addProperty("out_trade_no", "20150806125346");
requestBody.addProperty("notify_url", "https://www.example.com");
requestBody.addProperty("amount", getAmountJson());
requestBody.addProperty("attach", "This is attachment");

//构建请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

//签名
headers.set("Authorization", WxPayUtils.getAuthorizationHeaderValue(requestBody.toString(), merchantPrivateKey));

//发送请求
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
ResponseEntity<String> response = restTemplate.exchange(WXPayConfig.UNIFIED_ORDER_API, HttpMethod.POST, new HttpEntity<>(requestBody.toString(), headers), String.class);

三、回调

回调是支付完成后必须要处理的事情,否则无法保证交易的安全性。回调通知分为两种类型:支付成功通知和退款成功通知。本文只介绍支付成功通知的处理。回调通知将通过notify_url参数中指定的URL地址通知到后台。下面是一个完整的回调处理的Java实现示例:

@PostMapping(value = "/pay/notify", headers = {"Content-Type=application/xml"})
@ResponseBody
public WxPayNotifyResponse notify(@RequestBody String requestBody, HttpServletRequest request) {
  //获取请求头签名
  String authorization = request.getHeader("Authorization");

  //验证签名
  if (!WxPayUtils.verifySignature(requestBody.getBytes(), authorization, WxPayUtils.loadPublicKey("wechatpay_certificate.pem"))) {
    //签名不一致,直接返回失败
    return WxPayNotifyResponse.fail("Signature verification failed");
  }

  //将XML转成Java对象
  WxPayNotifyRequest payNotify = WxPayUtils.convertXmlToObject(requestBody, WxPayNotifyRequest.class);

  //检查支付状态
  if ("SUCCESS".equals(payNotify.getResultCode())) {
    //支付成功
    //TODO:  处理业务逻辑,例如更新订单状态等
    return WxPayNotifyResponse.success();
  } else {
    //支付失败
    return WxPayNotifyResponse.fail(payNotify.getReturnMsg());
  }
}

至此,本文介绍的微信支付的统一下单和回调的Java实现就完成了。实际的开发中,还需要处理一些异常情况,例如请求失败、网络超时等,需要根据实际情况进行处理。

本文链接:http://task.lmcjl.com/news/7958.html

展开阅读全文