在移动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