服务器端对接指南
由于客户端不是完全可信环境,所以客户端验证完成后,强烈建议将信息提交至服务器端,由服务器端调用极简服务器再次校验手机号码是否真实有效。
请求地址
请求参数
字段名称 | 字段说明 | 类型 | 必填 | 备注 |
---|---|---|---|---|
app_id | 分配的应用ID | string | Y | |
id | 客户端/网页验证完成后返回的 token | string | Y | 验证完成后 SDK 都会返回 token 和 mobile |
mobile | 客户端/网页验证的手机号 | string | Y | |
country_code | 手机号国家区号 | string | N | 默认86 |
r | 随机字符串 | string | Y | 每次请求都需要重新生成,长度不限 |
key | 校验值 | string | Y | 生成规则见 校验值规则 |
返回值
字段名称 | 字段说明 | 类型 |
---|---|---|
code | 请求结果码,200 成功, 其他失败 | int |
msg | 请求结果信息 | string |
data | 返回内容 | object |
data
结构体说明
字段名称 | 字段说明 | 类型 |
---|---|---|
status | 验证状态 | int |
msg | 状态描述 | string |
status
取值说明: 1 成功 , -1 手机号没有验证, -2 已过期 ,-3 验证失败
校验值生成规则
- 将所有参数的
key
按照字符串进行排序 - 如果参数的
value
不为空,则将key
和valu
e以=
号链接,且在后面增加&
,例如参数r
为1Nm882l7
, 则拼接为r=1Nm882l7&
- 按照排序的顺序拼接所有的参数
- 拼接完成后,在末尾拼接
token=密钥Token
, 其中密钥Token
可在用户中心查看,请注意密钥Token
不要泄露。 - 对拼接后的字符串进行
md5
加密,然后全部转为小写
密钥Token
的查看位置
校验值生成php示例代码
function createSign($data, $token)
{
$signOriginStr = '';
if ($data) {
ksort($data);
foreach ($data as $key => $value) {
if (empty($key) || $value === "" || $value === null || $key === 'token' || $key === 'key') {
continue;
}
$signOriginStr = "$signOriginStr$key=$value&";
}
}
$signOriginStr = $signOriginStr . "token=$token";
return strtolower(md5($signOriginStr));
}
校验值生成java示例代码
public static String createSign(Map<String, String> map, String token){
if(map == null || map.size() == 0){
return "";
}
List<String> keys = new ArrayList<>(map.keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for(String key: keys){
String value = map.get(key);
if(TextUtils.isEmpty(value)){
continue;
}
sb.append(key).append("=").append(value);
sb.append("&");
}
sb.append("token=").append(token);
return SecurityUtil.md5(sb.toString());
}
//SecurityUtil.md5
public static String md5(String s){
if (TextUtils.isEmpty(s)) {
return "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(s.getBytes());
String result = "";
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
校验值生成 golang 示例代码
func CreateSign(m map[string]string, token string) string {
if len(m) <= 0 {
return ""
}
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
var sb strings.Builder
for _, k := range keys {
if m[k] == "" {
continue
}
sb.WriteString(fmt.Sprintf(`%s=%s&`, k, m[k]))
}
sb.WriteString("token=")
sb.WriteString(token)
data := []byte(sb.String())
return fmt.Sprintf("%x", md5.Sum(data))
}