自定义微信分享链接(使用JS-SDK) + 实现预览pdf

需求:外部网页在微信中被分享时,会出现一个小卡片,包含title,image和url。



这个分享链接的内容不够直观,故需自定义小卡片的内容。

  1. 准备公众号
    在公众号中设置js安全域名(即需要分享链接的网页的域名)
    js安全域名

服务端获取签名(客户端不安全,且存在跨域问题)

可参考:微信JS-SDK说明文档 >

  1. 获取access_token
    首先 从公众号中获取APPID和SECRET
    appid和appsecret
请求地址: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + APPID + '&secret=' + SECRET,
请求方法:'get'
返回:access_token

此时可能出现白名单错误(忘截图了),需要在微信公众号中设置错误中的IP


白名单设置
  1. 获取ticket
//  ACCESS_TOKEN为上一步中得到的access_token
请求地址:'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi'
请求方法:'get'
返回:'ticket'

注意:access_token和ticket都需要缓存

4.获取签名signature

const nonceStr = 'string'  // 一个随机的字符串即可
const jsapi_ticket = ticket  // 上一步中的ticket
const timestamp = Date.now() // 当前时间戳
const url = location.href.spilt('#')[0]  // 该网页当前地址不要`#`后面的内容(由后续前端当做参数传递过来)

将以上内容以键值对形式拼接,类似如下

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

本地引入sha1算法(需网上查找)
将上述拼接的字符串以参数的形式传递到sha1中得到signature
signature = sha1(拼接完的字符串)
验证signature是否正确 >
将appId,nonceStr,timestamp和signature返回给前端

前端处理

  1. 通过config接口注入权限验证配置
// CDN引入
<script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js" charset="utf-8"></script>
wx.config({
    debug: true, // 开启调试模式,可以在电脑端打印消息,也可以在真机上弹出框提示错误消息
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名
    jsApiList: ['updateAppMessageShareData'] // 必填,需要使用的JS接口列表 === 根据JS-SDK附录二获取,此处只是加了一个分享给朋友的api
});

后续整理发现了一个很怪的bug。我使用的是安卓,微信版本是6.7.3,调试的时候发现config: ok并且updateAppMessageShareData: ok但是实际上分享的链接并不会起到自定义内容的效果。经过很多尝试后,发现需要更改jsApiList里的内容。如下:

官网上是这样描述的:

即将废弃的分享的api

但是实际上在使用updateAppMessageShareData的时候没有作用,必须在jsApiList中增加相应的废弃的接口才能生效。

jsApiList: ['updateAppMessageShareData', 'onMenuShareAppMessage', 'updateTimelineShareData', 'onMenuShareTimeline']

这时候调用updateAppMessageShareDataupdateTimelineShareData的时候就可以生效了,具体原理不清楚。。

分享给朋友

朋友圈分享


6. 成功验证和失败验证

```javascript
// 成功
wx.ready(() => {
       wx.updateAppMessageShareData({
              title: '', // 分享标题
              desc: '', // 分享描述,为主题内容
              link: location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致。当点击小卡片时会跳转到该链接
              imgUrl: '', // 分享图标,尺寸120 x 120,大小不超过10K,不支持GIF格式。必须采用https协议(最好写完整url),不支持base64
              success() {
                 // 设置成功
              }
      })

// 失败
wx.error((err) => {})

注意:imgUrl配置有严格的要求
尺寸120 x 120,大小不超过10K,不支持GIF格式。必须采用https协议(最好写完整url),不支持base64。由于我使用的是vue,在webpack打包时图片小于10k的是会自动打包成base64导致无法正常显示图片,因此在webpack.base.config.js中修改默认配置

limit修改为4kb

  1. 保证可以分享每个页面都能分享出这种小卡片形式的链接
    在app.vue中加入监测路由,由于第一次进入不会调用,所以在mounted也执行一次this.shareLinkToWxFriends()shareLinkToWxFriends函数就是上面第5步和第六步的内容

    image.png

  2. 将代码部署完成后,可在真机上查看结果


    分享链接结果

附加 pdf的显示和分享

由于在网页中直接查看pdf的路径是无法在微信中查看(安卓)和分享(ios),因此使用pdf插件进行优化 --- pdf.js。其原理是绘制成canvas,最终在真机上放大时可能出现模糊的问题。

  1. 现在我需要查看的是阿里云oss上的pdf文件(可以通过阿里云文档获取oss上的文件的url,且在oss的基本设置中可以设置跨域问题)
  • 首先引入pdf.js
    github地址

    pdf.js

    按照文档操作后将build/generic/build目录下的buildweb文件放入到我们vue项目中static文件中(不能放入src),这样我们就引入了pdf.js

  • 首先在vue中创建一个新的组件preview,内部为iframe

<template>
  <div class="preview">
    <iframe
      width="100%" height="1000"
      :src='"(这里是你的网站的包含https://的域名)/static/web/viewer.html?file=" + (这里是你想显示的pdf的url)'></iframe>
  </div>
</template>

创建之后控制台会报错出现跨域问题,因为pdf.js不支持跨域访问。此时可以将错误跨域信息在上一步你引入的文件中查找,然后将其判断语句注释掉即可解决这个问题。最后会发现pdf出现在这个容器中(忘截图了),也实现了微信中预览和分享的功能。


pdf容器
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 1. 准备工作 1.1 查看公众号分享接口权限 要使用微信SDK必须要有经过微信认证的非个人服务号 登陆服务号后,...
    sxplus阅读 6,209评论 0 2
  • 先引入JS 文件 this.wxShare() 在created里调用 首先登陆微信公众号 JSSDK使用步骤 步...
    寄鱼予海与你阅读 6,668评论 1 3
  • 这个名字的来历很简单,就是电话被前任拉黑了,每次到第二十秒的时候就会准时响起“对不起,您拨打的电话正在通话中,请稍...
    十九岁的梅西阅读 259评论 2 0
  • 亲爱的宝贝,你知道我有多爱你,自从你离开后我每天都在想你,看你的视频,我很自责一度怀疑是自己喂得不好才导致你的死去...
    VC维生素阅读 175评论 0 1
  • 接龙客栈新年活动 新年大接龙《寻寻觅觅,缘来是你》成员:小小七、是海绵啊、周小北baby、龙妮妮 文/小小七 《第...
    小小七阅读 733评论 8 8