1、使用tt.getUserInfo(注:这个方法要先tt.login登录用户账号)
拿到敏感信息encryptedData(未解密),然后解密,解密后可以拿到openid、用户性别、所在城市等敏感数据。
2、解密密钥可以通过请求获得(请求同时可以直接拿到openid,但如果还需其他敏感信息,可以继续下面解密那一步),详情参考:
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);
}