Java处理微信H5支付回调

微信支付是一种常见的支付方式,它可以在网页上完成支付操作。当用户完成支付后,微信会向服务器发送一个回调通知,通知服务器支付结果。本文将介绍如何使用Java处理微信H5支付回调的流程及示例代码。

流程图

flowchart TD
    A[接收回调通知] --> B[验证签名]
    B --> C{验证结果}
    C -->|验证成功| D[解析参数]
    C -->|验证失败| E[返回失败信息]
    D --> F{处理业务逻辑}
    F -->|成功| G[返回成功信息]
    F -->|失败| H[返回失败信息]

步骤

  1. 接收回调通知:服务器需要提供一个接口,用于接收微信支付的回调通知。可以使用Spring MVC等框架提供的功能来接收HTTP请求,并将请求参数传递给后续的处理方法。

  2. 验证签名:微信支付回调通知中包含了一个签名字段,用于验证回调通知的合法性。服务器需要使用微信支付配置中的密钥对回调通知进行验证,确保通知的来源是可信的。

/**
 * 验证签名
 * @param params 回调通知参数
 * @return 验证结果
 */
public boolean verifySign(Map<String, String> params) {
    // 从参数中获取签名字段和其他字段
    String sign = params.get("sign");
    // 省略其他字段获取过程

    // 构建签名字符串
    StringBuilder sb = new StringBuilder();
    // 将其他字段按照字典顺序排序并拼接
    // 省略拼接过程

    // 使用微信支付配置中的密钥对签名字符串进行加密
    String encryptedSign = encryptSign(sb.toString());

    // 将加密后的签名与回调通知中的签名进行比较
    return encryptedSign.equals(sign);
}
  1. 验证结果:根据验证签名的结果,判断回调通知是否合法。如果签名验证成功,则可以继续处理回调通知;如果签名验证失败,则需要返回失败信息给微信支付。

  2. 解析参数:将回调通知中的参数进行解析,获取支付结果以及其他相关信息。可以使用第三方库如org.json.JSONObject来解析JSON字符串。

    /**
     * 解析参数
     * @param params 回调通知参数
     * @return 支付结果对象
     */
    public PayResult parseParams(Map<String, String> params) {
        // 从参数中获取支付结果和其他字段
        String result = params.get("result");
        // 省略其他字段获取过程
    
        // 解析支付结果
        JSONObject jsonResult = new JSONObject(result);
        // 省略解析过程
    
        // 构建支付结果对象
        PayResult payResult = new PayResult();
        // 设置支付结果和其他相关字段
        // 省略设置过程
    
        return payResult;
    }
    
  3. 处理业务逻辑:根据支付结果进行相应的业务处理,如更新订单状态、发送通知等。

  4. 返回结果:根据业务逻辑的处理结果,返回响应给微信支付。成功的情况下返回成功信息,失败的情况下返回失败信息。

示例代码

下面是一个简单的示例代码,演示了如何使用Java处理微信H5支付回调。

@RestController
public class PayCallbackController {

    @PostMapping("/pay/callback")
    public String payCallback(@RequestBody Map<String, String> params) {
        // 验证签名
        if (!verifySign(params)) {
            return "fail";
        }

        // 解析参数
        PayResult payResult = parseParams(params);

        // 处理业务逻辑
        // 省略实际的业务处理过程

        // 返回结果
        if (payResult.isSuccess()) {
            return "success";
        } else {
            return "fail";
        }
    }

    private boolean verifySign(Map<String, String> params) {
        // 验证签名的逻辑
        // 省略具体实现
    }

    private PayResult parseParams(Map<String, String> params) {
        // 解析参数的逻辑
        // 省略具体实