鸿蒙next 游戏授权登录教程王者归来

前沿导读

各位同学很久没有分享技术文章给大家了,因为最近需要兼职讲课,所以我比较忙。都也没有多少个人时间,所以也是趁着现在有空我们就分享下

效果图

调用效果

日志打印

需求背景

工作中最近接到需求,需要接入鸿蒙的游戏授权登录和内购支付,今天把流程走完整,所以现在就做一个分享

开放步骤

初始化

这里如果不是在 EntryAbility 接入初始化代码需要做调整

// 在EntryAbility 里面初始化
javascript 复制代码
try {
  gamePlayer.init(this.context,()=>{
    hilog.info(0x0000, 'testTag', `Succeeded in initing.`);
  });
} catch (error) {
  let err = error as BusinessError;
  hilog.error(0x0000, 'testTag', `Failed to init. Code: ${err.code}, message: ${err.message}`);
}
// 不在EntryAbility 里面执行初始化
javascript 复制代码
try {
 gamePlayer.init(context as  common.UIAbilityContext ,()=>{
   hilog.info(0x0000, 'testTag', `Succeeded in initing.`);

 });
} catch (error) {
 let err = error as BusinessError;
 hilog.error(0x0000, 'testTag', `Failed to init. Code: ${err.code}, message: ${err.message}`);
}

获取 gamePlayerId

javascript 复制代码
let context = getContext(this) as common.UIAbilityContext;

let request: gamePlayer.UnionLoginParam = {
  showLoginDialog: false,  // 是否弹出联合登录面板。true表示强制弹出面板,false表示优先使用玩家上一次的登录选择,不弹出联合登录面板,若玩家首次登录或卸载重装,则正常弹出。
  thirdAccountInfos: [] // 若游戏无官包或无官方账号体系,请传空数组。
};
try {
  gamePlayer.unionLogin(context, request).then((result: gamePlayer.UnionLoginResult) => {
    hilog.info(0x0000, 'testTag', `Succeeded in logining: ${result?.accountName}`);
    console.log("gamePlayerId accountName --- >" +result.accountName)
    console.log("gamePlayerId thirdOpenId --- >" +result.boundPlayerInfo.thirdOpenId)
    console.log("gamePlayerId bindType --- >" +result.boundPlayerInfo.bindType)

    let  localPlayer=result.localPlayer;
    if(localPlayer.gamePlayerId){
      console.log("index gamePlayerId  localPlayer gamePlayerId  --- >" +localPlayer.gamePlayerId)

    }

    if(localPlayer.teamPlayerId){
      console.log("index gamePlayerId  localPlayer teamPlayerId  --- >" +localPlayer.teamPlayerId)

    }

  }).catch((error: BusinessError) => {
    hilog.error(0x0000, 'testTag', `Failed to login. Code: ${error.code}, message: ${error.message}`);
  });
} catch (error) {
  let err = error as BusinessError;
  hilog.error(0x0000, 'testTag', `Failed to login. Code: ${err.code}, message: ${err.message}`);
}

获取authorizationCode

javascript 复制代码
let loginRequest = new authentication.HuaweiIDProvider().createLoginWithHuaweiIDRequest();
loginRequest.state = util.generateRandomUUID();
// 执行认证请求
try {
  let controller = new authentication.AuthenticationController(getContext(this));
  controller.executeRequest(loginRequest, (err, data) => {
    if (err) {
      hilog.error(0x0000, 'testTag', `Failed to login. Code: ${err.code}, message: ${err.message}`);
      return;
    }
    let loginWithHuaweiIDResponse = data as authentication.LoginWithHuaweiIDResponse;
    let state = loginWithHuaweiIDResponse.state;
    console.log("index  authorizationCode  state   ---> "+state)
    if (state != undefined && loginRequest.state != state) {
      hilog.error(0x0000, 'testTag', `Failed to login. State is different.`);
      return;
    }
    hilog.info(0x0000, 'testTag', `Succeeded in logining.`);

    let loginWithHuaweiIDCredential = loginWithHuaweiIDResponse.data!;
    let authorizationCode = loginWithHuaweiIDCredential.authorizationCode;
    console.log("index  authorizationCode  ---> "+authorizationCode)
    // 开发者处理authorizationCode
  });
} catch (error) {
  let err = error as BusinessError;
  hilog.error(0x0000, 'testTag', `Failed to login. Code: ${err.code}, message: ${err.message}`);
}

