JS-SDK与二次分享问题

2023-10-31

先说说背景知识

1.JS-SDK的用途

调用拍照,选图,支付,分享,定位功能。微信开放这些能力给开发者,要对开发者进行鉴权。鉴权的时候需要签名,签名需要票据,随机字符串,时间戳,网址,票据需要调用微信的一个接口生成,比较麻烦的参数票据,票据的生成,需要调用另外一个接口,需要appId和serect。每天只能调用2000次,每次调用的有效期是2小时。
JS-SDK具体使用的步骤:JS-SDK具体使用步骤

2.签名的获取方法

2.0 准备工作

1.登录微信公众平台,在开发设置中查看AppID和AppSecret
在这里插入图片描述

2 设置JS接口安全域名。这里填写的是一级域名,不带www和http。最多可以设置三个域名。相比以前的分享没有任何域名限制,现在设置安全域名,目的是为了当微信发现此公众平台发现诱导分享行为时,可以根据此域名追溯到所有分享出去的链接,以及通过这些链接增加的粉丝。这样,微信就可以牢牢控制了你的微信平台,一旦发现违规,让分享链接失效,删除掉诱导行为增加的粉丝,是瞬间就可以完成的。因此,一定要合理来使用分享功能,不要因小失大。等到你的微信平台被封,估计哭都来不及。

2.1 获得Access Token

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下 access_token有效期为7200秒 ,重复获取将导致上次获取的access_token失效。公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台中获得(见下图)。 注意调用所有微信接口时均需使用https协议。

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明
参数
grant_type
appid
secret
返回说明

正常情况下,微信会返回下述JSON数据包:

{"access_token":"ACCESS_TOKEN","expires_in":7200}
参数
access_token
expires_in

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

2.2 获取jsapi_ticket

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
用第一步拿到的access_token , 采用https GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket),接口地址如下
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

成功返回如下JSON:

{
    "errcode":0,
    "errmsg":"ok",
    "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
    "expires_in":7200
}

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

2.3 签名算法实现

签名生成规则如下:

参数
noncestr
jsapi_ticket
timestamp
url

对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
即** signature=sha1(string1)**。 示例:

参数
noncestr
jsapi_ticket
timestamp
url
2.3.1 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:**

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

2.3.2 对string1进行sha1签名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

3 项目中的问题

3.1 IOS下分享内容描述和图标不对问题剖析

微信应用右上角自带的分享功能,在分享内容之前需要调用wx.config对微信分享JS-SDK鉴权,需要的传参如下:

   wx.config({
        debug: true, // 开启调试模式
        appId: 'xxx', // 必填,公众号的唯一标识
        timestamp: result.data.timestamp, // 必填,生成签名的时间戳
        nonceStr: result.data.nonceStr, // 必填,生成签名的随机串
        signature: result.data.signature,// 必填,签名
        jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline'] // 必填
    });

其中不好获取的参数是signature。signature是怎么获取的呢?在我们的项目中,是通过请求getTicket接口,获取signature,而请求getTicket接口的参数中,最容易出问题的就是jsUrl。

   	const params = {
		appId: newAppId || appId,
		corpId: env === 2 ? authCorpId : currentCorpId,
		wechatType: env,
		jsUrl: url,
		agentId,
  	};
    const res = await ajax('getTicket', params, isShowError);
    const { retdata = {} } = res;
    const { appId, noncestr, signature, timestamp, nextUpdateTime } = retdata;
    const obj = {
      debug: false, // 是否开启调试模式
      appId, // appid
      timestamp, // 时间戳
      nonceStr: noncestr, // 随机字符串
      signature, // 签名
      jsApiList,
      openTagList: [],
    };
    if (env === 1) {
      obj.beta = true;
      obj.appId = currentCorpId;
    }
    wx.config(obj);

这个jsUrl参数,按理说要取当前分享页面的url,在Android上确实是这样,可是在IOS手机上,如果取当前分享页面的url,

url = encodeURIComponent(window.location.href);

分享出去的内容,图标和描述的展示会有问题
在这里插入图片描述

应该取进入应用首页的url,而不是当前页面的url

url = encodeURIComponent(localStorage.getItem(keyDict.entryUrl));

所以调用getTicket这个方法的时候,要添加判断条件,

// 如果是 iOS 设备,个人微信环境,则使用应用首页的 URL 去请求 wxConfig,不然的话会导致 iOS 中分享的链接描述信息或者图标不对
  if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent) && env === 2) {
    // console.log('签名地址=======================', localStorage.getItem(keyDict.entryUrl))
    url = encodeURIComponent(localStorage.getItem(keyDict.entryUrl));
  } else {
    // console.log('签名地址=======================', window.location.href)
    url = encodeURIComponent(window.location.href);
  }

鉴权失败会报如下错误:

wx.config {"errMsg": "config:invalid signature"}

3.2 wx.agentConfig调用步骤

3.2.1 wx.config和wx.agentConfig的区别

