VUE使用微信分享SDK(附踩坑记录)

微信分享官方文档

  • 安装JS-SDK

    npm i -S weixin-jsapi

  • 引入包

    ES5 写法

    const wx = require('weixin-jsapi')

    ES6 写法

    import wx from 'weixin-jsapi'

  • 使用

    • 完整版

        $.ajax({
          url: 'https://*******/auth/jsapisignature',
          type: 'Get',
          async: false,
          dataType: 'jsonp',
          jsonp: 'callback', // 值可变,名称随意,但一般设为callback就可以了
          jsonpCallback: 'gdd',
          success: function (data) {
            wx.config({
              debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
              appId: data.AppId, // 必填,公众号的唯一标识
              timestamp: data.Timestamp, // 必填,生成签名的时间戳
              nonceStr: data.NonceString, // 必填,生成签名的随机串
              signature: data.Signature.toLowerCase(), // 必填,签名,见附录1
              jsApiList: [
                'checkJsApi',
                'onMenuShareTimeline',
                'onMenuShareAppMessage'
              ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
            })
      
            wx.ready(function () {
              // var IMG_SRC = ***
              var LINK = location.href.split('#')[0]
              // 微信分享
              document.title = title
              let TITLE = document.title
              // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
              wx.onMenuShareTimeline({
                title: TITLE, // 分享标题
                link: LINK, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: Logo, // 分享图标
                success: function () {
                  // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                  // 用户取消分享后执行的回调函数
                }
              })
      
              wx.onMenuShareAppMessage({
                title: TITLE, // 分享标题
                desc: Description, // 分享描述
                link: LINK, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: Logo, // 分享图标
                type: '', // 分享类型,music、video或link,不填默认为link
                dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                success: function () {
                  // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                  // 用户取消分享后执行的回调函数
                }
              })
            })
            wx.error(function (err) {
              console.log(err)
              // alert(err.errMsg)
            })
          }
        })

步骤详解

1、 调用后台返回微信签名的接口(为下面的config)

```JavaScript
  $.ajax({
    url: 'https://*******/auth/jsapisignature',
    type: 'Get',
    async: false,
    dataType: 'jsonp',
    jsonp: 'callback', // 值可变,名称随意,但一般设为callback就可以了
    jsonpCallback: 'gdd',
    success: function (data) {

    }
```

2、 通过config接口注入权限验证配置

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

3、 在微信JS-SDK准备好了就调用所需的方法

```JavaScript
  wx.ready(function () {
        // var IMG_SRC = ***
        var LINK = location.href.split('#')[0]
        // 微信分享
        document.title = title
        let TITLE = document.title
        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
        wx.onMenuShareTimeline({
          title: TITLE, // 分享标题
          link: LINK, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
          imgUrl: Logo, // 分享图标
          success: function () {
            // 用户确认分享后执行的回调函数
          },
          cancel: function () {
            // 用户取消分享后执行的回调函数
          }
        })

        wx.onMenuShareAppMessage({
          title: TITLE, // 分享标题
          desc: Description, // 分享描述
          link: LINK, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
          imgUrl: Logo, // 分享图标
          type: '', // 分享类型,music、video或link,不填默认为link
          dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
          success: function () {
            // 用户确认分享后执行的回调函数
          },
          cancel: function () {
            // 用户取消分享后执行的回调函数
          }
        })
      })
      wx.error(function (err) {
        console.log(err)
        // alert(err.errMsg)
      })
    }

```

踩坑记录


1、 在微信里面刷新一下才出来分享图片

原因是本人在项目中 初始的进入域名为 www.aa.com/ID, 然后通过接口判断是什么模版的页面,直接跳向 一个新的路由 www.aa.com/模版/ID。 导致第一步获取签名失败
微信默认规则:
通过分享链接进去页面之后先获取document.location.href,跟你当时获取签名时的document.location.href做对比,不一致,就签名失败,分享失效,图片不出来
刷新一下出来:是当前的域名(www.aa.com/模版/ID 跳转或处理完毕的)是现在第一步获取签名时候微信获取当前的document.location.href

出现问题的机型是IOS

vue-router用的history模式,在微信签名验证的时候iOS验证URL竟然是第一次进来的URL 参考

结论:保证 微信 进入当前页面时获取的 document.location.href 与 个人 获取微信签名时的 document.location.href 时一致。例如:我上面的前后路由地址都为 www.aa.com/ID 就不存在这样的问题了

2、 VUE 安装的微信JS-SDK后台报错 wx is undefined

之前安装的是这个包weixin-js-sdk,在项目中报错,目前测试是不支持,应该用上面提到的 weixin-jsapi

3、 对于vue单页面history模式应用多路由跳转导致签名失败 参考

1、原因是使用了vue-router里面的history模式,这种模式下的url是不断变化的,而JS-SDK的在每一次url变化的时候都需要重新config,导致每一个跳转一个页面都需要重新去进行config,
2、而使用vue-router的默认模式,只是hash部分(#后面的内容)变化,这种变化是不需要重新进行config的
3、使用默认的vue-router的hash mode就可以,在根组件(一般是app.vue)里面配置config信息即可,代码如下

4、 Ts包安装微信JS-SDK问题

npm install @type/weixin-js-sdk

5、 ios上二次分享会出现签名错误, 并且莫名被拼接上了一串标识 此问题只有在ios上有 参考

本质上的错误是;当浏览者从分享窗口进入后,他从分享页按着正常路由跳转到其他页面,其他页面的逻辑中如果有需要获取当前页面url的需要,会发现这个url和正常路由跳转的不一样,导致签名不一致,所以获取不到正确的文案。

应使用下面方法获取分享地址(上面例子里的方式就是正确的)

var LINK = location.href.split('#')[0]

VUE使用微信JDK(附踩坑记录)的更多相关文章

  1. 我用EasyExcel优化了公司的导出(附踩坑记录)

    背景介绍 最近要改一个导出的功能,在原有的基础上,在导出一份明细数据,要求导出内容加在原有 excel 的第二个 sheet 上.考虑到数据量还比较大,干脆引入阿里的 EasyExcel 来做. 下面 ...

  2. vue使用百度编辑器ueditor踩坑记录

    一.使用 下载放入项目 main.js引入 import '../static/UE/ueditor.config.js'; import '../static/UE/ueditor.all.js'; ...

  3. vue cli3 + cube-ui 配置rem踩坑记录

    在install cube-ui时,选择了后编译,选中使用rem的时候会发现,怎么刷新页面的html字体被设置成了37.5px 感觉太大了,于是去寻找修改的办法,第一反应是webpack的配置,于是去 ...

  4. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  5. vue 踩坑记录

    1.绑定双击事件用 @dblclick 不要用@ondblclick  在vue中@=on 2.Vue中路由跳转踩坑. 比如我的路由如下定义 routes: [ { path: "/&quo ...

  6. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

  7. jvisualvm连接远程应用终于成功,附踩大坑记录!!(一:jstatd方式)

    一.问题概述 连接远程java应用除了jstatd方式,还有jmx方式.不必拘泥于一种,一种不行可以果断尝试另一种,兴许就行了. 姊妹篇在这: jvisualvm连接远程应用终于成功,附踩大坑记录!! ...

  8. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  9. ABP框架踩坑记录

    ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...

随机推荐

  1. CTF中常见文件的文件头(十六进制)

    jpg/jpeg FF D8 FF E0 或 FF D8 FF E1 或 FF D8 FF E8 png 89 50 4E 47 bmp 42 4D 36 5D gif 47 49 46 38 zip ...

  2. iOS 模块分解— Runtime

    相信对于从事开发人员来说 runtime 这个名称都不陌生,就像我起初只知道「 runtime 叫运行时 」,后来知道 runtime 同样可以像 KVC 一样访问私有成员变量,还有「 给类动态添加属 ...

  3. HDLM命令dlnkmgr详解之五_set

    set命令用来设置HDLM的操作环境及参数. set操作设置的大部分是dlnkmgr view -sys命令中显示的参数值 命令格式 dlnkmgr set { -lb on [ -lbtype { ...

  4. bash: telnet: command not found

    //安装telnet服务 yum -y install telnet-server //安装telnet客户端 yum -y install telnet.*

  5. appium如何连接模拟器代码实例

    from appium import webdriver def connect(self): self.desired_caps = {} self.desired_caps['platformNa ...

  6. Android远程服务(AIDL)实现步骤

    AIDL是安卓接口定义语言的缩写 由于笔者使用的是android studio所以建立AIDL文件的位置也需要注意,要在APPNAME->main->aidl->packagenam ...

  7. 2-2 zookeeper下载、安装以及配置环境变量

    https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/ FTP的软件:FileZilla Client 登录腾讯云服务器tail /va ...

  8. oracle行转列练习

    ----------------------第一题--------------------------- create table STUDENT_SCORE ( name ), subject ), ...

  9. CodeForces 1109C. Sasha and a Patient Friend

    题目简述:维护以下三种操作 1. "1 t s":在时刻$t$插入命令$s$.保证任意操作后,任意时刻至多只有一个命令. 2. "2 t":删除时刻$t$的命令 ...

  10. JavaPersistenceWithMyBatis3笔记-第3章SQL Mappers Using XMLs-001

    一. 1.Mapper 2.Service 3.Domain package com.mybatis3.domain; import java.io.Serializable; import java ...