node.js 微信開發3-網頁受權

一、配置公衆號的自定義菜單,如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('服務器開啓成功');
server.js

將須要認證的.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);
                });
            });
        }
網頁受權獲取用戶openid

網頁受權的兩種方式

一、以snsapi_base爲scope發起的網頁受權,是用來獲取進入頁面的用戶的openid的,而且是靜默受權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(每每是業務頁面)

二、以snsapi_userinfo爲scope發起的網頁受權,是用來獲取用戶的基本信息的。但這種受權須要用戶手動贊成,而且因爲用戶贊成過,因此無須關注,就可在受權後獲取該用戶的基本信息。

  * 由於所須要的有效信息只要一個openid就夠了,因此我使用的就是第一種 以snsapi_base爲scope發起的網頁受權

  * 在域名受權接口的query中就會有一個code參數,咱們要作的就是把這個code和公衆號的appID,appScrect做爲參數發送一個GET請求給微信接口

   接口的獲取結果中就有openid和access_token等參數,其實咱們所須要的保留一個openid就能夠了

 

git:https://github.com/wuyongxian20/wechat-api

相關文章
相關標籤/搜索