Java 微信支付回调 XML 签名

在进行微信支付开发时,其中一个重要的环节就是支付回调的处理。在支付成功后,微信会向我们的服务器发送一个 XML 格式的回调信息,我们需要对这个回调信息进行验签,确保回调信息的完整性和安全性。本文将介绍使用 Java 对微信支付回调 XML 进行签名验证的过程。

微信支付回调 XML 格式

微信支付回调的 XML 格式大致如下所示:

<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[OK]]></return_msg>
  <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
  <mch_id><![CDATA[10000100]]></mch_id>
  <nonce_str><![CDATA[NfsMFbUFpdbEhPXP]]></nonce_str>
  <sign><![CDATA[B7274EBAC8C6E191B5622C34E0D0AB936]]></sign>
  <result_code><![CDATA[SUCCESS]]></result_code>
</xml>

其中,sign 字段就是微信支付回调信息的签名字段。

验签过程

在 Java 中验证微信支付回调信息的签名,我们需要进行以下几个步骤:

  1. 将 XML 格式的回调信息转换为 Map 类型;
  2. 将 Map 中的键值对按照 ASCII 码升序排序;
  3. 对排序后的键值对进行拼接,形成待签名的字符串;
  4. 使用微信支付密钥对待签名字符串进行 HMAC-SHA256 签名;
  5. 将签名结果与回调信息中的 sign 字段进行比对,验证签名是否正确。

下面是 Java 代码示例:

import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

public class WechatPayCallback {

    public static boolean verifySign(String xmlString, String key) {
        Map<String, String> resultMap = XmlUtil.xmlToMap(xmlString);

        SortedMap<String, String> sortedMap = new TreeMap<>(resultMap);

        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : sortedMap.entrySet()) {
            if (entry.getValue() != null && !"".equals(entry.getValue())) {
                sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
        }
        sb.append("key=").append(key);

        String sign = EncryptUtil.encryptHMACSHA256(sb.toString(), key).toUpperCase();

        return sign.equals(resultMap.get("sign"));
    }
}

关系图

下面是微信支付回调 XML 的关系图:

erDiagram
    XML --> Map
    Map --> SortedMap
    SortedMap --> 签名验证

通过以上步骤,我们可以在 Java 中对微信支付回调 XML 进行签名验证,确保支付回调信息的安全和有效性。

结语

本文介绍了使用 Java 对微信支付回调 XML 进行签名验证的过程,并提供了相应的代码示例。希望能够帮助开发者更好地理解微信支付回调的处理流程,保障支付信息的安全性。如果您有任何疑问或建议,欢迎留言讨论。感谢阅读!