之前已经遇到过:
但是那是:
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