走进小程序【七】微信小程序【常见问题总结】

news/2024/7/4 1:46:36 标签: 微信小程序, 小程序, 微信

文章目录

  • 🌟前言
  • 🌟小程序登录
    • 🌟unionid 和 openid
    • 🌟关键Api
    • 🌟登录流程设计
      • 🌟利用现有登录体系
      • 🌟利用OpenId 创建用户体系
      • 🌟利用 Unionid 创建用户体系
  • 🌟授权获取用户信息流程
    • 🌟先授权获取用户信息再 login 会发生什么?
  • 🌟图片导出
    • 🌟基本原理
    • 🌟如何优雅实现
  • 🌟小程序的一些注意事项
  • 🌟结语

在这里插入图片描述

🌟前言

哈喽小伙伴们,上一期为大家讲解了一下小程序的架构之【视图层】篇。今天为大家总结几个微信小程序>微信小程序比较常见的面试题和问题吧;希望可以填补大家的知识空缺。好了,让我们一起来看看吧🤘

🌟小程序登录

🌟unionid 和 openid

了解小程序登陆之前,我们写了解下小程序/公众号登录涉及到两个最关键的用户标识:

  • OpenId 是一个用户对于一个小程序/公众号的标识,开发者可以通过这个标识识别出用户。
  • UnionId 是一个用户对于同主体微信小程序>微信小程序/公众号/APP的标识,开发者需要在微信开放平台下绑定相同账号的主体。开发者可通过UnionId,实现多个小程序、公众号、甚至APP 之间的数据互通了。

🌟关键Api

  • wx.login 官方提供的登录能力
  • wx.checkSession校验用户当前的session_key是否有效
  • wx.authorize 提前向用户发起授权请求
  • wx.getUserInfo 获取用户基本信息
  • wx.getUserProfile 新增获取用户基本信息

小程序登录、用户信息相关接口调整说明官方

🌟登录流程设计

🌟利用现有登录体系

直接复用现有系统的登录体系,只需要在小程序端设计用户名,密码/验证码输入页面,便可以简便的实现登录,只需要保持良好的用户体验即可

🌟利用OpenId 创建用户体系

OpenId 是一个小程序对于一个用户的标识,利用这一点我们可以轻松的实现一套基于小程序的用户体系,值得一提的是这种用户体系对用户的打扰最低,可以实现静默登录。具体步骤如下

  • 小程序客户端通过 wx.login 获取 code
  • 传递 code 向服务端,服务端拿到 code 调用微信登录凭证校验接口,微信服务器返回 openid会话密钥 session_key ,此时开发者服务端便可以利用 openid 生成用户入库,再向小程序客户端返回自定义登录态;
  • 小程序客户端缓存 (通过storage)自定义登录态(token),后续调用接口时携带该登录态作为用户身份标识即可。

🌟利用 Unionid 创建用户体系

如果想实现多个小程序,公众号,已有登录系统的数据互通,可以通过获取到用户 unionid 的方式建立用户体系。因为 unionid 在同一开放平台下的所所有应用都是相同的,通过 unionid 建立的用户体系即可实现全平台数据的互通,更方便的接入原有的功能,那如何获取
unionid 呢,有以下两种方式

  • 如果户关注了某个相同主体公众号,或曾经在某个相同主体App、公众号上进行过微信登录授权,通过 wx.login 可以直接获取 到 unionid
  • 结合 wx.getUserInfo<button open-type="getUserInfo"><button/> 这两种方式引导用户主动授权,主动授权后通过返回的信息和服务端交互 (这里有一步需要服务端解密数据的过程,很简单,微信提供了示例代码) 即可拿到 unionid 建立用户体系, 然后由服务端返回登录态,本地记录即可实现登录,附上微信提供的最佳实践
    • 调用 wx.login 获取 code,然后从微信后端换取到 session_key,用于解密 getUserInfo 返回的敏感数据;
    • 使用 wx.getSetting 获取用户的授权情况;
      • 如果用户已经授权,直接调用 API wx.getUserInfo 获取用户最新的信息;
      • 用户未授权,在界面中显示一个按钮提示用户登入,当用户点击并授权后就获取到用户的最新信息。
    • 获取到用户数据后可以进行展示或者发送给自己的后端。

