Vue-ssr微信开发--授权登录到项目部署

Vue-ssr微信开发--授权登录到项目部署

之前一直用 Vue 做微信端的SPA(Single-Page Application - 单页应用程序)开发,授权都是后端来做的,前端只需拉接口填充数据即可。

由于数据都是异步获取的,可能会出现页面加载完成但是数据却并未全部填充完毕的情况,为了提高用户体验,后来的项目改用了 Nuxt 框架,采用服务端渲染,一切都比较顺利,唯独就是就是踩了微信授权的坑。

当然,如果我没踩过,也就不会有这篇文章了,本着学习的目的与大家一起分享,如有不对的地方还望大家批评斧正~

下面进入正题

环境搭建

其实 nuxt 相关的脚手架已经集成到了 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,如果你看到如下的界面,证明你已经安装成功了

首页

我们发现其实官方已经帮我们做了 demo ,我们只要对其进行改造即可。

微信授权设置

要想进行微信授权,你需要有一个自己的服务器、域名(如果没有,只能对测试号调试,微信规定了正式号必须使用域名),微信授权的官方文档参考这里

申请微信公众平台测试号

1.我们进入微信公众平台 申请一个测试号,使用测试号来开发是一个不错的选择,申请成功之后进入后台,
右下角侧边栏会有一个开发者工具选项,我们点击进入之后,选择 公众平台测试帐号

公众号测试配置

不出意外,你会拿到两个重要的数据 appID 和 appsercet,如下

测试号信息

2.我们需要将用户绑定到测试账号上来,扫描下方的测试号二维码,成功后你的信息会出现右侧的列表中,这一步很关键,之前没有做这一步导致获取不到用户信息!

3.最后,我们还需要设置回调域名,即

回调域名
回调域名设置

要注意的是:
1、这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;
2、授权回调域名配置规范为全域名,比如需要网页授权的域名为: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换取网页授权access_token

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

第四步:拉取用户信息(需scope为 snsapi_userinfo)

我们在 server 的 api 文件夹下面创建一个 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**设置的回调域名**%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获取网页的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 ){
                            // 第四步:根据获取的用户信息进行对应操作
                            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

嗯,现在如果你浏览器访问 http://localhost:3000/api/oauth,不出意外,你会看到下面的界面:

微信授权提示

恭喜你,你已经成功了一半了!

部署

我们的项目是运行在 3000 端口,现在要放到服务器上,通过 80 端口去访问它,我们要用到 nginx 来做转发(对于nginx的安装这里不多做赘述,建议不懂得小伙伴去看看),需要对其进行配置,这里,我们找到nginx安装目录下的 nignx.conf 进行简单的配置即可,我这里给出一个参考:

Nginx配置

接下来就是要部署我们的 Nuxt 项目,它的部署与vue稍微有点不同,我们需要在我们的项目中,先在本地运行

npm run build

进行打包,之后本地创建一个 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 接口,会弹起微信授权,如图所示

微信授权

确认登录之后,授权成功,可以拉取到用户信息,如下图

授权成功

同时,我们还可以在服务器端看到日志打印的个人信息如下:

服务端打印

到此,我们整个授权微信完成了,接下来只要将用户信息存入数据库即可~

嗯,补充一点,如果项目需要挂到服务器后台运行,这里我推荐使用 pm2 进行管理,有关 pm2 的用法网上教程也比较多,使用起来也很方便,这里我只是针对 Nuxt 项目而言,

执行命令 pm2 start npm -- start ,项目会被挂载在后台,并输出如下界面

pm2

当然,你也可以采用 pm2 list 查看当前的所有运行的node应用,这个 id 为当前应用的 id;
如果你要退出该应用,请使用pm2 delete _id即可~

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

推荐阅读更多精彩内容

  • 转载 :OpenDiggawesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库...
    果汁密码阅读 23,083评论 8 124
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 懊恼的手残星人想不明白:为什么欢脱的牙刷,屡屡不放过同一块牙龈表层!连续两天激动地撞击,看到她逐渐肿大至内层白色的...
    失宠大鸡排阅读 161评论 0 0
  • 逛公园看到的,好美,忍不住拍下来。 但是谁能告诉我,这是桃花,还是梅花?我一直分不清楚。 我觉得是桃花。
    邵媚阅读 239评论 0 2
  • 众所周知,德国是一个挺“另类”的国家,在这儿短期旅游,出差,都很好,可是如果进入他们的系统,学习,上班,相信我,绝...
    莱比锡橘子阅读 756评论 1 1