Vue-ssr微信開發(fā)--授權登錄到項目部署

Vue-ssr微信開發(fā)--授權登錄到項目部署

之前一直用 Vue 做微信端的SPA(Single-Page Application - 單頁應用程序)開發(fā),授權都是后端來做的鲫惶,前端只需拉接口填充數(shù)據(jù)即可做裙。

由于數(shù)據(jù)都是異步獲取的岗憋,可能會出現(xiàn)頁面加載完成但是數(shù)據(jù)卻并未全部填充完畢的情況,為了提高用戶體驗锚贱,后來的項目改用了 Nuxt 框架仔戈,采用服務端渲染,一切都比較順利拧廊,唯獨就是就是踩了微信授權的坑监徘。

當然,如果我沒踩過吧碾,也就不會有這篇文章了凰盔,本著學習的目的與大家一起分享,如有不對的地方還望大家批評斧正~

下面進入正題

環(huán)境搭建

其實 nuxt 相關的腳手架已經(jīng)集成到了 vue-cli倦春,同時提供 starter户敬、express、koa睁本、adonuxt多個不同的模版尿庐,這里我們選擇使用 express 模版

采用以下命令,初始化我們的項目

 // 初始化
 $ vue init nuxt-community/express-template vue-ssr

然后安裝依賴

$ cd vue-ssr

$ npm install

啟動項目

$ npm run dev

訪問localhost:3000呢堰,如果你看到如下的界面抄瑟,證明你已經(jīng)安裝成功了

首頁

我們發(fā)現(xiàn)其實官方已經(jīng)幫我們做了 demo ,我們只要對其進行改造即可枉疼。

微信授權設置

要想進行微信授權皮假,你需要有一個自己的服務器鞋拟、域名(如果沒有,只能對測試號調(diào)試惹资,微信規(guī)定了正式號必須使用域名)严卖,微信授權的官方文檔參考這里

申請微信公眾平臺測試號

1.我們進入微信公眾平臺 申請一個測試號,使用測試號來開發(fā)是一個不錯的選擇布轿,申請成功之后進入后臺哮笆,
右下角側(cè)邊欄會有一個開發(fā)者工具選項,我們點擊進入之后汰扭,選擇 公眾平臺測試帳號

公眾號測試配置

不出意外稠肘,你會拿到兩個重要的數(shù)據(jù) appID 和 appsercet,如下

測試號信息

2.我們需要將用戶綁定到測試賬號上來萝毛,掃描下方的測試號二維碼项阴,成功后你的信息會出現(xiàn)右側(cè)的列表中,這一步很關鍵笆包,之前沒有做這一步導致獲取不到用戶信息环揽!

3.最后,我們還需要設置回調(diào)域名庵佣,即

回調(diào)域名
回調(diào)域名設置

要注意的是:
1歉胶、這里填寫的是域名(是一個字符串),而不是URL巴粪,因此請勿加http://等協(xié)議頭通今;
2、授權回調(diào)域名配置規(guī)范為全域名肛根,比如需要網(wǎng)頁授權的域名為:www.qq.com辫塌,配置以后此域名下面的頁面 http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進行OAuth2.0鑒權派哲。但http://pay.qq.com 臼氨、 http://music.qq.com 、 http://qq.com無法進行OAuth2.0鑒權芭届。

到此储矩,微信授權的后臺配置我們已基本完成,接下來就是我們編寫服務端代碼的

服務端代碼

我們按照微信官方的授權步驟來看喉脖,主要分為一下幾個4步:

微信授權使用的是OAuth2.0授權的方式椰苟。主要有以下簡略步驟:

第一步:用戶同意授權抑月,獲取code

第二步:通過code換取網(wǎng)頁授權access_token

第三步:刷新access_token(如果需要)

第四步:拉取用戶信息(需scope為 snsapi_userinfo)

我們在 server 的 api 文件夾下面創(chuàng)建一個 oauth.js 用于微信授權树叽。

在次之前,我們需要安裝一個 request 模塊谦絮,方便我們處理請求题诵,即

npm install request --save

接著洁仗,我們編寫 oauth.js 文件,具體代碼如下:

