python实现网站微信登录的示例代码


Posted in Python onSeptember 18, 2019

最近微信登录开放公测,为了方便微信用户使用,我们的产品也决定加上微信登录功能,然后就有了这篇笔记。

根据需求选择相应的登录方式

python实现网站微信登录的示例代码

微信现在提供两种登录接入方式

  • 移动应用微信登录
  • 网站应用微信登录

这里我们使用的是网站应用微信登录

按照 官方流程

1 注册并通过开放平台开发者资质认证

注册微信开放平台帐号后,在帐号中心中填写开发者资质认证申请,并等待认证通过。

2 创建网站应用

通过填写网站应用名称、简介和图标,以及各平台下载地址等资料,创建网站应用

3 接入微信登录

在资源中心查阅网站应用开发文档,开发接入微信登陆功能,让用户可使用微信登录你的网站应用

如果已经完成上面的操作,请继续往下看

微信网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。

微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

  1.  第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  2.  通过code参数加上AppID和AppSecret等,通过API换取access_token;
  3.  通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

具体流程请参考官方文档,我们这里只说一下python的实现方法。官方文档地址 点这里

参考python-instagram 我写了一个python-weixin (https://github.com/zongxiao/python-weixin)一个微信python SDK

不过现在还只有微信接入、获取用户信息、 刷新refresh_token 等简单功能

首先 需要把代码clone到本地

然后执行

python setup.py install

使用方式非常简单

from weixin.client import WeixinAPI

APP_ID = 'your app id'
APP_SECRET = 'your app secret'
REDIRECT_URI = 'http://your_domain.com/redirect_uri' # 这里一定要注意 地址一定要加上http/https

scope = ("snsapi_login", )
api = WeixinAPI(appid=APP_ID,
      app_secret=APP_SECRET,
      redirect_uri=REDIRECT_URI)

authorize_url = api.get_authorize_url(scope=scope)

现在将

authorize_url 地址在浏览器打开, 将跳转到微信登录页面,使用手机扫码登录后将跳转到
http://your_domain.com/redirect_uri?code=CODE&state=STATE 页面

现在我们就可以使用code 来获取登录的 access_token

access_token = api.exchange_code_for_access_token(code=code)

access_token 信息为

{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE" 
}

参数 说明
access_token 接口调用凭证(有效期目前为2个小时)
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token(有效期目前为30天)
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔

获取access_token后,就可以进行接口调用,有以下前提:

  1.  access_token有效且未超时;
  2.  微信用户已授权给第三方应用帐号相应接口作用域(scope)。

对于接口作用域(scope),能调用的接口有以下:

授权作用域(scope) 接口 接口说明
snsapi_base /sns/oauth2/access_token 通过code换取access_token、refresh_token和已授权scope
/sns/oauth2/refresh_token 刷新或续期access_token使用
/sns/auth 检查access_token有效性
snsapi_userinfo /sns/userinfo 获取用户个人信息
api = WeixinAPI(appid=APP_ID,
    app_secret=APP_SECRET,
    redirect_uri=REDIRECT_URI)

# 刷新或续期access_token使用
refresh_token = api.exchange_refresh_token_for_access_token(refresh_token=auth_info['refresh_token'])

api = WeixinAPI(access_token=auth_info['access_token'])

# 获取用户个人信息
user = api.user(openid=auth_info['openid'])

# 检查access_token有效性
v = api.validate_token(openid=auth_info['openid'])

现在就微信登录就完成了

下面是用 flask 实现的完整的例子

from flask import Flask
from flask import Markup
from flask import redirect
from flask import request
from flask import jsonify

from weixin.client import WeixinAPI
from weixin.oauth2 import OAuth2AuthExchangeError

app = Flask(__name__)

APP_ID = 'appid'
APP_SECRET = 'app secret'
REDIRECT_URI = 'http://localhost.com/authorization'


@app.route("/authorization")
def authorization():
 code = request.args.get('code')
 api = WeixinAPI(appid=APP_ID,
     app_secret=APP_SECRET,
     redirect_uri=REDIRECT_URI)
 auth_info = api.exchange_code_for_access_token(code=code)
 api = WeixinAPI(access_token=auth_info['access_token'])
 resp = api.user(openid=auth_info['openid'])
 return jsonify(resp)


@app.route("/login")
def login():
 api = WeixinAPI(appid=APP_ID,
     app_secret=APP_SECRET,
     redirect_uri=REDIRECT_URI)
 redirect_uri = api.get_authorize_login_url(scope=("snsapi_login",))
 return redirect(redirect_uri)


@app.route("/")
def hello():
 return Markup('<a href="%s" rel="external nofollow" >weixin login!</a>') % '/login'

if __name__ == "__main__":
 app.run(debug=True)

参考链接:

微信网站应用接入文档 

网站应用创建地址

python-weixin github 地址  https://github.com/zongxiao/python-weixin

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过定义一个类实例作为ftp回调方法
May 04 Python
python生成器generator用法实例分析
Jun 04 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
Python实现的快速排序算法详解
Aug 01 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
python实现媒体播放器功能
Feb 11 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
实现Python与STM32通信方式
Dec 18 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
方法汇总:Python 安装第三方库常用
Apr 26 Python
简单了解python中的与或非运算
Sep 18 #Python
python字符串替换re.sub()方法解析
Sep 18 #Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 #Python
用Python写一个自动木马程序
Sep 17 #Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 #Python
Python中*args和**kwargs的区别详解
Sep 17 #Python
python SocketServer源码深入解读
Sep 17 #Python
You might like
PHP 输出简单动态WAP页面
2009/06/09 PHP
php下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
python3实现猜数字游戏
2020/12/07 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
django admin组件使用方法详解
2019/07/19 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
作弊检讨书
2015/01/27 职场文书
小学教师自我评价
2015/03/04 职场文书
2015年志愿者服务工作总结
2015/04/20 职场文书
中国合伙人观后感
2015/06/02 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server