HarmonyOS_SDK环境搭建
目前QQ HarmonyOS SDK v1.0.2版本已经发布,各位应用开发者可参考接入文档说明提前熟悉接入流程;
*当前包含能力:扫码登录、授权登录,其他功能正在持续迭代中,敬请期待后续版本。
1.获取har包
请到SDK下载页面下载最新版本QQ登录HarmonyOS_SDK。
2.添加har包本地依赖、module.json5 配置
(1)本地放入har包,并在模块oh-package.json5中添加依赖
备注:import相关类可以使用 import { xxx } from '@qq/OpenSdk'
import { IQQOpenApi, IUListener, AuthResult, AuthResultType, AuthResponse } from '@qq/OpenSdk';
(2)module.json5 配置文件修改
// module.json5 的"module"节点下配置 querySchemes
"querySchemes": [
"https",
"qqopenapi"
]
// 在 Ability 的 skills 节点中配置scheme
"skills": [
{
"entities": [
"entity.system.browser"
],
"actions": [
"ohos.want.action.viewData"
],
"uris": [
{
"scheme": "qqopenapi", // 接收 QQ 回调数据
"host": "102061317", // 业务申请的互联 appId
"path": "auth",
"linkFeature": "Login",
}
]
}
]
可参考 demo 工程中配置
3.授权登录接入
(1) 创建IQQOpenApi实例
// 推荐声明为全局静态变量
iQQOpenApi: IQQOpenApi = QQOpenApiFactory.createApi(appId)
(2) 调用授权登录接口获取authCode
a.基于Promise
this.iQQOpenApi.login(this.getUIContext(), {
scope: "all",
useQrCode: this.useQrcode,
networkTimeout: 0,
forceWebLogin: this.forceWebAuth
})
.then((result: AuthResult) => {
if (result.type == AuthResultType.Success) {
let code = result.authResponse?.authCode
if (code) {
// 获取 server-side 授权 code 成功,模拟业务后台到 QQ 互联后台换取 授权 accessToken,并获取用户 QQ 信息
HttpUtils.getAccessToken(this.tencent.appId.(), "[your open appkey]", code)
.then((value: AccessTokenJson) => {
hilog.debug(0x0000, TAG, "code get token : " + JSON.stringify(value))
this.tencent.getUserInfo(value.access_token, value.openid, this.iuListener)
}).catch((error: string) => {
hilog.debug(0x0000, TAG, "code get token error msg: " + error)
})
}
} else if (result.type == AuthResultType.Cancel) {
this.alert(result.message ?? "")
} else if (result.type == AuthResultType.Error) {
this.alert(result.message ?? "")
}
}).catch(() => {
})
b. 基于回调方式
// step1 互联授权登录回调监听
loginApiCallback: ApiCallback<AuthResponse> = {
onComplete: (response: AuthResponse): void => {
hilog.debug(0x0000, TAG, `onComplete response: ${JSON.stringify(response)}`);
if (response.ret == 0) {
// 获取 server-side 授权 code 成功,模拟业务后台到 QQ 互联后台换取 授权 accessToken,并获取用户 QQ 信息
HttpUtils.getAccessToken(this.tencent.appId.(), "[your open appkey]", response.authCode)
.then((value: AccessTokenJson) => {
hilog.debug(0x0000, TAG, "code get token : " + JSON.stringify(value))
this.tencent.getUserInfo(value.access_token, value.openid, this.apiCallback)
}).catch((error: string) => {
hilog.debug(0x0000, TAG, "code get token error msg: " + error)
})
}
promptAction.showToast({
message: "获取code成功:" + response.authCode
})
},
onError: (msg: string | null): void => {
this.alert(`onError msg: ${msg}`);
},
onCancel: (msg: string | null): void => {
this.alert(`onCancel msg: ${msg}`);
}
}
// step2 调用接口
this.iQQOpenApi.login(this.getUIContext(), {
scope: "all",
useQrCode: this.useQrcode,
forceWebLogin: false,
networkTimeout: 0
}, this.loginApiCallback)
(3)调用 IQQOpenApi.handleAuthResult()处理回调数据
// 在业务 Ability.onNewWant() 中调用(注意 IQQOpenApi 实例需要与调用 login 方法为同一实例,同时需要与 module.json5 中配置 scheme 为同一个 Ability)
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
super.onNewWant(want, launchParam);
ApiHolder.getInstance()?.handleAuthResult(want)
}
备注:
考虑到目前鸿蒙系统还未稳定,暂无法评估安全风险,故目前仅开放 server-side 方式(Android 和 iOS目前同时支持 serverSide / client-side 两种方式)
server-side业务后台开发参考: 使用Authorization_Code获取Access_Token — QQ互联WIKI
其中,step-1已经由客户端在login接口中获取,业务后端仅需要处理 step-2。
亦可参考demo工程中的 HttpUtils类(模拟了业务后端通过 authCode 换取到 accessToken)
Oauth2.0介绍概念和术语 — QQ互联WIKI