消息推送数据 MD5 校验示例

说明:本文档主要用来解释说明消息推送 MD5 校验方式,并提供 JAVA、PHP MD5 校验方法的校验示例,具体消息推送配置等说明请参考文档:
https://doc.youzanyun.com/doc#/content/27027/27081

推送机制:消息推送服务通过 POST 、参数编码为 APPLICATION/JSON (输入流) 的方式向开发者提供的地址推送消息。
有赞返回的防伪签名 sign 签名方式:
MD5(client_id+entity+client_secret) ; 其中 entity 是 ResponseBody 接收的内容(msg 中的 value,请勿做 decode)。
具体可参考下文加密示例
注:MD5加密内容顺序请严格按照文档示例,避免顺序改变导致加密的sign值不同验签校验不一致。

校验示例

JAVA 版本


 @Test
    public void Md5Test() {
        String msg = "msg加密串,请勿做decode";
        String client_id = "应用Id";
        String client_secret = "应用密钥";
        String sign = "消息推送返回的sign";
        String md5sign = MD5(String.format("%s%s%s", client_id , msg, client_secret));
        if(md5sign.equals(sign)){
            System.err.println("验签通过!!!");
        }else {
            System.err.println("验签失败!!!");
        }
    }

JAVA MD5 加密方法

/**
     * MD5加密方法
     * @param sourceStr
     * @return
     */
    public static String MD5(String sourceStr) {
        String result = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(sourceStr.getBytes());
            byte b[] = md.digest();
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            result = buf.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        return result;
    }

PHP 版本

<?php
$client_id='填写您的client_id';
$client_secret='填写您的client_secret';
$msg='填写msg中值请勿做decode';

$sign_string = $client_id."".$msg."".$client_secret; 
$sign = md5($sign_string);
echo $sign." ";
$pushSign='填写消息推送中的sign值';

if($sign != $pushSign){
	echo "F";
}else {
	echo "T";
}

加密示例(JAVA)

image.png