问卷星服务端接入
<p>[TOC]</p>
<h2>接口描述</h2>
<p>此接口用于回调给开发者服务器,如果奖励不允许用户重复领取,需做好 <code>playerId+serverId+roleId</code> 的唯一限制,防止调用方超时后重试导致重复发送。一个游戏下的所有奖励,必须使用相同的发放 URL。</p>
<p><strong>注意:此接口必须开发者服务端接入。</strong></p>
<p>开发者按接口规范实现此接口,我们会通过回调URL调用该接口通知给开发者服务端。</p>
<h2>流程图</h2>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/22e1512be930e758590a8162f100cedf?showdoc=.jpg" alt="" />
开发者需要关注流程图中第1和第8步(<strong>已标红</strong>)。</p>
<p>透传参数参考【接口规范】的前7个字段。必传字段不为null且不为空。</p>
<p>我们会透传这7个字段并且添加签名,签名规则参考 <a href="#jump_wjx_sign">签名算法</a>,开发者需验签后再发放奖励。</p>
<h2>接口规范</h2>
<ul>
<li>
<p>请求的URL:需要在业务控制台配置,可以<a href="https://www.showdoc.cc/mssdk?page_id=2615409307929897">联系我们</a></p>
</li>
<li>
<p>调用方式:<code>POST</code></p>
</li>
<li>
<p>HTTP 请求头Content-Type:<code>application/json</code></p>
</li>
<li>
<p>字符集:<code>UTF-8</code></p>
</li>
<li>请求参数,如下表:</li>
</ul>
<table>
<thead>
<tr>
<th>字段名称</th>
<th>类型</th>
<th>是否必填</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>playerId</td>
<td>String</td>
<td>是</td>
<td>玩家Id (CP透传,开发者可以传入自己的用户id)</td>
</tr>
<tr>
<td>extra</td>
<td>String</td>
<td>否</td>
<td>扩展字段(CP透传,在有多个链接的情况下用于标识链接,10字符以内))</td>
</tr>
<tr>
<td>serverId</td>
<td>String</td>
<td>是</td>
<td>区服Id (CP透传)</td>
</tr>
<tr>
<td>roleId</td>
<td>String</td>
<td>是</td>
<td>角色Id (CP透传)</td>
</tr>
<tr>
<td>level</td>
<td>String</td>
<td>是</td>
<td>用户等级 (CP透传)</td>
</tr>
<tr>
<td>accruingAmounts</td>
<td>String</td>
<td>是</td>
<td>用户累计消费金额 (CP透传)</td>
</tr>
<tr>
<td>consecutiveDays</td>
<td>String</td>
<td>是</td>
<td>用户连续登录天数 (CP透传)</td>
</tr>
<tr>
<td>sign</td>
<td>String</td>
<td>是</td>
<td>签名;需要校验签名一致,算法见下面说明(参与签名的字段为playerId/roleId/serverId)</td>
</tr>
<tr>
<td>gameId</td>
<td>String</td>
<td>是</td>
<td>游戏id(客户端请求头携带)</td>
</tr>
<tr>
<td>channel</td>
<td>String</td>
<td>是</td>
<td>渠道(客户端请求头携带)</td>
</tr>
<tr>
<td>appVersion</td>
<td>String</td>
<td>是</td>
<td>appVersion(客户端请求头携带)</td>
</tr>
</tbody>
</table>
<ul>
<li>返回信息,如下:</li>
</ul>
<table>
<thead>
<tr>
<th>字段名称</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>code</td>
<td>Int</td>
<td>返回码</td>
</tr>
<tr>
<td>msg</td>
<td>String</td>
<td>结果描述</td>
</tr>
</tbody>
</table>
<pre><code class="language-json">{
"code":20000,
"msg":"OK"
}</code></pre>
<h2>注意事项</h2>
<p>因问卷星对参数长度有限制(<strong>100字符</strong>),参数字符串长度应尽可能地小,否则无法获取问卷链接。
字符串拼接规则是:appId|playerId|channel|extra|serverId|roleId|level|accruingAmounts|consecutiveDays|appVersion
再进行Urlencode后所得字符串<strong>不能超过100个字符(编码后)</strong>。接入者需自行验证字符串是否满足此要求。</p>
<h2>错误码</h2>
<table>
<thead>
<tr>
<th>码值</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>20000</td>
<td>成功</td>
</tr>
<tr>
<td>20002</td>
<td>该用户已经领取过奖励</td>
</tr>
<tr>
<td>20003</td>
<td>请求参数错误</td>
</tr>
<tr>
<td>20004</td>
<td>签名错误</td>
</tr>
</tbody>
</table>
<h2>签名算法</h2>
<p><span id="jump_wjx_sign"></span></p>
<p>首先对部分请求参数(参与签名的字段为 playerId/roleId/serverId)按参数名做字典序升序排列。(所谓字典序升序排列,直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二个“字母”,依此类推。)</p>
<p><strong>1、参数排序后拼接字符串</strong></p>
<p>将把上一步排序好的请求参数格式化成“参数名称”=“参数值”的形式</p>
<pre><code>Key1=value1&Key2=value2&Key3=value3&…………</code></pre>
<p><strong>2、拼接最终签名字符串</strong></p>
<p>将秘钥appSecrect拼接在字符串前后,如下示例:</p>
<pre><code>appSecrect& Key1=value1& Key2=value2& Key3=value3&………&appSecrect</code></pre>
<p><strong>3、md5生成签名串, 并进行UrlEncode UTF-8 编码</strong></p>
<pre><code>UrlEncode(md5(appSecrect&Key1=value1&Key2=value2&Key3=value3&………&appSecrect))</code></pre>