需要了解的几个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

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

python flask获取微信用户信息流程 Python 第1张

下图为scope等于snsapi_userinfo时的授权页面:

python flask获取微信用户信息流程 Python 第2张

 

 

用户同意授权后访问的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)

python flask获取微信用户信息流程 Python 第3张

我这里用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") def index(): """让用户微信访问的网页页面视图""" # 从微信服务器中拿取用户 的资料 # 1.拿取code参数 code = request.args.get("code") # print(1, code) if not code: 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" in resp_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" in user_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; } }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