CocosCreater接入抖音获得openid两种方式

1、使用tt.getUserInfo(注:这个方法要先tt.login登录用户账号)

tt.getUserInfo__抖音开放平台

拿到敏感信息encryptedData(未解密),然后解密,解密后可以拿到openid、用户性别、所在城市等敏感数据。

2、解密密钥可以通过请求获得(请求同时可以直接拿到openid,但如果还需其他敏感信息,可以继续下面解密那一步),详情参考:

code2Session__抖音开放平台

 3、解密方式参考如下:

敏感数据处理__抖音开放平台

例子:

NetMgr.ts

    static sendRequest(res,callBack?:(data:any)=>void){
        //开发者服务器地址
        let url = 'https://developer.toutiao.com/api/apps/v2/jscode2session'
        let xhr = new XMLHttpRequest();
        xhr.open("POST",url);
        xhr.setRequestHeader("Content-Type","application/json");
        xhr.responseType="json";
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4){
                if(xhr.status >= 200 && xhr.status <= 207) {
                    if(callBack){
                        callBack(xhr.response);
                    }
                }else{
                    console.error("HTTP Error:", xhr.status, xhr.statusText);
                }
            }
        };
        let data = {
            appId: "...",//你自己的小游戏id
            secret: '...',//小程序的 APP Secret,可以在开发者后台获取
            anonymous_code: res.anonymous_code,//login 接口返回的匿名登录凭
            code : res.code,//tt.login接口返回的登录凭证
        };
        xhr.send(JSON.stringify(data));
    }

登录、获取信息并解密:

login() {
        let _this = this;
        let sessionKey = '';
        let openid = '';
        if(window.tt){
            tt.login({
                force: true,
                success(res) {
                  console.log(`login 调用成功${res.code} ${res.anonymousCode}`);
                  NetMgr.sendRequest(res,(data)=>{
                    console.log('sendRequest:'+ data);
                    sessionKey = data.data.session_key;
                    openid = data.data.openid;//方法1:这里请求就可以直接获得openid
                  });
                    // 获取用户信息
                    tt.getUserInfo({
                        withCredentials: true, // 根据需要设置是否返回敏感数据
                        success(resUser) {
                        console.log(`getUserInfo 调用成功`, resUser.userInfo);
                        // 如果 withCredentials 为 true,会返回 encryptedData 等敏感数据
                        if(resUser.signature){
                            console.log(`getUserInfo 调用成功`,resUser.signature);
                        }
                        // if (resUser.encryptedData) {
                        //     console.log(`getUserInfo 调用成功`, resUser.encryptedData);
                        // }
                        if (resUser.encryptedData) {
                            console.log(`getUserInfo 调用成功`, resUser.encryptedData);
                            let encryptedData = resUser.encryptedData; // 从客户端获取的 encryptedData
                            let iv = resUser.iv; // 从客户端获取的 iv
                            
                            // 解密敏感数据
                            let decryptedData = _this.decryptData(encryptedData, sessionKey, iv);
                            console.log('解密后的数据:', decryptedData);
                        }
                        _this.getUserInfo(resUser.userInfo,openid);
                        //方法2:绕一下,先获得敏感信息,再请求获得密钥,解密后得openid
                        //这个方法还可以获得更多敏感信息,如城市性别等
                        },
                        fail(resUser) {
                        console.log(`getUserInfo 调用失败`, resUser.errMsg);
                        let data = {nickName:'1111',avatarUrl:""}
                        _this.getUserInfo(data);
                        },
                    });
                },
                fail(res) {
                  console.log(`login 调用失败`);
                },
            });
        }else{
            let data = {nickName:'1111',avatarUrl:""}
            _this.getUserInfo(data);    
        }
    }

    //设置用户信息:
    getUserInfo(userData ?: any, openid ?:any){
        if(userData){
            PlayerMgr.setUserPlayerInfo({
                menberid:openid,    //openid是用户的唯一标识符,用于区别不同用户
                nickname:userData.nickName,
                avatar:userData.avatarUrl,
            });
        }
    }
    
    //解密算法:
    decryptData(encryptedData: string, sessionKey: string, iv: string): DecryptedData {
        // 将 sessionKey 和 iv 从 Base64 解码
        const sessionKeyBase64 = CryptoJS.enc.Base64.parse(sessionKey);
        const ivBase64 = CryptoJS.enc.Base64.parse(iv);
        const encryptedDataBase64 = CryptoJS.enc.Base64.parse(encryptedData);
    
        // 使用 AES-128-CBC 算法解密
        const decrypted = CryptoJS.AES.decrypt(
            { ciphertext: encryptedDataBase64 },
            sessionKeyBase64,
            {
                iv: ivBase64,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            }
        );
    
        // 将解密后的数据转换为字符串
        const decryptedText = decrypted.toString(CryptoJS.enc.Utf8);
    
        // 解析为 JSON 对象
        return JSON.parse(decryptedText);
    }    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值