python调用dll文件是出错 40001_[未解决]Flask在Flask-Login和login_required后有时候出现微信授权登录token过期:OfficialAPIError 400...

武彭薄
2023-12-01

之前已经遇到过:

但是那是:

wechat的python的SDK,内部处理oauth的access_token和本身全局的access_token没考虑周全导致的

自己已经解决该问题了。

但是现在,在实现了授权登录,记住用户的情况下:

时不时的:

比如,在加入活动之前,要求微信用户已登录,但是这时候去授权登录,结果是用的旧的过期的access_token去登录的,所以会出现:

OfficialAPIError: 40001: invalid credential, access_token is invalid or not latest hint: [ir.EBa0605vr30!]

的错误:postJson={‘action_info’: {‘scene’: {‘scene_str’: u’JOIN_EVENT_12′}}, ‘action_name’: ‘QR_LIMIT_STR_SCENE’}

[2016-09-02 21:23:25 +0000] [25734] [ERROR] Error handling request /create_event_qrcode?eventId=12

Traceback (most recent call last):

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py”, line 135, in handle

self.handle_request(listener, req, client, addr)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/gunicorn/workers/sync.py”, line 176, in handle_request

respiter = self.wsgi(environ, resp.start_response)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 2000, in __call__

return self.wsgi_app(environ, start_response)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 1991, in wsgi_app

response = self.make_response(self.handle_exception(e))

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 1567, in handle_exception

reraise(exc_type, exc_value, tb)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 1988, in wsgi_app

response = self.full_dispatch_request()

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 1641, in full_dispatch_request

rv = self.handle_user_exception(e)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 1544, in handle_user_exception

reraise(exc_type, exc_value, tb)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 1639, in full_dispatch_request

rv = self.dispatch_request()

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/flask/app.py”, line 1625, in dispatch_request

return self.view_functions[rule.endpoint](**req.view_args)

File “/root/html/SIPEvents/sipevents/views.py”, line 724, in decorated_function

return f(*args, **kwargs)

File “/root/html/SIPEvents/sipevents/views.py”, line 938, in create_event_qrcode

respQrcodeJson = wechat.create_qrcode(postJson)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/basic.py”, line 833, in create_qrcode

data=data

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/request.py”, line 104, in post

**kwargs

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/request.py”, line 74, in request

self._check_official_error(response_json)

File “/root/Envs/SIPEvents/lib/python2.7/site-packages/wechat_sdk-0.6.4-py2.7.egg/wechat_sdk/lib/request.py”, line 113, in _check_official_error

raise OfficialAPIError(errcode=json_data.get(‘errcode’), errmsg=json_data.get(‘errmsg’, ”))

OfficialAPIError: 40001: invalid credential, access_token is invalid or not latest hint: [ir.EBa0605vr30!]

目前出现的频率很高:

最短1,2小时左右?

最长好像是2天左右??

现在想要找到统一的,处理办法:

保证不会过期,或者很长时间,比如7天,1一个月之类的,也不会过期

目前能想到的,可能的办法是:

在调用generate_oauth2_authorize_url

/Users/crifan/dev/dev_root/daryun/SIPEvents/sourcecode/sipevents/wechat_sdk/basic.pydef generate_oauth2_authorize_url(self, redirect_uri, response_type=”code”, scope=”snsapi_userinfo”, state=””):

“””

生成获取用户信息的url

详情请参考 http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code

:param redirect_uri: 授权后重定向的回调链接地址,该方法内自动使用urlencode对链接进行处理

:param response_type: 返回类型,默认为code

:param scope: 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),

snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。

并且,即使在未关注的情况下,只要用户授权,也能获取其信息)。

默认为snsapi_userinfo

:param state: 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

:return: 用户授权的url链接字符串

“””

redirect_uri = urllib.quote(redirect_uri)

url = “https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=%s&scope=%s&state=%s#wechat_redirect” % (

self.conf.appid,

redirect_uri,

response_type,

scope,

state

)

return url

去使用:

静默授权,先去获得openid

-》内部,在大多数情况下,已经保存了用户的完整的信息

-》此时可以通过openid去得到用户信息

-》这样就不用显示地跳转到授权登录的页面了

-》但是也还是有缺点的:

万一用户信息更新,比如头像更新了,此时也是没发及时知道,及时更新的

更主要的是:估计别人也很少用这个静默授权吧?

或者是:

在此处的调用

wechat.get_oauth2_userinfo(oauth2Access_token, oauth2Openid)

的地方,加上exception处理,发现如果是

OfficialAPIError: 40001

就重新再去执行一次授权

-》或者直接向上面一样,去静默授权获得openid,去从数据库中读取用户的信息,得到User对象

Flask OfficialAPIError: 40001: invalid credential

Flask 40001 invalid credential

 类似资料: