游戏类应用调用此接口接入华为帐号体系,使用用户的华为帐号登录游戏。
开发者提前在华为开发者联盟申请华为游戏服务。用户启动游戏后,应用即调用此接口拉起华为帐号登录页面,用户登录成功后,应用即可获得用户的游戏帐号信息。
● 调用本接口前,必须已经提前为应用申请华为游戏服务,参见申请游戏服务。
● 本接口当前支持的国家或地区请参见游戏登录中的“注意事项”。
- HMSAgent.Game.login(LoginHandler handler, int forceLogin);
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
handler | M | 接口调用后的回调结果,查询结束后通过此回调实例回调给应用。回调结果中包含的具体参数参见结果回调。 | |
forceLogin | M | int | 玩家未登录华为帐号是否拉起登录页面。 ● 0:如果玩家未登录华为帐号,HMS SDK不会主动拉起华为帐号登录页面,适用于单机游戏的登录场景。 ● 1:如果玩家未登录华为帐号,HMS SDK会主动起华为帐号登录页面,适用于网游的登录场景和单机游戏支付前强制登录场景。 |
- public interface LoginHandler{
- /**
- * 登录结果回调,onResult方法将回调2次
- * @param retCode 返回码
- * @param userData 登录结果信息
- */
- void onResult(int retCode, GameUserData userData);
- }
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
retCode | M | int | 回调结果中登录结果的返回码,应用可以根据返回码判断登录是否成功或失败后如何处理,具体返回码处理参见返回码。 |
userData | M | 包含游戏登录结果的对象信息。如果retCode不为0,该对象将返回null。 获取userData对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“userData.getPlayerId()”为获取到的华为用户分配的游戏账户ID。 |
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
playerId | M | string | 华为为用户分配的游戏帐户ID。该ID可应用内唯一标识该用户。 ● 如果用户非首次登录,应用需要根据onResult方法的2次回调结果对playerId进行不同处理。 − 第1次回调:登录结果中仅包含playerId和isAuth,isAuth为0。应用如果要求快速登录且对安全性要求不高,可以使用此时的palyerId让用户进入游戏。待第2次回调的登录验签成功则允许用户继续游戏,验签失败则终止游戏并提示重新登录。 − 第2次回调:isAuth为1,登录结果中包含所有信息,应用需要根据登录结果进行登录验签。如果游戏要求必须登录验签成功后才能允许用户进入游戏,可以忽略第1次的回调结果,直接等待第2次的回调结果。 ● 如果用户首次登录,isAuth为1,应用必须校验登录签名后才能允许用户登录。 说明: |
displayName | O | string | 用户昵称。 只有isAuth为1时才返回。 |
playerLevel | O | int | 玩家等级。 只有isAuth为1时才返回。 |
isAuth | M | int | 是否需要进行登录签名校验。 ● 0:不需要 ● 1:需要 当isAuth为1的时候,应用需要校验gameAuthSign参数返回的登录签名。 说明: |
ts | O | string | 华为游戏服务器返回的时间戳,用于登录签名校验。 只有isAuth为1时才返回。 警告: ts的有效时间默认为5分钟,请在ts有效期内完成登录签名校验,否则将导致登录签名校验失败。 |
gameAuthSign | O | string | 登录签名。 只有isAuth为1时才返回。 |
| 类型 | 返回码常量 | 返回码值 | 返回码说明 | 处理建议 |
通用返回码 | 参见通用返回码。 | |||
业务返回码 | GameStatusCodes.GAME_STATE_SUCCESS | 0 | 返回结果成功。 | 表明操作成功。 |
GameStatusCodes.GAME_STATE_ERROR | 7001 | 游戏进程异常或HMS Core进程异常。 | 终止游戏进程或者HMS Core进程后重试。 | |
GameStatusCodes.GAME_STATE_NETWORK_ERROR | 7002 | 网络错误。 | 请检查网络状态后重试。 | |
GameStatusCodes.GAME_STATE_USER_CANCEL_LOGIN | 7004 | 用户取消登录操作。 | 用户取消登录,应用需要等待用户下一次登录游戏时重新调用login接口。 | |
GameStatusCodes.GAME_STATE_PARAM_ERROR | 7005 | 请求参数错误。 | 请检查入参的有效性。 常见错误:Manifest文件中application节点未配置开发者的支付ID,详细配置请参考配置工程文件。 | |
GameStatusCodes.GAME_STATE_NO_SUPPORT | 7006 | 当前区域不提供游戏服务。 | 您所在的地区目前还不支持接入华为游戏服务。如果是非华为手机出现此错误码,请尝试升级HMS Core至最新版本。 | |
GameStatusCodes.GAME_STATE_PARAM_NULL | 7011 | 入参为空。 | login接口传入的参数中存在空值,请检查入参的有效性。 | |
GameStatusCodes.GAME_STATE_CALL_REPEAT | 7012 | 重复调用login接口。 | 如果已经调用了login接口,并且没有返回结果之前,应用再次调用login接口,并且与上次调用时间差在10秒之内,就会拒绝后一次的登录请求。 | |
GameStatusCodes.GAME_STATE_DISAGREE_PROTOCOL | 7014 | 用户取消授权或授权失败。 | 当调用游戏服务接口,弹出用户授权界面需要用户确认的时候,用户选择了取消授权,则会返回该错误码。 | |
- showLog("game login: begin");
- HMSAgent.Game.login(new LoginHandler() {
- @Override
- public void onResult(int retCode, GameUserData userData) {
- if (retCode == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS && userData != null) {
- showLog("game login: onResult: retCode=" + retCode + " user=" + userData.getDisplayName() + "|" + userData.getPlayerId() + "|" + userData.getIsAuth() + "|" + userData.getPlayerLevel());
- // 当登录成功时,此方法会回调2次
- // 第1次:只回调playerId,userData.getIsAuth()为0,在要求快速登录时可以用此playerId登录
- // 第2次:回调所有信息,userData.getIsAuth()为1,此时需要对登录结果进行验签
- if (userData.getIsAuth() == 1) {
- // 如果需要对登录结果进行验签,建议发送请求到开发者服务器进行。
- // 下面的示例代码为在客户端验签的示例代码,实际验签建议放在应用的服务端。
- GameLoginSignUtil.checkLoginSign(appId, cpId, game_priv_key, game_public_key, userData, new ICheckLoginSignHandler() {
- @Override
- public void onCheckResult(String code, String resultDesc, boolean isCheckSuccess) {
- showLog("game login check sign: onResult: retCode=" + code + " resultDesc=" + resultDesc + " isCheckSuccess=" + isCheckSuccess);
- }
- });
- }
- } else {
- showLog("game login: onResult: retCode=" + retCode);
- }
- }
- @Override
- public void onChange() {
- //主子帐号登录发生变化时,需要重新登录
- showLog("game login: login changed!");
- login();
- }
- }, 1);
- }