关于微信js-sdk:微信内h5页面打开小程序

相干配置微信js文件版本大于等于1.6.0https://res.wx.qq.com/open/js/jweixin-1.6.0.js微信受权配置 window.wx.config({ ...otherConfig, openTagList: ['wx-open-launch-weapp']})调用示例 const style = { position: 'absolute', top: 0, right: 0, bottom: 0, left: 0,};function OpenWeapp({ originId, pagePath }) { return ( <wx-open-launch-weapp username={originId} path={pagePath} style={style}> <script type="text/wxtag-template"> <div style={style} /> </script> </wx-open-launch-weapp> );}// 应用形式<div style={{ position: 'relative' }}>点击跳转小程序<OpenWeapp originId="gh_xxxxxxxx" pagePath="pages/home/index?user=123&action=abc" /></div>为什么给div增加position: relative呢?因为wx-open-launch-weapp设置款式比拟艰难,故放弃设置款式,将wx-open-launch-weapp作为一个通明的占位元素,撑满父元素,也能达到预期的性能

July 30, 2021 · 1 min · jiezi

关于微信js-sdk:微信jssdk本地调试方案

此计划为共事探索得出,现自己行将到职,特此记录下该计划,以备后续查找。 解决的问题微信js-sdk初始化须要校验域名,本地调试无奈通过,需伪装成生产/测试时拜访的域名也实用于抓取手机端的申请,在PC端进行剖析(Charles)计划思路要点批改Host, 使得指标域名映射到本机(127.0.0.1)nginx开启HTTPS server,将指标域名proxy_pass到要测试的我的项目本地地址(如http://localhost:8080)手机通过Charles代理到电脑本机批改Hostssudo vi /etc/hosts# 增加指标域名映射127.0.0.1 [target-host-name]装置nginx倡议通过Homebrew装置 brew install nginxnginx -vnginx -h胜利装置截图 # 胜利装置后摘录如下Docroot is: /usr/local/var/wwwThe default port has been set in: /usr/local/etc/nginx/nginx.conf to 8080 so that nginx can run without sudonginx will load all files in /usr/local/etc/nginx/servers/.能够批改下默认端口,而后跑nginx启动, 能够在浏览器看到默认的http server,示意nginx装置好了,没什么问题。 mkcert生成ssl证书要开启https server,须要有ssl证书,应用mkcert能够在本地装置证书。 mkcert: https://github.com/FiloSottil... 生成证书的形式,请通读其README,次要理解装置、生成证书命令、装置CA命令 倡议将证书放到nginx装置目录下usr/local/etc/nginx/ssl,命名自行依据理论命名即可。 mkcert -key-file [key.pem] -cert-file [cert.pem] [target-host-name] [target-host-name]配置https server...http { ... # HTTPS server server { listen 443 ssl; server_name [target-host-name]; proxy_buffering off; ssl_certificate /usr/local/etc/nginx/ssl/[cert.pem]; ssl_certificate_key /usr/local/etc/nginx/ssl/[key.pem]; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; proxy_pass [本地服务,如 http://localhost:8080]; } }}设置结束重启nginx, 拜访指标域名,若能拜访到你开启的本地服务,则示意设置好了。 ...

April 28, 2021 · 1 min · jiezi

关于微信js-sdk:企业微信内嵌H5引入-JSSDK-调用-wxpreviewFile-预览下载文件vue20适用

业务场景基于vue2.0开发企业微信内嵌H5,实现文件下载性能。我司的文件存储门路是阿里云oss,应用其余凋谢资源也一样。 应用步骤1. 引入企业微信 JS-SDK留神: 引入源码必须是 "//res.wx.qq.com/open/js/jweixin-1.2.0.js",否则 wx.previewFile 会有未知的问题;vue2.0我的项目,你可能在有的文章里见过 npm install weixin-js-sdk 形式引入。非官方,不举荐;你可能会发现,//res.wx.qq.com/open/js/jweixin-1.2.0.js 里找不到previewFile函数,window.wx上也没有。不必在意,previewFile是原生实现的,看不到并不影响调用。/public/index.html<!DOCTYPE html><html lang="en"> <head> ... </head> <body> <div id="app"></div> <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> </body></html>2. 配置 wx.configSPA(单页面利用)要在每次url变动时进行调用 wx.config,倡议写在 router.js 路由配置文件里,全局后置导航守卫触发。 /src/router/index.jsrouter.afterEach((to, from) => { // 通过config接口注入权限验证配置,我封装在了 vuex 里 $store.dispatch("handleWxConfig");});/src/store/index.jshandleWxConfig({ state }) { // 从接口获取微信签名,须要后端同学提供 $apiCommon.getWxSign({ url: location.href.slice(0, location.href.indexOf("#")) // 留神:location.href最初如果有'/',必须保留 }).then(res => { // 步骤二:通过config接口注入权限验证配置 window.wx.config({ beta: true, // 必须这么写,否则wx.invoke调用模式的jsapi会有问题 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert进去 appId: res.data.appId, // 必填,企业微信的corpID。公司的惟一标识‘ww20745c5e79cfa434’ timestamp: new Date().getTime(), // 必填,生成签名的工夫戳 nonceStr: $utils.getRandomString(16), // 必填,生成签名的随机串,这里用的是自定义办法 signature: res.data.sign, // 必填,签名,见附录-JS-SDK应用权限签名算法 https://work.weixin.qq.com/api/doc/90000/90136/90506 jsApiList: ["previewFile"] // 必填,须要应用的JS接口列表,但凡要调用的接口都须要传进来。所有JS接口列表见附录2 }); // 步骤三:通过ready接口解决胜利验证。没有须要立刻调用的api,能够不写 window.wx.ready(function() {}); // 步骤四:通过error接口解决失败验证 window.wx.error(function(err) {}); }) }3. 调用 wx.previewFile当初就能够在 vue 里欢快地应用 wx.previewFile 了~留神: ...

November 17, 2020 · 1 min · jiezi

记录一次开发微信网页分享

需求最近在做一个项目需求,分享领好书活动,获取用户的个人信息以及unionID,并诱导用户分享给好友或朋友圈,达到裂变拉新的目的。在做的过程中遇到了一些坑的地方,所以回过来总结一下 技术方案使用微信JS-SDK自定义分享到好友和分享到朋友圈 实现步骤1、要实现微信H5网页自定义分享功能,必须先熟悉下微信公众平台开发文档,具体文档里面说的很详细,这里说下需要注意的点,别忘了绑定开发者权限,还有绑定js安全域名,要不然有可能会报redirect_uri参数错误。 2、首先一般在做微信H5网页活动,都需要获取用户的个人信息,这就需要用户授权,一般授权有两种方式,一种是静默授权,一种是网页授权,这个在微信开发文档说的很详细。 对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知一般网页授权流程分为四步: ①引导用户进入授权页面同意授权,获取code ②通过code换取网页授权access_token(与基础支持中的access_token不同) ③如果需要,开发者可以刷新网页授权access_token,避免过期 ④通过网页授权获取用户基本信息(openid 、UnionID、个人头像、性别、省市、微信昵称等) 3、下面是具体实现代码,说下大概思路,通过判断参数是否在微信浏览器中打开,是否让用户授权,并重定向到微信的接口拿到code后通过接口传给后端返回用户的基本信息。 // 用户授权 if (this.$route.query.from) { // 跳转微信页面 let _nowUrl = window.location.href.split("?")[0] +`?pictureId=${this.$route.query.pictureId}`; // 参数拼接 let _shareUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=微信公众号APPID&redirect_uri=${encodeURIComponent(_nowUrl)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`; window.location.href = _shareUrl; // 重定向到这个定义的URL } // 通过code获取用户信息 if (this.$route.query.code) { let _code = this.$route.query.code; this.handleWechatMsg(_code); }4、接下来就是如何自定义分享给好友或者朋友圈,同样也是按照调用微信开发文档上说的进行配置和调用。在调用分享接口成功之后开始调用分享api,并在调用成功之后的回调函数执行跳页,这里微信那边做了限制,如果用户在点击分享的时候取消了,默认还是走success成功回调函数,是拿不到最终分享成功的状态。下面是实现分享的具体代码 // 分享给朋友或朋友圈 wxChatShare(param) { var that = this; let _url = encodeURIComponent(param.url); apiUrl.wechatConfig(_url).then(res => { if (res.data.code == 200) { wx.config({ debug: false, appId: res.data.content.appid, timestamp: res.data.content.timestamp, // 必填,生成签名的时间戳 nonceStr: res.data.content.nonceStr, // 必填,生成签名的随机串 signature: res.data.content.signature, // 必填,签名 jsApiList: [ "onMenuShareTimeline", "onMenuShareAppMessage" // "updateAppMessageShareData", // "updateTimelineShareData" ] }); // wx.ready(function() { //分享到朋友圈 wx.onMenuShareTimeline({ title: param.title, // 分享标题 link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: param.imgUrl, // 分享图标 success: function() { // 用户点击了分享后执行的回调函数 that.$Message.message("分享成功!"); that.toRouter(); } }); //分享到好友 wx.onMenuShareAppMessage({ title: param.title, // 分享标题 desc: param.desc, // 分享描述 link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: param.imgUrl, // 分享图标 type: param.type, // 分享类型,music、video或link,不填默认为link dataUrl: param.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function() { // 用户点击了分享后执行的回调函数 that.$Message.message("分享成功!"); that.toRouter(); } }); // wx.updateTimelineShareData({ // title: param.title, // 分享标题 // link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 // imgUrl: param.imgUrl, // 分享图标 // success: function(res) { // // 设置成功 // that.$Message.message("设置成功!"); // that.toRouter(); // } // }); // //分享给朋友 // wx.updateAppMessageShareData({ // title: param.title, // 分享标题 // desc: param.desc, // 分享描述 // link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 // imgUrl: param.imgUrl, // 分享图标 // success: function(res) { // // 设置成功 // that.$Message.message("设置成功!"); // that.toRouter(); // } // }); // }); wx.error(function(res) { console.log("验证失败返回的信息:", res); }); } else { console.log(res.data.message); } }) .catch(err => { this.$Message.message(error); }); },总结这里遇到比较坑的就是,在调用分享事件的时候,不能同时写四个分享按钮事件,如果都写上,会造成在安卓机上还没有点击分享按钮的时候,就已经走分享成功success回调函数了,这里说下为啥写四个分享按钮事件,因为发现如果不写上即将废掉的两个onMenuShareTimeline、onMenuShareAppMessage会在安卓机上遇到不能分享的问题,所以把新增的两个分享按钮事件updateAppMessageShareData、updateTimelineShareData注释掉,就都可以分享了,iOS和安卓均没问题。 ...

May 7, 2019 · 2 min · jiezi

微信 jssdk 签名错误 invalid signature

几乎每一个开发用于微信公众号页面的工程师都遇到过微信jssdk报的各种错误,通常是permission denied,类似这样:通常他们会建议你把debug选项开开,比如这样: wechat.config({ debug: true, appId: appId, timestamp: timestamp, nonceStr: nonceStr, signature: signature, jsApiList: [‘scanQRCode’], });结果你又遇到了invalid signature。类似这样:签名不对,这是什么意思?可是这签名是后端给过来的,我怎么知道它为什么不对?后端用的是标准算法,不可能不对啊。查网上各种教程,或者微信官网,他们总是不厌其烦地告诉你,让你去检查签名算法,然而根本没有用!90%的这种情况下,其实只是一个原因:你用于计算签名的URL地址不对,跟算法没有任何关系,完全不必浪费时间去看什么签名算法。微信要求:如果我们需要在页面中调用微信的某个方法,则必须用这个页面的URL地址获取签名。听上去似乎很好理解,但是实际上URL地址包含的部分很多,有问号,有#号,你所要做的是取出#前面的部分。比如说你的URL地址是这样:https://www.abc.com/abc.html?abc=def#xyz,那么你用于计算签名的URL地址不可以是https://www.abc.com/abc.html,也不能是https://www.abc.com/abc.html?abc=def#xyz,而必须只能是https://www.abc.com/abc.html?abc=def。如何获取当前页面的URL地址呢?这个很简单:let wechaturl = window.location.href.split(’#’)[0];然而你以为事情就这样结束了?太天真。你的页面还是无法正常使用微信函数的。因为:微信内嵌浏览器在iOS和安卓下的表现不一样。在安卓下,你确实用上面的方法是可以调用了。但是在iOS下,签名依然失败!因为在iOS下,微信需要你传递的是入口URL,而不是当前页面的URL!比如说,你在微信公众号的某个菜单链接进入了A页面,然后从A页面的某个链接跳转到B页面,然后你在B页面获取签名,如果是在安卓下,你应该用B页面的URL地址来获取,但是在iOS下,你还必须用A页面的URL地址来获取,否则就还是签名失败!知道了原因,就有很多种解决办法。首先,我们可以在入口的A页面里增加这样的判断:if (navigator.userAgent.indexOf(‘iPhone’) !== -1) { window.wechaturl = window.location + ‘’;}然后,在B页面需要调用签名的地方,再增加这样的判断:let wechaturl = window.location.href.split(’#’)[0];if (window.wechaturl !== undefined) { wechaturl = window.wechaturl;}这样我们就有效地区分开了iOS和安卓。但问题是在iOS下,如果我的另外一个菜单入口是B页面,我从B页面跳转到A页面,这时候我的入口链接被强制变成了A页面,依然会产生签名失败的错误。所以我们还需要在微信公众号的每一个入口菜单链接里加一个特殊的参数,例如wechat=1,变成这样:https://www.abc.com/abc.html?abc=def&wechat=1,然后我们再增加一层判断,变成这样:if (navigator.userAgent.indexOf(‘iPhone’) !== -1) { if (this.$route.query.wechat !== undefined && this.$route.query.wechat === ‘1’) { window.wechaturl = window.location + ‘’; }}这里我用了vue的写法,但原理是一样的。只有我检测到了wechat这个参数,我才认为当前页面是入口页面,如果没有检测到,则不必强行设置为入口页面。这样似乎就解决了微信签名失败的问题。但是,我们又遇到了另外一种情况:在微信小程序里用web-view内嵌的网页,在安卓下也报permission denied和invalid signature错误。不过有了上面的经验,我们诊断错误根源还是URL入口地址的问题。果然,在安卓下用入口地址获取签名成功,而用当前地址获取签名失败,为此,我们在入口页面里再加一个判断:if (navigator.userAgent.indexOf(‘miniProgram’) !== -1) { window.wechaturl = window.location + ‘’;}至此,各种签名错误的问题才算是全部解决。

January 13, 2019 · 1 min · jiezi

个人申请官方微信支付接口,即时到账!还支持个人小程序支付!附支付demo

我们知道要想使用微信支付,要具备以下条件1、申请服务号2、要有企业资料(营业执照,对公账户)3、微信认证(300元/年)这样才能申请到微信支付的,对于个人开发者,根本就是一个大门槛,为了微信支付而去注册一家公司,有点成本高了,那么个人可以用微信支付吗?在这之前不可以,现在可以了!因为微信官方有一个叫做微信服务商,有能力的企业可以申请成为微信官方签约的服务商,服务商签约后,就可以获得开发权限。所以有一家公司:北京顶风科技有限公司,他成为了服务商,然后开发了PAYJS,用于开放接口给个人开发者接入官方微信支付!北京顶风科技有限公司是微信支付官方签约的全国服务商,所以我们可以利用PAYJS的接口进行开发即可。而且申请这个接口只需要个人身份证!PAYJS官网:https://payjs.cn/ref/DNXBJDPAYJS的优点:1、即时到账2、微信官方接口3、安全稳定4、提供清晰易懂的开发文档和DEMO下面看我用PAYJS的接口开发的一个扫码支付:http://liketube.cn/payjs/扫码后,就是这样的收款方显示商户名称。扫码支付成功后,就是这样的微信支付商户助手是微信支付官方的收款助手,也就是你的每一笔收款,微信支付商户助手就会收到通知的,而且是即时到账,第二天统一由财务通结算,是财付通结算,财付通是腾讯的,所以大家不用担心金额安全问题。那么PAYJS有微信支付的能力吗?以上就是能力,可以做扫码支付,例如我上面的demo,还可以做jsapi支付,也就是在微信里面访问的页面,点击按钮发起支付的方式,还有一个能力就是支持个人微信小程序的,个人微信小程序无需认证也可以使用PAYJS支付接口实现。JSAPI微信内置浏览器支付:需要在微信内置浏览器打开链接。PAYJS小程序支付:还有网友们提供的DEMO和成品OK介绍到这里,牛不牛逼自己玩玩就知道了:https://payjs.cn/ref/DNXBJD

December 27, 2018 · 1 min · jiezi

本地调式微信js-sdk

本地调试js-sdk,因为初始化js-sdk的时还需要通过域名url才能生成签名,所以需要在本地模拟一个域名进行调试。下面是详细的操作步骤:1. 首先需要让手机与调试的电脑位于同一个局域网2. 让电脑能够通过自己设置的域名访问调试本地页面,例如我的页面index是http://127.0.0.1/basic.html,我想要通过电脑浏览器访问http://baidu.com/basic.html得…(1) 修改hosts ,windows路径(C:WindowsSystem32driversetc),先用#把 127.0.0.1 localhost 注释掉,新建 127.0.0.1 baidu.com(2). 访问http://baidu.com/basic.html:3. 下载安装charles,将手机的ip访问代理到电脑端:(1). 查看电脑ip:192.168.6.162(2). 打开charles,它默认通过8888端口代理,打开Proxy->Proxy Settings查看:(3). 打开手机的wifi设置代理ip和端口:(4). 手机访问:‘http://baidu.com/basic.html',如果手机能通过你的电脑的自定义域名进行访问,就证明代理成,。向成功又迈进了一大步。4. 引入微信js-sdk,生成token等信息进行初始化:(1). 进入个人的测试公众号(微信公众平台:,没有就用个人邮箱注册一个)(2)切记,这里的域名绑定,是没有http://的(3). 记录下上图的appID和appsecret,用于获取token(4). 启动node.js,写一个获取noncestr(随机数)、timestamp(时间戳)和signature(签名)的服务端请求,用于页面初始化jsdk,附上官方文档(4.1)access_token和ticket有效期7200秒,而且这个接口每天都有调用次数限制,所以需要缓存起来,等过期了再重新调用获取,这里只是演示本地开发,没有做缓存。生产环境切记缓存。(4.2)接口代码:(请注意代码注释)const request = require(‘request’);const sha1 = require(‘js-sha1’); // 引入sha1加密算法,需要使用sha1算法生成签名app.post(’/getWX’, function (req, res) { const appId = ‘….’; // 测试公众号的addId const appSecret = ‘…..’ // 测试公众号的appSecret const url = req.body.url; // 初始化jsdk的页面url,如果是单页应用记得截掉url的#部分 let promise = new Promise((resolve, reject) => { // 第一步,通过appId和appSecret 获取access_token request(https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid=${appId}&amp;secret=${appSecret}, function (error, response, body) { if (!error && response.statusCode == 200) { let access_token = JSON.parse(body).access_token; console.log(‘第一步获取access_token:’, access_token); resolve(access_token); } else { reject(error); } }); }); promise.then(access_token => { // 第二步,通过第一步的access_token获取票据ticket return new Promise((resolve, reject) => { request(https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${access_token}&amp;type=jsapi, function (error, response, body) { if (!error && response.statusCode == 200) { let ticket = JSON.parse(body).ticket; console.log(‘第二步获取ticket:’,ticket); resolve(ticket); } else { reject(error); } }); }); }).then(ticket => { const createNonceStr = () => Math.random().toString(36).substr(2, 15); const createTimeStamp = () => parseInt(new Date().getTime() / 1000) + ‘’; const calcSignature = function (ticket, noncestr, ts, url) { var str = jsapi_ticket=${ticket}&amp;noncestr=${noncestr}&amp;timestamp=${ts}&amp;url=${url}; shaObj = sha1(str); //使用sha1加密算法 return shaObj; } const noncestr = createNonceStr(); // 随机字符串 const timestamp = createTimeStamp(); // 时间戳 const signature = calcSignature(ticket, noncestr, timestamp, url); // 通过sha1算法得到签名 res.send({ noncestr: noncestr, timestamp: timestamp, signature: signature, }) }).catch(error =>{ console.log(error); });});(5). 页面记得引用wx-jsdk,进行页面初始化,点击login调起选择图片的js接口(单页应用的hash模式有个好处就是,你只需要在首页初始化一次js-sdk,就可以任意切换页面调用,因为初始化的时候是把#号及其后面的部分截取掉,而单页面的hash模式,页面切换只会改变#后面部分。)<template> <div @click=“func”>login</div></template><script>import wx from ‘wx’export default { name: ‘Login’, data () { return {} }, mounted () { this.axios({ url: ‘/api/getWX’, method: ‘post’, data: { url: location.href.split(’#’)[0] // 把url的#及其后面的部分截取掉 } }).then(res => { console.log(’——’); console.log(res.data); wx.config({ debug: true, // 开发模式开启,便于调试是否成功初始化js-sdk appId: ‘…..’, // appId timestamp: res.data.timestamp, // 时间戳 nonceStr: res.data.noncestr, // 随机数 (注意,前面的nonceStr的S是大写的) signature: res.data.signature, // 签名 jsApiList: [‘checkJsApi’, // 需要调用的js-sdk功能接口列表 ‘chooseImage’, ‘previewImage’, ‘uploadImage’, ‘downloadImage’, ‘scanQRCode’ ] }); }); }, methods: { func () { wx.chooseImage({ count: 9, // 默认9 sizeType: [‘original’, ‘compressed’], // 可以指定是原图还是压缩图,默认二者都有 sourceType: [‘album’, ‘camera’], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { var localIds = res.localIds; alert(localIds); } }); } }}</script>(6). 关注调试公众号:(7). 手机微信端调试(通过微信访问我们的项目):(7.1) 初始化成功提示:(7.2) 点击login,调用chooseImg接口:(7.3) 成功调用页面alert:5. 如果初始化失败,查看官网文档 附录5-常见错误及解决方法6. 博客参考参考1参考2 ...

December 19, 2018 · 2 min · jiezi

一张图清晰解释微信三方平台获取授权流程

背景微信公众平台体系,大家最为熟悉的,一个是公众号,另一个就是小程序。如果需要使用公众号的高级功能,那么大家首先想到的就是自组开发团队来干这些活儿。绝大多数情况下,公众号运营方会把这些工作外包出去;但是外包出去之后会有一个风险:账号的所有权总不能外包出去吧,万一有风险,我能够把外包工作收回。微信公众号体系原生支持这种 “外包” 思路,那就是微信第三方平台,公众号能够通过这套体系,将公众号的部分功能和权限开放给第三方。这在微信开放平台中可以找到相应的文档。与自有公众号开发不同,微信三方平台的授权体系是慎之又慎,笔者第一次接触的时候,被文档中提及的各种 token、各种 ticket 搞晕了,于是特意整理了这个流程,以图表的方式将授权流程说明下来,便于查阅。已经学习了授权流程的同学,可以直接将本文拉到最后面查看完整图。本文按照授权顺序,一步一步地说明。图中关键的 token 或 ticket 数据,均用彩色标出并一一对应。希望本文对微信三方平台开发者能够有所帮助。授权步骤三方平台数据准备微信三方平台也是在微信开放平台上的账号,也有 appid 的概念。在微信的文档中,三方平台称为 “component”。三方平台需要实现一个供微信回调的 URL,在平台中称为 “授权事件接收URL”(以下简称 “通知回调”),在应用详情页中进行配置。不要被这个名称误导了,其实所有和三方平台直接相关的事件都会经过这个 URL 通知。获取 component_access_token这里涉及流程中的两个术语:component_verify_ticket 和 component_access_token。微信会每十分钟往通知回调中发送一个消息,将参数 component_verify_ticket 告知三方平台后台。三方平台拿到这个消息后,则需要使用自己的 app_secret 和 appid 信息,加上微信推送的这个 ticket,通过微信三方平台的 api_component_token 接口,向微信平台换取 component_access_token。生成授权注册页面 URL让公众号点击授权有两种模式,一种是引导公众号所有者扫码进入一个授权页;另一种范式是在移动端点击链接来授权。两种方式对后台而言大同小异,本文讲解第一种。这里其实包含了两个小步骤:首先是三方平台后台向微信请求获得预授权码 pre_auth_code;第二步是使用这个预授权码,来组合成一个 URL 给公众号所有者扫码。关键的参数如下(componentloginpage 是用于扫码的 URL):公众号授权获取授权的公众号公众号扫码授权后,微信会向通知回调发送消息,除了告知授权的公众号(称为 “authorizer”)的 appid 之外,最重要的是推送一个新的票据字段 authorization_code,这个 code 是与授予权限的公众号绑定的:拉取公众号信息及其授予的权限这分别是两个 API,其中比较重要的是拉取公众号授予的权限范围,调用了接口 “api_query_auth”。除了获得授权范围之外,最重要的,是再引入两个新参数:authorizer_access_token:用在后文 “代公众号调用接口” 中,替代微信公众平台的 access_token 参数。authorizer_refresh_token:用于定时刷新 access_token两个 API 的调用图如下:代公众号实现业务刷新 authorizer_access_token前文提到,通过 API:api_query_auth 可以获得用于替代公众号的authorizer_access_token。有了这个之后,就可以代公众号中使用 access_token 的调用。同样地,这个 token 也有过期时间,因此三方平台需要调用 API,在 token 即将失效时刷新。使用这个 API 循环刷新即可:获取微信 JS-SDK 的 ticket微信 JS-SDK 接口使用的不是 access_token,而是被称为 jsapi_ticket的一个票据。普通的公众号使用 access_token 来换取,三方平台则使用 component_access_token 来换取:其实这个接口已经不是微信三方应用的范围了,只是普通的微信公众平台接口。但是因为非常常用,所以还是在这里说明了一下。授权流程总览<span id=‘总览’>上面所提及的各个分步骤,组合成一览图如下(图片比较宽,推荐大屏幕查看或者放大查看):<>图中各个调用过程的标题,是 API 的名称,可以作为关键字在微信文档中搜索。参考资料第三方平台概述JS-SDK使用权限签名算法,搜索 “JS-SDK使用权限签名算法”本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。本文地址:https://segmentfault.com/a/1190000017402102。原文发布于:https://cloud.tencent.com/developer/article/1368038,也是本人的专栏。 ...

December 17, 2018 · 1 min · jiezi

自定义微信分享样式

博客地址Preface产品希望我们在微信分享出去的链接,有自己的样式,而不是仅仅一个链接。用产品的话来说,你发给客户一个链接,客户敢点么???听着比较有意思,不过也不能说完全没有道理,毕竟各种各样的诈骗大家也是有所耳闻,经确认,产品想要:而我们当前分享是:Main总监给我提示说,微信有 js-sdk ,可以在 js 里设置这个样式。于是,我找到了微信 JS-SDK 说明文档,基本上就是根据文档走些配置,这个要和产品那边要些账号密码,改些东西之类,根据文档来,没什么好说的。大体流程如下:步骤一:绑定域名步骤二:引入 JS 文件步骤三:通过 config 接口注入权限验证配置wx.config({}) //传入一些初始化参数步骤四:通过 ready 接口处理成功验证wx.ready(function() {}) //传入成功回调步骤五:通过 error 接口处理失败验证wx.error(function() {}) //传入失败回调实际操作的时候,遇到了几点麻烦,这里需要提一下:测试的时候,注意开启 debug 模式,方便定位问题。wx.config({ debug: true /其他参数/ })出于安全考虑,开发者必须在服务器端实现签名的逻辑。这个是文档说的,反正就是给后台处理了,最终前端初始化需要的几个字段,除了 debug 和 jsApiList ,都是从后台拿的。wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: ‘’, // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: ‘’, // 必填,生成签名的随机串 signature: ‘’,// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表});后台在实现的时候,可能需要注意文档提示的两点:access_token(有效期 7200 秒,开发者必须在自己的服务全局缓存 access_token)jsapi_ticket(有效期 7200 秒,开发者必须在自己的服务全局缓存 jsapi_ticket)因为这会导致一开始生成的签名没错,但是两个小时后就失效了。代码逻辑通常的逻辑都是前端从后台拿到上面的几个字段,在前端完成初始化,然后添加初始化成功和失败的回调。示例:var link = location.href$.ajax({ url: ‘your_url’, //后台给你提供的接口 type: ‘GET’, data: { url: link }, async: true, dataType: ‘json’, success: function(data) { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来 appId: data.configMap.appId, // 必填,公众号的唯一标识 timestamp: data.configMap.timestamp, // 必填,生成签名的时间戳 nonceStr: data.configMap.nonceStr, // 必填,生成签名的随机串 signature: data.configMap.signature, // 必填,签名,见附录1 jsApiList: [‘onMenuShareTimeline’, ‘onMenuShareAppMessage’] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }) wx.ready(function(res) { wx.onMenuShareAppMessage({ title: document.title, desc: document.title, link: link, imgUrl: Imgurl, trigger: function(res) {}, success: function(res) {}, cancel: function(res) {}, fail: function(res) {} }) wx.onMenuShareTimeline({ title: document.title, link: link, imgUrl: Imgurl, trigger: function(res) {}, success: function(res) {}, cancel: function(res) {}, fail: function(res) {} }) }) wx.error(function(res) { alert(res) }) }, error: function(error) { alert(error) }})我司稍微特殊些,直接把初始化的代码放在前面需要引入微信的 js 文件后面了,所以我直接引入这个文件就完成了初始化操作。不过,我还是需要在引入后监听初始化成功和失败的回调。我司代码:<script src="./js/shareInWeChat.js?debug=1"></script><!– 里面包含了 wx.config({}) 的代码–><!– 通过 debug 参数来切换调试模式 –>setWeChatShareStyle(product, imgUrl)function setWeChatShareStyle(product, imgUrl) { var success = function(res) {} var fail = function(res) {} var desc = product.description && product.description !== ’’ ? product.description : ‘后备描述’ wx.ready(function() { var eventConf = { title: product.name, desc: desc, imgUrl: imgUrl, link: window.location.href, success: success } if (pubMethods.isAndroid()) { // 安卓适用于老接口,新接口不行 wx.onMenuShareAppMessage(eventConf) wx.onMenuShareTimeline(eventConf) wx.onMenuShareQQ(eventConf) wx.onMenuShareQZone(eventConf) } if (pubMethods.isIOS()) { // iOS 适用于新接口,老接口不行 wx.updateAppMessageShareData(eventConf, success) wx.updateTimelineShareData(eventConf, success) } }) wx.error(fail)}最初我担心,这样可能会监听不到 wx.config 初始化的结果,结果发现还是可以监听到的,说明 wx.config 里面的操作是个异步操作。代码兼容性统一传参如上面代码所示,虽然根据微信的文档,对于不同的接口,传的参数稍有区别,但是我为了方便,都放在 eventConf 里面了,事实证明也是可以的(不可以我就要吐槽了,毕竟传入的是对象)。接口更新的 bug虽然微信文档上有接口更新的说明:请注意,原有的 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,即将废弃。请尽快迁移使用客户端 6.7.2 及 JSSDK 1.4.0 以上版本支持的 wx.updateAppMessageShareData、updateTimelineShareData 接口。但我实际上测试的结果是,安卓不支持新接口,iOS 支持,但是我如果把新老接口全用上,有一端会失败,所以最终才有上面那个机型判断的结果,对于不同的机型采用了不同的接口。if (pubMethods.isAndroid()) { // 安卓适用于老接口,新接口不行 wx.onMenuShareAppMessage(eventConf) wx.onMenuShareTimeline(eventConf) wx.onMenuShareQQ(eventConf) wx.onMenuShareQZone(eventConf)}if (pubMethods.isIOS()) { // iOS 适用于新接口,老接口不行 wx.updateAppMessageShareData(eventConf, success) wx.updateTimelineShareData(eventConf, success)}分享的图片不能是 base64由于我司需要对图片进行处理再去分享,所以当我用 canvas 导出 base64 作为 imgUrl 的时候,我发现是没有效果的。EndingReference微信分享自定义样式微信分享图标设置,以及 wx.config 配置 ...

November 24, 2018 · 2 min · jiezi