发送短信验证码

接口描述:发送短信验证码到指定手机号

接口地址:https://otp.yunpian.com/api/sms/sendCode

请求方法:POST

内容类型:application/x-www-form-urlencoded

请求头:

请求头 含义 备注
Content-Type 固定值 application/x-www-form-urlencoded
x-app-id OTP 应用 ID,请在云片开发者控制台创建应用并获取
x-app-key OTP 应用 Key,创建应用后自动生成的 appKey 为提高安全性,可以用签名取代 appKey,请参考附录 API 签名校验
x-timestamp 时间戳,单位毫秒
x-nonce 一次性随机数,调用方随机生成,应保证每次请求唯一

请求参数:

请求参数 含义
phone 手机号,建议使用 E164 格式,暂时仅支持中国大陆手机号

请求和响应示例:

  1. curl -X POST \
  2. 'https://otp.yunpian.com/api/sms/sendCode?phone=%2B86139XXXXYYYY' \
  3. -H 'Content-Type: application/x-www-form-urlencoded' \
  4. -H 'x-app-id: 7bc548ae10394f23b7d76a48cec23dec' \
  5. -H 'x-app-key: 5d2ae085c72f4ac8b91562d9b628c1e5' \
  6. -H 'x-timestamp: 1575129600000' \
  7. -H 'x-nonce: rl29sm2df'
  1. {
  2. "code": 0,
  3. "msg": "ok",
  4. "meta": {
  5. "rateLimitStats": {
  6. "appNaturalDay": {
  7. "count": 1,
  8. "limit": 1000,
  9. "enabled": true
  10. },
  11. "appToPhonePerMinute": {
  12. "count": 1,
  13. "limit": 10,
  14. "enabled": true
  15. },
  16. "appToPhonePerHour": {
  17. "count": 1,
  18. "limit": 30,
  19. "enabled": true
  20. },
  21. "appToPhonePerDay": {
  22. "count": 1,
  23. "limit": 30,
  24. "enabled": true
  25. }
  26. }
  27. },
  28. "data": {}
  29. }

响应体字段说明:

字段 含义 备注
code 响应码,0 - 成功,其他 - 失败,详情参考附录响应码
msg 响应码对应的描述语
meta 元信息,格式不固定的对象 包括当前限流信息rateLimitStats,取决于接口调用次数和您在开发者控制台的短信频率配置
data 保留字段,暂无数据

校验短信验证码

接口描述:校验短信验证码是否正确

接口地址:https://otp.yunpian.com/api/sms/verifyCode

请求方法:POST

内容类型:application/x-www-form-urlencoded

请求头:

请求头 含义 备注
Content-Type 固定值 application/x-www-form-urlencoded
x-app-id OTP 应用 ID,请在云片开发者控制台创建应用并获取
x-app-key OTP 应用 Key,创建应用后自动生成的 appKey 为提高安全性,可以用签名取代 appKey,请参考附录 API 签名校验
x-timestamp 时间戳,单位毫秒
x-nonce 一次性随机数,调用方随机生成,应保证每次请求唯一

请求参数:

请求参数 含义
phone 手机号,建议使用 E164 格式,暂时仅支持国内手机号
code 验证码

请求和响应示例:

  1. curl -X POST \
  2. 'https://otp.yunpian.com/api/sms/verifyCode?phone=%2B86139XXXXYYYY&code=123456' \
  3. -H 'Content-Type: application/x-www-form-urlencoded' \
  4. -H 'x-app-id: 40685513ea3446debdd5e04d03301e2a' \
  5. -H 'x-app-key: 1f63ee1d8e4547b7b9060fb9fa44a766' \
  6. -H 'x-timestamp: 1575129600000' \
  7. -H 'x-nonce: rl29sm2df'
  1. {
  2. "code": 40033,
  3. "msg": "验证码不正确",
  4. "meta": {
  5. "verifySuccessCount": 0,
  6. "verifyFailLimit": 5,
  7. "verifyFailCount": 1
  8. }
  9. }

响应体字段说明:

字段 含义 备注
code 响应码,0 - 成功,其他 - 失败,详情参考附录响应码
msg 响应码对应的描述语
meta 元信息,格式不固定的对象 包括待验证的验证码的验证失败次数、验证失败次数限制、验证成功次数等

注意:

验证码失效策略

  • 成功验证过一次后立即失效
  • 验证失败次数达到限制立即失效
  • 验证码超时未验证自然过期
  • 生成了新验证码后,旧验证码(未验证通过)自动失效

附录

API 签名校验

服务端接口需要校验调用方的身份,这些信息放在请求头中,您可以通过x-app-idx-app-key来完成校验,为提高安全性,您也可以选择签名校验。

请求头

请求头 含义 备注
Content-Type 固定值 application/x-www-form-urlencoded
x-app-id OTP 应用 ID,请在云片开发者控制台创建应用并获取
x-timestamp 时间戳,单位毫秒 服务器会对该时间做校验,与当前时间相差过大将无法完成校验
x-nonce 一次性随机数 调用方随机生成,应保证每次请求唯一
x-signature 签名,使用 HMAC-SHA256 加密算法 生成签名方法:拼接x-app-idx-timestampx-nonce的值作为消息,appKey的值作为密钥,生成消息摘要。

签名计算方法示例

假设

x-app-id=40685513ea3446debdd5e04d03301e2a x-timestamp=1575129600000 x-nonce=rl29sm2df appKey=1f63ee1d8e4547b7b9060fb9fa44a766

拼接字符串得到消息40685513ea3446debdd5e04d03301e2a1575129600000rl29sm2df,以1f63ee1d8e4547b7b9060fb9fa44a766作为密钥计算得到消息摘要为32aca2e5745357e3fe423226a14681f78d8cf69ae5469c89ff08f1c2778dadcc

Java 代码示例:

  1. String appId = "40685513ea3446debdd5e04d03301e2a";
  2. long timeMillis = System.currentTimeMillis();
  3. String nonce = UUID.randomUUID().toString();
  4. String msgToDigest = appId + timeMillis + nonce;
  5. String appKey = "1f63ee1d8e4547b7b9060fb9fa44a766";
  6. HmacUtils hmacUtils = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, appKey);
  7. String hmacHex = hmacUtils.hmacHex(msgToDigest);
  8. System.out.println(hmacHex);

这里,HmacUtils类来自于commons-codec

响应码

响应码是指响应体(JSON 格式)中的code字段,0表示成功,其他表示失败,具体参照下表。

注:HTTP 状态码为200时,返回响应体code0;HTTP 状态码非200时,返回响应体code0

HTTP 状态码 响应码(code) 描述
200 0 成功
400 40012 应用不存在
400 40022 短信模板状态异常,一般是短信模板未设置或未审核通过
400 40023 短信模板内容不包含验证码占位符(#code#),请修改短信模板
400 40024 短信内容过长,不应超过 70 个字,请更改短信模板
400 40031 验证码已过期,请重新获取验证码
400 40032 验证失败次数达到上限,请重新获取验证码
400 40033 验证码不正确,请重新提交验证码
400 40100 未通过身份验证,appKey 或签名错误导致
400 42900 请求过多,达到短信发送频率限制

服务端交互时序图

otp服务端交互时序图.png