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

特别注意

这个很重要 是设置微信的授权域名 和微信支付目前必须是一个域名 要不 微信支付无法使用
测试号登陆地址
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
用微信扫描登陆后 配置以下几个地方

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
