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)頁面域名。


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
