分享到 :

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 &#8212; QQ互联WIKI

其中,step-1已经由客户端在login接口中获取,业务后端仅需要处理 step-2。

亦可参考demo工程中的 HttpUtils类(模拟了业务后端通过 authCode 换取到 accessToken)

Oauth2.0介绍概念和术语 &#8212; QQ互联WIKI

返回顶部