关于微信js-sdk使用流程整理

ops/2024/9/19 0:40:11/ 标签: 微信, 微信公众平台

写在前面

  1. 微信js-sdk的使用和调试需要外网可访问的服务,因为微信要发起请求到你的服务验证,所以请预先准备好。
  2. 关于本地调试可以借助natapp内网穿透工具,相关操作请访问官网https://natapp.cn/,可注册领取两条免费隧道,官网使用帮助文档也很齐全。这样你启动本地服务,也能进行微信的相关功能测试。

一、后端(服务端)准备

后端主要准备两个接口:一个接收微信发起的token验证;一个接收前端的请求返回微信权限验证配置;
以下直接贴代码,有些方法和类就不贴出来了,一目了然也好理解自己搞定一下

package com.example.wxserver.controller;
import com.example.wxserver.domain.vo.WxAccessTokenVo;
import com.example.wxserver.domain.vo.WxAuthVo;
import com.example.wxserver.domain.vo.WxTicketVo;
import com.example.wxserver.utils.NonceGenerator;
import com.example.wxserver.utils.SHA1Encryption;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.Arrays;
import java.util.Date;@RestController
@RequestMapping("/wx")
public class WxController {static final String appid = "测试号申请页的appID";static final String secret = "测试号申请页的appsecret";// access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。// access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。// 避免频繁调用微信token,此处作为调试临时缓存一下static WxAuthVo wxAuthVoSession = null;/*** 接收微信发起的token验证* 在微信测试号申请时,接口配置一栏填写后会发起请求到此接口,并默认携带相关参数* 将token(测试号申请页面,接口配置填写的Token)、timestamp、nonce三个参数进行字典序排序* 排序后三个参数字符串拼接成一个字符串进行sha1加密* 获得加密后的字符串可与signature对比,一致的话就原样返回echostr,此后接口配置显示成功* @param signature 微信加密签名* @param timestamp 时间戳* @param nonce 随机数* @param echostr 随机字符串* @return echostr*/@GetMapping("/checkSignature")public String checkSignature(String signature, String timestamp, String nonce, String echostr) {final String token = "mytoken";String[] arr = {token, timestamp, nonce};Arrays.sort(arr);String sign = SHA1Encryption.encryption(String.join("", arr));if (sign.equals(signature)) {return echostr;}return "";}/*** 接收前端请求* 发起请求到微信服务,并返回权限验证信息给前端页面* 先获取微信accessToken,c通过accessToken获取微信jsapi_ticket* 生成signature签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同* 所以最终要将生成签名用的这两个字段返回给前端的* @param url 调用JS接口页面的完整URL* @return wx.config用到的相关信息*/@GetMapping("/get-auth")public WxAuthVo getWxAuth(String url) {if (wxAuthVoSession != null) return wxAuthVoSession;WxAuthVo wxAuthVo = new WxAuthVo();RestTemplate restTemplate = new RestTemplate();// 获取微信accessTokenfinal String wxTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;WxAccessTokenVo accessTokenVo = restTemplate.getForObject(wxTokenUrl, WxAccessTokenVo.class);System.out.println("获取accessToken:" + accessTokenVo);if (accessTokenVo != null && accessTokenVo.getAccess_token() != null) {// 获取微信jsapi_ticketfinal String wxTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessTokenVo.getAccess_token() + "&type=jsapi";WxTicketVo wxTicketVo = restTemplate.getForObject(wxTicketUrl, WxTicketVo.class);System.out.println("获取wxTicket:" + wxTicketVo);if (wxTicketVo != null && "ok".equals(wxTicketVo.getErrmsg())) {String noncestr = NonceGenerator.generatorNonce();long timestamp = new Date().getTime();String signature = SHA1Encryption.encryption("jsapi_ticket=" + wxTicketVo.getTicket() + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url);wxAuthVo.setSignature(signature);wxAuthVo.setTimestamp(timestamp);wxAuthVo.setNonceStr(noncestr);wxAuthVo.setAppId(appid);wxAuthVoSession = wxAuthVo;}}return wxAuthVo;}
}

二、微信测试号配置

微信公众账号测试号申请系统传送门

打开以上链接,登录后可见以下页面,这就是上一步提到的微信测试号配置页面:

页面往下还有具体的接口权限介绍,注意网页网页授权获取用户基本信息还需单独配置

三、前端使用

  1. 首先用到的微信sdk版本,注意不同版本的差异,会影响相关方法的使用

    <script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

  2. 微信方法测试准备页面

    特别说明一下:针对于微信的分享朋友,朋友圈功能,也就是updateAppMessageShareData,updateTimelineShareData两个方法,只是配置分享的内容,至于发起分享这个动作,还得通过微信右上角的三个点弹出的菜单进行操作。并非页面内自定义一个按钮,点击发起分享。且这两个方法必须在测试公众号下访问才能成功,测试的chooseImage方法则没有这个要求。至于别的方法与sdk版本,还请自行测试。

