zoukankan      html  css  js  c++  java
  • 我的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'

           其中我们需要自己确定好的参数有:appidredirect_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)

            其中我们需要的参数有appidsecretcode。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,从而验证的这个验证或者绑定的过程就可以完成。

            当然,如果你想要更加合理无误的话,却是需要更加复杂和完善的操作。

            

  • 相关阅读:
    Shell: 定期存档日志文件
    canva实践小实例 —— 马赛克效果
    canvas API ,通俗的canvas基础知识(五)
    canvas实践小实例二 —— 扇形
    canvas API ,通俗的canvas基础知识(四)
    canvas实践小实例一 —— 画板工具
    canvas API ,通俗的canvas基础知识(三)
    canvas API ,通俗的canvas基础知识(二)
    canvas API ,通俗的canvas基础知识(一)
    JavaScript小实例:拖拽应用(二)
  • 原文地址:https://www.cnblogs.com/sqz2671/p/7156541.html
Copyright © 2011-2022 走看看