在这篇博客中,我们将详细介绍如何在Java应用中集成微信支付V2和V3版本。我们将从微信支付的基本概念开始,然后讲解如何在Java中使用微信支付的SDK进行支付操作,最后我们将通过一个具体的例子来演示整个过程。
微信支付是微信平台上的支付功能,它为微信用户提供了快捷、安全的支付服务。在Java应用中集成微信支付,可以使用户在进行付款操作时,有一个更加便捷和安全的支付方式。
微信支付提供了两个版本的接口,分别是V2和V3。V2版本是早期的版本,它提供了基础的支付功能。V3版本是新的版本,它提供了更多的支付功能,并且在安全性和性能上都有所提升。
在开始编程之前,我们先来了解一下微信支付的基本流程:
要在Java中集成微信支付V2版本,我们需要先在微信支付商户平台注册一个商户账号,然后创建一个应用,获取应用的APPID、商户号和商户秘钥。
然后,我们需要在项目中添加微信支付的Java SDK依赖:
com.github.binarywang
wxpay-sdk
1.0.0
有了这些准备工作,我们就可以开始编程了。
首先,我们需要生成一个支付订单。支付订单是一个包含了订单信息的字符串,我们需要将它传递给微信支付的统一下单接口。
WxPayService wxPayService = new WxPayServiceImpl();
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(APP_ID);
payConfig.setMchId(MCH_ID);
payConfig.setMchKey(MCH_KEY);
wxPayService.setConfig(payConfig);
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setBody("商品描述");
orderRequest.setOutTradeNo("1234567890");
orderRequest.setTotalFee(100);
orderRequest.setSpbillCreateIp("123.12.12.123");
orderRequest.setNotifyUrl("http://localhost:8080/notifyUrl");
orderRequest.setTradeType("NATIVE");
WxPayUnifiedOrderResult orderResult = wxPayService.unifiedOrder(orderRequest);
String codeUrl = orderResult.getCodeURL();
在这个例子中,我们首先创建了一个WxPayService实例,然后设置了应用的APPID、商户号和商户秘钥。接着,我们创建了一个WxPayUnifiedOrderRequest,设置了商品描述、订单号、总金额、终端IP、通知URL和交易类型。最后,我们调用WxPayService的unifiedOrder方法生成支付订单,获取到预支付交易会话标识。
当用户完成支付操作后,微信支付会将支付结果通过通知URL发送给商户的应用。我们需要在通知URL对应的接口中接收并处理这个通知。
@PostMapping("/notifyUrl")
public String handleNotify(@RequestBody String xmlData) throws Exception {
final WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
// 结果正确
String orderId = notifyResult.getOutTradeNo();
String tradeNo = notifyResult.getTransactionId();
BigDecimal amount = notifyResult.getTotalFee() != null ? new BigDecimal(notifyResult.getTotalFee()).divide(new BigDecimal(100)) : BigDecimal.ZERO;
// 根据业务需要处理订单信息......
return WxPayNotifyResponse.success("处理成功!");
}
在这个例子中,我们首先解析了微信支付通知的XML数据,然后获取了订单号、微信支付订单号和支付金额。接着,我们可以根据业务需要处理订单信息。最后,我们返回处理成功的响应给微信支付。
微信支付V3版本的接口在设计上更加规范和统一,而且提供了更多的支付功能。在Java中集成微信支付V3版本,我们需要在微信支付商户平台注册一个商户账号,然后创建一个应用,获取应用的APPID、商户号和APIv3秘钥。
微信支付V3版本的SDK依赖如下:
com.wechat.pay
wechatpay-apache-httpclient
0.2.3
生成支付订单的过程和V2版本类似,只是在调用统一下单接口时,我们需要使用V3版本的接口,并且需要设置APIv3秘钥。
// 创建微信支付配置
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(MCH_ID, SERIAL_NO, getPrivateKey())
.withValidator(new WechatPay2Validator(new Verifier() {
@Override
public boolean verify(String serialNumber, byte[] message, String signature) {
// 这里需要实现你的证书验证逻辑
return true;
}
}));
HttpClient httpClient = builder.build();
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/native");
httpPost.addHeader("Accept", "application/json");
httpPost.addHeader("Content-Type", "application/json");
// 创建订单请求体
JSONObject jsonObject = new JSONObject();
jsonObject.put("appid", APP_ID);
jsonObject.put("mchid", MCH_ID);
jsonObject.put("description", "商品描述");
jsonObject.put("out_trade_no", "1234567890");
jsonObject.put("notify_url", "http://localhost:8080/notifyUrl");
jsonObject.put("amount", new JSONObject().fluentPut("total", 100).fluentPut("currency", "CNY"));
StringEntity stringEntity = new StringEntity(jsonObject.toString(), "UTF-8");
httpPost.setEntity(stringEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
String responseString = EntityUtils.toString(httpResponse.getEntity());
JSONObject responseJson = JSONObject.parseObject(responseString);
String codeUrl = responseJson.getString("code_url");
在这个例子中,我们首先创建了一个HttpClient实例,然后设置了应用的APPID、商户号、APIv3秘钥和证书验证逻辑。接着,我们创建了一个HttpPost实例,设置了接口地址和请求头。然后,我们创建了一个订单请求体,设置了商品描述、订单号、通知URL和金额。最后,我们调用HttpClient的execute方法发送请求,获取到预支付交易会话标识。
接收支付结果通知的过程和V2版本类似,只是在解析通知数据时,我们需要使用V3版本的接口,并且需要验证签名。
@PostMapping("/notifyUrl")
public String handleNotify(@RequestBody String jsonStr) throws Exception {
AesUtil aesUtil = new AesUtil(API_V3_KEY.getBytes(StandardCharsets.UTF_8));
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
String resource = jsonObject.getString("resource");
String cipherText = JSONObject.parseObject(resource).getString("ciphertext");
String originalJsonStr = aesUtil.decryptToString(Base64.decodeBase64(cipherText));
JSONObject originalJsonObject = JSONObject.parseObject(originalJsonStr);
String orderId = originalJsonObject.getString("out_trade_no");
String tradeNo = originalJsonObject.getString("transaction_id");
BigDecimal amount = originalJsonObject.getJSONObject("amount").getBigDecimal("total");
// 根据业务需要处理订单信息......
return "SUCCESS";
}
在这个例子中,我们首先创建了一个AesUtil实例,然后解析了微信支付通知的JSON数据。接着,我们解密了通知数据,然后获取了订单号、微信支付订单号和支付金额。接着,我们可以根据业务需要处理订单信息。最后,我们返回处理成功的响应给微信支付。
公众号请关注 "果酱桑", 一起学习,一起进步!