另外一个账号出现一些问题,所以想在改用这个。
刚开始接触微信这方面,了解的还不够全面,写写自己的认识,希望不要见怪。既来之则安之。首先,我们要对微信开发有一个基础的概念。
有这么一个基础的认知后,我们再开始接下来要做的。
最基础的流程:
二维码是一个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是你们,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)
因为微信开发这方面是刚开始接触,而且是自学,我按照自己理解所想写的一段流程代码
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' #
29 self.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,从而验证的这个验证或者绑定的过程就可以完成。
当然,如果你想要更加合理无误的话,却是需要更加复杂和完善的操作。