Java微信验签实现流程

流程图

flowchart TD
    A[开始] --> B[获取微信支付回调参数]
    B --> C[验证签名]
    C --> D{验签结果}
    D --> |验证成功| E[执行业务逻辑]
    D --> |验证失败| F[返回验签失败]
    E --> G[返回验签成功]
    F --> G
    G --> H[结束]

1. 获取微信支付回调参数

在Java中,我们可以通过使用HttpServletRequest对象来获取微信支付回调时的参数。具体实现如下所示:

HttpServletRequest request = ...; // 获取HttpServletRequest对象

String transactionId = request.getParameter("transaction_id"); // 获取微信支付订单号
String outTradeNo = request.getParameter("out_trade_no"); // 获取商户订单号
String totalFee = request.getParameter("total_fee"); // 获取订单金额
// 其他参数根据实际情况获取

2. 验证签名

微信支付回调时会将相关参数以及签名一并发送过来,我们需要通过校验签名来确保数据的完整性和准确性。具体实现如下:

String sign = request.getParameter("sign"); // 获取微信支付回调的签名

// 根据微信支付回调参数构建待签名字符串
SortedMap<String, String> paramMap = new TreeMap<>();
paramMap.put("transaction_id", transactionId);
paramMap.put("out_trade_no", outTradeNo);
paramMap.put("total_fee", totalFee);
// 其他参数根据实际情况添加

String signStr = generateSign(paramMap); // 生成待签名字符串
boolean verifyResult = verifySign(signStr, sign); // 验证签名

/**
 * 生成待签名字符串
 * @param paramMap 微信支付回调参数
 * @return 待签名字符串
 */
private String generateSign(SortedMap<String, String> paramMap) {
    StringBuilder sb = new StringBuilder();
    for (Map.Entry<String, String> entry : paramMap.entrySet()) {
        sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
    }
    sb.append("key=").append(商户密钥); // 商户密钥根据实际情况填写
    return MD5Util.md5(sb.toString()).toUpperCase(); // 使用MD5加密,并转换为大写字符串
}

/**
 * 验证签名
 * @param signStr 待签名字符串
 * @param sign 微信支付回调的签名
 * @return 验签结果
 */
private boolean verifySign(String signStr, String sign) {
    return sign.equals(signStr);
}

通过以上代码,我们可以获取到微信支付回调的参数,并且校验签名的正确性。

3. 验签结果处理

根据验签结果,我们可以执行相应的业务逻辑。如果验签成功,则可以继续处理订单逻辑;如果验签失败,则需要返回验签失败给微信支付。具体实现如下:

if (verifyResult) {
    // 执行业务逻辑
    // ...

    // 返回验签成功给微信支付
    return "SUCCESS";
} else {
    // 返回验签失败给微信支付
    return "FAIL";
}

4. 完整示例代码

以下是一个完整的Java微信验签实现示例代码:

public class WeChatPayCallbackController {

    @PostMapping("/callback")
    public String callback(HttpServletRequest request) {
        String transactionId = request.getParameter("transaction_id");
        String outTradeNo = request.getParameter("out_trade_no");
        String totalFee = request.getParameter("total_fee");
        // 其他参数根据实际情况获取

        String sign = request.getParameter("sign");

        // 根据微信支付回调参数构建待签名字符串
        SortedMap<String, String> paramMap = new TreeMap<>();
        paramMap.put("transaction_id", transactionId);
        paramMap.put("out_trade_no", outTradeNo);
        paramMap.put("total_fee", totalFee);
        // 其他参数根据实际情况添加

        String signStr = generateSign(paramMap);
        boolean verifyResult = verifySign(signStr, sign);

        if (verifyResult) {
            // 执行业务逻辑
            // ...

            // 返回验签成功给微信支付
            return "SUCCESS";
        } else {
            // 返回验签失败给微信支付
            return "FAIL";
        }
    }

    /**
     * 生成待签名字符串
     * @param paramMap 微信支付回调参数
     * @return 待签名字符串