cocosCreator微信小游戏 之 获取用户昵称、头像等信息(二)

news2025/1/22 14:40:28

版本: 3.4.0

语言: TypeScript

环境: Mac


简介


在上篇博客中,主要讲述内容:wx API在cocosCreator中配置定义文件和微信后台配置用户隐私相关。

讲述的主要原因是:

  • cocosCreator没有对 wx API提供定义接口支持
  • 使用wx API需要配置用户隐私保护才能调用获取信息

需要注意: 微信接口的调式,需要cocosCreator打包微信小游戏,并在 微信开发者工具运行才能调试。

上篇博客: cocosCreator微信小游戏 之 配置wxAPI

本篇博客主要讲述内容:

  • 授权按钮和获取用户信息的创建
  • 域名问题导致用户头像显示不出的解决方式
  • 其他

示例

在cocosCreator中创建一个页面,主要节点是:

  • avatarNode 精灵,用于显示头像
  • nameLabel 文本,用于显示昵称

请添加图片描述

调用 wx API相关接口前,我们需要注意:

  • 微信用户信息属于敏感信息,获取的话必须经过用户授权同意
  • 已经授权同意的,就不需要进行重复的授权请求

调用的主要接口:

  • wx.createUserInfoButton 用于创建用户信息按钮,用户点击授权后,我们就可以获取用户信息了
  • wx.getUserInfo 用户获取用户信息,签名,加密等数据
  • wx.getSetting 获取已请求的授权权限相关,如果已授权则返回true

主要思路:

  • 通过wx.getSetting获取用户信息权限是否已申请
  • 如果已申请,则调用wx.getUserInfo 获取用户信息数据
  • 如果没有申请,则调用wx.createUserInfoButton生成用户信息按钮进行授权

为了以后的方便拓展,代码的实现主要有两部分:

  1. LoginLayer.ts 主要用于UI的逻辑处理相关
  2. WechatManager.ts 管理类,主要负责调用wx API的接口相关

LoginLayer.ts

import { _decorator, assetManager, Component, ImageAsset, Label, Node, Sprite, SpriteFrame, Texture2D } from 'cc';
const { ccclass, property } = _decorator;
import { WechatManager } from './manager/WechatManager';

@ccclass('LoginLayer')
export class LoginLayer extends Component {
  @property(Node) avatar: Node = null;        // 头像
  @property(Label) nameLabel: Label = null;   // 昵称

  protected start(): void {
    WechatManager.instance.initAutoSetting((url) => {
      this.setAvatar(url);
    });
  }

  public clickShareEvent() {
    WechatManager.instance.showShareMenu();
  }

  //设置头像
  private setAvatar(url): void {
    let spire = this.avatar.getComponent(Sprite);
    assetManager.loadRemote<ImageAsset>(url + "?aaa=aa.jpg", { ext: '.jpg' }, (err, imageAsset) => {
      if (err) {
        return console.error(err.message);
      }

      let sp = new SpriteFrame();
      let texture = new Texture2D();
      texture.image = imageAsset;
      sp.texture = texture
      spire.spriteFrame = sp;
    })
  }
}

WechatManager.ts

// wxAPI: https://developers.weixin.qq.com/minigame/dev/api/
import { _decorator, screen} from 'cc';
const { ccclass, property } = _decorator;

export class WechatManager {
  private static _instance: WechatManager = null;  
  // 用户信息: 昵称,头像,语言等
  private _userInfo;
  // 头像回调
  private _avatarCallBack = null;

  static get instance() {
    if (this._instance) {
      return this._instance;
    }
    this._instance = new WechatManager();
    return this._instance;
  }

  // 获取标记权限
  public initAutoSetting(callBack) {
    this._avatarCallBack = callBack;
    // 避开ts语法检测
    const wx = window['wx'];
    // 获取请求过的权限标记
    let object: any = {
      // 成功回调         
      success: (res) => {
        // 是否授权用户信息
        const autoSetting = res.authSetting;
        if (autoSetting["scope.userInfo"]) {
          // 已授权
          this.getUserInfo();
        } else {
          // 未授权
          this.creatUserInfoButton();
        }
      },
      // 失败回调
      fail() {
        console.log("wx.getSetting获取用户配置失败");
      },
      // 结束回调(调用成功,失败都会执行)
      complete() {
        console.log("wx.getSetting获取用户配置结束");
      }
    }
    wx.getSetting(object);
  }

  // 创建用户授权按钮(仅用于登录页面, 如果用户拒绝授权,则一直显示)
  private creatUserInfoButton(isFull: boolean = false) {
    const wx = window['wx'];
    let object: any = {
      // 按钮类型: text可设置背景色和文本 image仅能设置背景贴图
      type: "text",
      // 按钮文本,仅对type为text有效
      text: "授权",
      // 按钮样式
      style: {
        left: 70, 
        top: 60,
        width: 100,
        height: 40,
        backgroundColor: "#66CC00",
        color: "#FFFFFF",
        textAlign: 'center',
        lineHeight: 40,
        fontSize: 20,
      },
    };

    const button = wx.createUserInfoButton(object);
    // 监听用户信息按钮点击事件
    button.onTap((res) => {
      if (res && res.userInfo) {
        console.log("用户同意授权");
        this._userInfo = res.userInfo; 
        if (this._avatarCallBack) {
          this._avatarCallBack(this._userInfo.avatarUrl);
        }
        // 授权成功后,才销毁按钮
        button.destroy();
      } else {
        console.log("用户拒绝授权");
      }
    });
  }

