签名算法与错误提示
<h5>签名算法</h5>
<h6>规则</h6>
<ul>
<li>按照 asc 排序键值对参数名排序(需要区分大小写), 如果选填参数同时值为空时不能参与签名计算,</li>
<li>将 api key 放到要签名的键值对最后。
例如:
假设apiKey = a367b552cfe347cc88e
(BizTypeECARDServiceQueryProductTime1706169267UserIdtesta367b552cfe347cc88e)</li>
<li>用32位MD5 加密处理后的参数串,采用 UTF-8编码后的 MD5,生成的MD5小写</li>
</ul>
<h6>JAVA示例代码</h6>
<pre><code>public static String generateSign(Map&lt;String, String&gt; params,String apiKey) {
// 先对map的键进行排序
String result = params.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.map(entry -&gt; entry.getKey() + entry.getValue())
.collect(Collectors.joining());
// 添加API Key
result += apiKey;
// 计算MD5值
return md5(result);
}
public static String md5(String s) {
try {
MessageDigest md = MessageDigest.getInstance(&quot;MD5&quot;);
byte[] array = md.digest(s.getBytes());
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item &amp; 0xFF) | 0x100), 1, 3);
}
return sb.toString().toLowerCase();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}</code></pre>
<h5>错误码</h5>
<table>
<thead>
<tr>
<th>code</th>
<th>msg</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>成功</td>
</tr>
<tr>
<td>101</td>
<td>参数错误 或者 缺少必须的业务参数</td>
</tr>
<tr>
<td>102</td>
<td>签名错误</td>
</tr>
<tr>
<td>103</td>
<td>用户状态不正常 【联系商务确定 ID、密钥是否正确, 产品、接口是否都已经配置】</td>
</tr>
<tr>
<td>104</td>
<td>余额不足</td>
</tr>
<tr>
<td>105</td>
<td>产品不存在或者状态不正常</td>
</tr>
<tr>
<td>106</td>
<td>目标充值账号不合法或者状态不正常</td>
</tr>
<tr>
<td>107</td>
<td>时间戳相差过大</td>
</tr>
<tr>
<td>108</td>
<td>订单号已经存在</td>
</tr>
<tr>
<td>999</td>
<td>未知错误(不直接作为失败, 是否成功请联系平台确认)</td>
</tr>
</tbody>
</table>