更新日期:2025年 09月 16日QuickGame(鸿蒙)客户端接入文档
<h3>
<span style="font-size:16px;">一、导⼊SDK资源</span>
</h3>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1.1 将 gamesdkLibrary.har 包放在⼯程的 libs ⽬录下:</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20241127/20241127105158d1CF665.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1.2 在 App Module 的 oh-package.json5中,添加依赖项:</span>
</p>
<p>
<br />
</p>
<span style="font-size:14px;">"dependencies": {</span><br />
<span style="font-size:14px;">"gamesdklibrary": "file:./libs/gamesdkLibrary.har"</span><br />
<span style="font-size:14px;">}</span><br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;">如下图:</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20241127/202411271052362Mot105.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<span style="font-size:14px;">1.3 在 App Module 的 module.json5中,配置⽹络访问权限:</span><br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;">"requestPermissions": [</span>
</p>
<span style="font-size:14px;">{</span><br />
<span style="font-size:14px;">"name": "ohos.permission.INTERNET"</span><br />
<p>
<span style="font-size:14px;">}],</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">如下图:</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20241127/20241127105316wlAJ922.png" alt="" />
</p>
<p>
<span style="white-space:normal;font-size:14px;"><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><span style="font-size:14px;">1.4 </span><span style="font-size:14px;">在 App Module 的 module.json5的module节点增加如下client_id和app_id属性配置,⽤于华为登录和内购</span><span style="font-size:14px;">的应⽤身份鉴权:</span><br />
<span style="font-size:14px;"> </span><br />
<span style="font-size:14px;">"metadata": [</span><br />
<span style="font-size:14px;">{</span><br />
<span style="font-size:14px;">"name": "client_id",</span><br />
<span style="font-size:14px;">"value": "xxxxxxxxx"</span><br />
<span style="font-size:14px;">}</span><br />
<span style="font-size:14px;">]</span><br />
<span style="font-size:14px;"> </span><br />
<span style="font-size:14px;">如下图:</span></span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><span style="font-size:14px;"><br />
</span></span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20250425/20250425104936myfl733.png" alt="" /><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;">以上内容可参考Demo的实现</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;">1.6 华为后台获取Client ID和APP ID:</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20250425/20250425105049VAaf804.png" alt="" /><br />
</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<h3>
<span style="font-size:16px;">二、</span><span style="white-space:normal;font-size:16px;">导入SDK接口</span>
</h3>
<p>
<br />
</p>
<span style="font-size:14px;">import { GameSDKManager, DialogView,DialogViewController, GameSDKUser,</span><br />
<span style="font-size:14px;">GameSDKRoleInfo, GameSDKOrderInfo, NotificationCenter, GameSDKCallBackData</span><br />
<p>
<span style="font-size:14px;">} from 'gamesdklibrary'</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<h3>
<span style="font-size:16px;">三、接口调⽤⽰例</span>
</h3>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.1 创建接口实例对象</span>
</h4>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">// 创建GameSDKManager实例对象 ,参数传SDK后台的productCode参数
gamesdkInstance: GameSDKManager =
GameSDKManager.getInstance('44021448506430380961470188790224')</pre>
<br />
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.2 初始化接口</span>
</h4>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">this.gamesdkInstance.initWithProductCode('44021448506430380961470188790224')</pre>
<br />
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.3 登录接口</span>
</h4>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">SDK官方登录接口:</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//打开登录界⾯
this.gamesdkInstance.login(this.getUIContext())</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">华为账号登录接⼝:</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//打开华为登录界⾯
this.gamesdkInstance.huaweiLogin(this.getUIContext())</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">华为后台需要添加公钥指纹,同时这⾥的证书需要和研发⼯程⾥使⽤的证书保持⼀致</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20250814/20250814101657XgAG864.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">SDK后台游戏管理 -功能配置⾥需配置鸿蒙参数</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20250425/20250425110201ilVH901.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">3.4 支付接口</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">//创建订单数据对象
let orderInfo: GameSDKOrderInfo = {
productId:'testProductId',
productName: 'testProductName',
cpOrderID: 'testCpOrderID',
amount: ‘6’,//单位元
callbackUrl: 'testCallbackUrl',
extrasParams: 'testExtrasParams'
}
//调⽤⽀付
this.gamesdkInstance.payWithOrderInfo(orderInfo)</pre>
<br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;">华为后台开通应⽤内购买服务</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20250814/20250814101833kAtW690.png" alt="" /><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">SDK后台游戏管理 -> ⽀付通道 里需添加鸿蒙⽀付并配置参数:</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20250916/20250916102042z1zj181.png" alt="" />
</p>
<p>
<span style="font-size:14px;color:#E53333;">注意:</span><br />
<span style="font-size:14px;">1. 沙盒测试需要在华为后台添加测试账号,同时测试设备的系统设置⾥⾯需要登录该账号</span><br />
<span style="font-size:14px;">2. 华为后台的商品id状态处于"草稿"状态不能测试,必须是"待提交"或者"审核通过"的状态</span><br />
<span style="font-size:14px;">3. SDK后台需正确配置包名,商品id,商品⾦额,否则⽀付完成⽆法到账</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.5 上传⾓⾊接口</span>
</h4>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//创建⻆⾊数据对象
let roleInfo: GameSDKRoleInfo = {
roleId:'testRoleId',
roleName: 'testRoleName',
serverId: 'testServerId',
serverName: 'testServerName',
roleLevel: 'testRoleLevel',
vipLevel: 'testVipLevel'
}
//上传游戏⻆⾊
this.gamesdkInstance.updateRoleInfo(roleInfo)
</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.6 隐私弹窗接口</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">//打开隐私弹窗
this.gamesdkInstance.openPrivacyDialog(this.getUIContext())
</pre>
<br />
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.7 </span><span style="font-size:14px;">解绑华为账号接⼝</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//如果是华为⽤户登录可解绑
if (this.gamesdkInstance.isHuaweiUser()) {
this.gamesdkInstance.unbindHuaweiAccount()
}</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.8 </span><span style="font-size:14px;">退出登录接⼝</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">this.gamesdkInstance.logout()</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.9 </span><span style="font-size:14px;">判断是否华为转移⽤户接⼝</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
this.gamesdkInstance.isHuaweiTransferAccount()
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.10 </span><span style="font-size:14px;">打开云客服接⼝</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">3.10.1 需先联系商务开通Quick云客服产品,获取客服产品code,将产品code传⼊客服接⼝</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//打开云客服,参数传云客服后台的产品code
this.gamesdkInstance.openServiceCenter(this.getUIContext(),
'11145220560844xxxxxxxxxxxxxxx')</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><span style="white-space:normal;font-size:14px;">3.10.2 </span>初始化窗⼝对象,需在Ability的onWindowStageCreate中调⽤如下⽅法</span><span style="font-size:14px;"></span>
</p>
<p>
<span style="font-size:14px;"></span>
</p>
<pre class="brush:js;toolbar:false">windowStage.getMainWindow((err, data) => {
if (err.code) {
console.error('获取失败' + JSON.stringify(err));
return;
}
console.info('获取主窗⼝的实例:' + JSON.stringify(data));
globalThis.windowClass = data // 赋值给全局变量windowClass
});
</pre>
<p>
<br />
</p>
<span style="font-size:14px;">如下图:</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"></span><img src="https://staticsite.quickapi.net/data/newFiles/20250814/2025081410285866Ar285.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">3.11 注册SDK回调通知</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//注册SDK初始化回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_INIT_SUCCESS',
(data: GameSDKCallBackData) => {
console.log(`SDK初始化成功:message:${data.message}`)
});
//注册SDK登录回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_LOGIN_SUCCESS',
(data: GameSDKCallBackData) => {
//回调返回⽤户信息:
console.log(`SDK登录成功:uid:${data.uid}, userName:${data.userName},
token:${data.token},`)
//通过GameSDKUser⽤户类获取⽤户信息
promptAction.showDialog({ message: `uid:${GameSDKUser.getInstance().uid},
userName:${GameSDKUser.getInstance().userName}, token:${GameSDKUser.getInstance().token}`
})
});
//注册SDK⽀付成功回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_PAY_SUCCESS',
(data: GameSDKCallBackData) => {
//回调返回⽀付成功信息:
console.log(`SDK⽀付成功:${data.message}:orderNo:${data.orderNo},
productId:${data.productId}, extrasParams:${data.extrasParams}`)
});
//注册SDK⽀付失败回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_PAY_FAIL', (data:
GameSDKCallBackData) => {
//回调返回⽀付失败信息:
console.log(`SDK⽀付失败:${data.message}:orderNo:${data.orderNo},
productId:${data.productId}, extrasParams:${data.extrasParams}`)
});
//注册隐私弹窗同意回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_AGREE_PRIVACY',
(data: GameSDKCallBackData) => {
console.log(`点击了同意隐私协议:message:${data.message}
,isAgreePrivacy:${data.isAgreePrivacy}`)
});
//注册隐私弹窗不同意回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_REFUSE_PRIVACY',
(data: GameSDKCallBackData) => {
console.log(`点击了不同意隐私协议:message:${data.message}
,isAgreePrivacy:${data.isAgreePrivacy}`)
});
//注册退出登录回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_LOGOUT_SUCCESS',
(data: GameSDKCallBackData) => {
console.log(`退出登录成功`)
});
//注册解绑华为账号回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_UNBIND_SUCCESS',
(data: GameSDKCallBackData) => {
console.log(`华为账号解绑成功`)
});
//注册华为登录失败回调事件
NotificationCenter.getInstance().addObserver('GAMESDK_NOTIFICATION_KEY_HUAWEILOGIN_FAIL', (data: GameSDKCallBackData) => {
console.log(`华为登录失败`)
if (data.code === 1002000016) {//用户点击关闭华为登录框
console.log(`用户点击关闭华为登录框`)
}
});</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;color:#E53333;">注意:为防止账号信息被篡改,游戏客户端获取到登录成功的回调后,需将回调里的uid跟token发送给游戏服务器端进行验证,具体操作详见QuickGameSDK服务器接入文档</span>
</p>
<div>
<br />
</div>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<h3>
<span style="font-size:16px;">四、</span><span style="font-size:16px;">其他接⼝(选接)</span>
</h3>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">4.1 </span><span style="font-size:14px;">初始化微信QQ登录(选接)</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//初始化微信登录
this.gamesdkInstance.initWxLogin("wxd6bxxxxxxxxxxx", "8606969ec8eb7ebxxxxxxxxxxxxx")
//初始化QQ登录
this.gamesdkInstance.initQQLogin("1022xxxxxx", "iNr8Hxxxxxxxx")
//在EntryAbility中响应来⾃微信/QQ的回调
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
GameSDKManager.getInstance('').handleAuthResult(want)
}</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;color:#E53333;">注意:</span>
</p>
<p>
<span style="font-size:14px;">微信登录时⼯程需要使⽤⼿动签名,不然会报错:"由于应⽤BundleID信息校验不通过,⽆法使⽤微信登录"</span><br />
<span style="font-size:14px;">QQ后台需要正确配置鸿蒙应⽤签名,不然会报错:"error authResponse is null"</span><br />
<span style="font-size:14px;">参考⽂档:https://wiki.connect.qq.com/harmonyos_sdk%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a</span><span style="font-size:14px;">2%98</span>
</p>
<p>
<span style="font-size:14px;">QQ后台AppLinking状态需要验证通过</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20250814/202508141031109vY5639.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">module.json5 配置⽂件修改</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">// module.json5 的"module"节点下配置 querySchemes
"querySchemes": [
"https",
"qqopenapi",
"weixin"
]
// 在 Ability 的 skills 节点中配置scheme
"skills": [
{
"entities": [
"entity.system.browser"
],
"actions": [
"ohos.want.action.viewData"
],
"uris": [
{
"scheme": "qqopenapi", // 接收 QQ 回调数据
"host": "(替换申请的互联 appId)", // 业务申请的互联 appId,如果填错会导致 QQ ⽆法回调
"path": "auth",
"linkFeature": "Login",
}
]
}
]</pre>
<span style="font-size:14px;"></span><br />
<span style="font-size:14px;"></span><span style="font-size:14px;">如下图:</span>
<p>
<br />
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20250425/20250425114626cJP9804.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">在业务 Ability.onNewWant() 中调⽤SDK如下⽅法:</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">//在EntryAbility中响应来⾃微信/QQ的回调
GameSDKManager.getInstance('').handleAuthResult(want)</pre>
<span style="font-size:14px;"></span>
<p>
<br />
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20250425/20250425114720oKmx807.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">4.2 SDK域名配置(选接)</span>
</h4>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">当需要修改sdk的默认域名时,打开⼯程找到sdk配置⽂件,⽂件路径:</span>
</p>
<p>
<span style="font-size:14px;">oh_modules/gamesdklibrary/src/main/resources/rawfile/sdk_config.json,然后修改⽂件中mainurl对应的</span><span style="font-size:14px;">value值</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20250425/20250425114817vpCS920.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">可参考SDK Demo 接⼊</span><span style="font-size:14px;"></span>
</p>
<p>
<br />
</p>
<div>
<br />
</div>