一、配置公衆號的自定義菜單,如html
{ "button":[ { "type":"view", "name":"公衆號", "url":"http://xxx/consultList" }, { "type":"view", "name":"小程序", "url":"http://xxx" }, { "type":"view", "name":"我的信息", "url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=http%3a%2f%2fxxx%2foauth%2findex&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" } ] }
二、設置網頁受權域名html5
* 進入微信管理平臺,打開功能設置-網頁受權域名node
* 須要設置的就是微信菜單中redirect_uri的地址(能夠是接口地址獲取頁面路由地址)git
* 在設置時,須要將一個認證的text文本放入網站根目錄github
當時我項目中的app.js文件啓動的3000端口只加載了和微信api有關的接口,並無網站根目錄,因此有新建了一個server.js啓動目錄,和一個網站根目錄web
項目結構以下:json
var http = require('http'); var fs = require('fs');//引入文件讀取模塊 var documentRoot = 'D:/wechat/nodetest/www'; //須要訪問的文件的存放目錄 var server= http.createServer(function(req,res){ var url = req.url; //客戶端輸入的url,例如若是輸入localhost:8888/index.html //那麼這裏的url == /index.html var file = documentRoot + url; console.log(url); //E:/PhpProject/html5/websocket/www/index.html fs.readFile( file , function(err,data){ /* 一參爲文件路徑 二參爲回調函數 回調函數的一參爲讀取錯誤返回的信息,返回空就沒有錯誤 二參爲讀取成功返回的文本內容 */ if(err){ res.writeHeader(404,{ 'content-type' : 'text/html;charset="utf-8"' }); res.write('<h1>404錯誤</h1><p>你要找的頁面不存在</p>'); res.end(); }else{ res.writeHeader(200,{ 'content-type' : 'text/html;charset="utf-8"' }); res.write(data);//將index.html顯示在客戶端 res.end(); } }); }).listen(3000); console.log('服務器開啓成功');
將須要認證的.text文本放入www文件夾,確認網頁受權就能夠了小程序
微信管理平臺的網頁應受權配置完成以後關閉這個server啓動項就能夠了,後續域名受權能夠正常使用api
三、關於域名受權接口服務器
const wechat = require('../wechat/wechat') const config = require('../config/wechat.json') let wechatApp = new wechat(config) module.exports = { // 公衆號消息 'GET /oauth/index': async (ctx, next) => { let code=ctx.request.query.code await wechatApp.snsapi_base(code).then(function (data) { ctx.response.type = 'text' ctx.response.body = data }); } };
/** * 經過snsapi_base 方式獲取用戶的openid和網頁受權access_token(與調用微信接口使用的access_token不一樣) */ WeChat.prototype.snsapi_base = async function (code) { logger.info('snsapi_base code', code) var that = this; return new Promise(function (resolve, reject) { //格式化請求地址 var url = util.format(that.apiURL.snsapi_base, that.apiDomain, that.appID, that.appScrect, code); that.requestGet(url).then(function (data) { resolve(data); }); }); }
網頁受權的兩種方式
一、以snsapi_base爲scope發起的網頁受權,是用來獲取進入頁面的用戶的openid的,而且是靜默受權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(每每是業務頁面)
二、以snsapi_userinfo爲scope發起的網頁受權,是用來獲取用戶的基本信息的。但這種受權須要用戶手動贊成,而且因爲用戶贊成過,因此無須關注,就可在受權後獲取該用戶的基本信息。
* 由於所須要的有效信息只要一個openid就夠了,因此我使用的就是第一種 以snsapi_base爲scope發起的網頁受權
* 在域名受權接口的query中就會有一個code參數,咱們要作的就是把這個code和公衆號的appID,appScrect做爲參數發送一個GET請求給微信接口
接口的獲取結果中就有openid和access_token等參數,其實咱們所須要的保留一個openid就能夠了