wx.config注入的是企业的身份与权限,而wx.agentConfig注入的是应用的身份与权限。尤其是当调用者为第三方服务商时,通过config无法准确区分出调用者是哪个第三方应用,而在部分场景下,又必须严谨区分出第三方应用的身份,此时即需要通过agentConfig来注入应用的身份信息。wx.agentConfig配置步骤:

3.2.2 先要引入 jwxwork sdk
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
3.2.3 wx.agentConfig配置参数
wx.agentConfig({
    corpid: '', // 必填,企业微信的corpid,必须与当前登录的企业一致
    agentid: '', // 必填,企业微信的应用id (e.g. 1000247)
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录-JS-SDK使用权限签名算法
    jsApiList: ['selectExternalContact'], //必填,传入需要使用的接口名称
    success: function(res) {
        // 回调
    },
    fail: function(res) {
        if(res.errMsg.indexOf('function not exist') > -1){
            alert('版本过低请升级')
        }
    }
});
3.2.4 调用agentConfig的注意事项
  1. agentConfig与config的签名算法完全一样,但是jsapi_ticket的获取方法不一样,请特别注意,查看”获取应用身份的ticket“.

  2. agentConfig仅在企业微信2.5.0及以后版本支持,微信客户端不支持(微信开发者工具也不支持)

  3. 调用wx.agentConfig之前,必须确保先成功调用wx.config. 注意:从企业微信3.0.24及以后版本(可通过企业微信UA判断版本号),无须先调用wx.config,可直接wx.agentConfig.

  4. 当前页面url中的域名必须是在该应用中设置的可信域名。

  5. 仅部分接口才需要调用agentConfig,需注意每个接口的说明

在这里插入图片描述

4. 跨企业分享内容,在另一企业打开,再次分享,wx.config报如下错误

errMsg: "config:invalid corpid more info at https://open.work.weixin.qq.com/devtool/query?e=40013"

原因是: 企微的JS-SDK调用,与企业Id,可信域名关联在一起的。在B企业下,无法用A企业的JS-SDK成功授权功能。即使A,B企业下,配置了相同的可信域名。也无法穿透调用。只能在各自的企业下,调用微信提供的网页开发包。
因为在B企业下打开分享内容时,hideMenuItems是第一个被调用的JS-SDK,所以第一个报的JS-SDK调用错误是:
在这里插入图片描述

为什么在另一企业下,wx.config配置出错的情况下,文章貌似还能分享。其实分享出去的文章,是有问题的。从下图可以看出,描述不对。
在这里插入图片描述

参考文章
1.企微跳转到小程序

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

JS-SDK与二次分享问题 的相关文章

  • 使jira支持reopen率的统计

    jira本身并不能统计bug的reopen率 虽然bug工作流程中有reopen节点 只能借助第三方插件来处理 插件名称 Enhancer Plugin for JIRA 此插件支持自定义字段 自定义计数器等等高级操作 在插件管理中搜索插件
  • docker基础3——制作镜像(基于容器)

    文章目录 一 基本了解 1 1 镜像结构 1 2 docker存储驱动 1 2 1 AUFS 1 2 2 OverlayFS 1 2 3 DeviceMapper 1 3 镜像仓库 二 镜像制作 2 1 基于容器制作镜像 三 镜像导入与导出
  • 双指针的实践

    一 原理 双指针 指的是在遍历对象的过程中 不是普通的使用单个指针进行访问 而是使用两个相同方向 快慢指针 或者相反方向 对撞指针 的指针进行扫描 从而达到相应的目的 换言之 双指针法充分使用了数组有序这一特征 从而在某些情况下能够简化一些
  • 第四章 频域滤波(傅里叶变换频域显示特性)

    一 傅里叶变换频域显示特性 在光学傅里叶变换中 人们已经习惯变换域中 的低谱部分位于中央 频域频谱分布中间低 周围高的特性 有利于频谱的解析和进行各种计算与分析 1 图像中心化 借助傅里叶变换的周期性和频率位移性质 可以对频域进行换位以使频
  • Navicat 11连接MYSQL 8.0问题

    一 问题 MySQL8 0 来使用的时候 通过sqlyog 或者程序中连接数据库时 提示 Authentication plugin caching sha2 password cannot be loaded 的错误 8 0改变了身份验证

