在使用微信扫码登录第三方应用时,第三方在取得access_token之后需要调用微信的sns/userinfo接口获取用户的nickname,openid之类的数据内容。然而在使用微信接口的时候发现真是有巨坑。本文地址:http://www.04007.cn/article/1215.html,未经许可,不得转载.
一开始我用的是英文昵称的微信号,扫码登录一切正常,但在使用一个中文昵称的微信扫码后,崩了。本来我以为只是一个简单的字符编码问题,但开始处理之后发现你要一开始不知道,它还真是个麻烦事,而这将会伴随每一个使用微信登录的开发者。本文地址:http://www.04007.cn/article/1215.html,未经许可,不得转载.
微信请求方式http请求方式: GET本文地址:http://www.04007.cn/article/1215.html,未经许可,不得转载.
https://api.weixin.qq.com/sns/userinfo?lang=zh_CN&access_token=ACCESS_TOKEN&openid=OPENID response = requests.get(url, timeout=3)在拿到response之后,我通过response.json提取到对应的数据json信息,英文下都正常,但是使用中文微信昵称后,我试了很多方法,都没法从这个json里面拿到正确的中文昵称。nickname转来转去都是乱码。
{"openid":"o1jBH6CRXOyii8BHRxDB0g9Kv3Jg","nickname":"è¯è¯ä¸ª","sex":0,} 'nickname': b'\xc3\xa8\xc2\xaf\xc2\x95\xc3\xa8\xc2\xaf\xc2\x95\xc3\xa4\xc2\xb8\xc2\xaa', UnicodeEncodeError: 'gbk' codec can't encode character '\xaf' nickname': 'è
解决办法:有网友说微信是使用的ISO-8859-1编码,先用‘ISO-8859-1’进行编码,再用‘UTF-8’进行解码,但在response.json中我仍未成功取到nickname.问题的讨论。更可误的是微信的接口文档里也不对这一块进行说明,真是可恨,让每个开发者都浪费时间在这个无聊的问题上。除了response.json外,response.text提取到的数据也是一样有问题。本文地址:http://www.04007.cn/article/1215.html,未经许可,不得转载.
真正解决问题的办法,是通过 response.content 来得取返回内容,而不要用response.text或response.json来提取(微信也微信,真是让人蛋痛!)。或者使用response.text来取得内容,然后使用:response.text.encode('iso-8859-1').decode('utf8') 进行处理,这样后面的内容也就都正常了。本文地址:http://www.04007.cn/article/1215.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/1215.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |