Node.js通過微信網(wǎng)頁授權機制獲取用戶信息

0.目標與前置條件

這一節(jié),我將介紹如何使用微信網(wǎng)頁授權機制來拉取微信用戶的信息。

在進行本節(jié)之前,你需要有一個自己的服務器、域名(如果沒有,只能對測試號調(diào)試,微信規(guī)定了正式號必須使用域名)

微信官方文檔請 點擊這里


1.部署Express

如果不知道如何部署,可參照: 部署Express


2.準備工作

2.2 什么是訂閱號?什么是服務號?

剛開始開發(fā)時,總是被這兩個概念弄得云里霧里,所以在此之前,有必要弄清楚這兩個概念:

微信公眾平臺現(xiàn)在已分成訂閱公眾號和服務公眾號兩種類型。   
公眾平臺服務號:是公眾平臺的一種帳號類型,旨在為用戶提供服務。如:招商銀行、中國南方航空。   
公眾平臺訂閱號:是公眾平臺的一種帳號類型,為用戶提供信息和資訊。如:騎行西藏、央視新聞。

服務號的權限:

  • 1個月(30天)內(nèi)僅可以發(fā)送1條群發(fā)消息
  • 發(fā)給訂閱用戶(粉絲)的消息,會顯示在對方的聊天列表中
  • 在發(fā)送消息給用戶時,用戶將收到即時的消息提醒
  • 服務號會在訂閱用戶(粉絲)的通訊錄中
  • 可申請自定義菜單

訂閱號的權限

  • 每天(24小時內(nèi))可以發(fā)送1條群發(fā)消息
  • 發(fā)給訂閱用戶(粉絲)的消息,將會顯示在對方的訂閱號文件夾中
  • 在發(fā)送消息給訂閱用戶(粉絲)時,訂閱用戶不會收到即時消息提醒
  • 在訂閱用戶(粉絲)的通訊錄中,訂閱號將被放入訂閱號文件夾中
  • 訂閱號不支持申請自定義菜單

另外,進入公眾平臺 -> 設置 -> 帳號信息 -> 類型 -> 升為服務號/訂閱號可設置類型;需要注意的是,公眾號只有1次機會可以選擇成為服務號/訂閱號,類型選擇之后不可修改,請慎重選擇。


2.1 申請微信開放平臺測試號

為什么要用測試號?
因為正式號的接口未開通,如果要開通,必須通過微信認證。
在獲得微信認證之前,使用測試號來開發(fā)是一個不錯的選擇。

Paste_Image.png

進入微信開發(fā)平臺 申請一個測試號。申請成功后會打開一個測試號管理頁面。
這里的appID和appsecret就是接下來需要用到的兩個重要數(shù)據(jù)。

測試號管理頁面

2.2 進入公眾號配置

在你綁定了公眾號后,可以登錄你注冊的微信公眾平臺帳戶,在最下面找到 [基本配置] 項,點擊進入也可以進行配置:

公眾平臺測試帳號

2.3 設置授權回調(diào)頁面域名

在測試號管理頁面中,找到“網(wǎng)頁服務”->“網(wǎng)頁帳號”,點擊右邊的“修改”,設置你的授權回調(diào)頁面域名。

授權回調(diào)頁面域名
設置授權回調(diào)頁面域名

3.服務端代碼:

在寫代碼之前,還需要通過npm安裝一個組件:

npm install request --save

安裝完畢后,即可開始。

我們在routes文件夾中增加一個路由文件oauth.js:

/**
 * @Module   : Wechat oauth Module
 * @Brief   : Process Wechat oauth
 */
var express = require('express');
var router = express.Router();
var request = require('request');

/* 微信登陸 */
var AppID = '<你的測試號或正式號appid>';
var AppSecret = '<你的測試號或正式號appsecret>';
router.get('/wx_login', function(req,res, next){
    //console.log("oauth - login")
    
    // 第一步:用戶同意授權,獲取code
    var router = 'get_wx_access_token';
    // 這是編碼后的地址
    var return_uri = 'http%3A%2F%2Fwww.onelib.biz%2Foauth%2F'+router;  
    var scope = 'snsapi_userinfo';
    
    res.redirect('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+AppID+'&redirect_uri='+return_uri+'&response_type=code&scope='+scope+'&state=STATE#wechat_redirect');
    
});


router.get('/get_wx_access_token', function(req,res, next){
    //console.log("get_wx_access_token")
    //console.log("code_return: "+req.query.code)
    
    // 第二步:通過code換取網(wǎng)頁授權access_token
    var 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)
                //console.log(JSON.parse(body));
                var data = JSON.parse(body);
                var access_token = data.access_token;
                var 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ù)獲取的用戶信息進行對應操作
                            var userinfo = JSON.parse(body);
                            //console.log(JSON.parse(body));
                            console.log('獲取微信信息成功!');
                            
                            // 小測試,實際應用中,可以由此創(chuàng)建一個帳戶
                            res.send("\
                                <h1>"+userinfo.nickname+" 的個人信息</h1>\
                                <p><img src='"+userinfo.headimgurl+"' /></p>\
                                <p>"+userinfo.city+","+userinfo.province+","+userinfo.country+"</p>\
                            ");
                            
                        }else{
                            console.log(response.statusCode);
                        }
                    }
                );
            }else{
                console.log(response.statusCode);
            }
        }
    );
});
module.exports = router;

最后,在app.js中引入這個路由:

...
var oauth = require('./routes/oauth');
...
app.use('/oauth', oauth);
...

4.測試

先關注該測試號,然后在微信中輸入網(wǎng)站: www.onelib.biz/oauth/wx_login

成功獲取用戶信息

原創(chuàng)文章,未經(jīng)許可,請勿轉載
作者:Mike的讀書季
日期:2016.10.08

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容