最近在弄一个付费课程的应用,主要有微信登录,支付和自定义分享,在开发过程中遇到的坑,这里做一下记录

文章主要有以下几点

  • 使用库简介
  • 微信登录解决
  • 微信支付解决
  • 微信自定义分享解决
  • 页面前进后退数据状态解决

使用库简介

  • 使用 vux UI组件库
  • 使用 vue-navigation 缓存页面,此库实现了前进刷新后退读缓存的功能,像原生APP导航一样。用子路由的方式实现tabbar有bug,用vuex解决了。
  • 使用 lib-flexible 解决移动页面适配

来一个清单

  1. "dependencies": {
  2. "fastclick": "^1.0.6",
  3. "lib-flexible": "^0.3.2",
  4. "lodash": "^4.17.4",
  5. "vue": "^2.5.2",
  6. "vue-navigation": "^1.1.3",
  7. "vue-router": "^3.0.1",
  8. "vuex": "^2.1.1",
  9. "vuex-i18n": "^1.3.1",
  10. "vux": "^2.7.8"
  11. }

微信登录

应用需要登录后可以访问,微信登录要实现的功能是从任意一个链接进入,判断是否登录,未登录跳到微信授权,成功后返回登录前链接,由于对php的微信授权做得比较多,所以微信授权放在的php实现,这里说一下实现过程。路由方式使用了history模式,打包好的index.html 文件用php渲染出来。路由path定义统一的格式r/xxxx,这样对于php端的路由可以实现匹配,只要是这个格式的路由都匹配到渲染index.html的方法,要不然访问的时候服务端出现404错误。

php端路由配置,这里是laravel,其他框架应该也差不多

  1. Route::get('/', 'HomeController@index')->middleware('auth')->name("home");
  2. Route::get('/r/{query}', 'HomeController@index')->middleware('auth')->name("home");

为什么不用hash模式呢,因为用hash模式的下php获取来源地址的时候获取不到#后面参数,虽然可以用参数传给后端,但是好麻烦,所以就用history模式了,后面的支付和分享也是这样

微信登录流程

  • 打开任意链接xxx.com/r/xxx
  • 先经过php端,匹配路由,匹配失败的话就会找不到页面啦~
  • 匹配成功判断登录,未登录就跳到微信登录,跳转之前先记录当前链接,登录成功就返回记录的链接

用户登录状态使用token,token定义在index.html这个页面里面

  1. <script>
  2. var TOKEN = '{{$token}}';//php模板变量
  3. var HOST = 'http://read.xxx.com';//程序api接口域名
  4. var INURL = location.href //页面域名(在ios自定义分享时候会用到)
  5. </script>

微信支付

微信支付要解决的就是路径配置问题,由于我们的路由都是以 r/xxxxx的格式来的,所以在微信那边就直接填写http://xxx.xxxx.com/r/,注意需要支付的页面传参请使用query的方式。要不然r后面就会出现目录了,比如 r/goods/id/1 要换成 r/goods?id=1,这样只要定义一个路径全站都可以拉起支付

自定义分享

由于使用了history的路由模式,所以ios的问题需要解决,在路由跳转后,安卓能正常难道当前的路径,ios获取的是你第一打开应用的路径,所以在签名的时候就得注意了,安卓拿当前路径去签名,ios要拿第一次打开页面的路径去签名。这就是为什么要在路由初始化之前要定义一个第一次打开应用的路径。就是index.html里面那个具体怎么去签名,我这里使用的是axios

关键代码

  1. let http = axios.create({
  2. baseURL: HOST + '/api/',
  3. timeout: 10000,
  4. headers: {
  5. 'Accept': 'application/json',
  6. 'Authorization': 'Bearer ' + TOKEN,
  7. 'InUrl': INURL,//传第一次打开页面的链接
  8. 'IsIos': isiOS//传是否ios
  9. }
  10. })

后台要拿三个

  1. $is_ios = request()->header('IsIos');//获取是否ios
  2. $in_url = request()->header('InUrl');//获取第一次打开页面路径
  3. $in_url = explode("#", $in_url)[0];//处理一下
  4. if ($is_ios == 'true') {
  5. $url = $in_url;//ios用第一次打开页面路径签名
  6. } else {
  7. $url = url()->previous();//安卓就用请求这个接口的路径去签名
  8. }
  9. //用url去签名吧

拿到签名后怎么初始化呢

  1. this.$wechat.config(res.data.wx_config)

这是vux提供的

由于应用使用了页面缓存,所以在定义自定义分享数据的代码就要放在activated里面执行,具体实现

首先定义一个init=false

mounted开始请求数据拿到签名

  1. this.$wechat.config(res.data.wx_config)
  2. this.$wechat.ready(() => {
  3. this.set_share()
  4. })

methods定义一个方法

  1. set_share () {
  2. // 自定义分享到朋友圈
  3. this.$wechat.onMenuShareTimeline({
  4. title: this.share.title,
  5. link: this.share.url,
  6. imgUrl: this.share.icon,
  7. success: () => {}
  8. })
  9. this.$wechat.onMenuShareAppMessage({
  10. title: this.share.title,
  11. desc: this.share.desc,
  12. link: this.share.url,
  13. imgUrl: this.share.icon
  14. })
  15. }

