H5微信分享记录

2023-11-20

最近做H5微信分享,用的微信jssdk来做,现记录下一些过程和遇到的问题。

一、公众号配置

微信官方文档 已经说明了使用步骤,公众号配置比较模糊,主要是要配置ip白名单和绑定js接口安全域名:

1、检查分享接口权限是否已获得,在微信公众号的【设置与开发】-【接口权限】,放图如下:

2、获取开发者密码、设置IP白名单,在微信公众号的【设置与开发】-【基本配置】,放图:

        开发者密码,自己获取后记下来就行;IP白名单将本地IP、域名所属服务器IP增加进去(ps: 注意不需要加https://或者http://)

 

3:绑定域名,在微信公众号【设置与开发】-【公众号设置】-【功能设置】,放图:

        先将txt文件按照要求上传至服务器,我一般只写域名xxx.com,所以将txt文件放域名跟目录下,txt放入服务器后,才可保存添加成功。

 二、遇到的问题

官方文档也有一些常见问题的处理方法,也可以先看看排查下。

1、Invalid Signature

按照官方文档的步骤去排查错误:
(1)确认签名算法正确,可用微信提供的http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。——这个问题主要在后台那里,要点:1.公众号后台配置ip白名单以及JS安全域名。重点:ip白名单记得要配后台线上服务器的ip,否则线上后台是拿不到asscee_token的,access_token为null时也可以参与signature的计算,很坑!!!建议让后台把access_token和jsapi_ticket返回或者让后台看看到底有没有返回值;2.记得拿公众号的APPID去计算,一定要后台亲眼去比对,APPID对不对!(2)确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。——这一步没啥好说的,自己好好检查

(3)确认url是页面完整的url(请在当前页面alert(location.href.split(‘#’)[0])确认),包括’http(s)://’部分,以及’?’后面的GET参数部分,但不包括’#’hash后面的部分。——记得 encodeURIComponent(location.href.split(‘#’)[0])

(4)确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。

(5)确保一定缓存access_token和jsapi_ticket。

(6)确保你获取用来签名的url是动态获取的,如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去’#’hash部分的链接(可用location.href.split(‘#’)[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。**——记得前端把当前页面路径(encodeURIComponent(location.href.split(‘#’)[0]))ajax 传给后台 **

2、the permission value is offline verifying

(1)确认config正确通过。——记得在页面挂在完毕去注入JSSDK,如果有路由拦截跳转的,要跳转完毕后再去注入,要保证传给后端获取签名信息的url和当前页面的url是一模一样的,分享出去的连接倒是可以不一样(我有个需求就是列表页分享出去后用户进入要都跳去首页,所以我就在列表页传首页连接去获取签名信息,然后把首页连接分享出去,结果一直无法分享)(encodeURIComponent(location.href.split(‘#’)[0]))

(2)如果是在页面加载好时就调用了JSAPI,则必须写在wx.ready的回调中。——wx.ready的回调去写分享逻辑

(3)确认config的jsApiList参数包含了这个JSAPI。

3、permission denied

(1)先去微信公众平台 看看公众号没有权限使用这个JSAPI

(2)可以调用jweixin.checkJsApi,记得把debug打开,微信开发者工具和真机报的错误很大可能会不一样。引用的最新的jssdk 1.6;也用了最新的分享给好友的方法;真机 updateAppMessageShareData: true; updateTimelineShareData: true; config: ok,就是分享不了,我真是吐了,如果遇到同样的情况,记得jsApiList加入 onMenuShareAppMessage,没错就是老版本,那个即将废弃的分享api

4、invalid url domain

     配置js接口安全域名的时候切记不要把http://或者https://填进去,我就是这么干的,结果导致了这个错误,有点坑

最后贴下微信分享主要代码:

/**
 * 是否在微信浏览器中打开
 */
export function isWeiXin(): boolean {
  const ua = window.navigator.userAgent.toLowerCase()
  const match = ua.match(/MicroMessenger/i)
  if (match === null) {
    return false
  }
  if (match.includes('micromessenger')) {
    return true
  }
  return false
}

/**
 * 微信分享
 * @param {data}: 微信注册配置信息
 * @param {shareData}: 分享信息
 */

export interface ShareDataProps {
  title: string // 分享标题
  desc?: string // 分享描述
  link: string // 分享链接,该连接域名或路径必须与当前页面对应的公众号JS安全域名一致
  imgUrl?: string // 分享图标
}

export const wxShare = (shareData: ShareDataProps) => {
  if (!isWeiXin()) return
  const default_img = location.origin + '/fs.dataexa.com/dataexa/rtdi/express/weixin_share_log.png'
  getWxConfigParams({
    url: location.href,
  }).then((res) => {
    const { appId, timestamp, nonceStr, signature } = res
    wx.config({
      debugger: false,
      appId,
      timestamp,
      nonceStr,
      signature,
      jsApiList: [
        'checkJsApi',
        'updateAppMessageShareData',
        'updateTimelineShareData',
        'onMenuShareAppMessage', // 旧的接口,即将废弃(网上说是要把旧接口也填上去,不然注册会失败)
        'onMenuShareTimeline', // 旧的接口,即将废弃
        'onMenuShareQQ', // 旧接口,分享给QQ好友
        'onMenuShareQZone', // 旧接口,分享到QQ空间
      ],
    })

    wx.ready(() => {
      // 分享到朋友圈及QQ空间
      wx.updateAppMessageShareData({
        title: shareData.title,
        link: shareData.link,
        desc: shareData?.desc || '',
        imgUrl: shareData?.imgUrl || default_img,
      })
      // 分享给朋友及分享到QQ
      wx.updateTimelineShareData({
        title: shareData.title,
        link: shareData.link,
        desc: shareData?.desc || '',
        imgUrl: shareData?.imgUrl || default_img,
      })

      wx.error((err: any) => {
        // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名
        console.log('验证失败', err)
      })
    })
  })
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

H5微信分享记录 的相关文章

  • 如果老板要求你的系统接入春晚大流量活动,你会心慌慌吗?

    目录 回头看看 原始系统技术架构 基于CDN的活动静态页面缓存方案 基于Nginx Tomcat Redis的多级缓存方案 超高并发写请求RocketMQ削峰填谷方案 系统限流防雪崩体系架构方案 今天给大家分享一个话题 就是如果要是你老板突
  • MyBatis实现Mapper配置并查询数据

    什么是Mapper 在MyBatis工程搭建 中我们主要讲解的是 MyBatis 如何连接数据库 具体执行 SQL 语句使用的是 JDBC 方式 但在实际应用中是不会选择 JDBC 来执行 SQL 的 MyBatis 提供了 Mapper
  • MeterSphere接口测试cookie提取正则表达式

    在接口自动化测试中经常需要提取header cookie信息 MeterSphere接口自动化测试 添加cookie提取方法如下 0 开启场景共享cookie 1 选择要提取cookie的请求步骤 2 点击后置操作 3 添加参数提取 类型选
  • Vuetify笔记(3):v-btn按钮和v-text-field文本

    1 v btn按钮 在UI组件中v btn组件是用一个material design主题和多个选项来替换标准的html按钮 任何色彩辅助类都可以用来改变背景或文字的颜色 v btn按钮常用属性 1 flat 移除按钮的背景色 布尔值类型 默
  • 蓝桥杯真题:迷宫

    目录 题目描述 运行限制 dfs bfs 结果 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 11 的为障碍 标记为 00 的为可以通行的地方 010000 000

随机推荐

  • 前端趋势 2022

    大家好 我是若川 持续组织了近一年的源码共读活动 感兴趣的可以 加我微信lxchuan12 参与 每周大家一起学习200行左右的源码 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列 包含20余篇源码文章 历史面试系列 另外 目前建有
  • js判断字符串以某字符开头或结尾

    一 substr start length 函数 1 概述 substr start length 从start开始往后截取length位 下标从0开始 长度从开始下标计算 2 举例 var str 我是一只快乐的小青蛙 str subst
  • XSS(跨站脚本攻击)详解

    XSS攻击通常指的是通过利用网页开发时留下的漏洞 通过巧妙的方法注入恶意指令代码到网页 使用户加载并执行攻击者恶意制造的网页程序 这些恶意网页程序通常是JavaScript 但实际上也可以包括Java VBScript ActiveX Fl
  • 从零开始zynq linux AXI DMA传输

    本文从0开始叙述过程 使用的工具为vivado2016 4 sdk也是2016 4 准备工作 首先下载如下的目标文件 1 下载xilinx官方的bootloader文件 git clone https github com Xilinx u
  • zookeeper集群安装+集群值启动+source命令+export命令

    1zookeeper集群安装 1安装到3台虚拟机上 mini2 mini3 mini4 2先要安装好JDK 步骤 1先给mini2 mini3 mini4创建用户hadoop 密码也是hadoop adduser hadoop passwd
  • python数据科学(十):pandas基础—— 数据导入导出

    数据科学 十 数据格式 csv 载入数据到 Pandas 分隔 缺失 指定读取 指定列名 指定行索引 指定多层索引 逐块读取 处理 正则表达式 缺失值处理 统计次数 保存数据到磁盘 不写索引 不写列名 指定分隔符 只写一部分 pickle
  • 【ffmpeg基础】ffmpeg音频编码

    一 aac编码 输入raw音频编码为AAC ffmpeg i input wav acodec aac y input aac 通过 acodec来指定音频编码器 视频编码器为 vcodec 也可以使用 c a来指定音频编码器 ffmpeg
  • 企业架构LNMP学习笔记29

    Nginx负载均衡配置 架构分析 1 用户访问请求Nginx负载均衡服务器 2 Nginx负载均衡服务器再分发请求到Web服务器 实际配置负载均衡 只需修改作为负载均衡服务器的Nginx即可 当前架构中的server04 在客户端解析域名到
  • 华为OD机试 - 日志首次上报最多积分(Java)

    题目描述 日志采集是运维系统的的核心组件 日志是按行生成 每行记做一条 由采集系统分批上报 如果上报太频繁 会对服务端造成压力 如果上报太晚 会降低用户的体验 如果一次上报的条数太多 会导致超时失败 为此 项目组设计了如下的上报策略 每成功
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • 基本逻辑运算

    目录 1 与 2 或 3 非 4 与非 5 或非 6 异或 7 同或 1 与 输入有零 输出为0 输入全1 输出才1 1 逻辑表达式 L A B
  • windows下安装ElasticSearch的Head插件

    es5以上版本安装head需要安装node和grunt 1 从https nodejs org en download 下载相应系统的msi 双击安装 2 安装完成用cmd进入安装目录执行 node v 可查看版本号 3 执行 npm in
  • github搭建个人博客报错分析及用法总结

    注册可以参考csdn中关于注册的相关博客 这里我想说的是 当重复注册 出现github账号被标记的情况 或者操作失误所产生的不能搭建个人博客的问题 遇到这种问题 直接联系管理员就好 一封礼貌的email就可以解决问题 1 每个人只能注册一个
  • C/C++实现输入终止则循环结束

    C while scanf d n EOF C while cin gt gt N
  • 【Windows】局域网内共享文件夹的设置方法

    引言 Windows 系统自带有文件共享功能 可实现局域网内简单的协同办公 本文简单介绍一下该功能该如何使用 需求 假设这里有两台在同一局域网的电脑 设备别名分别定义为 pc1 和 pc2 现在 pc1 桌面上建立一个名为 public 的
  • Street Workout

    sw网站 网站简介 很早就有了这个想法 但是无奈一直没有去做 终于到了这个寒假 2019 2020上 开始编码了 作为自己第一个单独开发的网站 经过了十多天的堆码 终于完成了大概的框架 虽然没有什么浏览量但是还是挺开心的 话不多说 放图 多
  • java获取指定时间前N天和后N天

    获取指定时间前N天后N天 Test public void getLastDay String time public void getLastDay SimpleDateFormat sdf new SimpleDateFormat yy
  • iPhone上查询UDID

    查找设备的 UDID 有多种方式 可以通过 iTunes 或 Finder 查找 也可以通过 Xcode 查找 这里介绍一种在线通过 iPhone 或 iPad 直接查找 UDID 的方法 1 在 iOS 设备上打开 Safari 浏览器
  • 华为OD机试 - 食堂供餐(Java)

    题目描述 某公司员工食堂以盒饭方式供餐 为将员工取餐排队时间降低为0 食堂的供餐速度必须要足够快 现在需要根据以往员工取餐的统计信息 计算出一个刚好能达成排队时间为0的最低供餐速度 即 食堂在每个单位时间内必须至少做出多少价盒饭才能满足要求
  • H5微信分享记录

    最近做H5微信分享 用的微信jssdk来做 现记录下一些过程和遇到的问题 一 公众号配置 微信官方文档 已经说明了使用步骤 公众号配置比较模糊 主要是要配置ip白名单和绑定js接口安全域名 1 检查分享接口权限是否已获得 在微信公众号的 设