首页 > 其他分享 >JS-SDK 配置,实现微信分享功能

JS-SDK 配置,实现微信分享功能

时间:2024-02-20 11:01:15浏览次数:28  
标签:const 必填 url 微信 JS 签名 timestamp data SDK

官方文档https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

在使用微信分享功能之前,需要进行如下配置,参考官方文档

1. 绑定域名

此处看官方文档

2. 引入JS文件

此处看官方文档

3. 通过config接口注入权限验证配置

这里进行步骤分解

3.1 调用后端签名接口

此处签名需要前端传递当前页面路由给后端进行签名,特别注意,前端传递的路由一定要用encodeURIComponent进行编码,或者说让后端进行编码(官方文档没提),不然配置会失效

noncestr=Wm3WZYTPz0wzccnW
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
timestamp=1414587457
url=http://mp.weixin.qq.com?params=value

3.2 调用签名接口成功之后,使用wx.config配置

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识 
  timestamp: , // 必填,生成签名的时间戳 //可让后端返回
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

为了前后端字段统一,appId timestamp nonceStr signature 这4个字段由后端统一返回

3.3 js-sdk配置完之后,使用updateAppMessageShareData方法实现微信分享功能

wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
  wx.updateAppMessageShareData({ 
    title: '', // 分享标题
    desc: '', // 分享描述
    link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致,地址无需编码
    imgUrl: '', // 分享图标,得使用网络地址
    success: function () {
      // 设置成功
    }
  })
});

到目前为止算是配置完成了,下面附上使用next.js进行签名的接口和对js-sdk封装的hooks

生成随机字符串

/** 随机字符串 **/
export const uuid = () => {
  return Math.random().toString(36).substring(2)
}

next.js进行签名的接口

// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
import { createHash } from 'crypto'
import { uuid } from '@/utils'

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse<Record<string, any>>
) {
  const method = req.method
  if (method == 'POST') {
    const noncestr = uuid()
    const timestamp = Math.floor(Date.now() / 1000)
    const appId = process.env.APPID
    const secret = process.env.SECRET
    let { url } = req.body || {}
    if (!url) return res.json({ code: 500, message: 'url不能为空' })
    const accessToken = await fetch(
      `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${secret}`
    ).then(async (response) => {
      const data = await response.json()
      return data.access_token
    })
    console.log({ accessToken })
    const ticket = await fetch(
      `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${accessToken}&type=jsapi`
    ).then(async (response) => {
      const data = await response.json()
      return data.ticket
    })
    console.log({ ticket })
    url = decodeURIComponent(url)
    // 要加密的数据
    const dataToHash = `jsapi_ticket=${ticket}&noncestr=${noncestr}&timestamp=${timestamp}&url=${url}`
    // 创建 SHA1 哈希对象
    const sha1Hash = createHash('sha1')
    // 更新哈希对象的内容
    sha1Hash.update(dataToHash)
    // 计算哈希值
    const hashedData = sha1Hash.digest('hex') // 'hex' 表示输出为十六进制
    console.log(dataToHash)
    return res.json({
      data: {
        noncestr,
        timestamp,
        url,
        appId,
        signature: hashedData
      },
      code: 200
    })
  }
}

对js-sdk封装的hooks

import { useEffect } from 'react'

/** 生成签名 */
const generateSignature = (
  data: Record<string, any>
): Promise<Record<string, any>> => {
  return new Promise((resolve, reject) => {
    fetch('/api/weixin', {
      method: 'POST',
      body: JSON.stringify({
        url: data.url
      }),
      headers: {
        'Content-Type': 'application/json'
      }
    }).then(async (response) => {
      const data = await response.json()
      if (data.code == 200) {
        resolve(data.data)
      } else {
        reject(data)
      }
    })
  })
}

type JweixinType = {
  jsApiList?: string[]
  ready: (wx: Record<string, any>, url: string) => void
}
const useJweixin = (data: JweixinType) => {
  if (!process.browser) {
    return null
  }
  if (!window.device.weixin) {
    return null
  }
  const url = encodeURIComponent(window.location.href)
  useEffect(() => {
    generateSignature({
      url: url.split('#')[0]
    }).then((result) => {
      const { timestamp, noncestr, signature, appId } = result
      window.wx.config({
        debug: process.env.NODE_ENV !== 'production', // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId, // 必填,公众号的唯一标识
        timestamp, // 必填,生成签名的时间戳
        nonceStr: noncestr, // 必填,生成签名的随机串
        signature, // 必填,签名
        jsApiList: data.jsApiList || ['updateAppMessageShareData'] // 必填,需要使用的JS接口列表
      })
      window.wx.ready(() => {
        data.ready(window.wx, url)
      })
    })
  }, [])
}