activated定义

  1. activated () {
  2. this.set_share()
  3. }

keep-alive 组件激活时重新设置一下自定义分享的数据,要不然如果在返回前的页面也定于的自定义分享,返回后页面没有刷新,分享的数据就会是之前的,这里重新定义一下就可以了

总结一下

第一次写文章,很多东西不会表达,希望对大家有所帮助!遇到问题请私信

这个项目的代码,可以当作项目的初始来哦!开箱即用

预览地址


基于vue开发的在线付费课程应用的更多相关文章

  1. 基于Vue开发的tab切换组件

    github地址:https://github.com/MengFangui/VueTabSwitch 1.index.html <!DOCTYPE html> <html lang ...

  2. 基于java开发的在线题库系统tamguo

    简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...

  3. 基于Vue开发的门户网站展示和后台数据管理系统

    基于Vue的前端框架有很多,这几年随着前端技术的官方应用,总有是学不完的前端知识在等着我们,一个人的精力也是有限,不可能一一掌握,不过我们学习很大程度都会靠兴趣驱动,或者目标导向,最终是可以以点破面, ...

  4. VBox 一款基于vue开发的音乐盒 序章

    己基于vue写了一个 Mplayer, github地址:https://github.com/xiangwenhu/MPlaer, 演示地址:http://babydairy2017.cloudap ...

  5. 基于VUE开发项目

    前言 最近由于公司需要,需要写一个相对来说比较大型的后台管理系统.为了保证管理系统操作体验较为舒适并且项目后期益于维护,最后决定基于VUE全家桶来开发一个高度组件化的单页SPA应用. 技术选型 vue ...

  6. 基于vue开发的多功能的时间选择器组件,开箱即用

    好一段时间没有写过博客了,在国庆期间心血来潮优化了一个组件,在日常开发中时常会有需求用到时间选择器,不同的项目需求可能会不一样.近期开发的几个项目中就有需求用到这样的选择器,由于以前有用到相关的组件, ...

  7. 基于SSM开发自行车在线租赁管理系统源码

    开发环境: Windows操作系统开发工具: Myeclipse+Jdk+Tomcat+MYSQL数据库注意:此项目分管理员与普通用户两种角色运行效果图 源码及原文链接:https://javadao ...

  8. 前端 go.js 流程图基于vue开发项目案例

    一.流程图效果 最近一段时间在研究go.js,它是一款前端开发画流程图的一个插件,也是一个难点,要说为什么是难点,首先,它是依赖画布canvas知识开发.其次,要依赖于内部API开发需求,开发项目需求 ...

  9. 基于vue开发的element-ui树形控件报错问题解决

    对没错,这次又是ElementUI的问题,在使用ElementUI中的 tree 树形控件时需要动态添加DOM元素,但是在使用文档中给出的案例的时候会报错. 案例:ElementUI树形控件 - 自定 ...

随机推荐

  1. CodeForces 527C. Glass Carving (SBT,线段树,set,最长连续0)

    原题地址:http://codeforces.com/problemset/problem/527/C Examples input H V V V output input H V V H V ou ...

  2. python_4

    1.迭代器:通过iter()方法获得了list的迭代对象,然后就可以通过next()方法来访问list中的元素了,当容器中没有可访问元素时,会抛出StopIteration异常终止迭代器 data = ...

  3. shiro PermissionUtil

    package org.linlinjava.litemall.admin.util; import org.apache.shiro.authz.annotation.RequiresPermiss ...

  4. AI动作捕捉技术,会让制造业大幅度降低成本吗?

    现代动作捕捉系统应该是起源于100多年前的动画工业,通过一种叫做"动态遮罩或影像描摹"的技术,动画师们可以获得流畅的.栩栩如生的动作:后来到了20世纪80年代,动画师们设计出带有活 ...

  5. 头次接触wamp服务器、xampp,初次单独使用tomcat部署

    刚刚经过了近两天的接触wamp.xampp.tomcat的时光,真的爽 导师有个网站打不开了,就让我去弄,还有一个网站的后台密码忘了,让我帮忙找回来.我第一感觉就是第一个活不简单,第二个还不简单吗?打 ...

  6. 用go写爬虫服务并发请求,限制并发数

    java写爬虫服务,思路是线程池,任务队列,限制并行线程数即可. go要用另一种设计思路,不能在线程层面限制,协程的异步请求,如果不作处理,并行发出所有网络请求,因网络请求数过多,会抛出异常 低版本的 ...

  7. 微软科学家Leslie Lamport荣获2013年图灵奖

    Lamport荣获2013年图灵奖" title="微软科学家Leslie Lamport荣获2013年图灵奖"> 编者按:Leslie Lamport,新晋图灵奖 ...

  8. [LC] 277. Find the Celebrity

    Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...

  9. [LC] 168. Excel Sheet Column Title

    Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...

  10. Data Binding on Android

    Data Binbing框架是在2015年Google I/O大会上最早提出来的,一直在Android开发者中热议,但是很少有真正在项目中用到.本文简单介绍Data Binding框架的简单用法以及其 ...