【X】一导通签名说明
<p>[TOC]</p>
<h1>一导通签名说明</h1>
<h2>必传参数</h2>
<ul>
<li>
<p>requestData: 入参数据内容(URl编码:UTF8)</p>
</li>
<li>
<p>eBusinessID: 用户ID</p>
</li>
<li>
<p>requestType: 请求指令类型</p>
</li>
<li>
<p>dataSign: 数据内容签名(请求内容(未编码)+ApiKey)进行MD5 加密,然后Base64
编码,最后进行URL(utf-8)编码</p>
</li>
<li>dataType: 2(返回数据类型为json)</li>
</ul>
<p>注册后会生成对应会生成对应的用户ID 和APIKey,用户ID 相当于用户名,APIKey 相当于密码。</p>
<h2>举例</h2>
<ol>
<li>假设</li>
</ol>
<p>RequestData (JSON)内容为:
<code>{'OrderCode':'','ShipperCode':'SF','LogisticCode':'118954907573'}</code>
经过URL(UTF-8)编码的内容为:
<code>%7B%27OrderCode%27%3A%27%27%2C%27ShipperCode%27%3A%27SF%27%2C%27LogisticCode%27%3A%27118954907573%27%7D</code>
EBusinessID=1237100【示例ID,不可用来实际使用】
APIKey=56da2cf8-c8a2-44b2-b6fa-476cd7d1ba17【示例Key,不可用来实际使用】</p>
<ol>
<li>DataSign签名内容</li>
</ol>
<pre><code>{'OrderCode':'','ShipperCode':'SF','LogisticCode':'118954907573'}56da2cf8-c8a2-44b2-b6
fa-476cd7d1ba17</code></pre>
<p>经过md5 和base64 后的内容就为:
<code>OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE=</code>,
在经过URL(UTF-8)编码的内容为:
<code>OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE%3D</code>
最终要发送的数据为:
<code>RequestType=1002&EBusinessID=1237100&RequestData =%7b%27OrderCode%27%3a%27%27%2c%27ShipperCode%27%3a%27SF%27%2c% 27LogisticCode%27%3a%27118954907573%27%7d&DataSign =OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE%3d&DataType=2</code></p>
<ol>
<li>接收方收到数据后,获得EBusinessID 和RequestData 和DataSign 等这几个数据。</li>
<li>接收方对EBusinessID 得到APIKey,RequestData+APIKey 的数据进行md5 和base64 后的内容就为OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE=</li>
<li>接收方判断签名后的数据跟传递过来的DataSign 是否一致,如果一致进行业务操作,如果不一致返回错误。</li>
</ol>
<h3>签名示例代码</h3>
<pre><code class="language-java">import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
/**
* @author: chenjunqin
* @date: 2022/5/10 16:02
*/
public class YiDaoTongSignDemo {
public static void main(String[] args) throws Exception {
// 组装应用级参数
String requestData = "{" +
"'OrderCode':''," +
"'ShipperCode':'SF'," +
"'LogisticCode':'118954907573'" +
"}";
String eBusinessID = "1237100";
String apiKey = "56da2cf8-c8a2-44b2-b6fa-476cd7d1ba17";
String requestType = "1002";
// 组装系统级参数
Map<String, String> params = new HashMap<>();
params.put("requestData", urlEncoder(requestData, "UTF-8"));
// RequestData: %7B%27OrderCode%27%3A%27%27%2C%27ShipperCode%27%3A%27SF%27%2C%27LogisticCode%27%3A%27118954907573%27%7D
params.put("eBusinessID", eBusinessID);
params.put("requestType", requestType);
String dataSign = encrypt(requestData, apiKey, "UTF-8");
// dataSign: OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE=
params.put("dataSign", urlEncoder(dataSign, "UTF-8"));
// DataSign: OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE%3D
params.put("dataType", "2");
System.out.println(params);
}
private static String urlEncoder(String str, String charset) throws UnsupportedEncodingException {
return URLEncoder.encode(str, charset);
}
private static String encrypt(String content, String keyValue, String charset) throws Exception {
return base64(MD5(content + keyValue, charset), charset);
}
/**
* MD5加密
* str 内容
* charset 编码方式
*
* @throws Exception
*/
@SuppressWarnings("unused")
private static String MD5(String str, String charset) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(charset));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
for (int i = 0; i < result.length; i++) {
int val = result[i] & 0xff;
if (val <= 0xf) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
return sb.toString().toLowerCase();
}
/**
* base64编码
* str 内容
* charset 编码方式
*
* @throws UnsupportedEncodingException
*/
private static String base64(String str, String charset) throws UnsupportedEncodingException {
return Base64.encode(str.getBytes(charset));
}
}</code></pre>