微信开发系列之 微信登陆的那些事

2016-03-05 14:01:20

   最近有几个朋友问起了微信开发的一些事情 我抽时间给大家整理一个微信开发系列  今天先谈谈微信登陆的那些事 本人用测试号帮大家把基本功能实现一遍   

  我的测试号

   0.jpg

   特别注意

1.png


  这个很重要 是设置微信的授权域名 和微信支付目前必须是一个域名  要不 微信支付无法使用

   测试号登陆地址

   http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

   用微信扫描登陆后 配置以下几个地方

4A931E3A-7D7A-4562-BB80-12DD7A630DCA.png

wechat-oauth 主要用这个第三方包

 npm install  wechat-oauth


这个是跳转链接中比较重要的

//生成访问连接
function getAuthorizeURL(req, res) {
    var id = req.params.id;
    var weixinid = 'wx_'   id;

    if(!id)
    {
        id="niefengjun" ;
    }
    var weixinconfig = config.config[weixinid];
    var url = req.query.url;
    console.log('登陆前' url) ;


    var oauth = new OAuth(weixinconfig.appid, weixinconfig.appsecret, function (openid, callback) {
        // 传入一个获取全局token的方法\

        fs.readFile('./token/'   openid   'AccessToken_'   id   '.txt', 'utf8', function (err, txt) {
            //console.log(err, txt);
            if (err) {
                return callback(err);
            }
            callback(null, JSON.parse(txt));
        })

    }, function (openid, token, callback) {

        fs.writeFile('./token/'   openid   'AccessToken_'   id   '.txt', JSON.stringify(token), callback);
    });
    var oauthuser = weixinconfig.urldomain "weixin/getaccesstoken/" id   "/";

    var state = req.query.state;
    if (!state) {
        state ='niefengjun';
    }else
    {
        state=id ;
    }
    oauth.setOpts({timeout: 150000}); //设置超时时间

    res.cookie("niefengjun.cn", url, {maxAge: 86400000});


    // oauthuser 这个参数是微信登陆完成后返回到哪里  当然是返回到根据code获取用户信息
     
    if (oauthuser && state) {
        console.log('参数',oauthuser,state);
        var returl = oauth.getAuthorizeURL(oauthuser, state, 'snsapi_base');
        console.log('生成连接' ,returl) ;
        res.redirect(returl);
    }
    else {
        res.send('参数出错');
    }
}

//根据code 获取用户信息 实现用户的登陆

function getAccessToken(req, res) {
    var id = req.params.id;
    var weixinid = 'wx_'   id;
    var weixinconfig = config.config[weixinid];

    var code = req.query.code;
    var state = req.query.state;
    var nickname;
    var updatenickename=false ;
    var openid;
    var refresh_token ;
    var access_token ;
    var i_account_bound ;
    var usercooke = {};

    var url=req.cookies["niefengjun.cn"] ;


    var oauth = new OAuth(weixinconfig.appid, weixinconfig.appsecret, function (openid, callback) {
        // 传入一个获取全局token的方法

        fs.readFile('./token/'   openid   'AccessToken_'   id   '.txt', 'utf8', function (err, txt) {
            //console.log(err, txt);
            if (err) {
                return callback(err);
            }
            callback(null, JSON.parse(txt));
        })

    }, function (openid, token, callback) {

        // 请将token存储到全局,跨进程、跨机器级别的全局,比如写到数据库、redis等
        // 这样才能在cluster模式及多机情况下使用,以下为写入到文件的示例
        fs.writeFile('./token/'   openid   'AccessToken_'   id   '.txt', JSON.stringify(token), callback);
    });

    var callurl = weixinconfig.callURL;

    oauth.setOpts({timeout:150000}); //设置超时时间
    console.log('注册code---',code)

    oauth.getAccessToken(code, function (err, result) {
        var  i_account_source=id ;
        console.log("根据code 获取openid",err,result) ;
        if (!err) {

            openid = result.data.openid;
            refresh_token = result.data.refresh_token;
            access_token = result.data.access_token;
            i_account_bound=result.data.unionid;
            usercooke.refresh_token = refresh_token;
            usercooke.access_token = access_token;
            usercooke.i_account_bound = i_account_bound;
            usercooke.openid=openid ;
            res.cookie("niefengjunuser", url, {maxAge: 86400000});

                if(url) {
                    console.log('跳转成功' url) ;
                    res.redirect(url);
                }
                else{
                    console.log('进pay' url) ;
                    res.redirect("/");
                }

        }
        else {
            console.log('报错了',err,result) ;
            res.send('-1');
        }
    })
}

 

这两部分的路由分别是

var express = require('express');
var router = express.Router();
var pageWexin=require('../lib/pageWeixin.js') ;
/* GET home page. */
router.all('/:id/',pageWexin.index) ;//微信接入

router.all('/getauthorizeurl/:id/', pageWexin.getAuthorizeURL); //生成微信访问连接
router.all('/getaccesstoken/:id/', pageWexin.getAccessToken); //根据code 换取用户信息


  至此微信登陆 完成了全部的功能


  本功能的相关代码 demo

你打算打赏多少钱呢?

打赏
(微信扫一扫)