export default useJweixin

 

标签:const,必填,url,微信,JS,签名,timestamp,data,SDK
From: https://www.cnblogs.com/yz-blog/p/18022628

相关文章

  • 安装Node.js和npm
    由于需要Node.js平台运行JavaScript代码,所以必须首先在本机安装Node环境。安装Node.js目前Node.js的最新版本是21.11.1。首先,从Node.js官网下载对应平台的安装程序。在Windows上安装时务必选择全部组件,包括勾选AddtoPath。安装完成后,在Windows环境下,请打开命令提示符,然后输......
  • .NET配置文件大揭秘:轻松读取JSON、XML、INI和环境变量
     概述:.NET中的IConfiguration接口提供了一种多源读取配置信息的灵活机制,包括JSON、XML、INI文件和环境变量。通过示例,清晰演示了从这些不同源中读取配置的方法,使配置获取变得方便且易于扩展。这种方式适用于不同场景,如API密钥、数据库连接等,为应用提供了高度可配置性。在.NET......
  • 聊聊微信小程序的流式(stream)响应请求
    场景:类似ChatGPT的逐字显示效果。流程:服务端我用Python的flask框架(向外提供API接口)实现,服务部署在replit上,Python调用azure的chatgpt服务(需要申请),并以流式的形式返回,小程序再调用这个流式接口实现。我会提供最小能运行的完整代码示例。我本地的Python版本:3.10.11、Flask版本:2.......
  • 学习总结基于VUE+ASP.NET Core mvc+EFCore+Axios.js+ehcart.js开发一个web应用
    Vue是一个用于构建用户界面(基于数据渲染出用户看到的页面)的渐进式(循序渐进)框架。分为(声明式渲染,基于js包、组建系统、客户端路由、大规模状态管理和构建工具)Vue的使用方法分为:1.Vue核心包开发:局部模块改造;2.Vue核心包+Vue插件工程化开发:整站开发1.开始之前准备下述包 在prog......
  • 基于python+django+vue.js开发的学生成绩管理系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。功能包括:成绩管理、学生管理、课程管理、班级管理、用户管理、日志管理、系统信息模块。源码地址https://github.com/geeeeeeeek/python_score演示地址http://score.gitapp.cn演示......
  • 基于python+django+vue.js开发的社区养老管理系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。功能包括:老人管理、护工管理、亲属管理、病史管理、房间管理、活动管理、用户管理、日志管理、系统信息模块。源码地址https://github.com/geeeeeeeek/python_yanglao演示地址http:/......
  • 基于python+django+vue.js开发的健身房管理系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。功能包括:教练管理、会员管理、场地管理、设备管理、用户管理、日志管理、系统信息模块。源码地址https://github.com/geeeeeeeek/python_fitness演示地址http://fitness.gitapp.cn......
  • 基于python+django+vue.js开发的停车管理系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。功能包括:车位管理、会员管理、停车场管理、违规管理、用户管理、日志管理、系统信息模块。源码地址https://github.com/geeeeeeeek/python_parking演示地址http://parking.gitapp.cn......
  • 基于python+django+vue.js开发的医院门诊管理系统/医疗管理系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。功能包括:医生管理、科室管理、护士管理、住院管理、药品管理、用户管理、日志管理、系统信息模块。源码地址https://github.com/geeeeeeeek/python_hospital演示地址http://hospital......
  • uniapp的H5端微信与支付宝支付(包括PC端与移动端)
    PC端:大致流程为1、请求创建订单接口传递正确参数(例如openid、金额、开始结束时间等),此接口会返回一个图片,或网络图片,或base64图片,这个图片是一张二维码;2、前端拿到这个二维码渲染到屏幕上并开始启动定时器,每过一秒请求一次查询支付结果接口,查询是否支付成功;3、支付宝支付可能会......