java微信支付流程,weixin-java-pay
终极管理员 知识笔记 38阅读
在这篇博客中我们将详细介绍如何在Java应用中集成微信支付V2和V3版本。我们将从微信支付的基本概念开始然后讲解如何在Java中使用微信支付的SDK进行支付操作最后我们将通过一个具体的例子来演示整个过程。
1. 微信支付简介微信支付是微信平台上的支付功能它为微信用户提供了快捷、安全的支付服务。在Java应用中集成微信支付可以使用户在进行付款操作时有一个更加便捷和安全的支付方式。

微信支付提供了两个版本的接口分别是V2和V3。V2版本是早期的版本它提供了基础的支付功能。V3版本是新的版本它提供了更多的支付功能并且在安全性和性能上都有所提升。
2. 微信支付流程在开始编程之前我们先来了解一下微信支付的基本流程

要在Java中集成微信支付V2版本我们需要先在微信支付商户平台注册一个商户账号然后创建一个应用获取应用的APPID、商户号和商户秘钥。
然后我们需要在项目中添加微信支付的Java SDK依赖
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>wxpay-sdk</artifactId> <version>1.0.0</version></dependency>
有了这些准备工作我们就可以开始编程了。
3.1 生成支付订单首先我们需要生成一个支付订单。支付订单是一个包含了订单信息的字符串我们需要将它传递给微信支付的统一下单接口。
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( orderResult wxPayService.unifiedOrder(orderRequest);String codeUrl orderResult.getCodeURL();
在这个例子中我们首先创建了一个WxPayService实例然后设置了应用的APPID、商户号和商户秘钥。接着我们创建了一个WxPayUnifiedOrderRequest设置了商品描述、订单号、总金额、终端IP、通知URL和交易类型。最后我们调用WxPayService的unifiedOrder方法生成支付订单获取到预支付交易会话标识。
3.2 接收支付结果通知当用户完成支付操作后微信支付会将支付结果通过通知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数据然后获取了订单号、微信支付订单号和支付金额。接着我们可以根据业务需要处理订单信息。最后我们返回处理成功的响应给微信支付。
4. 在Java中集成微信支付V3版本微信支付V3版本的接口在设计上更加规范和统一而且提供了更多的支付功能。在Java中集成微信支付V3版本我们需要在微信支付商户平台注册一个商户账号然后创建一个应用获取应用的APPID、商户号和APIv3秘钥。
微信支付V3版本的SDK依赖如下
<dependency> <groupId>com.wechat.pay</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>0.2.3</version></dependency>
4.1 生成支付订单 生成支付订单的过程和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( 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, 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方法发送请求获取到预支付交易会话标识。
4.2 接收支付结果通知接收支付结果通知的过程和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数据。接着我们解密了通知数据然后获取了订单号、微信支付订单号和支付金额。接着我们可以根据业务需要处理订单信息。最后我们返回处理成功的响应给微信支付。
公众号请关注 果酱桑, 一起学习,一起进步!