手机号授权
该能力旨在帮助开发者向用户发起手机号申请,并且必须经过用户同意后,开发者才可获得由平台验证后的手机号,进而为用户提供相应服务。
小程序端手机号授权
使用方法
步骤 1:配置 button 组件
需要将 button 组件的 open-type 值设置为 getPhoneNumber,当用户点击并同意授权后,通过 bindgetphonenumber 事件获取回调信息。
步骤 2:处理回调数据
将 bindgetphonenumber 事件回调中的动态令牌 code 传到开发者后台,并调用 bilibili 后台提供的 phonenumber.getPhoneNumber 接口,消费该 code 来换取用户手机号。
注意:每个 code 有效期为 5 分钟,且只能消费一次。
⚠️ 重要提示:
getPhoneNumber返回的code与bl.login返回的code作用不同,不可混用。
代码示例
XML 部分
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
JS 部分
Page({
getPhoneNumber(e) {
console.log(e.detail.code); // 动态令牌
console.log(e.detail.errMsg); // 回调信息(无论成功/失败均返回)
console.log(e.detail.errno); // 错误码(仅失败时返回)
// 实际开发中需将 code 发送到开发者后台处理
// bl.request({
// url: 'https://your-backend-api.com/phone',
// data: { code: e.detail.code }
// })
},
});
返回参数说明
| 参数 | 类型 | 说明 | 最低 SDK_Version |
|---|---|---|---|
| code | String | 动态令牌,用于通过 phonenumber.getPhoneNumber 接口换取手机号 | 4.0.9 |
| errMsg | String | 回调信息(如:getPhoneNumber:ok) | 4.0.9 |
| errno | Number | 错误码(仅失败时返回) | 4.0.9 |
服务端手机号授权
1 接口说明
该接口用于小程序手机号授权登录,获取用户手机号。
2 请求说明
2.1 基础信息
| 属性 | 说明 |
|---|---|
| 域名 | https://miniapp.bilibili.com |
| 路径 | /open/open_api/v1/platform/phone/exchange |
| Method | POST |
| ContentType | application/json |
2.2 请求参数
| 参数 | 类型 | 必填 | 位置(query、header、body) | 是否参与签名 | 示例 | 说明 |
|---|---|---|---|---|---|---|
| access_key | String | 是 | query | 否 | b6dj2f1e785149fjp2dedbiad68dwl9y | access_key,接入前申请 |
| sign | String | 是 | query | 否 | WbGNoWSnhogpKzilnQfPciPYdJgiTc2w6T2BI7Bcpo4B | 签名,参考【签名计算准则】 |
| ts | Long | 是 | query | 是 | 1736739534331 | 时间戳,单位毫秒 |
| app_id | String | 是 | body | 是 | bili388fh0g748hdj | 小程序app_id |
| open_id | String | 是 | body | 是 | 1736739534331 | 小程序open_id |
| preauth_code | String | 是 | body | 是 | PRE_20231010123456_abcd1234 | 小程序获取手机号的授权码 |
3 响应说明
3.1 响应信息
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
| code | Long | 0 | 错误码,0表示成功,其他表示异常,具体异常信息见message字段,详细错误码参考【状态码】介绍 |
| message | String | success | 错误信息 |
| data | PhoneExchangeDetailResp | 见完整示例 | 接口返回值,包含订单详情信息 |
PhoneExchangeDetailResp.encrypted_phone | String | - | 加密后的手机号,使用AES/CBC/PKCS5PADDING加密 |
PhoneExchangeDetailResp.iv | String | - | AES解密所需的初始化向量 |
3.2 错误码
| code | 说明(具体错误信息见 message 字段) |
|---|---|
| 0 | 请求成功 |
| 100 | 系统繁忙,请稍后再试 |
| 102 | 程序内部错误,可联系 B 站相关同学排查 |
| 104 | 参数异常,如接口参数不符合规范等 |
| 105 | unauthorized,如小程序访问未授权的剧集等 |
| 106 | invalid sign,如接口参数签名不正确等 |
| 107 | 解析签名参数失败,如解析接口签名参数异常等 |
| 200 | 数据不存在,如未查询到有效的小程序等 |
| 201 | 非法数据,如不符合业务逻辑安全性检查等 |
| 402 | 凭证已失效 |
备注:后续有新增或者变化,会持续新增
3.3 完整示例
3.3.1 请求示例
URL:
{API}?access_key=b6dj2f1e785149fjp2dedbiad68dwl9y&ts=1736739534331&sign=WbGNoWSnhogpKzilnQfPciPYdJgiTc2w6T2BI7Bcpo4B
Body:
{
"app_id": "bili4a144dc9519e38b8",
"open_id": "fba20827e95da8ada251be6bab2bb679",
"preauth_code": "PRE_AUTH_1741958522488_fe11657247b54a75a855a4d9a6d38cb6"
}
3.3.2 响应示例
{
"data": {
"encrypted_phone": "uXkJiU7eAHbDcHKLTrbJ4Q==",
"iv": "$YOCLvODjA7PbkQB"
},
"code": 0,
"message": "success",
"current_time": 1739871452085
}
4 解密说明
接口返回的手机号信息是经过AES加密的,需要使用以下方式进行解密:
4.1 加密算法
- 算法:AES
- 模式:CBC
- 填充:PKCS5PADDING
- 密钥:由B站小程序团队提供的secretKey
- 初始化向量:接口返回的iv字段
4.2 解密步骤
- 使用Base64解码encrypted_phone字段
- 使用提供的secretKey和iv进行AES解密
- 解密后得到明文手机号
4.3 代码示例
public class AESDecryptor {
public static String decrypt(String encryptedData, String secretKey, String iv) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decodedEncryptedData = Base64.getDecoder().decode(encryptedData);
byte[] original = cipher.doFinal(decodedEncryptedData);
return new String(original);
}
public static void main(String[] args) {
try {
String encryptedData = "加密手机号";
String secretKey = "B站小程序团队获取";
String iv = "接口返回";
String decryptedData = decrypt(encryptedData, secretKey, iv);
} catch (Exception e) {
e.printStackTrace();
}
}
}
5 版本变更
| 版本 | 说明 | 时间 |
|---|---|---|
| 1.0 | 新增手机号授权相关API | 2025-03-12 17:45:14 |
| 1.1 | 解密示例代码修改为decode | 2025-04-01 14:04:14 |
| 1.2 | 移除外部引用,完善解密逻辑说明文档 | 2025-11-12 11:57:15 |