随机推荐

  • 第三大的数、字符串中的单词数、排列硬币

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 百日刷题计划 第 16 100 天 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 大连棒棰岛
  • hbase集群在启动的时候报错:JAVA_HOME is not set and Java could not be found

    hbase集群在启动的时候报错 JAVA HOME is not set and Java could not be found 出现这种错误 一般应该是hbase下conf文件下的hbase env sh文件中的java home的环境变
  • 信息学奥赛一本通 1224:最大子矩阵

    题目链接 ybt 1224 最大子矩阵 ybt 1282 最大子矩阵 OpenJudge 2 6 1768 最大子矩阵 洛谷 P1719 最大加权矩形 题目考点 1 动态规划 线性动规 最大子段和 2 前缀和 解题思路 求二维最大子矩阵和
  • Android扫描银行卡获取银行卡号

    card io开源的银行卡扫描的三方库真的是很好用啊 首先需要在你的module的gradle的依赖文件中添加依赖 compile io card android sdk 5 5 1 2 清单文件中加入如下Activity
  • 腾讯云Linux服务器如何安装Nginx?(CentOS 8)

    安装及配置 Nginx 执行以下命令 安装 Nginx 说明 本文以安装 Nginx 1 18 0 为例 您可通过 Nginx 官方安装包 获取适用于 CentOS 8的更多版本 dnf y install http nginx org p
  • 跨站请求伪造CSRF(Cross-site request forgery)

    目录 一 什么是CSRF 二 可能存在CSRF攻击的三个条件 一个相关的动作 基于 Cookie 的会话处理 没有不可预测的请求参数 二 常见的CSRF攻击 1 CSRF令牌的验证取决与请求方法 2 CSRF令牌的验证取决与令牌是否存在 3
  • 基于C#开发的,支持多平台二维图表开源编辑器

    推荐一个基于C 开发的 支持多平台的二维图表开源编辑器 01 项目简介 Core2D是一个支持跨平台 多平台的应用程序 内置wyswig矢量图形编辑器 可用于数据驱动生成二维图 1 wyswig矢量图形编辑器 内置了一个强大的图形编辑器 它
  • 从小白到高手---api接口和drf(Django Rest_Framework)使用超详解

    1 api接口 为了在团队内部形成共识 防止个人习惯差异引起的混乱 我们需要找到一种大家都觉得很好的接口实现规范 而且这种规范能够让后端写的接口 用途一目了然 减少双方之间的合作成本 目前市面上大部分公司开发人员使用的接口服务架构主要有 r
  • Java IO File类中的知识点

    public class Demo3 public static void main String args TODO Auto generated method stub test1 1 名称 test2 2 判断信息 test3 创建删
  • ggplot2杂记

    ggplot2杂记 本文是我在阅读 lt
  • Quartz 之 Job参数 和 Job状态

    项目地址 https github com yuleiqq quartz example tree master quartz study 此示例旨在演示如何将运行时参数传递给quartz作业 以及如何维护作业中的状态 程序将执行以下操作
  • 自学Python真的可以吗?

    自学当然可以学成功python了 但是前提是你需要认真去学 而不是三天打渔两天晒网的 因为python初学很容易 稍微过几天忘记也很容易 所以一定要坚持学习 并且通过平时多加练习来熟练掌握各个知识点 一 学习建议 Python涉及到的学习方
  • 如何解决上传IPA反馈ERROR ITMS-90189版本号重复问题

    在使用App Store Connect上架iOS应用时 如果上传IPA文件时出现ERROR ITMS 90189版本号重复问题 可能是因为该版本号已经被其他应用占用 为了解决这个问题 您可以遵循以下步骤 1 在App Store Conn
  • Qt_shadow build

    就是构建生成的目录和源代码目录分开 比如工程目录叫test 则编译器自动生成一个test build desktop目录存放所有编译过程中生成的文件 当然与之类似的还有在pro文件中添加 MOC DIR temp moc RCC DIR t
  • YOLOv3 从入门到部署(四)YOLOv3模型导出onnx(基于pytorch)

    YOLOv3 从入门到部署 四 YOLOv3模型导出onnx 基于pytorch 文章目录 YOLOv3 从入门到部署 四 YOLOv3模型导出onnx 基于pytorch 目录 概述 pytorch导出onnx采坑 转onnx代码 使用D
  • postgresql ERROR: could not load library plpgsql.so的处理

    1 创建function时遇到ERROR could not load library plpgsql so 多半是因为使用了旧的版本 2 查看postgresql版本 3 寻找对应版本的so档案替换目前使用的plpgsql so 4 大功
  • Linux系统分区方案

    我个人服务器配置 24G内存 1T固态 2T机械 固态硬盘 1 主分区 Swap area 这个是根据系统内存的大小设置的 我这里内存是24G 所以给了 24 1024 2 主分区 boot 我这里给了 5120 3 逻辑分区 EFI 我这
  • Spring 对象XML映射

    OXM简介 我们都知道对象关系映射 ORM 用来将Java对象和关系型数据库的数据进行映射 Spring也提供了一套类似的映射机制 用来将Java对象和XML文件进行映射 这就是Spring的对象XML映射功能 有时候也成为XML的序列化和
  • 计算机组成原理期末总结

    文章目录 写在前面 1 计算机系统概论 知识点 习题 2 运算方法和运算器 知识点 习题 3 多层次的存储器 知识点 习题 4 指令系统 知识点 习题 5 中央处理器 知识点 习题 6 总线系统 知识点 习题 7 外存与IO设备 知识点 习
  • JS-SDK与二次分享问题

    先说说背景知识 1 JS SDK的用途 调用拍照 选图 支付 分享 定位功能 微信开放这些能力给开发者 要对开发者进行鉴权 鉴权的时候需要签名 签名需要票据 随机字符串 时间戳 网址 票据需要调用微信的一个接口生成 比较麻烦的参数票据 票据