Nodejs实现微信网页授权及正确配置JS-SDK接口

2024-05-05 16:38

本文主要是介绍Nodejs实现微信网页授权及正确配置JS-SDK接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:《Nodejs实现微信网页授权及正确配置JS-SDK接口》- 陈帅华

帅华君将在本文介绍基于Nodejs实现微信网页授权以及如何正确在前后端配置JS-SDK接口。

微信网页授权

准备工作

  • 根据微信公众号接口权限说明,只有认证服务号才有获取用户openid及用户基本信息的权限,因此,开发者需要在微信公众号后台开发者工具找到公众平台测试账号:

  • 拿到微信公众平台的测试账号后,进一步设置与网页授权相关的选项,在测试账号页面下方的体验接口权限列表中,找到网页服务-网页账号-网页授权获取用户基本信息,并点击右侧修改按钮,添加外网能够访问到的远程服务器的域名(下方是帅华君在natapp申请的域名,利用内网穿透技术,无需反复将Nodejs脚本传输到远程服务器,即可让微信服务器通过外网访问到Nodejs搭建的监听任意端口号的本地服务器,当然如果你不怕调试的麻烦,可以填写您购买的远程服务器域名),如此即完成了微信网页授权的准备工作:

HTTPs请求

  • 帅华君使用必填的 appidredirect_uriresponse_typescope查询参数与锚点 #wechat_redirect获取CODE值

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
    

    如果用户同意授权,页面将会跳转至 redirect_uri/?code=CODE&state=STATE,其中CODE值只能使用一次,5分钟未被使用自动过期。

  • 帅华君使用 appidsecretCODE获取access_token

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    

    微信服务器返回如下内容表示正确获取到access_token:

    {"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE"
    }
    

    帅华君的做法是将access_token存储到数据库中,用户的openid作为表中的一个字段保证了每条记录的唯一性,并且在新增一个openid时记录当前时间为最近一次更新access_token的时间戳,当监测到最近一更新时间加上7200秒(即微信定义的过期时间)则更新获取access_toen,并更新最近一次更新时间戳。

  • 帅华君使用 access_tokenopenid获取用户基本信息

    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    

帅华君要提醒各位开发者的是,正如微信官方所说:

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

因此,以上三个步骤中的后两个必须在服务器端完成,对于帅华君来说是通过Nodejs服务器完成的,由于微信规定请求URI的协议是 https,因此,在Nodejs服务端发起的是HTTPS请求,使用的是Nodejs的HTTPs内建模块。

微信JS-SDK

准备工作

  • 与微信网页授权类似,调用JS-SDK接口也许配置安全域名,这里帅华君使用相同的域名
  • 下载微信提供的用于调用JS-SDK各种接口的js文件,这里帅华君采用前后端分离的开发模式,我会在 wx.config()函数调用之前向服务端发送Ajax请求获取配置js-sdk必须的参数,需要填写的参数如下:
    wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '', // 必填,公众号的唯一标识timestamp: , // 必填,生成签名的时间戳nonceStr: '', // 必填,生成签名的随机串signature: '',// 必填,签名jsApiList: [] // 必填,需要使用的JS接口列表
    });
    
    既然前端需要获取 appidtimestampnonceStrsignature参数值,那么接下来主要任务是后端写一个接口用以让前端通过Ajax请求获取到这些值。

API

接下来就是后端的事情了,后端同样采用Nodejs开发。

想要拿到参数传给前端,倒推到上一步骤就是获取jsapi_ticket,下面是微信官方对jsapi_ticket的解释。

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。

jsapi_ticket 和 access_token 类似,都有刷新次数的限制,因此jsapi_ticket和access_token一样需要缓存起来,帅华君的做法是,和access_token的缓存方法一样——存储到数据库中,定时的触发刷新机制。

由于获取jsapi_ticket的前提是需要提供access_token,关于如何获取微信公众平台access_token,帅华君在很早以前的文章中介绍过——《微信公众平台开发动态获取与更新access_token》

使用HTTPs模块向下方URI发起请求,请求参数只需携带ACCESS_TOKEN即可:

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。

签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

如此便可成功获取JS-SDK配置参数。


本文完

这篇关于Nodejs实现微信网页授权及正确配置JS-SDK接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962162