  // 获取用户信息,需要获取scope.userInfo的授权,也就是getSettings的接口调用
  public getUserInfo() {
    const wx = window['wx'];
    let object: any = {
      success: (res) => {
        console.log("通过 getUserInfo 获取的数据:", res);
        if (res) {
          this._userInfo = res.userInfo;
          if (this._avatarCallBack) {
            this._avatarCallBack(this._userInfo.avatarUrl);
          }
        } 
      },
      fail: () => {
        console.log("getUserInfo获取信息失败");
      },
      complete: () => {},
    };
    wx.getUserInfo(object);
  }
}

脚本编写完成后,构建发布微信小游戏,构建完成后,通过运行打开微信开发者工具

效果图类似如下:

请添加图片描述

点击授权,选择同意

请添加图片描述

获取昵称,头像权限,选择允许

请添加图片描述

最终的效果:

请添加图片描述

代码相关注意:

  • const wx = window['wx'];的增加,主要是因为微信的运行环境跟cocosCreator不一致,如果没有该定义,ts是会提示报错的
  • 调用相关接口,注意对比API文档是否为异步操作,避免逻辑出现问题
  • 授权登录按钮处,如果用户拒绝,会一直存在
  • 某些接口是有调用次数限制的,可参考文档:接口调用频率规范
  • 测试中,如果想取消授权,可通过微信开发者工具点击:右上方… -> 设置 --> 用户信息开关关闭即可

请添加图片描述



头像域名导致的不显示


在测试的过程中,可能遇到类似问题:
请添加图片描述

问题原因:域名配置导致的,如果仅针对于测试, 处理方式:

微信开发者工具右上角详情 -> 本地设置 --> 勾选不校验合法域名…

请添加图片描述

重新运行,就会显示头像了。

如果是正式的环境,建议微信后台配置,步骤:

  • 打开mp.weixin.qq.com 后台
  • 选择左侧的开发管理,然后开发设置 -> 服务器域名 ,点击开始配置

请添加图片描述

  • 主要配置如下部分

请添加图片描述

然后保存提交。



其他


在微信官方提供的文档中,针对于wx API 接口的使用,都有着详细的说明,这里不再赘述。

更多内容可参考:

wx API

微信小游戏-开放能力

接口调用频率规范

接口版本兼容

如果您觉得不错,请您为我编写的文章点赞,祝大家学习生活愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链表的中间结点

题目表述 给你单链表的头结点 head&#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 这道题的思路是快慢指针&#xff0c;具体来说就是定义两个指针&#xff0c;一快一慢&#xff0c;快指针一次走两步&#xff0c;慢指针一次…

【每日一题】填充每个节点的下一个右侧节点指针 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;BFS 其他语言python3 写在最后 Tag 【BFS】【树】【2023-11-03】 题目来源 117. 填充每个节点的下一个右侧节点指针 II 题目解读 为二叉树中的每一个节点填充下一个节点。 解题思路 方法一&#xff1a;BFS 本题题目…

C 语言左移位操作在kernel驱动子系统中的特殊用途

文章目录 前言一、C语言左移位操作介绍1. 左移位二、左移位操作在kernel 驱动子系统中的应用1. 左移位操作在 V4L2, Media 子系统中的应用实例2.左移位操作在 DRM 子系统中的应用实例2.1 左移位操作在struct drm_crtc 中的应用2.2 左移位操作在struct drm_encoder 中的应用总结…

thinkphp6 入门(11)-- 模板标签

新版框架默认只能支持PHP原生模板&#xff0c;如果需要使用thinkTemplate模板引擎&#xff0c;需要安装think-view扩展&#xff08;该扩展会自动安装think-template依赖库&#xff09;。 composer require topthink/think-view配置文件 安装完成后&#xff0c;在配置目录的vi…

[AUTOSAR][诊断管理][ECU][$3E] 测试设备在线|会话保持

文章目录 一、简介二、服务请求报文定义三、肯定响应四、支持的NRC四、示例步骤(1)supportPosRspMsgIndicationBit=0(2)supportPosRspMsgIndicationBit=1三、示例代码3e_test_present.c一、简介 这个服务的目的是确保诊断服务或者之前激活的通信还处在激活的状态,可以保持…

批量压缩图片大小的绝妙技巧,让你的图片更轻盈

在制作幻灯片演示时&#xff0c;经常需要插入图片作为视觉辅助&#xff0c;通过批量缩小图片大小&#xff0c;可以减小演示文件的大小&#xff0c;方便共享和传输。 那么怎么将图片缩小成了问题的关键&#xff0c;市面上不少方法都是需要通过下载软件来处理图片的&#xff0c;…

