首页 > 其他分享 >wx.config的前后端实现express和react

wx.config的前后端实现express和react

时间:2024-07-05 22:41:16浏览次数:12  
标签:const data express react token timestamp ticket config wx

wx.config 是微信JS-SDK的配置接口,用于初始化微信JS-SDK。为了确保安全性,微信要求每次调用JS-SDK时都需要进行签名认证。签名认证需要使用jsapi_ticket,而jsapi_ticket需要通过access_token获取。

以下是实现wx.config的步骤:

后端部分

  1. 获取Access Token
    你需要定期获取并缓存access_token,因为它的有效期是7200秒(2小时)。

  2. 获取JSAPI Ticket
    使用access_token获取jsapi_ticket,并缓存它,因为它的有效期也是7200秒。

  3. 生成签名
    根据jsapi_ticket、当前网页的URL、随机字符串(nonceStr)和时间戳(timestamp)生成签名。

  4. 提供签名接口
    提供一个后端接口,前端可以调用这个接口获取签名信息。

以下是一个示例实现:

import express from 'express';
import fetch from 'node-fetch';
import crypto from 'crypto';

const app = express();
app.use(express.json());

const appId = 'YOUR_APP_ID';
const appSecret = 'YOUR_APP_SECRET';

let accessToken = '';
let jsapiTicket = '';
let tokenExpiresAt = 0;
let ticketExpiresAt = 0;

