获取手机号(新方式)
收藏
我的收藏

获取用户绑定的手机号。需要用户主动点击 button 组件后才能发起手机号的获取。
注意:此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请;
说明
从基础库版本 3.51.0 开始,对换取手机号信息的方式进行了安全升级,下述为新方式使用指南。
旧方式目前可以继续使用,但建议开发者使用新方式,以增强小程序安全性)另外,新方式仍然需要提前调用tt.login进行登录。

注意事项

    小程序对获取用户手机号能力的使用场景需符合平台要求,平台允许的使用场景如下:
    在注册/登录场景,通过获取手机号,简化注册/登录流程;实现用户在小程序下的账号打通。
    在账户绑定场景,手机号作为唯一凭证,用于关联小程序的账号、权益、资产等数据互通。
    在交易场景,通过获取手机号,查询用户订单信息或完成用户订单/物流等提醒触达。
    触发按钮文案应为“授权手机号快捷登录”、“手机号码一键登录”等,禁止在用户进入小程序时就弹出获取手机号。

使用方法

需要将 <button> 组件 open-type 的值设置为 getPhoneNumber。用户点击后会弹出一个授权弹窗让用户确认(若该用户账户未绑定手机号码会执行一次绑定手机号码的流程;授权弹窗每次使用都会弹出)。 用户同意后,开发者可以通过 bindgetphonenumber 事件回调获取到一个动态令牌code,并在开发者后台调用后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。每个code有效期为5分钟,且只能消费一次。
注:getPhoneNumber 返回的 codett.login 返回的 code 作用是不一样的,不能混用。

代码示例

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
Page({ onLoad: function (options) { tt.login({ force: true, success(res) { console.log(res,"code登录"); } }); }, getPhoneNumber (e) { console.log(e.detail.code) // 动态令牌 console.log(e.detail.errMsg) // 回调信息(成功失败都会返回) console.log(e.detail.errno) // 错误码(失败时返回) } })

回调参数说明

参数
类型
说明
最低支持版本
errMsg
string
错误信息
1.14.0
encryptedData
string
包括敏感数据在内的完整用户信息的加密数据
1.14.0
iv
string
加密算法的初始向量
1.14.0
cloudId
string
敏感数据对应的开放数据 id,上云的小程序才会返回。
2.70.0
code
string
动态令牌。在开发者后台调用后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号
3.51.0
通过开发者在「抖音开放平台-控制台-找到对应的小程序-开发-开发配置」配置的应用公钥 进行RSA非对称加密后的密文数据,需要开发者通过对应的应用私钥进行解密。应用公私钥由开发者生成,并将公钥录入在「应用公钥」上,私钥由开发者保管。(注:应用公私钥需要谨慎修改,在平台更新应用公钥后,默认会选择最新的应用公钥加密,开发者需要立马更新代码中用来解密的应用私钥。
应用公钥配置流程:
errMsg为发生错误时具体的错误信息:
    开放平台没有权限获取手机号:platform auth deny。若平台封禁了某开发者该权限时可能返回或者是非企业小程序也会返回此信息。
    该小程序没有申请获取手机号权限:no permission
    开放平台账号没有绑定手机号:no phone number。若用户宿主端没有绑定手机号,也会返回此信息。
    未在小程序平台登录:not login。开发者看到此信息后应当执行登录操作。
    用户没有绑定手机号或用户拒绝授权:auth deny
    用户未登入:invalid session
    其他错误:internal error

数据解密

参考敏感数据处理在开发者后台解密。解密后获取得到的数据形式如下:
{ "phoneNumber": "138xxxxxxxx", // 用户绑定的手机号(国外手机号会有区号) "purePhoneNumber": "138xxxxxxxx", // 没有区号的手机号 "countryCode": "86", // 区号 "watermark": { "appid": "ttxxxxxxxxxxxxxxxx", "timestamp": 15000000000000000 } }

接入测试注意事项:

    1.如果code返回是空字符串,可以按照以下顺序排查:
    检查是否配置了应用公私钥,未配置应用公私钥的情况下不会返回code。
    同时需要确保配置的应用公私钥是合法的,可以复用开发者工具生成,JAVA 适用PKCS8格式,非JAVA语言适用PKCS1格式。
    如果已配置的情况下依然为空,则需要检查App基础库版本是否大于等于3.51.0,可以通过兼容性说明中的方式获取本地的基础库版本信息,如果App基础库版本过低,通过更新App即可解决。