实现 Java 小程序微信支付回调通知

微信支付是一个十分常用的支付解决方案,尤其是在小程序中实现在线支付功能时。为了确保支付成功后,我们能及时收到并处理相关的通知,回调通知机制必不可少。本文将详细地带你实现 Java 小程序的微信支付回调通知流程。

一、流程概述

在深入理解如何实现之前,首先让我们了解一下整个流程。以下是支付流程的步骤:

步骤 描述
1 用户在小程序中发起支付请求。
2 调用微信支付接口,生成预支付订单。
3 用户完成支付,微信支付系统向我们的服务器发送回调通知。
4 服务器处理回调通知,验证支付结果并记录订单状态。
5 服务器返回响应,告知微信处理结果。

二、每一步的详细实现

接下来,我们将逐步实现每一个步骤,尤其是重点在第三步回调通知的处理。

1. 用户发起支付请求

这一步通常在小程序的前端实现,这里就不详细讨论了。确保这一步能产生一个有效的prepay_id

2. 调用微信支付接口生成预支付订单

这里的请求需要配置一些参数如商户号、商品描述、随机字符串等。以下是一个示例代码片段:

// 微信支付接口请求示例
String url = "
Map<String, String> params = new HashMap<>();
params.put("appid", "YOUR_APP_ID"); // 小程序的APP ID
params.put("mch_id", "YOUR_MCH_ID"); // 商户号
params.put("nonce_str", UUID.randomUUID().toString().replace("-", "")); // 随机字符串
params.put("body", "商品描述");
params.put("out_trade_no", "YOUR_ORDER_NO"); // 商户订单号
params.put("total_fee", "1"); // 总金额 (单位: 分)
params.put("spbill_create_ip", "USER_IP"); // 用户IP
params.put("notify_url", "YOUR_NOTIFY_URL"); // 支付成功后的回调地址
params.put("trade_type", "JSAPI"); // 交易类型

// 这里需要生成签名,将params按接口文档的要求生成签名,并添加到params中
String sign = createSign(params);
params.put("sign", sign);

// 将params转换为XML格式并发送POST请求
String xmlParams = mapToXml(params);
String response = HttpUtil.post(url, xmlParams);

3. 处理微信支付回调通知

当用户完成支付后,微信会以HTTP POST的方式将支付结果的通知发送到我们设置的 notify_url。我们需要实现一个接口来处理这个通知。

// 创建一个处理回调的接口
@RequestMapping(value = "/wxpay/notify", method = RequestMethod.POST)
@ResponseBody
public String weChatPayNotify(HttpServletRequest request) {
    // 解析请求体,获取支付结果
    String xmlData = getRequestBody(request);
    Map<String, String> resultMap = xmlToMap(xmlData);

    // 合法性校验
    if (verifySign(resultMap)) {
        String orderNo = resultMap.get("out_trade_no");
        String paymentStatus = resultMap.get("result_code");

        if ("SUCCESS".equals(paymentStatus)) {
            // 处理服务逻辑,例如更新数据库订单状态
            updateOrderStatus(orderNo, "PAID");
            return "<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>";
        }
    }
    return "<xml><return_code>FAIL</return_code><return_msg>ERROR</return_msg></xml>";
}

4. 验证支付结果并记录订单状态

在处理完回调后,我们需要更新数据库中的订单状态。示例代码如下:

public void updateOrderStatus(String orderNo, String status) {
    // 连接数据库并更新订单状态的逻辑
    String sql = "UPDATE orders SET status = ? WHERE order_no = ?";
    jdbcTemplate.update(sql, status, orderNo); // 使用Spring的JdbcTemplate进行数据库操作
}

5. 服务器返回响应

如上面代码所示,我们在回调处理完毕后返回给微信的结果,确保使用微信支付接口要求的返回格式。

三、类图

下面是一个简易的类图,展示了主要类之间的关系。

classDiagram
    class WxPayController {
        +weChatPayNotify(HttpServletRequest request)
    }
    
    class OrderService {
        +updateOrderStatus(String orderNo, String status)
    }
    
    WxPayController --> OrderService : uses

结尾

以上就是实现 Java 小程序微信支付回调通知的完整过程。从用户发起支付请求到处理回调通知,每一步都至关重要,希望通过这篇文章你能够掌握这个流程。在实际开发中,你还需要考虑各种异常和错误处理,确保支付的安全性和可靠性。如果还有任何疑问,请随时向我提问!