当前位置:网站首页>Node——生成微信权限验证配置
Node——生成微信权限验证配置
2022-07-02 00:15:00 【一只漫步前行的羊】
1. 加载所需依赖
cnpm i -S sha1 axios
2. 创建wxJsApiService.js
const sha1 = require("sha1")
const axios = require("axios")
let accessToken = null
let jsapiTicket = null
let tokenUpdateTime = null
let ticketUpdateTime = null
class WxJsApiService {
appid = "appid"
secret = "secret"
/* 获取微信access_token */
async getAccessToken() {
if ((Date.now() - tokenUpdateTime || 0) < (1000 * 60 * 60 * 2)) {
console.log("token还没失效:", accessToken);
return accessToken;
}
const {
access_token, errcode } = await new Promise((resolve, reject) => {
axios.get("https://api.weixin.qq.com/cgi-bin/token", {
params: {
grant_type: "client_credential",
appid: this.appid,
secret: this.secret
}
}).then(response => {
resolve(response.data);
}).catch(err => {
reject(err);
})
})
if (errcode) {
return new Error("token获取失败:" + errcode);
}
if (access_token) {
accessToken = access_token;
tokenUpdateTime = Date.now();
return accessToken;
}
}
/* 获取jsapi_ticket */
async getJsapiTicket() {
if ((Date.now() - ticketUpdateTime || 0) < (1000 * 60 * 60 * 2) && (Date.now() - tokenUpdateTime || 0) < (1000 * 60 * 60 * 2)) {
console.log("ticket还没失效:", jsapiTicket);
return jsapiTicket;
}
const {
ticket } = await new Promise(async (resolve, reject) => {
axios.get("https://api.weixin.qq.com/cgi-bin/ticket/getticket", {
params: {
access_token: await this.getAccessToken(),
type: "jsapi"
}
}).then(response => {
resolve(response.data);
}).catch(err => {
reject(err);
})
})
if (ticket) {
jsapiTicket = ticket;
ticketUpdateTime = Date.now();
return jsapiTicket;
}
}
/* 生成随机字符串 */
createNonceStr() {
return Math.random().toString(36).substring(2, 15);
}
/* 获取当前时间戳 */
createTimestamp() {
return parseInt(new Date().getTime() / 1000) + '';
}
/* 排序拼接 */
raw(args,isToLowerCase = true) {
let keys = Object.keys(args).sort(); //获取args对象的键值数组,并对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)
let newArgs = {
}
keys.forEach(key => {
newArgs[isToLowerCase ? key.toLowerCase() : key] = args[key];
})
let string = '';
for (let k in newArgs) {
// 循环新对象,拼接为字符串
string += `&${
k}=${
newArgs[k]}`
}
string = string.substring(1)// 截取第一个字符以后的字符串(去掉第一个'&')
return string;
}
/** * 微信jssdk签名算法 * @param url 用于签名的 url ,注意必须动态获取 * @param nonceStr 随机字符串 * @param timestamp 时间戳 * @return sha1算法加密的字符串 */
async jssdkSign(url, nonceStr, timestamp) {
let ret = {
jsapi_ticket: await this.getJsapiTicket(),
nonceStr, timestamp, url,
}
let str = this.raw(ret) // 排序拼接为字符串
return sha1(str) // 返回sha1加密的字符串
}
/* 生成jssdk配置 */
async createJssdkConfig(url) {
const timestamp = this.createTimestamp()
const nonceStr = this.createNonceStr()
return {
appid:this.appid,
sign: await this.jssdkSign(url,nonceStr,timestamp),
timestamp,
nonceStr
}
}
}
module.exports = WxJsApiService
3. 使用
const WxJsApiService = require("wxJsApiService.js")
let url = "http://location:8080" //网页访问的地址,需外网可访问
new WxJsApiService().createJssdkConfig(url).then(res=>{
console.log(res)
})
//或
let config = await new WxJsApiService().createJssdkConfig(url)
//返回参数
//{ appid, sign, timestamp, nonceStr }
TIP 配置注入可参考这个文章https://blog.csdn.net/qq812457115/article/details/125043544
边栏推荐
- SQL数据分析之子查询的综合用法和案例题【耐心整理】
- 【mysql 07】GPG key retrieval failed: “Couldn‘t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022“
- 回顾数据脱敏系统
- Algolia's search needs are almost closed
- Learn online case practice
- 记录一下大文件上传偶然成功偶然失败问题
- heketi 记录
- ThreadLocal内存泄漏是什么,怎么解决
- SQL数据分析之窗口排序函数rank、dense_rank、raw_number与lag、lead窗口偏移函数【用法整理】
- Record the accidental success and failure of uploading large files
猜你喜欢
E-commerce RPA robot helps brand e-commerce to achieve high traffic
数据分析方法论与前人经验总结【笔记干货】
.env.xxx 文件,加了常量,却undefined
Review data desensitization system
Pytorch learning record
The origin of usb-if Association and various interfaces
It's nothing to be utilitarian!
电商RPA机器人,助力品牌电商抢立流量高点
【QT】對於Qt MSVC 2017無法編譯的問題解决
B tree and b+tree of MySQL
随机推荐
Jielizhi, production line assembly link [chapter]
leetcode96不同的二叉搜索樹
启牛学院开户安全的吗?开户怎么开?
vs2015 AdminDeployment. xml
如何提升数据质量
Shell process control
Data analysis methodology and previous experience summary [notes dry goods]
Correlation - intra group correlation coefficient
Cmake engineering related
智能运维实战:银行业务流程及单笔交易追踪
Record the accidental success and failure of uploading large files
Algolia's search needs are almost closed
Graduation season | Huawei experts teach the interview secret: how to get a high paying offer from a large factory?
Halcon knowledge: an attempt of 3D reconstruction
九州云与英特尔联合发布智慧校园私有云框架,赋能教育新基建
vue 强制清理浏览器缓存
ADO. Net SqlConnection object usage summary
Heketi record
Regular expression collection
[template] adaptive Simpson integral