最近在弄一個付費課程的應用,主要有微信登陸,支付和自定義分享,在開發過程當中遇到的坑,這裏作一下記錄php
文章主要有如下幾點html
vux
UI組件庫vue-navigation
緩存頁面,此庫實現了前進刷新後退讀緩存的功能,像原生APP導航同樣。用子路由的方式實現tabbar有bug,用vuex解決了。lib-flexible
解決移動頁面適配來一個清單vue
"dependencies": {
"fastclick": "^1.0.6",
"lib-flexible": "^0.3.2",
"lodash": "^4.17.4",
"vue": "^2.5.2",
"vue-navigation": "^1.1.3",
"vue-router": "^3.0.1",
"vuex": "^2.1.1",
"vuex-i18n": "^1.3.1",
"vux": "^2.7.8"
}
複製代碼
應用須要登陸後能夠訪問,微信登陸要實現的功能是從任意一個連接進入,判斷是否登陸,未登陸跳到微信受權,成功後返回登陸前連接,因爲對php的微信受權作得比較多,因此微信受權放在的php實現,這裏說一下實現過程。路由方式使用了history
模式,打包好的index.html
文件用php渲染出來。路由path定義統一的格式r/xxxx
,這樣對於php端的路由能夠實現匹配,只要是這個格式的路由都匹配到渲染index.html
的方法,要否則訪問的時候服務端出現404錯誤。ios
php端路由配置,這裏是laravel,其餘框架應該也差很少laravel
Route::get('/', 'HomeController@index')->middleware('auth')->name("home");
Route::get('/r/{query}', 'HomeController@index')->middleware('auth')->name("home");
複製代碼
爲何不用
hash
模式呢,由於用hash模式的下php獲取來源地址的時候獲取不到#後面參數,雖然能夠用參數傳給後端,可是好麻煩,因此就用history
模式了,後面的支付和分享也是這樣git
xxx.com/r/xxx
用戶登陸狀態使用token,token定義在index.html這個頁面裏面github
<script>
var TOKEN = '{{$token}}';//php模板變量
var HOST = 'http://read.xxx.com';//程序api接口域名
var INURL = location.href //頁面域名(在ios自定義分享時候會用到)
</script>
複製代碼
微信支付要解決的就是路徑配置問題,因爲咱們的路由都是以 r/xxxxx
的格式來的,因此在微信那邊就直接填寫http://xxx.xxxx.com/r/
,注意須要支付的頁面傳參請使用query
的方式。要否則r後面就會出現目錄了,好比 r/goods/id/1
要換成 r/goods?id=1
,這樣只要定義一個路徑全站均可以拉起支付vue-router
因爲使用了history
的路由模式,因此ios的問題須要解決,在路由跳轉後,安卓能正常難道當前的路徑,ios獲取的是你第一打開應用的路徑,因此在簽名的時候就得注意了,安卓拿當前路徑去簽名,ios要拿第一次打開頁面的路徑去簽名。這就是爲何要在路由初始化以前要定義一個第一次打開應用的路徑。就是index.html
裏面那個具體怎麼去簽名,我這裏使用的是axios
vuex
關鍵代碼json
let http = axios.create({
baseURL: HOST + '/api/',
timeout: 10000,
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer ' + TOKEN,
'InUrl': INURL,//傳第一次打開頁面的連接
'IsIos': isiOS//傳是否ios
}
})
複製代碼
後臺要拿三個
$is_ios = request()->header('IsIos');//獲取是否ios
$in_url = request()->header('InUrl');//獲取第一次打開頁面路徑
$in_url = explode("#", $in_url)[0];//處理一下
if ($is_ios == 'true') {
$url = $in_url;//ios用第一次打開頁面路徑簽名
} else {
$url = url()->previous();//安卓就用請求這個接口的路徑去簽名
}
//用url去簽名吧
複製代碼
拿到簽名後怎麼初始化呢
this.$wechat.config(res.data.wx_config)
複製代碼
這是vux提供的
因爲應用使用了頁面緩存,因此在定義自定義分享數據的代碼就要放在activated
裏面執行,具體實現
首先定義一個init=false
mounted
開始請求數據拿到簽名
this.$wechat.config(res.data.wx_config)
this.$wechat.ready(() => {
this.set_share()
})
複製代碼
在methods
定義一個方法
set_share () {
// 自定義分享到朋友圈
this.$wechat.onMenuShareTimeline({
title: this.share.title,
link: this.share.url,
imgUrl: this.share.icon,
success: () => {}
})
this.$wechat.onMenuShareAppMessage({
title: this.share.title,
desc: this.share.desc,
link: this.share.url,
imgUrl: this.share.icon
})
}
複製代碼
activated
定義
activated () {
this.set_share()
}
複製代碼
keep-alive 組件激活時從新設置一下自定義分享的數據,要否則若是在返回前的頁面也定於的自定義分享,返回後頁面沒有刷新,分享的數據就會是以前的,這裏從新定義一下就能夠了
第一次寫文章,不少東西不會表達,但願對你們有所幫助!遇到問題請私信
這個項目的代碼,能夠看成項目的初始來哦!開箱即用