Java集成微信支付流程

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

1. 微信支付简介

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

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

2. 微信支付流程

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

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

3. 在Java中集成微信支付V2版本

要在Java中集成微信支付V2版本,我们需要先在微信支付商户平台注册一个商户账号,然后创建一个应用,获取应用的APPID、商户号和商户秘钥。

然后,我们需要在项目中添加微信支付的Java SDK依赖:


    com.github.binarywang
    wxpay-sdk
    1.0.0

有了这些准备工作,我们就可以开始编程了。

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("http://localhost:8080/notifyUrl");
orderRequest.setTradeType("NATIVE");

WxPayUnifiedOrderResult 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依赖如下:


    com.wechat.pay
    wechatpay-apache-httpclient
    0.2.3

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("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方法发送请求,获取到预支付交易会话标识。

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

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

你可能感兴趣的:(果酱紫,java,微信支付,java)