欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

java微信支付流程,weixin-java-pay

终极管理员 知识笔记 38阅读

在这篇博客中我们将详细介绍如何在Java应用中集成微信支付V2和V3版本。我们将从微信支付的基本概念开始然后讲解如何在Java中使用微信支付的SDK进行支付操作最后我们将通过一个具体的例子来演示整个过程。

1. 微信支付简介

微信支付是微信平台上的支付功能它为微信用户提供了快捷、安全的支付服务。在Java应用中集成微信支付可以使用户在进行付款操作时有一个更加便捷和安全的支付方式。

微信支付提供了两个版本的接口分别是V2和V3。V2版本是早期的版本它提供了基础的支付功能。V3版本是新的版本它提供了更多的支付功能并且在安全性和性能上都有所提升。

2. 微信支付流程

在开始编程之前我们先来了解一下微信支付的基本流程

用户在商户的应用中选择商品提交订单选择微信支付。商户的应用生成支付订单调用微信支付的统一下单接口将支付订单提交给微信支付。微信支付处理支付订单返回预支付交易会话标识给商户的应用。用户在微信支付页面完成支付操作。微信支付处理用户的支付请求扣除用户的支付金额然后将支付结果通知给商户的应用。商户的应用接收到支付结果通知后确认支付结果然后更新订单状态。 3. 在Java中集成微信支付V2版本

要在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数据。接着我们解密了通知数据然后获取了订单号、微信支付订单号和支付金额。接着我们可以根据业务需要处理订单信息。最后我们返回处理成功的响应给微信支付。

公众号请关注 果酱桑, 一起学习,一起进步!

标签:
声明:无特别说明,转载请标明本文来源!