自动驾驶高效预训练--降低落地成本的新思路(ReSimAD)

自动驾驶高效预训练--降低落地成本的新思路 1. 引言定义高效预训练 2. ReSimAD2.1引言2.2 主要贡献1.发布大规模ReSimAD数据2.ReSimAD pipeline 2.3 实验 上海人工智能实验室 1. 引言 高效的预训练&#xff0c;是大模型的第一步 大模型的两种能力 海量数据分布–未知场景泛化…

MySQL TIMESTAMPDIFF函数的使用场景

TIMESTAMPDIFF函数在MySQL中用于计算两个日期或时间之间的差异&#xff0c;并以指定的单位返回结果。这个函数特别适用于需要计算时间差或者对日期和时间进行操作的场景。 以下是一些TIMESTAMPDIFF函数的使用场景示例&#xff1a; 源表employees 计算两个日期之间的天数差异&a…

【LeetCode刷题-链表】--82.删除排序链表中的重复元素II

82.删除排序链表中的重复元素II 由于链表是排好序的&#xff0c;所以只需要对其进行一次遍历即可&#xff0c;比较相邻节点对应的值 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(…

Unity3D与iOS的交互 简单版开箱即用

本文适合的情况如下&#xff1a; Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚…

STM32:I²C通信原理概要

一、IIC通信原理 IIC通信和串口通信有一定的相似之处&#xff0c;都有一根共地线和两根数据线。但是传递外部信息&#xff0c;串口有两根数据线可以进行双向通信&#xff0c;也就是全双工通信。而在IIC通信下&#xff0c;其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL)&am…

k8s系列文章一:安装指南

# 临时关闭分区 swapoff -a 前言 k8s是docker的升级版&#xff0c;可用于docker集群配置管理微服务 一、更新ubuntu系统版本 sudo apt update sudo apt upgrade二、添加GPG密钥(阿里源) 尽管我不知道gpg是个什么东西&#xff0c;反正跟着做就完了 curl https://mirrors.a…

PostgreSQL 进阶 - 模式匹配,过滤敏感数据,数据清理

1. 模式匹配 SELECT phone_number FROM customers;使用正则表达式替换所有非数字字符 这样可以清理和标准化电话号码数据&#xff0c;去除任何非数字字符&#xff0c;只保留数字 UPDATE customers SET phone_number REGEXP_REPLACE(phone_number, [^0-9], , g) WHERE phone…

NProgress顶部进度条的用法

大家打开一个网页的时候&#xff0c;会看到一个进度条&#xff0c;然后加载完成后进度条就消失了。这个呢&#xff0c;就是一个第三方的进度条库&#xff0c;叫做nprogress. 1.首先安装nprogress(咱直接用npm安装了) : npm install --save nprogress 2.然后在 router/index.j…

高德Go生态建设与研发实践

序 高德在构建Go生态演化过程中&#xff0c;已经实现了QPS从0到峰值千万的飞跃&#xff0c;本篇文章主要介绍在此过程中积累的一些技术决策及性能优化和重构经验。阅读本文读者会有以下3点收获&#xff1a; 1.高德Go生态发展历程及现状分析 2.高德云原生Serverless落地情况&…

MobaXterm使用VNC远程显示和控制ubuntu桌面

目录 1 在ubuntu中安装vnc 2 设置ubuntu远程连接 3 MobaXterm中连接ubuntu的vnc 1 在ubuntu中安装vnc 参考&#xff1a;Ubuntu18.04~Ubuntu22.04安装并配置VNC_ubuntu安装vnc-CSDN博客 大体流程就是在ubuntu中安装vnc&#xff0c;设置密码&#xff0c;然后配置服务&#x…

Android开发适不适合做车载开发?

众所周知&#xff0c;今年的互联网行业就业率并不是很好&#xff0c;像“开猿截流&#xff0c;公司倒闭”等事件时有发生&#xff0c;感觉市场对于人才的需求量降低了&#xff0c;给原本不景气的Android 开发行业增添了不少的难度。 随着新能源汽车行业的脱颖而出&#xff0c;…

网络安全策略制定和执行: 提供制定全面的网络安全策略的步骤和指南,以确保组织的整体安全性。

网络安全一直是IT领域的一个关键挑战。随着威胁的不断演变和增强&#xff0c;制定和执行全面的网络安全策略变得至关重要。本文将为您提供一系列步骤和指南&#xff0c;帮助您确保组织的整体安全性。 第一章&#xff1a;明确安全需求和目标 在开始制定网络安全策略之前&#…

数据抽取+dataworks的使用+ADB的应用

一&#xff0c;大数据处理之数据抽取 1&#xff0c;什么是数据抽取 在大数据领域中&#xff0c;数据抽取是指从原始数据源中提取所需的数据子集或特定数据项的过程&#xff0c; 数据抽取是数据预处理的重要步骤&#xff0c;它为后续的数据分析和建模提供了基础。 2&#xff…