/ 技术 / 89浏览

企业微信|Flask 网页授权登录API

首先,我们要知道企业微信网页授权登录的原理。

企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。
企业应用中的URL链接(包括自定义菜单或者消息中的链接),均可通过OAuth2.0验证接口来获取成员的UserId身份信息。

最开始,我们需要在Flask App中定义参数:

WECHAT_CORP_ID = '你的企业ID'
WECHAT_CORP_SECRET = '你的应用Secret'
WECHAT_REDIRECT_URI = '你的登录URL'  # 例如 http://gongzk.com/callback

# 引入 from flask_caching import Cache
cache = Cache(app)

而后,定义一个统一返回函数:

# 引入 from flask import Flask, request, jsonify
def Result(code=500,message='error',data=[]):
    json_dict = {
        'code':code,
        'message':message,
        'data':data
    }
    return jsonify(json_dict)

构造企业微信网页授权登录链接函数:

@app.route('/api/wework/oauth')
def wechat_login():
    url = request.args.get('url')
    wechat_auth_url = (
        f"https://open.weixin.qq.com/connect/oauth2/authorize"
        f"?appid={WECHAT_CORP_ID}"
        f"&redirect_uri={WECHAT_REDIRECT_URI}"
        f"&response_type=code"
        f"&scope=snsapi_userinfo"
        f"&state={url}#wechat_redirect"
    )
    return Result(500,"获取成功",wechat_auth_url)

获取企业微信Access Token函数:

def get_wechat_access_token():
    token = cache.get('wechat_access_token')
    if token is None:
        token_url = (
            f"https://qyapi.weixin.qq.com/cgi-bin/gettoken"
            f"?corpid={WECHAT_CORP_ID}&corpsecret={WECHAT_CORP_SECRET}"
        )
        response = requests.get(token_url).json()
        token = response.get('access_token')
        if token:
            # 注意 Access Token 不可大量请求,需在本地缓存 7200 秒
            cache.set('wechat_access_token', token, timeout=7200)
    return token

最后,从数据库中找到相应用户返回 JWT Token:

@app.route('/api/wework/callback')
def wechat_callback():
    code = request.args.get('code')
    if not code:
        return jsonify({"code": 500, "message": "找不到参数"})

    # 获取 access_token
    access_token = get_wechat_access_token()
    if not access_token:
        return jsonify({"code": 500, "message": "参数获取失败"})

    userinfo_url = (
        f"https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"
        f"?access_token={access_token}&code={code}"
    )
    userinfo_response = requests.get(userinfo_url).json()
    user_id = userinfo_response.get('UserId')

    if not user_id:
        return jsonify({"code": 500, "message": "用户信息错误"})

    # 根据 user_id 查找或创建用户
    user = User.query.filter_by(username=user_id).first()
    if not user:
        return Result(500,"用户不存在系统中")

    # 生成 JWT Token
    userInfo = {
        "username": user.username,
        "name": user.name,
        "phone": user.phone,
        "gender": user.gender,
        "id_card": user.id_card,
        "license_plate": user.license_plate
    }
    access_token = create_access_token(identity=user_id, expires_delta=timedelta(minutes=10080))
    return Result(200,"登录成功",{"token":access_token,"userInfo":userInfo})

前端|JS验证身份证件信息函数