HarmonyOS 鸿蒙Next uni-app QQ登录,怎么读取都是provider里没有qq
HarmonyOS 鸿蒙Next uni-app QQ登录,怎么读取都是provider里没有qq 【问题描述】:uniapp进行开发,想接入qq登录,但是读取用户qq但是读取的都是provider里没有qq
【问题现象】:uniapp读取不到用户qq
【版本信息】:NA
【复现代码】:NA
【尝试解决方案】:NA
开发者你好,由于uni.share、uni.login方法在HarmonyOS上暂不支持分享到QQ、QQ授权登录,还请参考以下示例使用QQ提供的SDK来完成QQ授权登录: 实现步骤: UTS插件:
- @tencent/qq-open-sdk目前支持登录、分享功能。
- @ohos/crypto-js用于本地签名,生产环境建议使用后端签名。
- QQ HarmonyOS SDK中Demo工程中的QQOpenApiHolder.ets文件,直接复制进UTS插件。
- 封装分享QQ聊天方法。
import { Want } from '@kit.AbilityKit';
import { IQQOpenApi, ShareData, ShareResult, ShareResultType } from '[@tencent](/user/tencent)/qq-open-sdk';
import CryptoJS from '[@ohos](/user/ohos)/crypto-js';
import { QQOpenApiHolder } from './QQOpenApiHolder.ets';
UTSHarmony.onAppAbilityCreate(() => {
QQOpenApiHolder.create();
})
UTSHarmony.onAppAbilityNewWant((want : Want) => {
QQOpenApiHolder.getInstance()?.handleResult(want);
})
/**
* 调用业务后台接口对分享内容生成签名,此处以本地签名为例
* @param appId
* @param shareDataStr
* @param timestamp
* @param nonce
* @returns
*/
export async function demoGenSign(appId : string | number, shareDataStr : string, timestamp : number, nonce : number) : Promise<string> {
const totalStr = `POSTconnect.qq.com/share?appid=${appId}&nonce=${nonce}&ts=${timestamp}&${shareDataStr}`;
const hmac = CryptoJS.HmacSHA1(totalStr, 'vgGckeQ0QfhW6QUP');
const sign = hmac.toString(CryptoJS.enc.Base64);
return sign;
}
export async function shareToQQ(shareDataStr : string) : Promise<void | ShareResult> {
const qqOpenApi : IQQOpenApi = QQOpenApiHolder.getInstance();
const shareData : ShareData = new ShareData();
// 生成时间戳
shareData.timestamp = Date.now();
// 生成随机整数
shareData.nonce = Math.floor(Math.random() * 100000000 + 100);
shareData.shareJson = shareDataStr;
shareData.shareJsonSign = await demoGenSign(qqOpenApi.appId, shareDataStr, shareData.timestamp, shareData.nonce);
const promise : Promise<void | ShareResult> = qqOpenApi.share(2, shareData).then((result : ShareResult) => {
if (result.resultType === ShareResultType.Success) {
uni.showToast({
title: '分享成功'
})
}
if (result.resultType === ShareResultType.Cancel) {
const msg : string = result.message ?? "用户取消分享"
uni.showToast({
title: msg
})
}
if (result.resultType === ShareResultType.Error) {
const msg : string = result.message ?? "分享失败"
uni.showModal({
content: msg,
showCancel: false
})
}
return result;
});
return promise;
}
- 封装QQ授权登录方法,授权完成后会获取authCode,后续需要业务后台到"QQ互联"后台换取授权accessToken,并获取用户QQ信息。
export function LoginWithCallback() {
const qqOpenApi : IQQOpenApi = QQOpenApiHolder.getInstance();
qqOpenApi.login({
scope: "all",
useQrCode: false,
networkTimeout: 0,
forceWebLogin: false
} as AuthReqOptions)
.then((result : AuthResult) => {
console.info(`testLoginWithPromise then : ${JSON.stringify(result)}`)
if (result.type == AuthResultType.Success) {
let code : string | undefined = result.authResponse?.authCode
if (code) {
// 获取server-side授权code成功,后续需要业务后台到"QQ互联"后台换取授权accessToken,并获取用户QQ信息。
}
} else if (result.type == AuthResultType.Cancel) {
uni.showToast({
title: (result.message ?? "")
});
} else if (result.type == AuthResultType.Error) {
uni.showToast({
title: (result.message ?? "")
});
}
}).catch(() => {
})
}
插件依赖: 在config.js中配置三方依赖:
{
"dependencies": {
"[@tencent](/user/tencent)/qq-open-sdk": "1.0.3",
"[@ohos](/user/ohos)/crypto-js": "^2.0.5"
}
}
页面调用: 导入UTS插件的shareToQQ和LoginWithCallback方法:
<template>
<view class="content">
<button type="default" @click="share">QQ分享</button>
<button type="default" @click="login">QQ授权登录</button>
</view>
</template>
<script>
import {
shareToQQ,
LoginWithCallback
} from "@/uni_modules/my-qq-sdk"
export default {
data() {
return {
title: 'Hello'
}
},
onLoad() {
},
methods: {
share() {
const data = {
"msg_style": 0,
"title": "HarmonyOS ARK图文",
"summary": "ARK分享的内容",
"brief": "互联分享",
"url": "https://www.baidu.com",
"picture_url": "https://www.xxx.com/xxx.png"
};
shareToQQ(JSON.stringify(data)).then((res) => {
console.info(res);
});
},
login() {
LoginWithCallback();
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.content button {
width: 100%;
}
</style>
【参考链接】:uni-app实现QQ分享、QQ授权登录示例
更多关于HarmonyOS 鸿蒙Next uni-app QQ登录,怎么读取都是provider里没有qq的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
uni-app集成QQ登录可参考示例代码:https://developer.huawei.com/consumer/cn/forum/topic/0204198524703889005
仓库链接在帖子最后面
问下qq吧
鸿蒙Next中uni-app的QQ登录读取问题,是因为当前鸿蒙Next版本暂未集成QQ登录SDK。鸿蒙Next采用纯鸿蒙内核,不再兼容安卓生态,因此原有的安卓版QQ登录SDK无法直接使用。目前华为官方提供的登录服务为华为帐号登录,第三方登录如QQ、微信等需等待后续官方适配或由第三方厂商提供鸿蒙原生SDK。


