Python第三方微信登录教程

"""
作者:阳光男孩
时间:2020/10/10
功能:网站应用微信登录V1.0
邮箱:[email protected]
对此文的贡献者:阳光男孩、万叔的python吃瘪路。

微信官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
必看:看着官方文档一点一点来,一点一点啃,咬着牙抓着脑袋干就完了。微信授权登录比apple授权登录简单多了,后续小编还会更新apple登录参考代码。
unionid 和 openid 是唯一标识,都可作为判定与系统账号绑定逻辑。

准备工作
网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

授权流程说明
微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
"""

# 第一步:请求CODE
"""
微信登录接受code和state参数
    appid 	        是 	应用唯一标识
    redirect_uri 	是 	请使用urlEncode对链接进行处理
    response_type 	是 	填code
    scope 	        是 	应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即
    state 	        否 	用于保持请求和回调的状态,授权请求后原样带回给第三方。
                        该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,
                        可设置为简单的随机数加session进行校验
"""
import requests
# 生成微信登录获取code链接
get_code_url = 'https://open.weixin.qq.com/connect/qrconnect?appid=你的APPID&redirect_uri=你的回调地址%2f&response_type=code&scope=snsapi_login&state=STATE'


def WxLogin():
    api_AppID = '你的APPID'
    api_AppSecret = '你的api_AppSecret'
    # 注意!!!! code是前端工程师或APP工程师请求获取到的/用户扫码同意登录获得code,需要传送后端,我们后端工程师只需要想办法接受code即可,不用管他们怎么拿到。
    code = '071nPHGa1QlCMz0vxxJa1guDxX1nPHGf'  # 用户扫码同意登录后获取code
    # 第二步:通过code获取access_token
    # 获取access_token 利用format()填充API
    get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code'.format(
        api_AppID, api_AppSecret, code)
    # 请求API返回json数据
    token_data = requests.get(get_token_url).json()
    print('>>>>>>>>>>>>>>>>>>>>微信token:', token_data)
    # 取得token,判断token是否可用 防止微信授权登录参数更新,进行更有效的判断保障。
    if len(token_data) > 3:
        refresh_token = token_data['refresh_token']  # 刷新token参数
        refresh_url = u'https://api.weixin.qq.com/sns/oauth2/refresh_token'
        params = {
    
    
            'appid': api_AppID,
            'grant_type': 'refresh_token',
            'refresh_token': refresh_token,
        }
        # 向微信发起请求,刷新access_token有效期.防止token过期。
        new_token_data = requests.get(refresh_url, params=params).json()
        print('********************刷新token得到的新token数据:', new_token_data)
        new_access_token = new_token_data['access_token']
        new_openid = new_token_data['openid']
        # 第三步: 获取用户个人信息(UnionID机制)
        user_info_url = 'https://api.weixin.qq.com/sns/userinfo'
        params = {
    
    
            'access_token': new_access_token,
            'openid': new_openid,
            'lang': 'zh_CN'
        }
        # 取得用户的微信信息
        """
        接口说明
        此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。
        """
        user_info_data = requests.get(url=user_info_url, params=params).json()
        user_openid = user_info_data['openid']  # 普通用户的标识,对当前开发者帐号唯一
        user_unionid = user_info_data['unionid']  # 用户的unionid是唯一的
        user_nickname = user_info_data['nickname']  # 普通用户昵称
        # 微信返回的是iso-8859-1码,需要转换。
        user_username = user_info_data['nickname'].encode('iso-8859-1').decode('utf8')
        user_province = user_info_data['province'].encode('iso-8859-1').decode('utf8')
        user_city = user_info_data['city'].encode('iso-8859-1').decode('utf8')
        user_county = user_info_data['country'].encode('iso-8859-1').decode('utf8')


WxLogin()

猜你喜欢

转载自blog.csdn.net/weixin_44053341/article/details/108994289