平台账户绑定
概述
想象一下,有些手机游戏允许玩家同时在PC和手机上游戏。一个潜在的问题是:
我们如何允许Google和Apple用户在PC上玩这款游戏?
对于PC游戏,到目前为止只有Garena账户被允许在PC上玩Garena游戏。嗯……如果我们可以将Google/Apple和Garena账户结合起来,同时玩这款游戏的PC和手机版本会怎么样?
这就是它!!!这就是平台账户绑定的目的。它用于将2个不同平台的账户绑定在一起,以利用每个平台账户的优势。
原理
将账户B绑定到应用C上的账户A(Bind(A, B, C))意味着创建一个绑定,其中A是主账户,B是应用C上的次要账户。绑定发生后:
- 如果用户使用账户
B登录,我们将返回从账户A生成的access token - 如果用户使用账户
A登录,我们将返回从账户A生成的access token
例如,Google/Apple账户是主账户,Garena账户是次要账户。如果用户使用Google/Apple登录,GOP将返回从Google/Apple账户生成的access token。如果用户使用Garena账户登录,GOP将返回从作为其主账户的Google/Apple账户生成的access token,这样我们就可以使用该access token以与手机端相同的凭据玩游戏。
当然,一个主账户可以有多个次要账户。
要成功将账户B绑定到应用C上的账户A(Bind(A, B, C)):
A必须是应用C的主账户。B必须是应用C的新账户。platform_id(B) != platform_id(A)- 不存在账户
D,使得platform_id(D) == platform_id(B)且账户D是应用C中A的次要账户。 - 应用
C已启用APP_PLATFORM_BIND。 platform_id(B)在应用C的secondary_app_platform_bind_list列表中。platform_id(A)在应用C的primary_app_platform_bind_list列表中。
应用的主账户是
- 在该应用上具有授权/角色的账户。
应用的次要账户是:
- 不是主账户,
- 连接到主账户,在应用账户绑定表上有记录。
应用的新账户是:
- 不是
主账户, - 没有连接到此应用上的任何
主账户。
流程
协作与流程
- 假设用户已登录,未使用游客账户
- 游戏通过MSDK调用获取平台账户绑定信息
- GOP返回绑定的账户和主账户可以绑定的可用平台。
- 游戏使用上述数据向用户显示信息,并允许用户根据返回的平台使用次要账户登录。
- MSDK帮助启动应用/网页进行授权。
- 游戏客户端将接收次要账户的token。
- 游戏客户端将主账户的token和次要账户的token发送到游戏服务器
- 游戏服务器调用GOP服务器的绑定API,并将绑定结果返回给游戏客户端。
时序图

获取绑定信息
平台绑定状态
登录到非游客账户后,您可以请求用户当前的平台账户绑定状态,以获取绑定的账户和可绑定的平台(可用于显示平台选项)。
- Android
- iOS
- Unity
- Unreal
accountManager.getPlatformBindingInfo(new OnBindPlatformInfoListener() {
@Override
public void onSuccess(@NonNull List<BoundedAccount> boundedAccounts, @NonNull List<Integer> availablePlatforms) {
}
@Override
public void onFailure(@NonNull MSDKError error) {
}
});
[MSDKLoginManager.shared requestPlatformBindingInfoWithCompletion:^(MSDKPlatformBindingInfoRet *ret) {
if (ret.flag == MSDKeFlagSucc) {
// `ret`包含所有绑定的平台账户和可绑定的平台。
NSLog(@"绑定的平台账户: %@", ret.boundAccounts);
NSLog(@"可绑定的平台: %@", ret.availablePlatforms);
} else {
// 获取平台绑定信息失败
if (ret.flag == MSDKeFlagPlatformBindingInvalidApp) {
// 当前应用不适用于平台绑定
}
}
}];
GMSDKHandler.BindClient.GetPlatformBindingInfo(ret =>
{
if (ret.resultCode == ErrorCode.Success)
{
//成功
Debug.Log("可绑定平台 = " + ret.availablePlatforms);
Debug.Log("绑定的账户 =" + ret.boundedAccounts);
}
else
{
// 处理错误
Debug.LogError("GetPlatformBindingInfo() 失败: " + ret.message);
}
});
UMsdkLogin::GetPlatformBindingInfo();
平台绑定令牌
通过验证非游客的次要平台账户来获取平台绑定令牌。
- Android
- iOS
- Unity
- Unreal
accountManager.getPlatformBindingToken(platformType, callback);
[MSDKLoginManager.shared getSecondaryPlatformSessionWithPlatform:(MSDKePlatform)platform completion:^(MSDKLoginRet *loginRet) {
if (loginRet.flag == MSDKeFlagSucc) {
// 继续下一步绑定用户的主账户和次要账户。通常,游戏客户端应将主账户的token和次要账户的token发送到游戏服务器
} else {
// 获取次要平台会话失败。
// 可能的错误:
// MSDKeFlagNotInstall
// MSDKeFlagUserCancel
// MSDKeFlagNetworkError
// MSDKeFlagAuthUserBanned
// MSDKeFlagAuthTokenInvalid
// MSDKeFlagError
}
}];
GMSDKHandler.BindClient.GetPlatformBindingToken((AccountPlatform)_platformBindingPlatform, ret =>
{
LogScene.LogResult(ret);
if (ret.resultCode == ErrorCode.Success)
{
var platform = ret.platform;
var openId = ret.openId;
var token = ret.token;
// 继续下一步绑定用户的主账户和次要账户。通常,游戏客户端应将主账户的token和次要账户的token发送到游戏服务器
}
else
{
// 获取次要平台会话失败。
// 可能的错误:
// AppNotInstalled
// UserCancelled
// NetworkException
// UserBanned
// InvalidToken
// UnknownError
Debug.LogError("GetPlatformBindingToken() 失败: code=" + ret.Description + ",message=" + ret.message);
}
});
UMsdkLogin::GetPlatformBindingToken(EPlatform BindPlatform);
处理平台账户绑定结果
仅在Android上,通过游戏服务器成功绑定平台账户后,您需要通知MSDK更新其本地状态。
- Android
- Unity
- Unreal
accountManager.onBindPlatformCompleted();
GMSDKHandler.BindClient.OnBindPlatformCompleted();
UMsdkLogin::OnAndroidBindPlatformCompleted();