注意事项

  • 需要获取 unionid 形式的登录体系,在以前(18年4月之前)是通过以下这种方式来实现,但后续微信做了调整(因为一进入小程序,主动弹起各种授权弹窗的这种形式,比较容易导致用户流失),调整为必须使用按钮引导用户主动授权的方式,这次调整对开发者影响较大,开发者需要注意遵守微信的规则,并及时和业务方沟通业务形式,不要存在侥幸心理,以防造成小程序不过审等情况;
    wx.login(获取code) ===> wx.getUserInfo(用户授权) ===> 获取 unionid
  • 因为小程序不存在 cookie 的概念, 登录态必须缓存在本地,因此强烈建议为登录态设置过期时间;
  • 值得一提的是如果需要支持风控安全校验,多平台登录等功能,可能需要加入一些公共参数,例如platformchanneldeviceParam等参数。在和服务端确定方案时,作为前端同学应该及时提出这些合理的建议,设计合理的系统;
  • openidunionid 不要在接口中明文传输,这是一种危险的行为,同时也很不专业。

🌟授权获取用户信息流程

在这里插入图片描述

  • session_key 有有效期,有效期并没有被告知开发者,只知道用户越频繁使用小程序session_key 有效期越长;
  • 在调用 wx.login 时会直接更新 session_key,导致旧 session_key 失效;
  • 小程序内先调用 wx.checkSession 检查登录态,并保证没有过期的 session_key 不会被更新,再调用 wx.login 获取 code。接着用户授权小程序获取用户信息,小程序拿到加密后的用户数据,把加密数据和 code 传给后端服务。后端通过 code 拿到 session_key 并解密数据,将解密后的用户信息返回给小程序

🌟先授权获取用户信息再 login 会发生什么?

在这里插入图片描述
在这里插入图片描述

  • 用户授权时,开放平台使用旧的 session_key 对用户信息进行加密。调用 wx.login 重新登录,会刷新 session_key,这时后端服务从开放平台获取到新 session_key,但是无法对老 session_key 加密过的数据解密,用户信息获取失败;
  • 在用户信息授权之前先调用 wx.checkSession 呢?wx.checkSession 检查登录态,并且保证 wx.login 不会刷新 session_key,从而让后端服务正确解密数据。但是这里存在一个问题,如果小程序较长时间不用导致 session_key 过期,则 wx.login 必定会重新生成 session_key,从而再一次导致用户信息解密失败。

🌟图片导出

这是一种常见的引流方式,一般同时会在图片中附加一个小程序二维码。