//引入 路由 和 request 模塊
import { Router } from 'express';
import request from 'request'

const router = Router();

//授權請求接口
router.get('/oauth' , function (req , res , next) {
    //用戶同意授權性锭,獲取code
    let router = 'get_access_token';
    //編碼后的地址
    let return_url = 'http%3A%2F%2F**設置的回調(diào)域名**%2Fapi%2F' + router ;
    let scope = 'snsapi_userinfo';
        
    //重定向到微信授權鏈接
    res.redirect('https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + AppID + '&redirect_uri=' + return_url + '&response_type=code&scope=' + scope + '&state=STATE#wechat_redirect');
})

router.get('/get_access_token',function (req, res, next) {

    //第二步:通過code獲取網(wǎng)頁的access_token
    let code = req.query.code;

    request.get({
            url:'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' + AppID + '&secret='+ AppSecret + '&code=' + code + '&grant_type=authorization_code'
        },
        function (error, response, body) {
            if( response.statusCode == 200 ){
            
                // 第三步:拉取用戶信息(需scope為 snsapi_userinfo)
                
                let data = JSON.parse( body );
                let access_token = data.access_token;
                let openid = data.openid;

                request.get({
                        url : 'https://api.weixin.qq.com/sns/userinfo?access_token=' + access_token + '&openid=' + openid + '&lang=zh_CN',
                    },
                    function (error, response, body) {
                        if( response.statusCode == 200 ){
                            // 第四步:根據(jù)獲取的用戶信息進行對應操作
                            let userinfo = JSON.parse(body);
                            
                            console.log(userinfo)

                            res.send("\
                                <h1>openid:" + userinfo.openid +  "</h1>\
                                <h1>"+userinfo.nickname+" 的個人信息</h1>\
                                <p>![]("+userinfo.headimgurl+")</p>\
                                <p>"+userinfo.city+"赠潦,"+userinfo.province+","+userinfo.country+"</p>\
                                ")
                        }else{
                            console.log(response.statusCode);
                        }
                    }
                )
            }else{
                console.log(response.statusCode);
            }
        }
    )
})

export default router

嗯草冈,授權代碼就寫完了她奥,記得要掛載到api目錄下 index.js 中

import { Router } from 'express'
import oauth from './oauth'

const router = Router()

// Add USERS Routes
router.use(oauth)

export default router

嗯,現(xiàn)在如果你瀏覽器訪問 http://localhost:3000/api/oauth怎棱,不出意外哩俭,你會看到下面的界面:

微信授權提示

恭喜你,你已經(jīng)成功了一半了拳恋!

部署

我們的項目是運行在 3000 端口凡资,現(xiàn)在要放到服務器上,通過 80 端口去訪問它谬运,我們要用到 nginx 來做轉(zhuǎn)發(fā)(對于nginx的安裝這里不多做贅述隙赁,建議不懂得小伙伴去看看),需要對其進行配置梆暖,這里伞访,我們找到nginx安裝目錄下的 nignx.conf 進行簡單的配置即可,我這里給出一個參考:

Nginx配置

接下來就是要部署我們的 Nuxt 項目轰驳,它的部署與vue稍微有點不同咐扭,我們需要在我們的項目中,先在本地運行

npm run build

進行打包滑废,之后本地創(chuàng)建一個 package.json 的文件(除去原本項目中dev的依賴)蝗肪,如下:

{
  "name": "vue-ssr",
  "version": "1.0.0",
  "description": "Nuxt.js project",
  "author": "chenwei <cryptic_v@163.com>",
  "private": true,
  "scripts": {
    "dev": "backpack dev",
    "build": "nuxt build && backpack build",
    "start": "cross-env NODE_ENV=production node build/main.js",
    "precommit": "npm run lint",
    "lint": "eslint --ext .js,.vue --ignore-path .gitignore ."
  },
  "dependencies": {
    "axios": "^0.16.2",
    "cross-env": "^5.0.1",
    "express": "^4.15.3",
    "nuxt": "^1.0.0-rc3",
    "request": "^2.83.0",
    "source-map-support": "^0.4.15"
  }
}

將打包好的 .nuxt 文件夾bulid 文件夾package.json 文件一起放到 服務器的項目目錄下(我這里使用的是vue-ssr),
進入該文件夾蠕趁,運行npm install安裝依賴薛闪,完成后運行npm start,項目即可運行俺陋,接著我們訪問 api/oauth 接口豁延,會彈起微信授權,如圖所示

微信授權

確認登錄之后腊状,授權成功诱咏,可以拉取到用戶信息,如下圖

授權成功

同時缴挖,我們還可以在服務器端看到日志打印的個人信息如下:

服務端打印

到此袋狞,我們整個授權微信完成了,接下來只要將用戶信息存入數(shù)據(jù)庫即可~

嗯,補充一點苟鸯,如果項目需要掛到服務器后臺運行同蜻,這里我推薦使用 pm2 進行管理,有關 pm2 的用法網(wǎng)上教程也比較多早处,使用起來也很方便湾蔓,這里我只是針對 Nuxt 項目而言,

執(zhí)行命令 pm2 start npm -- start 砌梆,項目會被掛載在后臺默责,并輸出如下界面

pm2

當然,你也可以采用 pm2 list 查看當前的所有運行的node應用咸包,這個 id 為當前應用的 id傻丝;
如果你要退出該應用,請使用pm2 delete _id即可~

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诉儒,一起剝皮案震驚了整個濱河市葡缰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忱反,老刑警劉巖泛释,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異温算,居然都是意外死亡怜校,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門注竿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茄茁,“玉大人,你說我怎么就攤上這事巩割∪雇纾” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵宣谈,是天一觀的道長愈犹。 經(jīng)常有香客問我,道長闻丑,這世上最難降的妖魔是什么漩怎? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮嗦嗡,結(jié)果婚禮上勋锤,老公的妹妹穿的比我還像新娘。我一直安慰自己侥祭,他們只是感情好叁执,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布茄厘。 她就那樣靜靜地躺著,像睡著了一般徒恋。 火紅的嫁衣襯著肌膚如雪蚕断。 梳的紋絲不亂的頭發(fā)上欢伏,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天入挣,我揣著相機與錄音,去河邊找鬼硝拧。 笑死径筏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的障陶。 我是一名探鬼主播滋恬,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抱究!你這毒婦竟也來了恢氯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤鼓寺,失蹤者是張志新(化名)和其女友劉穎勋拟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妈候,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡敢靡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苦银。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啸胧。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幔虏,靈堂內(nèi)的尸體忽然破棺而出纺念,到底是詐尸還是另有隱情,我是刑警寧澤想括,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布柠辞,位于F島的核電站,受9級特大地震影響主胧,放射性物質(zhì)發(fā)生泄漏叭首。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一踪栋、第九天 我趴在偏房一處隱蔽的房頂上張望焙格。 院中可真熱鬧,春花似錦夷都、人聲如沸眷唉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冬阳。三九已至蛤虐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肝陪,已是汗流浹背驳庭。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氯窍,地道東北人饲常。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像狼讨,于是被迫代替她去往敵國和親贝淤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載 :OpenDiggawesome-github-vue 是由OpenDigg整理并維護的Vue相關開源項目庫...
    果汁密碼閱讀 23,119評論 8 124
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理政供,服務發(fā)現(xiàn)播聪,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 懊惱的手殘星人想不明白:為什么歡脫的牙刷布隔,屢屢不放過同一塊牙齦表層离陶!連續(xù)兩天激動地撞擊,看到她逐漸腫大至內(nèi)層白色的...
    失寵大雞排閱讀 164評論 0 0
  • 逛公園看到的,好美术吝,忍不住拍下來计济。 但是誰能告訴我,這是桃花排苍,還是梅花沦寂?我一直分不清楚。 我覺得是桃花淘衙。
    邵媚閱讀 241評論 0 2
  • 眾所周知传藏,德國是一個挺“另類”的國家,在這兒短期旅游彤守,出差毯侦,都很好,可是如果進入他們的系統(tǒng)具垫,學習侈离,上班,相信我筝蚕,絕...
    萊比錫橘子閱讀 767評論 1 1