接口调用说明
<h1>API调用说明</h1>
<pre><code>&quot;请求地址&quot;: https://prb.ecit.cc/web/index.php
&quot;签名密钥&quot;: fd21dee2da528ee0577469e1c6b1536a
&quot;DES密钥&quot;: 4MTU1KBG
&quot;应用ID&quot;: 4</code></pre>
<hr />
<h2>请求方式</h2>
<p>采用HTTP标准的POST协议</p>
<pre><code>一个完整的json格式请求/响应报文包含body节点(body采用DES加密详看下述 DES加密)。</code></pre>
<h2>编码格式</h2>
<p>UTF-8</p>
<h2>公共参数说明</h2>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th style="text-align: left;">示例值</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">r</td>
<td style="text-align: left;">api/user/login</td>
<td style="text-align: left;">请求接口地址</td>
</tr>
<tr>
<td style="text-align: left;">_mall_id</td>
<td style="text-align: left;">4</td>
<td style="text-align: left;">应用ID</td>
</tr>
<tr>
<td style="text-align: left;">timestamp</td>
<td style="text-align: left;">2024-06-28 10:00:00</td>
<td style="text-align: left;">请求时间</td>
</tr>
<tr>
<td style="text-align: left;">sign</td>
<td style="text-align: left;">374d95774f17c3e354e73f7aaf21b5ec</td>
<td style="text-align: left;">签名</td>
</tr>
</tbody>
</table>
<h2>签名算法</h2>
<p>验证签名步骤:</p>
<ol>
<li>获取json报文中的body部分</li>
<li>对参数(timestamp+version+body+signkey)进行拼接</li>
<li>拼接的参数进行MD5编码并转小写后进行签名比对验证</li>
</ol>
<p>Java签名组装示例代码:</p>
<pre><code class="language-java">JSONObject json = JSONObject.fromObject(body); String mybody = json.getString(&quot;body&quot;);
String sign = md5(timestamp+version+body+signkey).toLowerCase();
return sign;</code></pre>
<h2>DES加密</h2>
<pre><code>请求、响应报文的body部分采用DES加密后进行传输。</code></pre>
<p>加密后示例:</p>
<pre><code class="language-json">{
&quot;timestamp&quot;:&quot;2024-06-28 10:00:00&quot;,
&quot;version&quot;:&quot;1.0&quot;,
&quot;sign&quot;:&quot;374d95774f17c3e354e73f7aaf21b5ec&quot;,
&quot;body&quot;:&quot;RRRJJNGHELTYYYTTEWRKJJJKRKEWR==&quot;
}</code></pre>
<p>DES加密代码实例 java版本</p>
<pre><code class="language-java">package com.afreon.util;
import java.io.IOException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* Description 根据键值进行加密
* @param data
* @param key 加密键byte数组
* @return
* @throws Exception
*/
public static String encrypt(String data, String key) throws Exception {
byte[] bt = encrypt(data.getBytes(&quot;UTF-8&quot;), key.getBytes(&quot;UTF-8&quot;));
String strs = new BASE64Encoder().encode(bt);
return strs;
}
/**
* Description 根据键值进行解密
* @param data
* @param key 加密键byte数组
* @return
* @throws IOException
* @throws Exception
*/
public static String decrypt(String data, String key) throws Exception,
Exception {
if (data == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf,key.getBytes(&quot;UTF-8&quot;));
return new String(bt, &quot;UTF-8&quot;);
}
/**
* Description 根据键值进行加密
* @param data
* @param key 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(&quot;DES&quot;);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(&quot;DES&quot;);
// 用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}
/**
* Description 根据键值进行解密
* @param data
* @param key 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(&quot;DES&quot;);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(&quot;DES&quot;);
// 用密钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}</code></pre>
<h2>接口返回码</h2>
<table>
<thead>
<tr>
<th style="text-align: left;">分类</th>
<th style="text-align: left;">返回码</th>
<th style="text-align: left;">返回信息</th>
<th style="text-align: left;">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">成功</td>
<td style="text-align: left;">0</td>
<td style="text-align: left;">操作成功</td>
<td style="text-align: left;"></td>
</tr>
<tr>
<td style="text-align: left;">系统相关</td>
<td style="text-align: left;"></td>
<td style="text-align: left;"></td>
<td style="text-align: left;"></td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;">1001</td>
<td style="text-align: left;">报文解析失败</td>
<td style="text-align: left;"></td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;">1002</td>
<td style="text-align: left;">签名错误</td>
<td style="text-align: left;"></td>
</tr>
</tbody>
</table>