
Cocos 2d-x引擎鸿蒙游戏集成游戏服务和应用内支付 原创
1 背景
HarmonyOS NEXT将原来SDK中的登录、支付、游戏服务等游戏下沉到了系统服务中,提供ArkTs接口供APP调用。
ArkTS接口内部实现涉及拉起登录、支付弹窗,因此只能在UI线程调用。
本文基于C++调用TS代码的能力,提供一个完整的由C++发起请求,APP UI线程调用ArkTs接口实现登录、支付、游戏服务的解决方案。
2 原理概述
前往Demo 源码下载Demo。
注意 引擎3.17.2
Demo的C++代码调用流程如下:
- 游戏登录C++通过NAPI框架调用ets文件中账号拉起相关接口。GSSDKTest->CCSDKApplication->SDKManager.ts。
- 将游戏登录相关参数通过消息发送给主线程。parentPort.postMessage、SDKManager.ts->Index.ets。
- 主线程接收游戏登录参数后,调用系统账号SDK相关接口,并在callback中处理登录结果。(Index.ets-> SDKManagerMsg.ets ->Index.ets)。
- 将结果通过消息发送给子线程。(Index.ets->cocosWorker.ets)。
- ts通过NAPI框架调用C++对结果做处理。(cocosWorker.ets->sdk plugin manager-> GameServiceSDKNapi->CCSDKApplication)。
3 详细接入方式
3.1 开发者网站配置
根据开发者网站指导配置签名、指纹、应用内支付、商品等信息。
3.2 DevEco Studio中配置项目
在entry目录下添加依赖,并点击右上角“sync now”。
Entry->oh-package.json5
- har包代码二次开发(可选)
如果有修改har包内部代码逻辑的诉求,可以带入对应源码进行二次开发和重新编译。har包详细代码在gameservicesdk.zip和iapkitsdk.zip中,可通过File->New->Import->Import Module 将其导入到导出的DevEco Studio中,修改依赖指向即可。
"dependencies": {
"iapkitsdk": "../iapkitsdk ",
"gameservicesdk": "../gameservicesdk "
}
这里修改完依赖后可以方便地集成进项目中进行开发调试,以方便使用者自行修改或加强功能。
修改完成后可以选中gameservicesdk的module。

选择Build->Make Module 重新构建har包放入项目中使用。
3.3 初始化逻辑(重要)
主要关注 [ProjectPath]\entry\src\main\ets\ workers\ CocosWorker.ets
需要加入引用(具体请根据dependencies中配置内容确定)
import { GameServiceSDK, IapKitSDK } from “…/sdkManager/SDKManager”
在onXCLoad中新增初始化调用
3.4 C++调用ArkTs流程(重要)
C++侧游戏登录GSSDKTest->CCSDKApplication。
通过JSFunction::getFunction(“GameServiceSDK.loginInit”).invokestd::string();绑定ArkTs侧src/main/ets/napi/SDKNapiHelper.ts中对应标记"GameServiceSDK.loginInit"的方法。
该标记对应注册的方法是src/main/ets/SDKManager/SDKManager.ts中的loginInit。
该方法将游戏登录相关参数通过消息发送给主线程,parentPort.postMessage,SDKManager.ts->src/main/ets/pages/Index.ets。
在Index.ets中接收消息,获得游戏登录相关参数,通过await sdkManagerMsg.handlePullSDK(eventData as EventData);调用SDKManagerMsg.ets中handlePullSDK并获得对应Har中方法的结果。
Index.ets-> SDKManagerMsg.ets->Har-> Index.ets。
在Index.ets中将结果通过消息发送给子线程,Index.ets->CocosWorker.ets。
在src/main/ets/workers/CocosWorker.ets中,通过NAPI框架调用C++对结果进行处理。
Const loginSDKNapi: nativeRender.CPPFunctions =
nativeRender.getSDKContext(SDKContextType.GAMESERVICESDK_NAPI);
getSDKContext方法注册在entry/src/main/cpp/napi_init.cpp中。
绑定的方法SDKNapiManager::GetContext在src/main/cpp/napi/sdk_plugin_manager.cpp,
根据getSDKContext传入的类型GAMESERVICESDK_NAPI,
绑定src/main/cpp/napi/modules/GameServiceSDKNapi.cpp中onGameServiceSDKCallBack
调用executeGameServiceSDKCallback将获得的结果返回给C++。

3.5 修改业务配置并出包
开发者需要按照开发者指南,获取并配置开发者和应用信息,主要包括:
- 配置包名(AppScope/app.json5)
- 配置app_id和client_id(entry/src/main/module.json5)
- 签名(File -> Project Structure)
- 出包(Build –> BuildHaps)。出的hap包路径为build/default/outputs/default/entry-default-signed.hap
4 登录流程(重要)
需要根据登录按钮对应的联合登录接口的回参来判断是否使用华为账号登录。部分登录逻辑已集成在华为账号登录按钮调用的har接口中,可自行改写放在har包中执行(如何自行改写har包内容详细可看详细接入章节中第三小节附录部分)。
详情请参考文档通过Authorization Code获取Access Token、转移详细文档、绑定详细文档。
5 支付流程(重要)
支付初始化完成后(详细接入方式步骤4),请至少一次调用检查支付环境。
流程图中的步骤2.1已在本Demo业务逻辑内集成,无需开发者再次手动调用。
更多详情请参考如下文档:
6 常见问题(重要 审核中高频被驳回的问题)
问题:授权绑定流程中,用户取消授权等异常时不能返回重新选择转移/绑定
解决方案:如果玩家取消授权,捕获到错误码1001502012后进行异常处理,即调用一次unbindPlayer,thirdopenid传空,即可在下次华为账号登录时重新弹出转移关联框供用户再次选择;此步骤已集成在har包中。
问题:未接入解绑功能
解决方案:解绑游戏账号指导。
问题:实现官方账号登录的游戏,应在游戏内增加切换账号按钮
解决方案:参考文档。
原文链接:华为开发者文章
更多问题可关注:
鸿蒙游戏官方网站:已有游戏移植-鸿蒙游戏-华为开发者联盟
公开课:华为开发者学堂
