Python中实现微信第三方登录的设计思路

这两天在做利用微信第三方登陆应用网站的接口,查了下资料,说的还是蛮详细的,总结一下。

  1. 进行开发的相关文档基本都在这里: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432,建议大概看下,可以了解到,微信没有提供免费的沙箱环境以供调试本地三方登陆网站。测试号那个也没有提供二维码登陆的调试功能,所以没必要像我再走弯路。

  2. 开发流程开始:

    1. 根据网站应用注册可以获取到 app_id 和 app_secret,这个是在开放平台注册应用时获取到的。

    2. https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 根据这个 url 格式,填写 url 中的各个参数,其中 scope 为 snsapi_login,state 是个随机字符串,可以使用时间,session 等进行加密生成的字符串。

    3. 跳转认证成功之后,会跳转到你的回调地址,你的 url 会多了一个参数 code (前提是参数:response_type=code ),我们需要拿到这个 code 换取网页授权 access_token,https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

    4. 认证后,会返回一个 json,包括 open_id 等信息。可以通过 open_id 获取用户信息,最后就是拿到 json 中的 access_token 和 openid 去获取用户的微信信息数据了。

    网上有很多相关的资料,可以多查查,少走弯路就是提高了效率, 欢迎加群号:902788038 这里有一群可以一起奋斗的小伙伴,也有阅人无数的 HR 小姐姐,希望可以在这里可以收获成长,并找到心仪工作。


Python中实现微信第三方登录的设计思路

15 回复

点开这个帖子之前,我还以为楼主说的会是利用 web 微信的二维码登录呢……


要搞微信第三方登录,核心就三块:OAuth2.0授权、获取用户信息、处理回调。

1. 准备工作 先去微信开放平台注册应用,拿到AppIDAppSecret,设置好授权回调域名(比如www.yoursite.com)。

2. 前端引导授权 用户点击登录时,前端跳转到微信的授权URL:

# 构造授权URL
def get_auth_url(app_id, redirect_uri, state):
    base_url = "https://open.weixin.qq.com/connect/qrconnect"
    params = {
        "appid": app_id,
        "redirect_uri": redirect_uri,
        "response_type": "code",
        "scope": "snsapi_login",  # 网页应用用这个
        "state": state  # 防CSRF
    }
    return f"{base_url}?{urlencode(params)}#wechat_redirect"

3. 后端处理回调 微信会带着codestate跳回你的回调地址,后端需要:

import requests
from flask import request

def wechat_callback():
    code = request.args.get("code")
    state = request.args.get("state")
    
    # 验证state防止CSRF
    if not validate_state(state):
        return "Invalid state", 400
    
    # 用code换access_token
    token_url = "https://api.weixin.qq.com/sns/oauth2/access_token"
    params = {
        "appid": APP_ID,
        "secret": APP_SECRET,
        "code": code,
        "grant_type": "authorization_code"
    }
    resp = requests.get(token_url, params=params).json()
    
    access_token = resp.get("access_token")
    openid = resp.get("openid")
    
    # 获取用户信息
    user_info_url = "https://api.weixin.qq.com/sns/userinfo"
    params = {"access_token": access_token, "openid": openid}
    user_info = requests.get(user_info_url, params=params).json()
    
    # 处理用户登录/注册逻辑
    return handle_user_login(openid, user_info)

4. 用户绑定 如果是首次登录,把微信openid和你系统的用户ID绑定存数据库。下次同一个openid过来就直接登录。

关键点:一定要验证state参数防CSRF,access_token有时效性(2小时),需要处理刷新逻辑。网页应用用snsapi_login,公众号里用snsapi_userinfo

总结:流程就是跳转微信→拿code→换token→取用户信息→绑定本地账号。

我也以为是另辟蹊径的那种登录

骚年,慢慢的你会发现,很多坑.

对。后面坑得我五体投地。

哎,要是有手机的就好了

楼上两位坑都踩光了么

还有内外网问题,当时我可是惨了

能用别人做好的库就别自己写,坑太多

好像说的就是的吧

移动端的开发也在日程中了

内外网,我用的是 natapp,网上教程很多,可以试试。

不一样,我说的不需要 app_id、app_secret

小程序出来后就没碰微信开发了,贴一下常规外的方案:

可以用认证服务号的参数二维码
可以被动获得 openid/unionid

當初坑太多,然後就改用現成的了,要求不高,能用就行啦

回到顶部