全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Vue微信公众号开发踩坑全记录

本文介绍了Vue微信公众号开发踩坑全记录,分享给大家,也给自己留个笔记。

需求

  • 微信授权登录(基于公众号的登录方案)
  • 接入JS-SDK实现图片上传,分享等功能

现状及难点

  • 采用的Vue框架,前后端分离模式(vue工程仅作为客户端),用户通过域名访问的是客户端,但是微信授权中涉及签名和token校验依赖服务端
  • JS-SDK需要向服务端获取签名,且获取签名中需要的参数包括所在页面的url,但由于单页应用的路由特殊,其中涉及到IOS和android微信客户端浏览器内核的差异性导致的兼容问题

解决方案

授权登录

授权流程如下:

详细说明:

  1. 用户访问网站主域名
  2. vue客户端(domain/)接收请求,在路由解析前判断用户是否登录(比如检查cookie);
  3. 如果没有登录,则通过api获取微信授权地址,获取后跳转到微信服务端授权页面;
  4. 用户确认授权,微信服务器发起回调请求,这时需要回调到服务器端(domain/api/xxx)
  5. 服务器端保存用户信息,进行注册登录操作(记录cookie),重定向到vue客户端(domain/)
  6. 重复第一步,授权登录成功

踩坑记录:

以下是一个错误授权方案

这个方案为什么错误呢?其实如果只实现授权登录到话,这个方案是可以的,而且也很清晰,vue客户端单方面在服务器和微信服务器之间进行通信,微信服务器不能直接和服务器通信。这种方案的坑在于当微信授权回调时会携带一个code参数,该参数会污染vue路由导致ios上进行JS-SDK签名时失败(后续会具体描述这个问题)

JS-SDK签名

对于签名,官方是这么说的

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用

vue中路由有history和hash两种模式;在history模式下,理想的设计方案是,当进入到需要用到JS-SDK组件时,获取以下当前url(也就是通过 location.href.split(‘#')[0]获得到的地址)传递到服务端进行签名,应该就没问题了,但是IOS获取的url并不是调用微信js的时候所在页面的地址,而是进入到网站第一个页面的地址。

网上查询到一个方案是针对ios设备进入页面时先将当前url记录下来,到授权页面时将记录的url传递给服务端进行签名。该方案经实践是可行的,妈妈再也不用担心我的网址很丑很难看啦。

另外一个方案就是使用hash模式,这种模式下,url永远都只是主域名地址,省去了传递url的烦恼,也没必要处理兼容,所以如果不建议路由中有#的话,该方案应该是首选方案。

这里还有一个深坑,那就是如果授权方案采用了上述中的vue客户端处理回调的方式,那么ios将永远无法签名成功,为什么呢,因为这种方案路由通常是这样子的:

http://domain.com/?code=xxxxxx&stat=#/xxx

这种路由中带了参数的url是没法签名校验成功的!
这种路由中带了参数的url是没法签名校验成功的!
这种路由中带了参数的url是没法签名校验成功的!
重要的事情得说三遍啊

Coding

任何不上代码的吹逼都是耍流氓,这里笔者分享下在vue中具体怎么coding的。

微信授权登录

笔者在项目中使用的vue-router进行路由控制,使用了vuex记录用户登录信息,但是由于vuex中存储的内容在页面刷新后会丢失,所以服务端同时也写了用户登录状态到cookie中,vue中需要通过这两个条件进行登录判断,不多BB,直接看代码吧

// ... other code

router.beforeEach((to, from, next) => {
 if ((!VueCookie.get('user') && !store.state.userInfo)) {
  // 第一次访问
  console.log('授权登录')
  // 跳转到微信授权页面,微信授权地址通过服务端获得
  axios.post('/api/login').then(res => {
   var data = res.data
   if (data.code === 100) {
    window.location.href = data.data
   }
  })
 } else if (!store.state.userInfo) {
  // 刷新页面,获取数据存入vuex
  axios.get('/api/currentuser').then(res => {
   if (res.data.code === 100) {
    store.dispatch('setUserInfo', res.data.data)
    next()
   }
  })
  console.log('cookie生效期内登录')
  next()
 } else {
  // 已经登录
  console.log('已登录')
  next()
 }
})

//... other code

history模式下的JS-SDK签名

在入口文件中将当前url存入vuex

// ... other code
router.beforeEach((to, from, next) => {
 document.title = to.meta.title
 // 处理jssdk签名,兼容history模式
 if (!store.state.url) {
  store.commit('setUrl', document.URL)
 }
 // ... other code

在需要获取签名的组件中获取并进行配置

// ... other code
created () {
   var sef = this
   var url = ''
   // 判断是否是ios微信浏览器
   if (window.__wxjs_is_wkwebview === true) {
    url = this.$store.state.url.split('#')[0]
   } else {
    url = window.location.href.split('#')[0]
   }
   this.$http.get('/api/jssdk?url=' + url).then(function (res) {
    sef.lists = res.data.data
    hmTools.wechact(sef.lists, sef) //js-sdk配置
   })
  }
// ...other code

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Vue微信公众号  # Vue微信公众号开发  # Vue微信公众号网页分享的示例代码  # 使用vue完成微信公众号网页小记(推荐)  # 使用vue编写h5公众号跳转小程序的实现代码  # Vue开发Html5微信公众号的步骤  # vue中使用微信公众号js-sdk踩坑记录  # vue项目使用微信公众号支付总结及遇到的坑  # Vue.js 实现微信公众号菜单编辑器功能(二)  # Vue.js 实现微信公众号菜单编辑器功能(一)  # vue 做移动端微信公众号采坑经验记录  # 巧用Vue.js+Vuex制作专门收藏微信公众号的app  # 如何使用vue开发公众号网页  # 服务端  # 客户端  # 回调  # 带了  # 深坑  # 用户登录  # 模式下  # 跳转到  # 的是  # 都是  # 是一个  # 第一个  # 也没  # 耍流氓  # 两种  # 不多  # 中有  # 这个问题  # 这两个  # 不上 


相关文章: 网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  婚礼视频制作网站,学习*后期制作的网站有哪些?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  如何配置支付宝与微信支付功能?  海南网站制作公司有哪些,海口网是哪家的?  英语简历制作免费网站推荐,如何将简历翻译成英文?  已有域名和空间如何搭建网站?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  网站代码制作软件有哪些,如何生成自己网站的代码?  高端建站如何打造兼具美学与转化的品牌官网?  重庆市网站制作公司,重庆招聘网站哪个好?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何获取开源自助建站系统免费下载链接?  如何在西部数码注册域名并快速搭建网站?  高防服务器租用指南:配置选择与快速部署攻略  如何通过wdcp面板快速创建网站?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何通过远程VPS快速搭建个人网站?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  如何用好域名打造高点击率的自主建站?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  建站主机选哪家性价比最高?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  建站之星代理商如何保障技术支持与售后服务?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  贸易公司网站制作流程,出口贸易网站设计怎么做?  如何通过虚拟主机快速完成网站搭建?  红河网站制作公司,红河事业单位身份证如何上传?  如何构建满足综合性能需求的优质建站方案?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何通过虚拟主机空间快速建站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  建站之星价格显示格式升级,你的预算足够吗?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?    免费ppt制作网站,有没有值得推荐的免费PPT网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  创业网站制作流程,创业网站可靠吗?  如何选择域名并搭建高效网站?  建站之星如何保障用户数据免受黑客入侵?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  营销式网站制作方案,销售哪个网站招聘效果最好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。