注:此协议即将过期
# 流程
- Post 请求
https://line1-sdk-center-login-sh.biligame.net/api/client/rsa获取 rsa 公钥,param 计算流程下方 [1],获取rsa_key与hash - Post 请求
https://line1-sdk-center-login-sh.biligame.net/api/client/login进行登录,param 计算流程下方 [2],获取access_key与uid,若未能获取access_key或错误信息提示需要验证码,请参照验证码部分 - Post 请求
https://api-sdk.mihoyo.com/bh3_cn/combo/granter/login/v2/login进行崩坏三渠道服登录,param 计算流程下方 [3],获取combo_idopen_id与combo_token - Post 请求
https://global2.bh3.com/query_dispatch?version={oa_req_key}&t={TimeStampMs}获取 OA 服务器,其中oa_req_key为游戏版本号_gf_android_bilibili,TimeStampMs为系统的毫秒时间戳,获取region_list中第一个对象中的dispatch_url - Post 请求
{dispatch_url}?version={oa_req_key}&t={TimeStampMs},这两个值同上一步,获取整个对象 - 此时使用二维码解码库,对崩坏 3 的扫码登录二维码进行解析获取网址,获取
ticketapp_id与biz_key - Post 请求
https://api-sdk.mihoyo.com/{Biz_key}/combo/panda/qrcode/scan进行扫码流程的第一步,通知扫码流程开始,param 计算流程下方 [4],获取 - Post 请求
https://api-sdk.mihoyo.com/{Biz_key}/combo/panda/qrcode/confirm进行扫码流程的最后一步,确认扫码登录,param 计算流程下方 [5],若retcode为 0 则登录成功
# 验证码
1 | { |
- 进行时间戳的替换
- 使用 [1] 求 sign 的流程,获取 sign
- 将
&sign=xxx拼接在最后 - POST 请求
https://api-sdk.mihoyo.com/bh3_cn/combo/granter/login/v2/start_captcha,获取gtchallengegt_user_id - 使用浏览器访问
https://help.tencentbot.top/geetest/?captcha_type=1&challenge={challenge}>={gt}&userid={gt_user_id}&gs=1,进行参数的替换 - 完成验证码后将
validate=后的内容复制保存 - 在流程的第 2 步时可以填写对应的值,详情见 [2]
# RSA 公钥 [1]
1 | { |
- 基础 json 文本,使用时将
timestamp与client_timestamp的内容替换为本机毫秒时间戳 - 将每个键进行 URL 拼接,形如
operators=1&merchant_id=590…… - 下面来计算 sign,首先将上述的所有键按照首字母进行升序排列,后将值进行直接拼接
- 在上述字符串后添加盐,本版本的盐为
dbf8f1b4496f430b8a3c0f436a35b931 - 将加盐后的字符串进行 MD5 加密,转为小写
- 将
&sign=xxx拼接在最后
# 哔哩哔哩登录 [2]
1 | { |
- 若有验证码结果,请将
gt_user_id``validate``challenge填入对应的值,否则请留空 - 将
user_id的值更改为需要进行登录的账户 - 进行密码的 RSA 加密,首先将在 RSA 公钥请求中获取到的 hash 与密码明文拼接,之后将拼接的文本使用获取到的 RSA 公钥进行 RSA 加密 (Pkcs1)
- 将上一步加密后的密码,替换
pwd的值 - 之后根据 [1] 流程求 sign 的过程,计算一遍 sign,拼接在最后
# 崩坏三渠道服登录 [3]
1 | { |
- 将第二步获取到的
uid与access_key填入对应值中 - 进行求 sign 的流程,此处为崩坏三的 sign 与哔哩哔哩的 sign 不同。首先同样将所有的键按首字母升序的方式进行排序,之后将键值对按
key=value&的形式进行拼接,注意末尾没有& - 将上一步的流程使用
HMAC-SHA256算法处理,此版本的 Key 为0ebc517adb1b62c6b408df153331f9aa - 将 json 中添加一个名为
sign的键,请求体为整个 json
# 崩坏三扫码流程_通知扫码 [4]
1 | { |
- 将毫秒时间戳替换进
ts的值,将二维码 URL 中的参数替换进对应的值 - 使用 [3] 中求 sign 的流程进行 sign 的计算
- 将 json 中添加一个名为
sign的键,请求体为整个 json
# 崩坏三扫码流程_确认扫码 [5]
1 | { |
- 建议使用上一步的 json 进行填充,或将最外层的
app_id``device等值补充完全 - 首先根据前几步获取到的值进行替换
oaserver.开头的值为在第 4 步获取到的整个对象- 若
oaserver.asset_boundle_url键不存在,使用oaserver.asset_bundle_url_list中随意一个值 - 若
oaserver.ex_resource_url键不存在,使用oaserver.ex_resource_url_list中随意一个值 asterisk_name为最终在游戏界面上展现的用户名,可随意更改- 将整个 json 使用 [3] 中求 sign 的方法获取 sign,
payload只需当做一个值即可 (json 压缩),无需对其内部进行键排序 - 最终返回下方的这个 json
1 | { |
将字段进行填充,并将 [5] 最一开始填充完成值 json 的 payload 放置在这段 json 的 payload 处,返回即可
# 参考加密算法代码
# MD5
1 | using System.Security.Cryptography; |
# RSA
nuget 包 BouncyCastle
1 | using Org.BouncyCastle.Crypto; |
# HMAC-SHA256
1 | using System.Security.Cryptography; |
# 错误代码参考
哔哩哔哩游戏 SDK 开放平台文档中心