最近有几个朋友问起了微信开发的一些事情 我抽时间给大家整理一个微信开发系列 今天先谈谈微信登陆的那些事 本人用测试号帮大家把基本功能实现一遍
我的测试号
特别注意
这个很重要 是设置微信的授权域名 和微信支付目前必须是一个域名 要不 微信支付无法使用
测试号登陆地址
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
你打算打赏多少钱呢?
(微信扫一扫)