# 发送短信验证码
> iOS >= 0.7.13 支持，Android >= 0.7.5 支持。

通过 `button` 组件指定 `open-type` 为 `sendPhoneSms`，可触发向指定手机号发送手机验证码。

## 使用提醒

- 建议开发者尽可能使用微信登录或者一键获取手机号的方式，减少使用发送验证码的方式，因为发送验证码的方式由于运营商的原因，存在一定的不稳定。
- 一个经办人只能备案一个短信的签名（即，张三作为「aa科技」这个签名的经办人，在本平台提交材料进行备案了；但是张三优作为「bb科技」在某短信平台进行备案了，这种情况也是属于「一经办人多企」的情况，被运营商抽查发现也会终止短信验证码的发送，请开发者知悉），如果企业需要用到多个短信签名，需要分别备案。

## 其他注意事项
- 在使用发送短信验证码功能之前需先完成短信签名要求实名制报备，否则将无法发送短信。**[点此提交报备材料](https://doc.weixin.qq.com/forms/AJEAIQdfAAoAFAAmAbdAFwdIvv5sqKTUf?page=1)**。并且，提交报备材料后可前往社区联系[小助手](https://developers.weixin.qq.com/community/personal/oCJUsw3P4p8PBaPYB1GvX79vibes)提供「多端应用 ID」以及「短信签名」信息进行申请加急处理
- 报备材料中不要填小程序的 AppID，是填多端应用的 AppID！
- **其他说明：个人主体以及个体工商户暂不支持申请，请知悉。**

## 短信签名报备背景

1、【签名必须备案】

- 按照工信部 23-24 年要求，短信签名 如【腾讯科技】都要向运营商进行完整法律文书报备；未报备或者文书过期，短信会拦截。请根据你公司行业情况，完整提供资料运营商审核周期 3-7 个工作日后。

2、【独立经办人要求】

- 每个签名独立填写一份，工信部要求，一个自然人只能对一个签名负责
- 举例：比如贵司申请 3 个不同短信签名，需提交 3 次材料收集表；提交 3 个不同的经办人资料。

2.1 必填材料：均需盖章（传直接图片，勿传 PDF 等文件格式）

  - 签名归属主体营业执照
  - 经办人证件复印件（正、反面）、手持证件照片（不用盖章）
  - 软著及版号盖章（游戏类签名必须提供）
  - 金融许可证（金融类签名必须提供）
  - 预售许可证（房产类签名必须提供）

2.2 关联性证明资料：（传直接图片，勿传 PDF 等文件格式）

- 签名与公司主体名称不一致时，需完成 签名品牌 归属该主体的证明链
- 如 App/小程序/网站截图（商标证书或者 ICP 备案）

2.3 行业主体及授权资料：（传直接图片，勿传 PDF 等文件格式）

- 如果贵司主体，并非腾讯控股的主体或业务，需填写法人及授权资料：法人身份证复印件、签名授权书、签名说明书、合同链证明（如，打印《身份管理功能服务条款》，开发者盖公司公章后（含骑缝章）
上传完整文档盖章照片）
- 关于每份材料的提供要求可查看[短信签名备案详细说明](https://doc.weixin.qq.com/forms/AJEAIQdfAAoAFAAmAbdAFwdIvv5sqKTUf?page=1#/fill)

## 前置流程

1、需前往「[微信开发者平台](https://developers.weixin.qq.com/platform/) - 多端应用 - 身份管理」开通身份管理功能，并且勾选「短信验证码」。

## button 组件参数

|属性|类型|默认值|必填|说明
|--|--|--|--|--|
|phoneNumber|string||是|手机号|
|open-type|string||是|sendPhoneSms 为发送手机验证码|
|sms-type|number|0|否|发送手机验证码的类型|
|bindsendphonesms|Function||否|获取用户手机号回调，open-type=sendPhoneSms 时有效|

### sms-type
|值|说明
|--|--|
|0|作为 [wx.phoneSmsLogin](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.phoneSmsLogin) 的前置流程|
|1|作为 [wx.miniapp.bindPhone](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.miniapp.bindPhone) 的前置流程|

## bindsendphonesms 回调参数

### Object res

|属性|类型|说明|
|--|--|--|
|errCode|number|错误码|
|errMsg|string|错误提示|

## 示例代码

```xml
<input bindinput="onPhoneNumberChange" value="{{phoneNumber}}"/>
<button type="primary" open-type="sendPhoneSms" sms-type="{{0}}" bindsendphonesms="onHandleLogin" phoneNumber="{{phoneNumber}}">发送验证码</button>
<input bindinput="onVerifyCodeChange" value="{{verifyCode}}"/>
<button bindtap="login">登录</button>
```

```js
Page({
  data: {
    phoneNumber: '',
    verifyCode: ''
  },
  onVerifyCodeChange(e) {
    this.setData({ verifyCode: e.detail.value });
  },
  onPhoneNumberChange(e) {
    this.setData({ phoneNumber: e.detail.value });
  },
  onHandleLogin(e) {
    const detail = e.detail;
    console.log('sendphonesms errCode', detail.errCode)
  },
  login() {
    wx.phoneSmsLogin({
      phoneNumber: this.data.phoneNumber,
      verifyCode: this.data.verifyCode,
      success (res) {
        if (res.code) {
          //发起网络请求
          wx.request({
            url: 'https://example.com/onLogin',
            data: {
              code: res.code
            }
          })
        } else {
          console.log('登录失败！' + res.errMsg)
        }
      }
    })
  }
})
```

### 错误码

|errCode|说明|
|--|--|
|10001007|多端应用未绑定移动应用|
|10001017|发送短信超过频率限制，验证码有效期为 2 分钟，开发者需限制调用频率|
|10001045|当前短信签名尚未报备，请按照本文的指引提交报备材料，完成短信签名的报备|
|-700000|前端错误，errMsg 将给出详细提示|
