1. 开发前必读 - 如何进行签名
<p>[TOC]</p>
<h1>如何进行签名</h1>
<h2>签名算法逻辑</h2>
<h3>第一步</h3>
<pre><code> 设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用以下格式拼接成字符串</code></pre>
<pre><code> key1value1key2value2...</code></pre>
<p>特别注意以下重要规则:</p>
<pre><code> 参数名ASCII码从小到大排序(字典序);
如果参数的值为空不参与签名;
参数名区分大小写;
传送的sign参数不参与签名;</code></pre>
<h3>第二步</h3>
<pre><code> 在字符串最后拼接上secret密钥得到stringSignTemp字符串</code></pre>
<h3>第三步</h3>
<pre><code> 对stringSignTemp进行MD5加密得到signValue</code></pre>
<h2>前端生成签名</h2>
<pre><code>// npm install crypto-js
import MD5 from 'crypto-js/md5';
function genSign(params) {
// 密钥
const secret = 'xxxxxxxxxxxxxxxxxxxxxxx'
// 1O位时间戳
const timestampStr = parseInt(new Date().getTime() / 1000).toString()
params.timestamp = timestampStr
// 取 key
const sortedKeys = []
for (const key in params) {
// 注意这里,要剔除掉 sign 参数本身
if (key !== 'sign') {
sortedKeys.push(key)
}
}
// 参数名 ASCII 码从小到大排序(字典序)
sortedKeys.sort()
// 1 拼接参数
let str = ''
sortedKeys.forEach(key =&gt; {
str += key + params[key]
})
// 2 拼接密钥
str += secret
// 3 MD5加密
params.sign = MD5(str).toString().toUpperCase()
}
export default genSign</code></pre>
<h2>后端生成签名</h2>
<pre><code>import org.apache.commons.codec.binary.Hex;
import java.security.MessageDigest;
@Slf4j
public class SignUtil {
private static final String SECRET = &quot;xxxxxxxxxxxxxxxxxxxxxxxxxx&quot;;
private static final String SIGN = &quot;sign&quot;;
private static final String TIMESTAMP = &quot;timestamp&quot;;
//签名
public static String genSign(TreeMap&lt;String, Object&gt; params) {
params.remove(SIGN);
StringBuilder str = new StringBuilder();
for (String key : params.keySet()) {
Object val = params.get(key);
if (ObjectUtil.isNotNull(val)) {
// 1 拼接参数
str.append(key).append(val);
}
}
// 2 拼接秘钥
str.append(SECRET);
// 3 MD5加密
return md5(str.toString());
}
public static String md5(String source) {
String md5Result = null;
try {
byte[] hash = org.apache.commons.codec.binary.StringUtils.getBytesUtf8(source);
MessageDigest messageDigest = MessageDigest.getInstance(&quot;MD5&quot;);
messageDigest.update(hash);
hash = messageDigest.digest();
md5Result = Hex.encodeHexString(hash);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5Result;
}
}
</code></pre>