API总体说明
<p><strong>1、基础API交互地址:</strong> 请将该地址全局保存,所有接口共用地址,基础URL由H5站点地址拼接而成,重点是取地址参数cmid和acdb,
如H5站的地址是https://h5.yunhu365.com/h5.aspx?cmid=12116&acdb=st0908_1
则通过以下示例代码获得API地址是https://h5.yunhu365.com/ErpServer/h5api/12116/st0908_1</p>
<pre><code class="language-language"> function GetServerURL () {
//获取浏览器中域名的部分
var domain = window.location.origin;
//获取浏览器中参数部分cmid=12116&amp;acdb=st0908_1
var search = window.location.search.toLowerCase();
//解析参数部分
var params = new URLSearchParams(search);
//获取参数cmid的值
var cmid = params.get(&quot;cmid&quot;);
var acdb = params.get(&quot;acdb&quot;);
var serverurl = domain + &quot;/ErpServer/h5api/&quot; + cmid + &quot;/&quot; + acdb;
return serverurl;
}</code></pre>
<p><strong>2、HTTP交互方式</strong>:获取数据、提交数据均使用POST</p>
<p><strong>3、全局参数</strong>: 建议以下参数在请求拦截中加入,以免每个接口单独加入该参数
<strong>4、token</strong>: 用户注册或登录成功后的身份标识,每个接口都传入该参数,以请求header的方式传入,没有值为空即可则视为未注册或未登录。
<strong>5、校验密钥</strong>:注册或登录成功后返回校验密钥,请存为全局变量,在后续的各交易参与校验
<strong>6、数据校验</strong>:</p>
<ol>
<li>只有在数据请求时进行校验,接收数据时无需校验。请求校验时的参数名为sign。
除sign字段外,所有参数按照字段名的ascii码从小到大排序后使用QueryString的格式(即key1=value1&key2=value2…)拼接而成,空值不传递,不参与签名组串。</li>
<li>签名原始串中,字段名和字段值都采用原始值进行拼接组串,不进行URL Encode</li>
<li>签名时将字符串转化成字节流时指定的编码字符集应与参数charset一致,采用utf-8</li>
<li>token的值和sign的值放header中传递,密钥不传递</li>
<li>MD5签名计算公式:sign = Md5(原字符串&key=密钥+token).toUpperCase()</li>
</ol>
<p>如假登录后的密钥=1234、token是5678,则:
(1)参数方式时sign=Md5(abc=1&bcd=2&cde=3&name=张三&key=12345678).toUpperCase()
给服务器传递的数据是:abc=1&bcd=2&cde=3&name=张三
(2)json方式时则sign=MD5(json=data&key=12345678).toUpperCase()
则给服务器传的是JSON的data数据</p>
<p>如假未登录则密钥为空、token为空,header中传空字符串(不是传null),则:
(1)参数方式时sign=Md5(abc=1&bcd=2&cde=3&name=张三).toUpperCase()
给服务器传递的数据是:abc=1&bcd=2&cde=3&name=张三
(2)json方式时则sign=MD5(json=data).toUpperCase()
则给服务器传的是JSON的data数据</p>
<p><strong>7、数据返回结构</strong>:</p>
<pre><code class="language-language">{
&quot;code&quot;: 0,
&quot;msg&quot;: &quot;帐号或密码错误&quot;,
&quot;data&quot;: {}
}</code></pre>
<p>说明:code是错误码,1表示成功,0表示失败,2店铺未上线,3店铺已关闭,4店铺已到期,5请登录,6超时过期或未登录,7参数签名不正确,8用户未注册,9账号或密码不正确,10手机号已注册,11用户名已注册,12邮箱已注册,其它值待定。
msg是消息,如错误提示
data是数据,是一个JSON对象。
一般是先判断code,为0则提示msg,为1再处理data,这三项值均不会为空。
<strong>8、向服务器传递JSON示例</strong>(实际使用中将函数postdata定义为全局函数供数据交互时调用):</p>
<pre><code class="language-language">//全局对象AppConfig存放服务器传来的数据
var AppConfig = {};
AppConfig.serverurl = &quot;基础交互的API地址,根据JS代码函数GetServerURL获取&quot;;
AppConfig.token = &quot;用户登录后服务器传来的token&quot;;
AppConfig.singkey = &quot;用户登录后服务器传来的密钥&quot;;
AppConfig.userid = 0;//用户登录后服务器传来的用户id
AppConfig.username = &quot;aname&quot;;//用户登录后服务器传来的用户名
function postdata() {
//构造请求数据
var obj = new Object();
//必须要有actionName,userid,usernane
obj.actionName = &quot;接口名称&quot;;
obj.userid = AppConfig.userid;
obj.username = AppConfig.username;
obj.openid = &quot;&quot;;
obj.appid = &quot;&quot;;
//传递参数
obj.params1 = &quot;value1&quot;;
obj.params2 = &quot;value2&quot;;
//传递数组列表
obj.list = new Array();
obj.list.push(&quot;list1&quot;);
obj.list.push(&quot;list2&quot;);
//传递对象
obj.objone = new Object();
obj.objone.name = &quot;objone&quot;;
obj.objone.value = &quot;valueone&quot;;
//传递对象数组列表
obj.objlist = new Array();
var obj1 = new Object();
obj1.name = &quot;obj1&quot;;
obj1.value = &quot;value1&quot;;
obj.objlist.push(obj1);
var obj2 = new Object();
obj2.name = &quot;obj2&quot;;
obj2.value = &quot;value2&quot;;
obj.objlist.push(obj2);
//将对象obj转换为json字符串
var jsondata = JSON.stringify(obj);
//数据签名
var sign = &quot;&quot;;
if (AppConfig.token == null || AppConfig.token.length == 0)
sign = hex_md5(&quot;json=&quot; + jsondata);
else
sign = hex_md5(&quot;json=&quot; + jsondata + &quot;&amp;key=&quot; + AppConfig.singkey + AppConfig.token);
sign = sign.toUpperCase();
//发送请求
var xhr = new XMLHttpRequest();
xhr.open('POST', AppConfig.serverurl, true);
xhr.setRequestHeader('Content-Type', 'application/json');
//在header中传递token
xhr.setRequestHeader('token', AppConfig.token);
//将sign放在header中传递
xhr.setRequestHeader('sign', sign);
xhr.onload = function () {
if (this.status == 200) {
var res = this.responseText;
if (res == null || res.length==0) {
alert(&quot;返回数据为空&quot;);
return;
}
//解析返回数据
var obj = JSON.parse(res);
if (obj.code == 1) {
alert(&quot;成功&quot;);
} else {
alert(obj.msg);
if (obj.code == 2) {
//店铺未上线,跳转店铺建立中的页面
} else if (obj.code == 3) {
//店铺已关闭,跳转到警请期待页面
} else if (obj.code == 4) {
//店铺已到期,跳转到续费页面
} else if (obj.code == 5) {
//请重新登录,跳转到登录页面
} else if (obj.code == 6) {
//超时或未登录,跳转到登录页面
} else if (obj.code == 7) {
//签名不正确,跳转到登录页面
}
}
}
};
//发送数据
xhr.send(jsondata);
}</code></pre>
<p><strong>9、发送给api的数据格式</strong>:JSON中的参数名、属性名、字段名是区分大小写的</p>
<table>
<thead>
<tr>
<th>序号</th>
<th>参数名</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>actionName</td>
<td>接口名称</td>
</tr>
<tr>
<td>2</td>
<td>userid</td>
<td>用户ID,用户登录后由服务器传来</td>
</tr>
<tr>
<td>3</td>
<td>username</td>
<td>用户名,用户登录后由服务器传来</td>
</tr>
<tr>
<td>4</td>
<td>其它参数</td>
<td>根据接口的需要传递的其它参数</td>
</tr>
</tbody>
</table>
<pre><code class="language-language">{
&quot;actionName&quot;: &quot;userlogin&quot;,
&quot;userid&quot;: 1,
&quot;username&quot;: &quot;张三&quot;
...
}</code></pre>