Vue:在Vue中实现微信网页授权和分享

前言

自己开始开发的时候也在网上搜过些教程,尤以segmentfault和脚本之家的两篇文章为甚,然后两篇文章都只是讲了自己的场景和如何使用,却没有讲述其中的原理。我不喜欢只会用的程度,如果不明白为什么这么做,每一步做的理由,所以写下这篇文章,分享一下我在开发中的心得。

前期准备

web开发者工具.png

你肯定不愿意每次都在手机上调试,因为不能console,所以你得准备这个渣渣开发者工具,mac下容易假死。有大佬改chrome,伪装成微信浏览器,我没试过,不知道能不能成功。

natapp.png

然后是natapp,或许大家会有疑问,我都有服务器了,还买这个穿透工具干啥?因为微信签证和当前浏览器URL有关(微信设置JS安全域名),你肯定不想每次打包后都拜托后台大哥传上去你再调试吧。但是本地的localhost 192.168.x.x是无效的,因此通过natapp把当前主机暴露到外网,这样可以临时设置JS安全域名到这里,就可以进行验签和授权了。

额外补充

我们知道,做Vue开发会通过express开启一个临时服务器,我试过natapp直接映射到这个服务器,前端请求会报错,content-length not match。所以我就用anywhere对打包后的文件又开了一个本地服务器,这样其实效率挺低的,希望哪位大佬告诉我解决方案。

渣渣mac

该问题存在于mac下,windows下无问题。

网页授权和分享

这俩货其实是不一样的,得分开实现,网页授权是一套机制。分享是另一套机制。我们先看看分享

微信分享

微信分享步骤.png

首先绑定域名,这个就填natapp的临时域名就好了。然后引入JS文件,npm上有现成的包import wx from 'weixin-js-sdk';,第三个就是最重要的了。debug参数开启了,你的验签信息,分享结果,成功与失败都会以alert形式的弹窗弹出来了。调试的阶段我们需要打开,接着几个参数都没太大的问题,唯一难点在于signature。签名

signature

这些参数都应该初始化过程中请求后台,由后台返回。值得注意的是signature,在附录中有详细的介绍。这个signature会和当前浏览器的URL有关,并且注册以后如果URL发生改变需要重新注册。什么意思呢?
vue-router中如果mode设置为history模式,如果进入不同路由时,URL发生了变化,此时微信认为你的URL是不合法的,因此验签失效了,你就得必须重新验签。
如果每一个路由都重新验签对于我这种强迫症是受不了的。因此我们使用hash模式,这样路由会响应#号后面的变化,真正的地址没有发生变化。因此只需要一处验签,后面都不会受到影响。
下面是我的验签代码

验签.png

首先发出一段ajax请求,讲当前的URL传递给后台,后台会根据这个URL生成signature,注意这里使用的是window.location.href.split('#')[0]方法,不能写死。因为如果进行网页授权的话。query参数会出现在#号前面。比如http://xxx.xx.com/?xx=xx&xx=xx&/#/xxx,这个query参数将会伴随整个页面的生命周期。并且其中的参数是动态变化的,如果写死将会导致验签失败。ajax拿到后台数据后进行验签,成功后调试模式下会有提示。接着进行分享

分享.png

如果出现正确的图片和title,并且调试信息无误的话一个分享就成功了。值得注意的是,分享出去的URL必须和签名的URL一样,否则分享会失败(我试过分享授权的链接,失败了)。并且如果当前用户没有订阅的话,分享出去也只是title和一串URL地址,只有订阅用户才能分享出图片和描述。
在频繁改动appid的时候(测试需要),有的时候微信服务器会有缓存,导致正确的签名顺序也会报错误的验签,这个时候等等就好了。
目前只做了风险,验签和分享坑差不多就这些。

网页授权

这个其实很简单,就是诱导一个用户跳转到一个网页,这个网页的URL配置了一些参数,按照相关的要求由后台配好以后点进去就行了。静默授权,就是不获取用户的信息,表现就是链接跳出去又跳回来。获取信息就是用户点击一个确认授权,然后你就可以获取该用户的相关信息了。
这个示例链接是
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
其中的redirect_uri就是回调的URL,授权成功后,将转入这个页面,并且携带两个query参数,其中的code就是授权码,通过这个授权码获取该用户的openid。
这个授权码有时间限制,并且只能使用一次。将这个授权码发送给后台以后,后台请求openid,这个openid是唯一的,可以通过这个openid在数据库中绑定用户。之后的逻辑就和非微信环境没有太大区别了。

业务逻辑

整个业务逻辑就是,首先判断是不是微信环境(我们的网页要求移动端同样能用)

const isWechat = () => {
  let ua = window.navigator.userAgent.toLowerCase();
  return ua.match(/MicroMessenger/i) == 'micromessenger';
}

如果是微信环境,就对他进行验签。此时并未网页授权,网页授权和验签可以分开。

授权的逻辑放在开启探索这个按钮上
首先是判断当前是否存在code(因为这可能已经是授权后的页面,因此先检查是否有code,再判断是否需要跳转授权页)

const getQuery = name => {
  var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
  var r = window.location.search.substr(1).match(reg);
  if (r != null) {
      return unescape(r[2]);
  }
  return null;
} 

如果code存在就把code发给后台,根据后台的返回结果处理自己的业务逻辑。code不存在则通过
window.location.href=xxxxx跳转到微信授权页,授权成功后又跳转到当前页面,此时code存在。
如果需要其他JSSDK服务,就让后台吧通过code获取的openid,accesstoken保存下来。有些用户已经使用过了网站服务,或者网站需要用户的手机号,获取code以后就跳转一个绑定页,要求用户绑定手机或者邮箱,这个地方根据自己的业务逻辑来。
因为要同时处理微信与非微信登录,所以这里的判断逻辑比较复杂,建议先草稿纸规划好,考虑到每一个情况再敲代码。不然到时候甩锅都甩不好。

结束

微信开发确实是一个不小的难题,并非代码多高深,主要难在调试的环境上。每一个域名绑定,授权都很复杂。相关的文档个人觉得也并不完善。并且最坑爹的是微信会缓存appid,这样在开发切换到生产环境的时候,微信服务器得appid并没有切换成功,导致验签失败。在你确认签名配置无误的时候,依旧发生验签失败,那么你就等等吧。
另外,未验签分享出去的title默认就是网页的title,也就是document.title。
:)就是这样

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

推荐阅读更多精彩内容