我的Python开发之路---微信网页授权(扫码登陆)
另外一个账号出现一些问题,所以想在改用这个。
刚开始接触微信这方面,了解的还不够全面,写写自己的认识,希望不要见怪。既来之则安之。首先,我们要对微信开发有一个基础的概念。
具体请查看:微信公众平台中的微信网页授权
有这么一个基础的认知后,我们再开始接下来要做的。
最基础的流程:
二维码是一个url,我们扫描的过程就是一个访问的过程,这个url就是我们已经搭建好的服务器地址,经过urls.py这样一个url、后台处理模块相对应的过程,
我们开始正式进行网页授权。
第一步:用户同意授权,获取code
也就是访问这个url ='https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_url}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect'
其中我们需要自己确定好的参数有:appid、redirect_url。appid是你们公众号的appid,redirect_url是我们访问上方这个url之后获取到code,处理code的这样一个回调连接。
这里给大家提供一个简单的书写方式:
1 url_tpl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_url}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect' 2 url = url_tpl.format(appid=appid, redirect_url=redirect_url)
需要注意的是:
1、用户同意授权后,跳转的页面是redirect_url所连接的页面。
2、code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
第二步:通过code换取网页授权access_token
也就是同上的访问这个url_tpl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code'
url = url_tpl.format(appid=config.WEIXIN['appid'], secret=config.WEIXIN['secret'], code=code)
其中我们需要的参数有appid、secret、code。appid是公众号的appid, secret公众号的appsecret,code就是我们第一步操作所获取的code。
因为微信开发这方面是刚开始接触,而且是自学,我按照自己理解所想写的一段流程代码
1 # -*- encoding:utf-8-*- 2 3 # vim: set ts=4 et sw=4 sts=4 fileencoding=utf-8 : 4 5 import os 6 import sys 7 import logging 8 import time 9 from zbase.web import core 10 from zbase.web import template 11 from zbase.base.dbpool import with_database 12 import json 13 import config 14 import urllib2 15 import MySQLdb 16 17 log = logging.getLogger() 18 19 20 # 1 第一步:用户同意授权,获取code 21 # 2 第二步:通过code换取网页授权access_token 22 # 3 第三步:刷新access_token(如果需要) 23 # 4 第四步:拉取用户信息(需scope为 snsapi_userinfo) 24 # 5 附:检验授权凭证(access_token)是否有效 25 26 class Visit_User: 27 def __init__(self): 28 self.appid = 'appid' # 公众号appid 29 self.secret = 'secret' # 公众号secret 30 self.redirect_url = 'http://api.uyu.com/v1/wx/user_auth' # 回调地址 31 32 def Visit_Url(self, url): # 每次访问链接 33 try: 34 result = urllib2.urlopen(url).read() 35 return result 36 except urllib2.HTTPError, e: 37 print e.code 38 except urllib2.URLErrror, e: 39 print str(e) 40 41 def Get_Code(self): # 1 第一步:用户同意授权,获取code 42 get_code_url = 'https://open.weixin.qq.com/sns/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect' % ( 43 self.appid, self.redirect_url) 44 code = self.Visit_Url(get_code_url) 45 if code: 46 return code 47 else: 48 print "Failure to obtain results" 49 50 def Get_Access_token(self): # 2 第二步:通过code换取网页授权access_token 51 code = self.Get_Code() 52 get_access_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code' % ( 53 self.appid, self.secret, code) 54 acc_token = self.Visit_Url(get_access_url) 55 if acc_token["errcode"]: 56 pass 57 if acc_token["access_token"]: 58 # access_token = json.loads(access_token) 59 access_token = acc_token["access_token"] 60 expires_in = acc_token["expires_in"] 61 refresh_token = acc_token["refresh_token"] 62 openid = acc_token["openid"] 63 scope = acc_token["scope"] 64 return access_token, openid, refresh_token 65 66 def Refresh_Access_token(self): # 3 第三步:刷新access_token(如果需要) 67 yu_zu = self.Get_Access_token() 68 refresh_token = yu_zu[2] 69 new_access_url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s' % ( 70 self.appid, refresh_token) 71 new_acc_token = self.Visit_Url(new_access_url) 72 if new_acc_token["errcode"]: 73 pass 74 if new_acc_token["access_token"]: 75 # access_token = json.loads(access_token) 76 access_token = new_acc_token["access_token"] 77 expires_in = new_acc_token["expires_in"] 78 refresh_token = new_acc_token["refresh_token"] 79 openid = new_acc_token["openid"] 80 scope = new_acc_token["scope"] 81 return access_token, openid 82 83 def Verify_Access_token(self): # 验证access_token是否有效 84 yu_zu = self.Refresh_Access_token() 85 access_token = yu_zu[0] 86 openid = yu_zu[1] 87 verify_url = 'https://api.weixin.qq.com/sns/auth?access_token=%s&openid=%s ' % ( 88 access_token, openid) 89 verify = self.Visit_Url(verify_url) 90 if verify["error"] == 0: 91 print "Succeed!!!" 92 return access_token, openid 93 else: 94 pass 95 96 def Get_Message(self): # 4 第四步:拉取用户信息(需scope为 snsapi_userinfo) 97 yu_zu = self.Verify_Access_token() 98 access_token = yu_zu[0] 99 openid = yu_zu[1] 100 user_message_url = 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN' % ( 101 access_token, openid) 102 user_message = self.Visit_Url(user_message_url) 103 openid = user_message["openid"] 104 global openid 105 nickname = user_message["nickname"] 106 sex = user_message["sex"] 107 province = user_message["province"] 108 city = user_message["city"] 109 country = user_message["country"] 110 openheadimgurlid = user_message["headimgurl"] 111 privilege = user_message["privilege"] 112 unionid = user_message["unionid"] 113 return openid, nickname, sex, province, city, country, openheadimgurlid 114 115 def Insert_db(self): 116 pass 117 118 119 120 class Query_User_Tel: 121 def __init__(self, tel): 122 self.openid = openid 123 self.tel = tel 124 self.conn = MySQLdb.connect( 125 host='localhost', 126 user='root', 127 passwd='123456', 128 db='test', 129 port=3306 130 ) 131 132 def Judge_user(self): 133 try: 134 # conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='shang', port=3306) 135 cur = self.conn.cursor() 136 cur.execute('select * from register WHERE Openid=%s ' % self.openid) 137 rows = cur.fetchall() 138 if rows: 139 return True 140 else: 141 print "Please register with the registration page" 142 cur.close() 143 self.conn.close() 144 except MySQLdb.Error, e: 145 print "Mysql Error %d: %s" % (e.args[0], e.args[1]) 146 147 def Judge_tel(self): 148 try: 149 # conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='shang', port=3306) 150 cur = self.conn.cursor() 151 cur.execute('select * from register WHERE Tel=%s ' % self.tel) 152 rows = cur.fetchall() 153 if rows: 154 return True 155 else: 156 print "Please enter the telephone number again" 157 cur.close() 158 self.conn.close() 159 except MySQLdb.Error, e: 160 print "Mysql Error %d: %s" % (e.args[0], e.args[1])
View Code
一开始我是以为所有步骤都要走一遍,后来发现在我所做的实际操作里我只需要获取到openid就可以,换而言之就是我只需要用过code换区网页授权access_token,从中拿到openid,从而验证的这个验证或者绑定的过程就可以完成。
当然,如果你想要更加合理无误的话,却是需要更加复杂和完善的操作。
转载于:https://www.cnblogs.com/sqz2671/p/7156541.html
我的Python开发之路---微信网页授权(扫码登陆)相关推荐
- vue开发本地调试微信网页授权
vue开发本地调试微信网页授权 相关信息: 微信开发者工具 vue-cli3 1.修改hosts文件 这里可能会遇到无法修改的问题,可以通过修改权限或管理员权限打开修改 修改用户权限的操作如下: 修改 ...
- 网页版微信和微信公共号扫码登陆原理分析
看到知乎上有关于微信扫码登陆原理的讨论.现将自己的分析结果写出来,供大家参考,不正确的地方望指正. 用户打开网页版微信: https://wx.qq.com/,微信为用户生成了一张包含uuid的二维码 ...
- Java微信公众平台开发(十六)--微信网页授权(OAuth2.0授权)获取用户基本信息
转自:http://www.cuiyongzhi.com/post/78.html 好长时间没有写文章了,主要是最近的工作和生活上的事情比较多而且繁琐,其实到现在我依然还是感觉有些迷茫,最后还是决定静 ...
- java实现简单扫码登录功能(模仿微信网页版扫码)
java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端 ...
- 提问:微信网页授权到第三方调用错误、调用微信公众号扫码登陆错误、微信SCOP权限错误或没有权限
总结: 调用微信扫码,但是微信返回提示SCOP错误,我的微信公众号认证了,也把对应的域名填写了,代码上填写的snsapi的路径是填写在对用网页授权域名下的路径. 错误原因: 应该是微信公众号上的配置错 ...
- [微信] 微信网页版扫码登录的实现
我们先来回顾一下微信网页版的扫码登录过程 1. 打开微信网页版,https://wx.qq.com/ 2. 打开手机微信客户端,扫一扫 3. 点击确定,登录 看似简单的操作流程,中间涉及的数据交互有很 ...
- 微信公众号开发——实现用户微信网页授权流程
- java实现扫码微信登录_java实现简单扫码登录功能(模仿微信网页版扫码)
public class PoolCache { // 缓存超时时间 10分钟 private static Long timeOutSecond = 10 * 60 * 1000L; // 每半小时 ...
- 微信授权Java重定向前端地址_微信网页授权+分享踩过的坑
页面用浏览器自带返回和安卓物理返回死循环的话,直接看高潮部分 背景 折磨我两个工作日加周末一天的问题,我觉得还是有必要记录一下,为什么程序员总是加班,就是遇到这些意想不到的问题 需求 领导:我想做两个 ...
- iOS 11.3 显示:Apple ID 或将实现微信式扫码登陆
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 据外媒 9to5mac 近日报道,苹果似乎在筹备基于 "iCloud 个人数据&q ...
最新文章
- laravel中查看执行的SQL语句
- mysql中varchar 大小写敏感问题
- No module named 'numpy.core._multiarray_umath'
- WINCE基于hive注册表的实现
- IL入门之旅(三)——Dump对象
- (chap6 Http首部) 请求首部字段 RefererTE User-Agent
- 产品经理需要去客服部门轮岗吗?
- 《极乐迪斯科》:醉鬼神探的深邃人生
- 台式电脑如何截屏_买台式电脑如何避免成为被宰羔羊(一)
- python 迭代器相关知识
- 696.计数二进制子串(力扣leetcode) 博主可答疑该问题
- LT8619B 产品功能概述 HDMI1080P转BT1120
- 【超级干货必看】如何从零开始学PCB设计?
- win7 install solution for intel SKL and BSW platform
- hadoop基础----hadoop理论(四)-----hadoop分布式并行计算模型MapReduce详解
- ISTQB基础级考试资料汇总
- 网页JS弹出广告代码,头部,右下角,网页中漂浮,对联广告代码等大全
- 什么是arp攻击?arp攻击的解决方法有哪些?
- 小米蓝牙耳机怎么选?适合小米手机的蓝牙耳机推荐
- \t\t有一种女人嫁给谁都幸福
热门文章
- LINUX虚拟机安装增强功能时报错:/sbin/mount.vboxsf: mounting failed with the error: No such device
- SHEL脚本中调用另外一个脚本的函数和变量
- 无锡公交也有两套支付
- 在白宫,郎朗为什么选择了《我的祖国》
- 管理感悟:不要问没经过思考的问题
- php一小时入门,php3小时快速入门-读书笔记
- linux搭建git服务
- VC++字符串类型转换
- phython在file同时写入两个_Python实现读取excel写入mysql的小工具详解
- 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)【转】...