微信小程序:登录-python处理
1 基本流程
https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html#wxloginobject
2 code 获取 session_key 和 openid
json格式获取js_code,通过接口获取session_key和openid,符合条件返回unionID,具体看文档
@bp.route("/auth/weapp_login", methods=['GET','POST']) def mini_program(): if request.method == 'POST': data = request.get_data() json_data = json.loads(data) print(json_data) js_code = json_data.get("js_code") APP_ID = 'xxxxxx' APP_SECRET = "yyyyyyy" if js_code: url = 'https://api.weixin.qq.com/sns/jscode2session' params = {} params['appid'] = APP_ID params['secret'] = APP_SECRET params['js_code'] = js_code params['grant_type'] = "authorization_code" ret = requests.get(url=url,params=params) print(ret.status_code) print(ret.content) token = "xxxxxxxx" return jsonify({"token",token})
3 js_code 获取unionid
@bp.route("/auth/weapp_login", methods=['GET','POST']) def mini_program(): if request.method == 'POST': data = request.get_data() json_data = json.loads(data) print(json_data) js_code = json_data.get("js_code") encrypted_data = json_data.get("encryptedData") iv = json_data.get("iv") APP_ID = 'xxxx' APP_SECRET = "yyyyyyy" if js_code and encrypted_data is None and iv is None: url = 'https://api.weixin.qq.com/sns/jscode2session' params = {} params['appid'] = APP_ID params['secret'] = APP_SECRET params['js_code'] = js_code params['grant_type'] = "authorization_code" ret = requests.get(url=url,params=params) print(ret.status_code) print(ret.content) content = json.loads(ret.content) unionid = content.get('unionid') global session_key_backup session_key_backup = content.get('session_key') if unionid: print("unionid",unionid) unionid_obj = mongo.db.users.find_one({'unionid': unionid}) if unionid_obj: consumer_id = unionid_obj.get("consumer_id") else: user_id = str(uuid.uuid4()) consumer_id = get_consumer_id(user_id) user = {} user['user_id'] = user_id user['consumer_id'] = consumer_id user['user_type'] = GUEST mongo.db.users.insert_one(user) key, secret, created_at = get_consumer_credentials(consumer_id) token = get_jwt_token(consumer_id, key, secret, created_at) data = {} data['token'] = token return my_jsonify(data) else: data = {} data['token'] = None return my_jsonify(data) else: # pip install python-weixin from weixin import WXAPPAPI from weixin.lib.wxcrypt import WXBizDataCrypt api = WXAPPAPI(appid=APP_ID, app_secret=APP_SECRET) # session_info = api.exchange_code_for_session_key(code=js_code) # # 获取session_info 后 # session_key = session_info.get('session_key') session_key = session_key_backup crypt = WXBizDataCrypt(APP_ID, session_key) # encrypted_data 包括敏感数据在内的完整用户信息的加密数据 # iv 加密算法的初始向量 # 这两个参数需要js获取 user_info = crypt.decrypt(encrypted_data, iv) # # dict # print(user_info) unionid = user_info.get('unionId') print("uninonid",unionid) # 之前有没有扫码登录网络 unionid_obj = mongo.db.users.find_one({'unionid': unionid}) if unionid_obj: consumer_id = unionid_obj.get("consumer_id") else: user_id = str(uuid.uuid4()) consumer_id = get_consumer_id(user_id) user = {} user['user_id'] = user_id user['unionid'] = unionid user['consumer_id'] = consumer_id user['user_type'] = GUEST mongo.db.users.insert_one(user) key, secret, created_at = get_consumer_credentials(consumer_id) token = get_jwt_token(consumer_id, key, secret, created_at) # set_limit_by_consumer_id(consumer_id) data = {} data['token'] = token return my_jsonify(data)