发送短信验证码


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


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


请求方法:POST


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


请求头:

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


请求参数:

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


请求和响应示例:


curl -X POST \
  'https://otp.yunpian.com/api/sms/sendCode?phone=%2B86139XXXXYYYY' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'x-app-id: 7bc548ae10394f23b7d76a48cec23dec' \
  -H 'x-app-key: 5d2ae085c72f4ac8b91562d9b628c1e5' \
  -H 'x-timestamp: 1575129600000' \
  -H 'x-nonce: rl29sm2df'


{
  "code": 0,
  "msg": "ok",
  "meta": {
    "rateLimitStats": {
      "appNaturalDay": {
        "count": 1,
        "limit": 1000,
        "enabled": true
      },
      "appToPhonePerMinute": {
        "count": 1,
        "limit": 10,
        "enabled": true
      },
      "appToPhonePerHour": {
        "count": 1,
        "limit": 30,
        "enabled": true
      },
      "appToPhonePerDay": {
        "count": 1,
        "limit": 30,
        "enabled": true
      }
    }
  },
  "data": {}
}


响应体字段说明:

字段含义备注
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-idOTP 应用 ID,请在云片开发者控制台创建应用并获取
x-app-keyOTP 应用 Key,创建应用后自动生成的 appKey为提高安全性,可以用签名取代 appKey,请参考附录 API 签名校验
x-timestamp时间戳,单位毫秒
x-nonce一次性随机数,调用方随机生成,应保证每次请求唯一


请求参数:

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


请求和响应示例:


curl -X POST \
  'https://otp.yunpian.com/api/sms/verifyCode?phone=%2B86139XXXXYYYY&code=123456' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'x-app-id: 40685513ea3446debdd5e04d03301e2a' \
  -H 'x-app-key: 1f63ee1d8e4547b7b9060fb9fa44a766' \
  -H 'x-timestamp: 1575129600000' \
  -H 'x-nonce: rl29sm2df'


{
  "code": 40033,
  "msg": "验证码不正确",
  "meta": {
    "verifySuccessCount": 0,
    "verifyFailLimit": 5,
    "verifyFailCount": 1
  }
}


响应体字段说明:

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


注意:


验证码失效策略


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


附录


API 签名校验


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


请求头

请求头含义备注
Content-Type固定值 application/x-www-form-urlencoded
x-app-idOTP 应用 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 代码示例:


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


这里,HmacUtils类来自于commons-codec


响应码


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


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

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


服务端交互时序图


otp服务端交互时序图.png