2019独角兽企业重金招聘Python工程师标准>>>

首先在nodejs里的config下创建一个wechat.js文件,里面配置好appid和appSecret。

let config = exports;config.production = {appId: 'wxc464e493a4e946b6',appSecret: 'ab86e8264ed8c8a91df958a98a7928b4',//     appId: 'wxe27bcb44cb1e4753',//     appSecret: '920841d36776734b772f778cfa8c8b77',
};config.testing = Object.assign({}, config.production);
config.development = Object.assign({}, config.production);config.qa = Object.assign({}, config.testing, {});config.nc = Object.assign({}, config.production, {});config.sjhl = Object.assign({}, config.production, {});config.gm = Object.assign({}, config.production, {});

然后在libs下创建wechat.js文件,

里面的代码为

var fs = require('fs');
var OAuth = require('wechat-oauth');class Wechat {//拿到配置文件里的appid和appSecretconstructor(appId, appSecret) {this.appId = appId;this.appSecret = appSecret;this.client = new OAuth(this.appId, this.appSecret, this.getToken, this.setToken);}//从缓存中获取用户的assets tokengetToken(openid, callback) {let file = `runtime/access_token_${openid}.txt`;if (!fs.existsSync(file)) {return callback(null);}fs.readFile(file, 'utf8', function (err, txt) {if (err) {console.log('[wechat] get token err', err);return callback(err);}callback(null, JSON.parse(txt));});}//如果没获取到token就把token设置到缓存中setToken(openid, token, callback) {let file = `runtime/access_token_${openid}.txt`;fs.writeFile(file, JSON.stringify(token), callback);}//传入url让用户点击授权getAuthorizeURL(url) {let redirectUrl = this.client.getAuthorizeURL(url, 'qiongtao.li', 'snsapi_userinfo');return redirectUrl;}//获取用户的accessTokenasync getAccessToken(code) {return new Promise((resolve, reject) => {this.client.getAccessToken(code, (err, rst) => {if (err) {console.log('[wechat] get access token err', err);resolve();}console.log('[wechat] access token:', rst.data);resolve(rst.data);})})}//通过openid获取到用户信息async getUser(openid) {return new Promise((resolve, reject) => {this.client.getUser(openid, (err, rst) => {if (err) {console.log('[wechat] get user info err', err);resolve();}console.log('[wechat] userinfo:', rst);resolve(rst);})})}}module.exports = Wechat

最后在toutes里写action,代码为

const Wechat = require('../../libs/Wechat');
const Trans = require('../../libs/database/Mysql');
const Model = require('../../libs/Model');
const RecordLog = require('../../libs/Log');
const Request = require('../../libs/Request');
const redis = require('../../libs/Redis');const wechat = new Wechat(_.config.wechat.appId, _.config.wechat.appSecret);module.exports = {'/npi/wechat/login': {get: async (ctx, next) => {let echostr = ctx.query.echostr || '';let code = ctx.query.code || '';if (echostr != '') { //证明你是开发者return echostr;}//授权认证if (code == '') {let domain = ctx.protocol + '://' + ctx.host; //let url = wechat.getAuthorizeURL(domain + ctx.url);ctx.set('Referrer', ctx.headers['Referrer'] || `${domain}/npi/test/succ`)ctx.redirect('back', url);return '';}//获得userInfolet rst = await wechat.getAccessToken(code);let userInfo = await wechat.getUser(rst.openid);console.log('111111111111111111111111111', userInfo);//开始判断登录或者注册let openid = userInfo.data.openid;let gender = '';if (userInfo.data.sex == '1') {gender = 'MAN';} else {gender = 'WOMEN';}let row = await Model.tblGyUserSocial().where('openid', openid).where('status', 'ACTIVE').getOne();//登录if (row.id) {let user = await Model.tblGyUserInfo().where('id', row.user_id).getOne();let token = _.makeToken({userId: user.id,userType: 'PERSON',}, ctx);let str = {userId: user.id,userType: 'PERSON',};let JsStr = JSON.stringify(str);await redis.setex("gy:app:u:token:" + token, 7200, JsStr);return _.succ('登录成功!', {token: token,});}//注册let data = {businessId: 1,datacenterId: 1,serverId: 1,};let uid = await new Request().getJSON(_.config.settings.getId, data);Trans.transBegin();let res = await Model.tblGyUserInfo().set('status', 'ACTIVE').set('update_time', new Date()).set('create_time', new Date()).set('id', uid).set('nick_name', row.data.nickname).set('gender', gender).set('icon', row.data.headimgurl).insert();if (res === false) {Trans.transRollback();return _.err('失败!', 711);}let res1 = await Model.tblGyUserSocial().set('status', 'ACTIVE').set('update_time', new Date()).set('create_time', new Date()).set('user_id', uid).set('platform', uid).set('openid', openid).set('nick_name', row.data.nickname).set('gender', gender).set('province', row.data.province).set('city', row.data.city).set('country', row.data.country).set('icon', row.data.headimgurl).insert();if (res1 === false) {Trans.transRollback();return _.err('失败!', 711);}let token = _.makeToken({userId: uid,userType: 'PERSON',}, ctx);let str = {userId: uid,userType: 'PERSON',};let JsStr = JSON.stringify(str);await redis.setex("gy:app:u:token:" + token, 7200, JsStr);ctx.status = 301;ctx.redirect(_.config.settings.wechatRedirectUrl + `?token=${token}`);// return _.succ(userInfo);}},
}

转载于:https://my.oschina.net/u/3491770/blog/1928796

nodejs实现微信授权登录相关推荐

  1. H5 微信授权登录功能实现

    背景 最近几周面试复习以前知识库,刚好博客从国外迁移到国内CSND,同步坐下笔记,梳理之前开发H5 微信授权登录功能获取用户信息数据. H5页面微信授权登录,使用微信官方JSSDK,微信网页授权较为复 ...

  2. [小黄书后台]会员管理及微信授权登录

    通过前几章小程序的UI实践,我们小黄书的Home页面已经有一个基本的呈现.但是,所有的数据还都只是mock模拟的数据,还没有任何跟小黄书服务器进行交互的动作. 今天开始,我们会逐步增加小程序和服务器的 ...

  3. 慕课网_《微信授权登录》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:无 学习源码:https://github.com/zccodere/ ...

  4. html5+ mui框架 微信授权登录后跳回app无任何回调事件

    2019独角兽企业重金招聘Python工程师标准>>> 微信授权登录可以调起微信,但是在微信上点击确认登陆后跳回app,但是之后无任何回掉事件. 问题原因: 1 因为我在集成Face ...

  5. thinkphp 微信授权登录 以及微信实现分享

    <?php namespace app\wechat\controller; use think\Controller; use think\Request; /** * 微信授权登录类 * U ...

  6. ios微信登录不上服务器,iOS微信授权登录

    首先需要确保你的App应用在微信开发平台上注册创建并获得对应的接口,对应登录.支付等功能还涉及付费,具体申请流程就不再这里说了.到开放平台->管理中心->移动应用->查看应用,确认你 ...

  7. code换取微信openid_微信授权登录开发的两种方式

    本文主要针对微信公众号(公众平台的开发) 首先理解一个概念:OAuth: OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表), ...

  8. 五行代码搞定微信授权登录

    Authing 通过 SDK 为开发者提供了一种快速在微信网页中获取用户信息并完成登录的方法.如果用户在微信客户端中访问第三方网页.公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑 ...

  9. Java版本微信授权登录(测试版)

    这篇文章是对微信授权登录的一个测试版本,并不能直接在生产上使用,对于在生产上正式使用将会在下一篇中描述. 一,首先需要以下两个数据 appID和appsecret 如何获取这两个数据,请先登录微信公众 ...

最新文章

  1. 服务器修改mime类型,服务器上设置mime类型
  2. Alibaba Cluster Data 开源:270GB 数据揭秘你不知道的阿里巴巴数据中心
  3. SQL中Case when 方法的使用
  4. 传图识字java_Java:全面 清晰的 NIO 学习攻略
  5. 默认构造函数的作用(“A”方法没有采用“0”个参数的重载
  6. java后端简历项目经历_为了面试字节跳动后端开发岗(Java)鬼知道我经历了什么.....
  7. 分享2款XSHELL配色方案及导入配色方案的方法
  8. python和json转换_python和json之间转化
  9. 什么是等保三级?基本流程是什么样的?
  10. 逆向序列号生成算法(三)
  11. 喜报 | 谱尼测试获得零跑科技第三方试验室认可
  12. ssm毕设项目班级网站45nk3(java+VUE+Mybatis+Maven+Mysql+sprnig)
  13. 【数据科学】数据治理与数据认责概述
  14. 51单片机驱动HMI串口屏,串口屏的下载方式
  15. 【85期分享】4款小清新PPT模板免费下载
  16. RocketMQ单机环境搭建测试+springboot整合
  17. 我的保研全过程——推免经验从夏令营到预推免,再到最后填报的全过程记录
  18. 英文简历应该怎么写?一定要有这六大要素
  19. 关于Rstudio中安装R包:“lib“未被指定的问题
  20. 干货:分布式系统学习笔记

热门文章

  1. 图像拼接--Automatic Panoramic Image Stitching using Invariant Features
  2. Linux下使用perf进行性能分析,并导出火焰图
  3. LeetCode 206 Reverse Linked List--反转链表--迭代与递归解法--递归使用一个临时变量,迭代使用3个
  4. linux系统中的日志管理
  5. java随机产生若干个偶数完成求和_java - 创建随机生成器以生成并计算奇数对偶数 - 堆栈内存溢出...
  6. 如何辨别二逼、文艺互联网公司?
  7. 分布式主键解决方案----Twitter 雪花算法的原理(Java 版)
  8. 使用Python+Pycaret进行异常检测
  9. 浅谈python+requests接口自动化框架
  10. 隔壁,阿里18k老测试员常用的 软件测试工具大全