// 获取Access Token
async function getAccessToken() {
  if (Date.now() < tokenExpiresAt) {
    return accessToken;
  }

  const response = await fetch(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`);
  const data = await response.json();
  accessToken = data.access_token;
  tokenExpiresAt = Date.now() + (data.expires_in - 300) * 1000; // 提前5分钟过期

  return accessToken;
}

// 获取JSAPI Ticket
async function getJsapiTicket() {
  if (Date.now() < ticketExpiresAt) {
    return jsapiTicket;
  }

  const token = await getAccessToken();
  const response = await fetch(`https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${token}&type=jsapi`);
  const data = await response.json();
  jsapiTicket = data.ticket;
  ticketExpiresAt = Date.now() + (data.expires_in - 300) * 1000; // 提前5分钟过期

  return jsapiTicket;
}

// 生成签名
function createSignature(ticket: string, nonceStr: string, timestamp: number, url: string) {
  const string1 = `jsapi_ticket=${ticket}&noncestr=${nonceStr}&timestamp=${timestamp}&url=${url}`;
  const hash = crypto.createHash('sha1');
  hash.update(string1);
  return hash.digest('hex');
}

// 提供签名接口
app.post('/api/getSignature', async (req, res) => {
  const { url } = req.body;

  try {
    const ticket = await getJsapiTicket();
    const nonceStr = Math.random().toString(36).substr(2, 15);
    const timestamp = Math.floor(Date.now() / 1000);
    const signature = createSignature(ticket, nonceStr, timestamp, url);

    res.json({
      appId,
      timestamp,
      nonceStr,
      signature,
    });
  } catch (error) {
    res.status(500).json({ error: 'Failed to get signature' });
  }
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

前端部分

前端需要调用后端的签名接口,并使用返回的数据配置wx.config

import React, { useEffect } from 'react';

const YourComponent = () => {
  useEffect(() => {
    const url = window.location.href.split('#')[0];

    fetch('/api/getSignature', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ url }),
    })
      .then(response => response.json())
      .then(data => {
        wx.config({
          debug: true, // 开启调试模式
          appId: data.appId,
          timestamp: data.timestamp,
          nonceStr: data.nonceStr,
          signature: data.signature,
          jsApiList: [
            // 需要使用的JS接口列表
            'onMenuShareTimeline',
            'onMenuShareAppMessage',
            // 其他接口
          ],
        });

        wx.ready(() => {
          // wx API 调用
        });

        wx.error((res) => {
          console.error('wx.config 错误:', res);
        });
      })
      .catch(error => {
        console.error('Error:', error);
      });
  }, []);

  return <div>Your Component</div>;
};

export default YourComponent;

总结

  1. 后端定期获取并缓存access_tokenjsapi_ticket
  2. 后端提供一个签名接口,生成并返回签名信息。
  3. 前端调用后端签名接口,并使用返回的数据配置wx.config

请确保在微信公众平台上正确配置了JS接口安全域名。

标签:const,data,express,react,token,timestamp,ticket,config,wx
From: https://www.cnblogs.com/wangshushuo/p/18286719

相关文章

  • IDEA运行时报错:Application Server was not connected before run configuration stop
    求求了,有没有大佬能看到呀,马上就考试了,运行不出来真的好烦躁无力呀,我在CSDN上看到了好多解决方法,但是我用过之后依旧没能解决。这是我的tomcat和jdk版本,版本应该没有问题吧,这也是老师发给我们的版本这是我的环境变量的配置; 这是我的tomca,jdk,以及IDEA的地址;  求......
  • 1055 - Expression #9 of SELECT list is not in GROUP BY clause and contains nonag
    MySQL8的默认sql_mode包含了only_full_group_by,如果想要sql不按照这模式做检查,可以设置当前session的sql_mode值不包含oly_full_group_by;全局修改则使用以下sql--全局配置session级配置则去掉GlobalSETGLOBALsql_mode='ANSI_QUOTES,STRICT_ALL_TABLES,STRICT_TRANS_TAB......
  • Visual Studio 使用 EditorConfig 定义一致的编码样式
    代码一致性EditorConfig文件设置可在代码库中保持一致的编码样式和约定,无论使用哪种编辑器或IDE。可以控制缩进样式、制表符宽度、行尾字符和编码等编码样式。例如,如果C#代码库具有缩进使用五个空格字符、文档使用UTF-8编码,并且行以CR/LF结尾的约定,则可以将EditorCon......
  • react 2024 07 04
    import{createApi,fetchBaseQuery}from'@reduxjs/toolkit/query/react';import{RootState}from'../store';//定义用户数据的接口interfaceUser{id:number;name:string;sex:string;address?:string;//可选字段job?:string;//可选字段......
  • React组件性能优化中如何避免频繁更新?
    在React应用中,组件的频繁更新可能会导致性能问题,因为每次更新都涉及到重新渲染和布局计算。为了提升性能,避免不必要的更新是非常关键的。以下是一些优化React组件性能,避免频繁更新的策略:使用PureComponent或React.memoPureComponent和React.memo都会在组件接收新属性或状......
  • 微调qwen-VL报错ValueError: Unrecognized configuration class<xxx>to build an AutoTo
    问题在微调qwen-vl的时候,微调完成之后,模型也保存好了,但是用保存的模型进行推理的时候报错,看样子是找不到分词器tokenizer。报错信息ValueError:Unrecognizedconfigurationclass<class‘transformers_modules.configuration_qwen.QWenConfig’>tobuildanAutoTok......
  • Create Operations and the Oracle Restart Configuration
    CreateOperationCreatedComponentAutomaticallyAddedtoOracleRestartConfiguration?CreateadatabasewithOUIorDBCAYesCreateadatabasewiththe CREATE DATABASE SQLstatementNoCreateanOracleASMinstancewithOUI,DBCA,orASM......
  • Spring Reactor基本介绍和案例
    1.Reactor对比1.1Reactor线程模型Reactor线程模型就是通过单个线程使用JavaNIO包中的Selector的select()方法,进行监听。当获取到事件(如accept、read等)后,就会分配(dispatch)事件进行相应的事件处理(handle)。如果要给Reactor线程模型下一个更明确的定义,应该是:Re......
  • K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群
    前言Redis是在开发过程中经常用到的缓存中间件,为了考虑在生产环境中稳定性和高可用,Redis通常采用集群模式的部署方式。在制定Redis集群的部署策略时,常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点,相较之下,使用PetaExpress提供的Kubernetes(k8s)服务进行Redis集......
  • VCL界面组件DevExpress VCL v24.1 - 发布全新的矢量主题
    DevExpressVCL是DevExpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。DevExpressVCLv24.1已于日前正式发布,新版本官......