做了一个网站,放到线上,用微信打开,点击分享,可是分享后发给朋友的链接卡片是微信默认自带的,如下:

这标题,描述以及图片是默认自带的,丑不说,分享给别人还以为是盗号网站呢,而接入微信的JSSDK后,分享可以自定义内容,如下:

我承认,虽然这分享的标题和内容也并不正经,但这不妨碍我表达**我们可以通过微信JSSDK定义分享内容**,接下来我们将一步一步从零实现JSSDK从后端Node.js的接入。
成为测试公众号开发者
登录测试公众号后台
首先我们需要在微信公众平台申请测试接口,地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
使用微信扫描登录后,即可来微信公众平台测试账号系统。
成为测试公众号开发者
其次在微信公众平台测试账号中,扫描测试号二维码,成为测试公众号的开发者
接口配置信息
修改接口配置信息
- URL地址必须是你服务器上的地址,此地址要能通过浏览器的地址栏访问到(没有服务器?没关系,一会儿我们搭建一个)
假设我这里填写的服务器地址是”http://www.your_server_name.com/wxJssdk" - Token你可以随意填写,用作生成签名,(不知道签名?没关系,一会儿会用到这东西的)
假设我这里填写的Token是”jegfjaeghfuccawegfgjdbh“
此时点击提交是会提示配置失败的,因为在提交的时候,微信是会请求你的服务器地址,而你的当前配置的地址并不能访问,所以会提示配置失败。不过别急,我们先来搭建一个简单的Node服务器,让微信能够访问该服务器。
搭建简单的Node服务器
我们需要在http://www.your_server_name.com 这个域名上搭建一个服务器,并且曝出一个接口为/wxJssdk
1 | const express = require('express') |
现在我们在地址栏中访问http://www.your_server_name.com/wxJssdk ,如果页面显示“请求成功了了了了”,则进入到下一步,如果没有成功的话,检查一下你的服务器是否开启Node服务器,如:node index.js
此时保存微信测试公众号后台的接口配置信息,仍然会提示配置失败,这是因为我们没有按照它的要求返回。
根据微信测试公众号请求信息返回对应内容
根据微信公众号开发文档接入指南,微信在请求我们配置的接口时,会带上如下信息
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
微信服务器会通过GET请求,来请求我们所配置的接口,并带上以上表格的信息,而我们必须按照以下要求,将微信发送的信息进行要求校验,以确保是微信发送的信息,其中校验流程如下: |
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
1 | const express = require('express') |
此时我们重启Node服务器,再次保存接口配置信息即可配置成功。
微信JSSDK使用步骤
根据微信JSSDK说明文档,我们需要完成如下:
填写安全域名
登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”,即要调用接口的域名,不包含协议
前端引入JS
在需要调用JS接口的页面引入此JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
填写接口的配置信息
1 | wx.config({ |
调用接口
做你前端该做的,调用微信分享接口,或微信提供的其它接口,whatever you need,当然,这并不是我们所要讲的重点,我们接下来要看一下微信的配置信息从哪获取
在Node服务器中生成jssdk所需要的配置信息
从上一节可以看到,调用微信JSSDK需要以下信息
- appId
- timestamp
- nonceStr
- signature
- jsApiList
其中:
- 第1项appId是测试公众号后台的appId,我们已知
- 第2项时间戳我们也可以自己生成
- 第3项nonceStr可以随意填写,你可以理解为密钥
- 第4项signature则需要我们按要求生成
- 第5项是所需要接口的接口名
生成signature
生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
为了保证我们appid,appsecret,nonceStr等信息不在前端曝露,我们以下步骤将在服务器上进行操作,以免他人盗用信息获取(注:微信请求有每日次数限制,一旦超出,则无法使用,具体请求次数限制在微信公众号后台中可查看)
生成access_token
根据微信开发文档[获取access_token文档说明],我们需要将微信测试公众号后台的appid和和appsecret以GET的请求方式向https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 发起请求获取token,请求成功后我们会获得下返回JSON转化的字符串
1 | {"access_token":"ACCESS_TOKEN","expires_in":7200} |
具体请求代码如下:
1 | const request = require('request') |
获取jsapi_ticket
1 | const request = require('request') |
生成签名
生成签名的步骤和最开始的/wxJssdk
的算法是一致的,具体如下:
1 | let jsapi_ticket = jsapi_ticket // 上一步从获取的jsapi_ticket |
连接后的代码为:
1 | const request = require('request') |
曝露接口,返回给前端
1 | app.post('/wxJssdk/getJssdk', (req, res) => { |
前端请求后端接口,获取配置信息
获取配置
1 | axios.post('/wxJssdk/getJssdk', {url: location.href}).then((response) => { |
做你想做的,比如,自定义分享
1 | if (wx) { |
至此,后端配置好了,我们已经能够正常使用微信的接口了,但是微信每日接口请求是有上限的,通过2000次/天,因此如果网站上线后,一量当天访问量超过2000次你的接口将失效,而且每次都请求微信接口两次,造成请求时间浪费,所以我们需要将以上获取信息缓存在后端,避免造成接口失效以及多次请求微信后台。
缓存access_token及jsapi_ticket
此处直接上代码,利用node_cache包进行缓存
1 | const request = require('request') |