需要了解的几个url
用户第一次访问时的url,包含以下几个参数
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http%3A//www.example.com/wechat8008/index&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
下图为scope等于snsapi_userinfo时的授权页面:
用户同意授权后访问的url,该url会访问你的视图函数
http://www.example.com/wechat8008/index?code=021ci0np18bW0j0IpHnp1eXGmp1ci0ns&state=1
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
以上是同意授权的示例url,该url会访问你的视图函数,只需要留意获取code参数
通过code换取网页授权access_token的请求url
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
该url包含4个参数:
其中appid和secret在填写你自己公众号设置里的的实际参数,
code是前面访问时带过来的url参数,获取之code = request.args.get("code")
grant_type=authorization_code固定写法
url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code" % (WECHAT_APPID, WECHAT_APPSECRET, code)
我这里用urllib2发送请求 response = urllib2.urlopen(url)
返回值为一个响应体数据,解析之resp_dict = json.loads(response.read())
正确时返回的JSON数据包如下:
{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"snsapi_userinfo"}
拉取用户信息时的请求url
https://api.weixin.qq.com/sns/userinfo?access_token=access_token&openid=open_id&lang=zh_CN
该url包含3个参数:
access_token是上一步请求返回的参数,提取之 access_token = resp_dict.get("access_token")
open_id同上open_id = resp_dict.get("openid")
语言lang=zh_CN
url = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN" %(access_token, open_id)
同样用urllib2发送请求
response = urllib2.urlopen(url)
返回值
正确时返回的JSON数据包如下:
{"openid":"OPENID","nickname": NICKNAME,"sex":"1","province":"PROVINCE"
"city":"CITY","country":"COUNTRY","headimgurl":"http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","privilege":["PRIVILEGE1"
"PRIVILEGE2"],"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
这里就可以根据自己的需求使用用户信息了。
视图函数代码
from flask import Flask, request, abort, render_template
import hashlib
import xmltodict
import time
import urllib2
import json
WECHAT_TOKEN = "python"
WECHAT_APPID = "wxe123456789"
WECHAT_APPSECRET = "123456789"
app = Flask(__name__)
#www.example.com/wechat8008/index
@app.route("/wechat8008/index")defindex():"""让用户微信访问的网页页面视图"""
#从微信服务器中拿取用户 的资料
#1.拿取code参数
code = request.args.get("code")#print(1, code)
if notcode:return u"缺失code参数"
#2.向微信服务器发送http请求,获取access_token
url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code" %\
(WECHAT_APPID, WECHAT_APPSECRET, code)#使用urllib2的urlopen方法发送请求
#如果只传网址url参数,则默认使用http的get请求方式,返回响应对象
response =urllib2.urlopen(url)#获取响应体数据,微信返回的json数据
json_str =response.read()
resp_dict=json.loads(json_str)#print(2, resp_dict)
#提取access_token
if "errcode" inresp_dict:return u"获取acces_token失败"access_token= resp_dict.get("access_token")
open_id= resp_dict.get("openid") #用户的编号
#3.向微信服务器发送http请求,获取用户信息
url = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN" %\
(access_token, open_id)
response=urllib2.urlopen(url)#读取微信传回的json的响应体数据
user_json_str =response.read()
user_dict_data=json.loads(user_json_str)#print(user_dict_data)
if "errcode" inuser_dict_data:return u"获取用户信息失败"
else:#将用户的资料数据填充到页面中
return render_template("index.html",user=user_dict_data)if __name__ == '__main__':
app.run(port=8008, debug=True)
需要注意的是,微信只认域名和80端口。如果你80端口已被占用,可用nginx转发一下
server {#监听80端口
listen 80;#本机
server_name localhost;location/wechat8008 {
proxy_pass http://127.0.0.1:8008;
}
}