<body><button id="chooseImage">选照片</button>
</body>
<script>function initWxConfig() {// 创建一个新的 XMLHttpRequest 实例const xhr = new XMLHttpRequest();// 请求后端准备的接口,并把url传过去xhr.open('GET', '/wx/get-auth?url=' + window.location.href);// 设置请求完成的回调函数xhr.onreadystatechange = function () {// 请求完成并且响应状态码为 200if (xhr.readyState === XMLHttpRequest.DONE) {if (xhr.status >= 200 && xhr.status < 300) {// 处理请求响应的数据const response = JSON.parse(xhr.responseText);const {appId, nonceStr, signature, timestamp} = response;console.log('response', response);wx.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId, // 必填,公众号的唯一标识timestamp, // 必填,生成签名的时间戳nonceStr, // 必填,生成签名的随机串signature,// 必填,签名jsApiList: ['updateAppMessageShareData','chooseImage','updateTimelineShareData'] // 必填,需要使用的JS接口列表});wx.ready(function () {// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。console.log("微信初始化成功~")wx.updateAppMessageShareData({title: '测试分享给朋友', // 分享标题desc: '这是一条描述信息用来测试的', // 分享描述link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: 'https://img-blog.csdnimg.cn/direct/fe0aba524001438b99ec91063d5c00dd.png#pic_center', // 分享图标success: function () {// 设置成功console.log('分享朋友设置成功')}})wx.updateTimelineShareData({title: '测试分享到朋友圈', // 分享标题link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: 'https://img-blog.csdnimg.cn/direct/fe0aba524001438b99ec91063d5c00dd.png#pic_center', // 分享图标success: function () {// 设置成功console.log('分享朋友圈设置成功')}})});wx.error(function (res) {// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。console.log("微信初始化失败:", res)});} else {// 处理错误,例如 404 或 500 状态码console.error('Error: ' + xhr.status);}}};xhr.send();}initWxConfig()chooseImage.onclick = function (){console.log("选取照片")wx.chooseImage({count: 1, // 默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有success: function (res) {var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片console.log('localIds', localIds)}});}
</script>

四、测试截图

这里的测试链接,必须符合微信测试号配置的安全域名,以下就是成功了

参考文档:

1.微信网页开发 /JS-SDK说明文档
2.关于接口配置信息URL和Token说明
3.获取 Access token原文介绍
4.获取 jsapi_ticket原文介绍


http://www.ppmy.cn/ops/8167.html

相关文章

Python 物联网入门指南(六)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十七章&#xff1a;机器人学 101 一提到机器人&#xff0c;我们就会被科幻小说所包围。我们可能会想起动画片《杰森一家》或者电影《终结…

金融领域思考-前言

1背景介绍 不知不觉已经进入金融领域并且从事支付相关研发工作2年&#xff0c;2年了&#xff0c;应该是一个非常重要的分水岭。但越学习&#xff0c;越了解&#xff0c;越知道金融领域的复杂性。故希望借助写博客整理相关思绪&#xff0c;每有会意&#xff0c;便会记录&#x…

「Kafka」Kafka理论知识解读(一)

「Kafka」Kafka理论知识解读&#xff08;一&#xff09; 1. Kafka与RabbitMQ的区别2. Kafka适合什么样的场景?3. Kafka的核心概念:提供一串流式的记录 - topic4. 分布式&#xff08;高可用&#xff09;5. Kafka 的功能6. Kafka 重要的五个概念7. Kafka 如何进行持久化&#xf…

AGM AG32 MCU在汽车UWB应用方案

AG32的汽车UWB应用方案 汽车电子产品的日益成熟&#xff0c;包括ADAS和车载信息娱乐&#xff0c;正在推动对CPLD的需求。例如&#xff0c;利用安装在车上的各种传感器&#xff08;如雷达、摄像头和激光雷达等&#xff09;来感知周围环境&#xff0c;实现实时监测和数据处理。这…

给c++小白的教程6:顺序结构

顺序结构&#xff0c;即代码从上往下顺序运行的结构。 一天&#xff0c;老师给赫炎出了道题:给定a,b,c,d四个整数&#xff0c;算出(ab)*c/d的值 这可难不倒学霸赫炎&#xff0c;但是你会用c来解决他吗&#xff1f; 首先要打出基础代码: #include<bits/stdc.h> using …

Ansible-基础模块

file模块; file 模块用于对文件相关的操作&#xff08;创建、删除、软硬链接&#xff09; 参数; path:要操作的文件路径 state&#xff1a;状态选项&#xff0c;用于指定希望文件处于的状态 touch:创建文件 directory&#xff1a;创建文件夹 link&#xff1a;创建软连接文件 ha…

jvm学习笔记

文章目录 1.内存泄漏原因2.JVM部分配置参数3.垃圾回收器的选择4.GC调优&#xff1a;5.查看线程命令6.问题一&#xff1a;cpu高占用7.问题二&#xff1a;接口响应时间很长8.问题三&#xff1a;线程不可用 面试篇1.什么是jvm2.字节码文件的组成3.什么是运行时数据区4.哪些区域会出…

【软考---系统架构设计师】软件架构

目录 1 一、软件架构的概念 二、软件架构风格 &#xff08;1&#xff09;数据流风格​​​​​​​ &#xff08;2&#xff09;调用/返回风格 &#xff08;3&#xff09;独立构件风格 &#xff08;4&#xff09;虚拟机风格 &#xff08;5&#xff09;仓库风格 三、架构…

Android Material Design学习笔记

Material Design控件学习记录 Toolbar 新建一个工程后&#xff0c;在res/values/themes.xml文件里 <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name"Theme.MaterialTest" paren…

储能光伏交流直流电流霍尔传感器

安科瑞薛瑶瑶18701709087 ◆概述 霍尔传感器&#xff0c;适用于交流、直流、脉冲等复杂信号的隔离转换&#xff0c;通过霍尔效应原理使变换后的信号能够直接被AD、DSP、PLC、二次仪表等各种采集装置直接采集和接受&#xff0c;体积小&#xff0c;寿命长&#xff0c;安装方便&…

JS - 基本数据类型的使用和定义

JavaScript的基本数据类型 字符串&#xff08;String&#xff09;&#xff1a;用于表示文本数据&#xff0c;例如&#xff1a;“Hello, World!”。数字&#xff08;Number&#xff09;&#xff1a;用于表示数值&#xff0c;包括整数和浮点数&#xff0c;例如&#xff1a;42, 3…

Postman之版本信息查看

Postman之版本信息查看 一、为何需要查看版本信息&#xff1f;二、查看Postman的版本信息的步骤 一、为何需要查看版本信息&#xff1f; 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “Set…

C语言枚举类型详解

下午好诶&#xff0c;今天小眼神给大家带来一篇C语言枚举类型详解的文章~ 目录 一、枚举类型的声明 二、枚举类型的优点 三、枚举类型的使用 一、枚举类型的声明 枚举顾名思义就是 一 一 列 举 。 比如&#xff1a; 一周从周一到周日共有七天&#xff0c;可以一一列举。 性…

SQLite去除.db-shm和.db-wal文件【已解决】

原因是开启了WAL 日志模式&#xff0c;实现日志回滚功能&#xff1b; 如果是多个连接访问数据库就会出现共享内存-shm文件 PRAGMA journal_modeWAL; 解决办法就是设置为默认模式 PRAGMA journal_modeDELETE; 执行成功后断开再重新连接&#xff0c;就不会出现这两个文件了…

STM32之不使用MicroLIB

一、microlib介绍 microlib 是缺省 C 库的备选库,功能上不具备某些 ISO C 特性。 microlib 进行了高度优化以使代码变得很小,功能比缺省 C 库少,用于必须在极少量内存环境下运行的深层嵌入式应用程序。 二、不使用microlib的原因 由于microlib不支持C++开发,因此在使用C…

python安装tokenizers包@FreeBSD

tokenizers提供了当今最常用的tokenizers的实现&#xff0c;重点关注性能和多功能性。官网&#xff1a;GitHub - huggingface/tokenizers: &#x1f4a5; Fast State-of-the-Art Tokenizers optimized for Research and Production 在FreeBSD系统python3.10下直接pip安装token…

科技驱动未来,提升AI算力,GPU扩展正当时

要说这两年最火的科技是什么&#xff1f;我想“AI人工智能”肯定是最有资格上榜的&#xff0c;尤其ChatGPT推出后迅速在社交媒体上走红&#xff0c;短短5天&#xff0c;注册用户数就超过100万&#xff0c;2023年一月末&#xff0c;ChatGPT的月活用户更是突破1亿&#xff0c;成为…

Flask 解决指定端口无法生效问题

问题重现 手动指定的IP端口是app.run(host0.0.0.0, port9304)&#xff0c;但是启动的地址显示的却是http://127.0.0.1:5000。 if __name__ __main__:app.run(host0.0.0.0, port9304)启动地址如下&#xff1a; 解决方案 PyCharm会自动识别出来flask项目&#xff08;即使你…

AI大模型探索之路-实战篇3:基于私有模型GLM-企业级知识库开发实战

文章目录 前言概述一、本地知识库核心架构回顾&#xff08;RAG&#xff09;1. 知识数据向量化2. 知识数据检索返回 二、大模型选择1. 模型选择标准2. ChatGLM3-6B 三、Embedding模型选择四、改造后的技术选型五、资源准备1. 安装git-lfs2. 下载GLM模型3. 下载Embeding模型 六、…

jetcache fastjson 泛型复杂对象JSON序列 ,反序列化

Jetcache fastjson 泛型复杂对象JSON序列 ,反序列化 默认的FastJson2 序列化存在问题增强FastJson 支持Encode 编码器Decode 解码器 默认的FastJson2 序列化存在问题 默认的序列化不能转换List 中的泛型数据类型, 从缓存拿取的list集合对象数据全部都转换成了JSONObject 增强F…