相关文章

程序在银河麒麟系统下实现开机自启及创建桌面快捷方式

目录 1. 机器环境说明 2. 程序开机自启动设置 2.桌面快捷方式设置 3. 附加说明 1. 机器环境说明 机器安装的银河麒麟操作系统属性如下: 2. 程序开机自启动设置 第1步:编写一个脚本,用于自动化启动,为便于后文描述,该脚本名称为autostart.sh,脚本内容如下:     #!/bin/bashexport LD_LIBRARY_PATH=$LD_L

JS使用教程

JS的使用方法: 1.从外部文件中导入 2.内部链接,<script></script> 3.嵌入标签 JS基本语法 1.执行顺序:按照HTML文档中出现的顺序依次执行 2.大小写敏感性:严格区分大小写 3.忽略空格符和换行符 4.语句分割符: 1)使用;结束语句 2)可以把多个语句写在一行 3)最后一个语句的分号可以省略,最好不要省略。 4)可以使用{},组成一个bloc

三方库移植之NAPI开发[2]C/C++与JS的数据类型转

通过NAPI框架进行C/C++与JS数据类型的转换 OpenHarmony NAPI将ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八种数据类型,以及函数对应的Function类型,统一封装成napi_value类型,下文中表述为JS类型,用于接收ArkUI应用传递过来的数据及返回数据给ArkUI

NAT技术总结与双向NAT配置案例

NAT的转换方式: 1.静态转换:固定的一对一IP地址映射。 interface GigabitEthernet0/0/1 ip address 122.1.2.24 nat static global 122.1.2.1 inside 192.168.1.1 #在路由器出接口 公网地址 私网地址。 2.动态转换:Basic NAT nat address-group 1 122.1.2.1 1

Android 应用开发-实现将公共存储空间内的文件复制到应用的私用存储空间中

一、前言 几个月前,我用Android Studio给公司销售部门的同事开发了一款手机app,让同事们用自己的手机就能进行商品的扫码盘点操作,帮他们提高了工作效率,他们用了一段时间,反映还不错。不过前几天,销售部门的同事找到我,说近期公司新增了一些商品,用我的这款软件无法正常扫码这些新商品,希望我能解决问题。    这个问题的产生原因是,因为我的能力和资源有限,开发的这款手机app只是一

Vue3:分类管理综合案例实现

综合案例 实现分类管理功能 路由 在main.js中引入router 访问根路径’/'后跳转到布局容器 加载布局容器后重定向到’/nav/manage’ 加载我们需要的组件 这样可以在布局容器中切换功能模块时,只对需要修改的组件进行重新加载 const router = createRouter({history: createWebHistory(import.meta.en

基于java的超级玛丽游戏的设计与实现(论文 + 源码)

Java的超级玛丽游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313347 基于java的超级玛丽游戏的设计与实现 摘要 近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。J2SE称为Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台。利用该平台可以开发J

微信支付 JAVA实现

微信支付接口文档2.7里的demo实在是看不下去了,错误百出,到网上搜了半天,全部都是把官方文档下下来让你下载,还扣你积分,操蛋。。。   微信支付JAVA 接口 首先下载官方demo,虽然很多有问题,但是很多工具类是可以用的 附上地址:https://mp.weixin.qq.com/paymch/readtemplate?t=mp/business/course2_tmpl

微信支付java版本之JSAPI支付+发送模板消息

目录(?)[-] 工具类公众账号设置代码实现weixin_jspay项目中代码实现3其他接口 1.工具类 工具类见:微信支付JAVA版本之Native付款 2.公众账号设置 3.代码实现 openId:openId为用户与该公众账号之间代表用户的唯一标示 以下类中涉及到生成token,关闭订单接口调用,获

微信公众平台开发之现金红包(Java)

目录(?)[-] 功能介绍微信红包发送规则商户侧调用红包接口流程用户交互流程接口详细说明一开发现金红包SDK二构造现金红包并发送 本文介绍的是基于Java语言开发微信现金红包的例子。由于个人表达能力和编程能力有限,请多多包涵。本文仅介绍拥有微信支付权限的微信公众号开发。 本文分为以下两部分: 1.开发现金红包SDK 2.构造现金红包并发送 首先看一下现金红包接口文档: