Python中如何实现微信内授权登录功能?

看了微信的文档,迷迷糊糊的,登录方式有好多种,搞迷糊了
我想实现的是 公众号内点底部链接 然后需要微信授权,授权成功后就能访问具体页面了
另外有没有适合 django 的微信开发库呢
Python中如何实现微信内授权登录功能?

17 回复

参阅公众号开发文档微信网页授权一栏,具体做法是点击之后跳转到微信授权链接,用户授权后会自动重定向到授权链接接中的 redirect_url 并带上 code,浏览器拿到 code 之后传给服务器换取 accesstoken,到这里就算是授权成功了


要搞微信内授权登录,核心就是走OAuth 2.0那套流程。我给你个Flask的完整例子,用requestsitsdangerous处理会话。

from flask import Flask, redirect, request, session, jsonify
import requests
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
import json

app = Flask(__name__)
app.secret_key = 'your-secret-key-here'  # 换成你的密钥

# 微信配置
WECHAT_APPID = '你的AppId'
WECHAT_SECRET = '你的AppSecret'
REDIRECT_URI = 'http://你的域名/wechat/callback'  # 授权回调地址

@app.route('/wechat/login')
def wechat_login():
    """第一步:引导用户到微信授权页面"""
    auth_url = (
        f"https://open.weixin.qq.com/connect/oauth2/authorize?"
        f"appid={WECHAT_APPID}&"
        f"redirect_uri={REDIRECT_URI}&"
        f"response_type=code&"
        f"scope=snsapi_userinfo&"  # 需要用户信息时用snsapi_userinfo
        f"state=STATE#wechat_redirect"
    )
    return redirect(auth_url)

@app.route('/wechat/callback')
def wechat_callback():
    """第二步:处理微信回调,获取access_token和用户信息"""
    code = request.args.get('code')
    
    if not code:
        return "授权失败: 未收到code", 400
    
    # 用code换access_token
    token_url = (
        f"https://api.weixin.qq.com/sns/oauth2/access_token?"
        f"appid={WECHAT_APPID}&"
        f"secret={WECHAT_SECRET}&"
        f"code={code}&"
        f"grant_type=authorization_code"
    )
    
    resp = requests.get(token_url).json()
    
    if 'errcode' in resp:
        return f"获取token失败: {resp}", 400
    
    access_token = resp['access_token']
    openid = resp['openid']
    
    # 获取用户信息
    user_url = (
        f"https://api.weixin.qq.com/sns/userinfo?"
        f"access_token={access_token}&"
        f"openid={openid}&"
        f"lang=zh_CN"
    )
    
    user_info = requests.get(user_url).json()
    
    if 'errcode' in user_info:
        return f"获取用户信息失败: {user_info}", 400
    
    # 生成会话token(实际项目这里要存数据库)
    s = Serializer(app.secret_key, expires_in=3600)
    session_token = s.dumps({'openid': openid}).decode('utf-8')
    
    # 返回用户信息和token
    return jsonify({
        'user_info': user_info,
        'session_token': session_token
    })

if __name__ == '__main__':
    app.run(debug=True, port=5000)

流程说明:

  1. 用户访问/wechat/login,跳转到微信授权页
  2. 用户授权后,微信回调到/wechat/callback并带上code
  3. 用code向微信换access_token和openid
  4. 用access_token获取用户基本信息
  5. 生成自己的会话token返回给前端

关键点:

  • 微信内授权必须用scope=snsapi_userinfosnsapi_base
  • 回调地址要在微信后台配置好
  • access_token有效期很短(7200秒),需要时再获取
  • 实际项目要把用户信息和openid关联存数据库

总结:核心就是OAuth 2.0授权码流程,处理好回调即可。

PHP 我倒是自己二次封装了一版…

需要说明的是,服务器用浏览器传过来的 code 向微信服务器换取到的 accesstoken 以及 openid 等不应该传回给客户端浏览器

微信授权有不同类别,有需要用户手动点击同意的,也有直接通过的,能访问到的信息不同,但都是 OAuth,跳到微信的一个网址即可。

php 的话我推荐 overture 的。。。Python 的。。。不知道,也许是个自己造轮子的机会?

python 有不止一个轮子,以关键词 django wechat 搜出来一堆结果😂

公众号内点底部链接的情况,如果是服务号
1. 已关注用户:可以直接获取
2. 未关注的情况下,如果要详细资料需要授权
3. 如果只获取 openid 来区分唯一用户不需要点击授权

如果是订阅号:不行,但你可以配置一个第三方的服务号,通过 unionid 关联到当前订阅号

造个轮子并不难,时间多的话可以试试,还是比较有乐趣的。

兄弟 搜不到啊

做过一次 感觉轮子没啥用处…… 看不懂文档很多地方还是迷迷糊糊的,要给公账号设置一堆东西,文档不看这些东西就混了,文档能看明白 SDK 也没啥用了。

所以还是老老实实看文档,虽然文档确实屎一样…… 静下心来慢慢看

你要的可能是一个单点登录系统…

或者只是在微信客户端中打开你的网页,微信客户端打开的网页需要指明授权级别,基础授权和用户信息授权。
其中 用户信息授权会弹出一个是否信任该网页(类似的意思),选择了是那么你就可以使用微信给你的该账号与你的公众号绑定生成的 openId 你可以依据这个 openId + 应用 Token+AppId 可以获得用户的一些基本信息,包括但不限于微信头像和微信昵称等

对的,就是文档迷迷糊糊的…好多地方摸不着头脑 公众号后面也要设置很多东西…另外这个该如何在本地调试呢?我看回调函数都要从固定域名发起…

我是在 vps 上开发的…… 看有的人好像是申请两个微信号,一个测试用,设置 host,本地通过域名访问

先把逻辑理清楚 , 所谓微信登录其实只是借助微信验证用户合法性 主要流程如下:
网站->微信登录->成功->发放登录凭证(session/token)

#11 反向代理 , 本地起一个 ngrok 或者 huashengke

这儿有现成的:
https://github.com/aiportal/wechat-proxy

你所要做的仅仅是把用户的请求跳转到:/app/test/auth?call=…&state=&lang=
call 参数就是你最终接收用户 openid 的网址。

非常感谢,研究了一天终于搞明白了,在回调域名那坑了 3 个多小时,最后还是搞出来了

回到顶部