🌟基本原理

  • **借助
  • canvas 元素,将需要导出的样式首先在 canvas 画布上绘制出来 (api基本和h5保持一致,但有轻微差异,使用时注意即可;**
  • 借助微信提供的 canvasToTempFilePath 导出图片,最后再使用 saveImageToPhotosAlbum (需要授权)保存图片到本地。

🌟如何优雅实现

  • 绘制出需要的样式这一步是省略不掉的。但是我们可以封装一个绘制库,包含常见图形的绘制,例如矩形,圆角矩形,圆, 扇形, 三角形, 文字,图片减少绘制代码,只需要提炼出样式信息,便可以轻松的绘制,最后导出图片存入相册。笔者觉得以下这种方式绘制更为优雅清晰一些,其实也可以使用加入一个type参数来指定绘制类型,传入的一个是样式数组,实现绘制。
  • 结合上一步的实现,如果对于同一类型的卡片有多次导出需求的场景,也可以使用自定义组件的方式,封装同一类型的卡片为一个通用组件,在需要导出图片功能的地方,引入该组件即可。
class CanvasKit {
   constructor() {
   }
   drawImg(option = {}) {
     ...
     return this
   }
   drawRect(option = {}) {
     return this
   }
   drawText(option = {}) {
     ...
     return this
   }
   static exportImg(option = {}) {
     ...
   }
 }

 let drawer = new CanvasKit('canvasId').drawImg(styleObj1).drawText(styleObj2)
 drawer.exportImg()

注意事项 :

  • 小程序中无法绘制网络图片到canvas上,需要通过downLoadFile 先下载图片到本地临时文件才可以绘制;
  • 通常需要绘制二维码到导出的图片上,有一种方式导出二维码时,需要携带的参数必须做编码,而且有具体的长度(32可见字符)限制,可以借助服务端生成 短链接 的方式来解决。

🌟小程序的一些注意事项

  • 小程序仍然使用 WebView 渲染,并非原生渲染。(部分原生);
  • 服务端接口返回的头无法执行,比如:Set-Cookie
  • 依赖浏览器环境的 JS库不能使用;
  • 不能使用 npm,但是可以自搭构建工具或者使用 mpvue。(未来官方有计划支持);
  • 不能使用 ES7,可以自己用babel+webpack自搭或者使用 mpvue`;
  • 不支持使用自己的字体(未来官方计划支持);
  • 可以用 base64 的方式来使用 iconfont
  • 小程序不能发朋友圈(可以通过保存图片到本地,发图片到朋友前。二维码可以使用B接口);
  • 获取二维码/小程序接口的限制;
  • 程序推送只能使用“服务通知” 而且需要用户主动触发提交 formIdformId 只有7天有效期。(现在的做法是在每个页面都放入form并且隐藏以此获取更多的 formId。后端使用原则为:优先使用有效期最短的);
  • 小程序大小限制 2M,分包总计不超过 8M
  • 转发(分享)小程序不能拿到成功结果,原来可以。链接(小游戏造的孽);
  • 拿到相同的 unionId 必须绑在同一个开放平台下。开放平台绑定限制:
    • 50个移动应用;
    • 10个网站;
    • 50个同主体公众号;
    • 5个不同主体公众号;
    • 50个同主体小程序
    • 5个不同主体小程序
  • 公众号关联小程序
  • 一个公众号关联的10个同主体小程序和3个非同主体小程序可以互相跳转;
  • 品牌搜索不支持金融、医疗;
  • 小程序授权需要用户主动点击;
  • 小程序不提供测试 access_token
  • 安卓系统下,小程序授权获取用户信息之后,删除小程序再重新获取,并重新授权,得到旧签名,导致第一次授权失败;
  • 开发者工具上,授权获取用户信息之后,如果清缓存选择全部清除,则即使使用了wx.checkSession,并且在session_key有效期内,授权获取用户信息也会得到新的session_key

🌟结语

这篇为小伙伴们讲解了一些小程序的问题;水滴石穿,积少成多。各位小伙伴让我们 let’s be prepared at all times!

✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!


http://www.niftyadmin.cn/n/228756.html

相关文章

xxl-job定时任务调度中心的配置以及整合到自己的项目中实现远程调用

目录 前言&#xff1a; xxl-job配置与启动&#xff1a; xxl-job-admin: xxl-job-execultor--sample-springboot: 启动任务调度中心&#xff1a; ​编辑 调用定时任务&#xff1a; ​编辑 在自己的项目中配置xxl-job&#xff1a; 项目结构&#xff1a; ​编辑 AdUp…

嵌入式硬件电路设计

第一、电源确定 电源对于嵌入式系统中的作用可以看做是空气对人体的作用&#xff0c;甚至更重要&#xff1a;人呼吸的空气中有氧气、二氧化碳和氮气等但是含量稳定&#xff0c;这就相当于电源系统中各种杂波&#xff0c;我们希望得到纯净和稳定符合要求的电源&#xff0c;但由于…

HTB-Obscurity

HTB-Obscurity信息收集8080端口立足www-data -> robertrobert -> rootsudo 注入hash捕获信息收集 8080端口 ”如果攻击者不知道你在使用什么软件&#xff0c;你就不会被黑客攻击!“&#xff0c;目标对web的指纹做了某些处理。 “‘SuperSecureServer.py’ in the secre…

经历了野蛮生长之后,新科技或许已经抵达了全新的临界点

跳出仅仅只是以概念和营销的方式来定义元宇宙&#xff0c;真正找到元宇宙与现实商业之间的桥接&#xff0c;让元宇宙可以在真实实践上得到复现&#xff0c;才是保证元宇宙的发展可以进入到一个全新发展阶段的关键所在。归根到底&#xff0c;我们还是要找到元宇宙落地的正确的方…

【shell 脚本】

编写 shell 脚本 Hello word 创建并进入编写一个 xx.sh脚本文件 vi first.sh#! /bin/bashecho "Hello Word!"运行 .sh脚本 sh first.sh或 ./first.sh加上 -x 可以查看脚本的运行记录 sh -x first.sh[rootshell ~]# sh -x first.shecho Hello Word!Hello Word!基…

Rust China Conf 2023 筹备启动:议题征集开始

大会介绍Rust China Conf 2023 由 Rust 中文社区发起主办、知名企业和开源组织联合协办&#xff0c;是年度国内规模最大并唯一的 Rust 线下大型会议&#xff0c;深受 Rust 中文社区开发者与相关企业的喜爱与推崇。本次大会为线下会议&#xff0c;将于6月17日-18日在上海举办&am…

代码随想录算法训练营总结篇

通过本次为期两个月的算法训练使自己对于算法中一些名词有了更加深刻的理解。接下来我将按照这段时间的算法题目做一个总结。 在进入算法训练之前首先应对时间复杂度和空间复杂度有一个认识&#xff0c;我们在完成一道代码题后&#xff0c;对其进行优化的前提是可以从目前已完…

【RocketMQ】主从模式下的消费进度管理

在【RocketMQ】消息的拉取一文中可知&#xff0c;消费者在启动的时候&#xff0c;会创建消息拉取API对象PullAPIWrapper&#xff0c;调用pullKernelImpl方法向Broker发送拉取消息的请求&#xff0c;那么在主从模式下消费者是如何选择向哪个Broker发送拉取请求的&#xff1f; 进…