外部网关API签名规则
<p>[TOC]</p>
<h2>变更记录</h2>
<table>
<thead>
<tr>
<th>日期</th>
<th>修订版本</th>
<th>修改描述</th>
<th>修改人</th>
</tr>
</thead>
<tbody>
<tr>
<td>2019.10.16</td>
<td>V1.0</td>
<td>创建文档</td>
<td>bruce.lan</td>
</tr>
</tbody>
</table>
<h2>支持http(s)</h2>
<p>示例:</p>
<ul>
<li>
<p>header:
Header(“AppKey”,xxxxx);
Header(“Nonce”,xxxxx);
Header(“Signature”,xxxxx);
Header(“Timestamp”,xxxxx);</p>
</li>
<li>
<p>Get 请求:
<a href="https://pub-gw.uu.cc/public-gateway/">https://pub-gw.uu.cc/public-gateway/</a><接口API>?<接口请求参数>
接口请求参数= Key1=value1& Key2=value2& Key3=value3&…</p>
</li>
<li>POST请求:
<a href="https://pub-gw.uu.cc/public-gateway/">https://pub-gw.uu.cc/public-gateway/</a><接口API>
<pre><code class="language-json">{
内容
}</code></pre></li>
</ul>
<h2>公共请求头</h2>
<table>
<thead>
<tr>
<th>参数名</th>
<th>描述</th>
<th>类型</th>
<th>是否必填</th>
<th>参与签名</th>
</tr>
</thead>
<tbody>
<tr>
<td>Content-Type</td>
<td>固定为:application/json</td>
<td>String</td>
<td>必填</td>
<td>否</td>
</tr>
<tr>
<td>User-Agent</td>
<td>见详情说明</td>
<td>String</td>
<td>必填</td>
<td>否</td>
</tr>
<tr>
<td>Accept-Language</td>
<td>固定值为:zh_CN</td>
<td>String</td>
<td>必填</td>
<td>否</td>
</tr>
<tr>
<td>AppKey</td>
<td>每个应用有唯一个key</td>
<td>String</td>
<td>必填</td>
<td>是</td>
</tr>
<tr>
<td>Nonce</td>
<td>随机字符串UUID,与Timestamp 联合起来,用于防止重放攻击。10分钟内的请求Nonce不能有重复</td>
<td>String</td>
<td>必填</td>
<td>是</td>
</tr>
<tr>
<td>Timestamp</td>
<td>发起API请求的时间(UNIX时间戳),精确到毫秒</td>
<td>String</td>
<td>必填</td>
<td>是</td>
</tr>
<tr>
<td>Authorization</td>
<td>token(登录后必填,未登录前可以不填)</td>
<td>String</td>
<td>可选</td>
<td>可选</td>
</tr>
<tr>
<td>Signature</td>
<td>请求签名,用来验证此次请求的合法性</td>
<td>String</td>
<td>必填</td>
<td>否</td>
</tr>
</tbody>
</table>
<ul>
<li>
<p><strong>AppKey</strong>
appkey,appSecrect是给乐逗给游戏分配的秘钥对。
微服务业务控制台地址:<a href="http://biz.cloud.idreamsky.com">http://biz.cloud.idreamsky.com</a> 创建应用就能得到相应的 appkey,appSecrect.</p>
</li>
<li>
<p><strong>国际化多语言 Accept-Language</strong>
如:"Accept-Language:zh_CN"
默认为 zh_CN</p>
</li>
<li><strong>User-Agent</strong>
主要是用来标记客户端信息,包含信息字段说明如下:</li>
</ul>
<table>
<thead>
<tr>
<th>参数名</th>
<th>描述</th>
<th>类型</th>
<th>是否必填</th>
</tr>
</thead>
<tbody>
<tr>
<td>platform</td>
<td>系统平台及版本</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>channel</td>
<td>分配的渠道号</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>appVersion</td>
<td>游戏的版本号</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>package</td>
<td>游戏的包名</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>sdkVersion</td>
<td>sdk的版本号</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>sdkName</td>
<td>sdk指纹</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>networkType</td>
<td>网络类型,4G或者wifi</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>deviceBrand</td>
<td>手机型号+品牌</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>deviceId</td>
<td>设备唯一标识</td>
<td>String</td>
<td>是</td>
</tr>
<tr>
<td>localTime</td>
<td>当前的时间和时区</td>
<td>String</td>
<td>是</td>
</tr>
</tbody>
</table>
<p>示例如下:</p>
<pre><code>platform:CP;channel:CP;appVersion:1.0.0;package:com.cp.sdk;sdkVersion:1.0.0;sdkName:MSSDK;networkType:WiFi;deviceBrand:common;deviceId:00000000;localTime:2019-01-01 00:00:00</code></pre>
<p><strong>注意</strong>: 一定要按以上<strong>字段顺序拼接,参数";"分割,并且参数的值不能包含 ";"</strong> </p>
<ul>
<li>
<p><strong>认证令牌token Authorization</strong>
玩家登录成功后,服务端会返回一个token,后续玩家请求都需要带上Authorization信息
如:</p>
<pre><code>Authorization="bearer 239bde30-19e7-49e8-851a-ef4260aac1d0"</code></pre>
</li>
<li><strong>Content-Type</strong></li>
</ul>
<p>Content-Type 固定为 application/json</p>
<p>如:</p>
<pre><code>Content-Type=“application/json”</code></pre>
<ul>
<li><strong>Signature</strong></li>
</ul>
<p><strong>参与签名的包含字段有</strong>:</p>
<pre><code>公共请求参数(参与签名字段) + ”Authorization”(可选) + 请求参数(get请求) + body(post请求)</code></pre>
<p><strong>注意:</strong>
Authorization: 登录成功后服务端返回的token值(可选,登录后必填,未登录前可以不填),该key存在则参与签名
get请求, 则没有请求body
post请求,则没有请求参数</p>
<p><strong> 签名规则说明</strong>
1、对所有参与签名的参数按参数名做字典序升序排列(所谓字典序升序排列,直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二个“字母”,依此类推),key排序后按照 “参数名称”=“参数值”的形式拼接字符串,得到<strong>签名字符串</strong>。</p>
<pre><code>Key1=value1& Key2=value2& Key3=value3&…………</code></pre>
<p>2、将秘钥appSecrect拼接在<strong>签名字符串前后</strong></p>
<pre><code>appSecrect& Key1=value1& Key2=value2& Key3=value3&………& appSecrect</code></pre>
<p>对于post请求,key固定为“requestBody”,“requestBody”参与参数名排序,value为请求的整个body。
例如</p>
<pre><code>JSxPpoOzc9de9gC2wiSt&Authorization=Bearer 239bde30-19e7-49e8-851a-ef4260aac1d0&Nonce=1997&Timestamp=201910101&requestBody={
"appKey":"10001_LsP2XAYmBF6jHXTPOMZO",
"loginType":"Hphone",
"loginId":"13725530664",
"password":"123456",
"gameId":"10001",
"deviceId":"abc99887yu",
"channelId":"1002",
"deviceBrand":"huawei"
}&JSxPpoOzc9de9gC2wiSt</code></pre>
<p><code>JSxPpoOzc9de9gC2wiSt</code> 是秘钥appSecrect</p>
<p>requestBody 是post上来的JSON串,当成一个整体,里面的内容不用排序。</p>
<p>3、md5生成签名串, 并进行UrlEncode UTF-8编码:</p>
<pre><code>Signature=UrlEncode(md5(appSecrect& Key1=value1& Key2=value2& Key3=value3&………& appSecrect))</code></pre>
<h2>签名代码示例</h2>
<p>请参考 <a href="https://www.showdoc.cc/mssdk?page_id=2992099572666798">签名示例</a> 文档。</p>