微信授权登录获取用户信息_python

严宏旷
2023-12-01

官方文档梳理

"""
一:微信官方登录页面
1。用户请求
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

appid:''
scope: "snsapi_login"
redirect_url   :请使用urlEncode对链接进行处理
response_type: 'code'
2.用户授权后,回调地址带code和state


二:网站内集成微信登录二维码
1.引入js
http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
2.实例js对象
var obj = new WxLogin({
 self_redirect:true,
 id:"login_container", #页面显示二维码的容器id
 appid: " ",
 scope: "snsapi_login",
 redirect_uri: "",
  state: "",
 style: "",
 href: ""
 });


三;code换access_token
请求页面:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

appid :' '
secret	:	应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code	:	第一二步回调地址返回的code
grant_type : authorization_code


respone:
{
"access_token":"ACCESS_TOKEN",   接口调用凭证
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",  	access_token接口调用凭证超时时间, 单位(秒)
"openid":"OPENID",              授权用户唯一标识
"scope":"SCOPE",                用户授权的作用域(需求),使用逗号(,)分隔
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"   当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段
}


2.刷新access_token有效期

1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。


https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

appid:
grant_type:refresh_token
#refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
refresh_token:刷新上一步返回的refresh_token长效凭证时间



四:通过access_token调用用户信息snsapi_userinfo

http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

access_token :调用凭证
openid		: 普通用户的标识,对当前开发者帐号唯一
lang		: 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN


respone:
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" : 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的

}



沙箱环境入口



小程序有测试号系统沙盒环境:

测试号管理 | 微信公众平台

https://developers.weixin.qq.com/sandbox

公众号开发也有测试号沙盒环境

微信公众平台

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

"""

代码:

import requests

from Bas import settings


class Wxlogin_info():
    # 微信开发者id
    appid = settings.AppID_wx
    appsecret = settings.AppSecret_wx

    # code=''
    # state=''
    def get_info(self):
        # 1.获取code,和state
        try:
            #
            self.code = self.request.GET.get('code')
            self.state = self.request.GET.get('state')
        except Exception as  e:
            print("获取参数code,state错误", e)
        # 2.code换access_token

        try:
            # https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
            access_url = 'https://api.weixin.qq.com/sns/oauth2/access_token'
            params = {
                'appid': self.appid,
                'secret': self.appsecret,
                'code': self.code,
                'grant_type': 'authorization_code'
            }
            # 请求re_url,将返回的数据序列化
            res = requests.get(access_url, params=params).json()
            # 获取access_token
            #global access_token
            access_token = res['access_token']
            # 获取unionid。
            #global unionid
            unionid = res['unionid']
            #
            #global openid
            openid = res['openid']
            # 长效凭证
            #global refresh_token
            refresh_token = res['refresh_token']
        except Exception as e:
            print("获取参数access_token错误",e)

        # 3.刷新refresh_token长效凭证过期,通过access_token获取的refresh_token
        try:
            # https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
            re_url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token'
            params = {
                'appid': self.appid,
                'grant_type': 'authorization_code',
                'refresh_token': refresh_token
            }
            # 请求re_url,将返回的数据序列化
            res = requests.get(re_url, params=params).json()
            # 获取新的长效凭证
            refresh_token_new = res['refresh_token']
        except Exception as e:
            print("获取参数错误refresh_token",e)
        # 4。获取用户信息
        try:
            # https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
            user_info_url = 'https://api.weixin.qq.com/sns/userinfo'
            params = {
                'access_token': access_token,
                'openid': openid
            }
            res = requests.get(user_info_url, params=params).json()
            #global user_info
            user_info = []
            # 遍历dict中的所有value
            for value in res.values():
                # 将iso8859-1码转换成utf-8
                value = value.encode('iso8859-1').decode('utf-8')
                user_info.append(value)
        except Exception as e:
            print("获取用户信息失败",e)

        return unionid, user_info
 类似资料: