本篇文档介绍短信接口的验证机制。
短信发送使用数字签名(signature)的验证模式。这种模式能够有效避免签名密钥在传输途中的泄露,是安全级别很高的一种加密验证方式。
数字签名验证模式
调用接口时, 用户不需要把签名密钥 (SMS_KEY) 作为参数明文传输, 而是将数字签名 (signature) 作为参数传输给服务器,服务器端会验证此数字签名 (signature) 的正确性。
生成数字签名的方法
1.将实际调用 API( 发送验证码短信、发送通知类短信、校验验证码、查询发送状态 )的参数以字母升序(A-Z)排列,除去其中的 signature
字段。
特别注意以下规则:
- 参数名以字母升序(A-Z)排列;
- 传送的参数
signature
不参与签名。
例如,传送的参数如下:
templateId: 100001 |
2.将参数以字母升序(A-Z)排列,再以 'key=value'+ '&' + 'key=value'
的方式连接所有参数,得到字符串 param_str
。
param_str="mobile=130xxxxxxxx&templateId=100001×tamp=1492675740231" |
3.以 param_str + ‘&’ + SMS_KEY
的方式得到字符串 sign_str
。
sign_str="mobile=130xxxxxxxx&templateId=100001×tamp=1492675740231&$SMS_KEY" |
SMS_KEY (短信 API 密钥) 在 控制面板-短信-配置 中获取,操作如下:
4.计算 sign_str
的 SHA256值 (64位, 不区分大小写), 得到 signature
5.该签名用于各个接口的访问。
Java 示例如下(其他语言规则一致):
// 发送短信验证码 |
此处可参考完整 示例代码。
提示:
生成数字签名时, 参数不要使用 urlencode
。在调用 api 时, 才需要对参数做urlencode
&
是代码中使用的连接符,+
是文档显示之用。