我们拿到了 gamePlayerId 和 authorizationCode 去请求服务端去获取

服务端流程

获取 Access Token地址

调用on接口注册playerChanged事件监听

javascript 复制代码
aboutToAppear(): void {
  // 调用on接口注册playerChanged事件监听
  try {
    gamePlayer.on('playerChanged', this.onPlayerChangedEventCallback);
    hilog.info(0x0000, 'testTag', `Succeeded in registering.`);
  } catch (error) {
    let err = error as BusinessError;
    hilog.error(0x0000, 'testTag', `Failed to register. Code: ${err.code}, message: ${err.message}`);
  }

}

监听事件回调

csharp 复制代码
private onPlayerChangedEventCallback(result: gamePlayer.PlayerChangedResult) {
  if (result.event === gamePlayer.PlayerChangedEvent.SWITCH_GAME_ACCOUNT) {
    // ...
    // 游戏号已切换,完成本地缓存清理工作后,再次调用unionLogin接口等

  }
}

提交玩家角色信息

javascript 复制代码
let context = getContext(this) as common.UIAbilityContext;
let request: gamePlayer.GSKPlayerRole = {
  roleId: '123', // 玩家角色ID,如游戏没有角色系统,请传入"0",务必不要传""和null。
  roleName: 'Jason', // 玩家角色名,如游戏没有角色系统,请传入"default",务必不要传""和null。
  serverId: '456',
  serverName: 'Zhangshan',
  gamePlayerId: '789', // 请根据实际获取到的gamePlayerId传值。
  thirdOpenId: '123' // 接入华为账号登录时不传该字段。接入游戏官方账号登录时,请根据实际获取到的thirdOpenId传值。
};
try {
  gamePlayer.savePlayerRole(context, request).then(() => {
    hilog.info(0x0000, 'testTag', `Succeeded in saving.`);
  });
} catch (error) {
  let err = error as BusinessError;
  hilog.error(0x0000, 'testTag', `Failed to save. Code: ${err.code}, message: ${err.message}`);
}

参数配置

我们需要在 添加如此下配置

json 复制代码
"metadata": [
  // 配置如下信息
  {
    "name": "client_id",
    "value": "xxxxxxxxx"  
    // 华为Client ID  请替换成你自己的正式参数
  },
  {
    "name": "app_id",
    "value": "6917581951060909508"
    // 华为APP ID 请替换成你自己的正式参数
  }
],

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET"
  },
],

配置手动签名测试

查看日志

写在最后

整个鸿蒙游戏授权登录相对比较简单,但是有一个槽点,就是获取 gamePlayerId 和 authorizationCode需要分开两个方法回调 。其实可以做成一个回调更简单,这个希望后期能完善, 服务端逻辑对比客户端来说,还是相对复杂一点点,不过对着文档也是很快能解决这次接入 华为技术支持也帮了不少忙,这个点赞, 对于鸿蒙生态的推广这块,华为确实下了决心,也非常积极的回应。希望鸿蒙越来越好,国产系统早日完善。我依然是你们最爱的徐老师。我们下一期再见。

相关推荐
waeng_luo8 小时前
[鸿蒙2025领航者闯关]HarmonyOS路由跳转
harmonyos·鸿蒙2025领航者闯关·鸿蒙6实战·开发者年度总结
hh.h.9 小时前
开源鸿蒙生态下Flutter的发展前景分析
flutter·开源·harmonyos
讯方洋哥12 小时前
HarmonyOS应用开发——应用状态
华为·harmonyos
ujainu12 小时前
鸿蒙与Flutter:全场景开发的技术协同与价值
flutter·华为·harmonyos
FrameNotWork12 小时前
HarmonyOS 教学实战:从 0 写一个完整应用(真正能跑、能扩展)
pytorch·华为·harmonyos
Random_index13 小时前
#HarmonyOS篇:鸿蒙开发模板&&三方库axios使用&&跨模块开发交互
harmonyos
游戏技术分享14 小时前
【鸿蒙游戏技术分享 第71期】资质证明文件是否通过
游戏·华为·harmonyos
赵浩生14 小时前
鸿蒙技术干货11:属性动画与转场效果实战
harmonyos
Monkey_2415 小时前
鸿蒙开发工具大全
华为·harmonyos
灰灰勇闯IT17 小时前
鸿蒙 5.0 开发入门第二篇:掌握 ArkTS 的 if 分支语句,实现条件逻辑判断
华为·harmonyos