Closed huxinghai closed 9 years ago
你测试的接口是不是:https://github.com/lanrion/weixin_authorize/blob/master/spec%2Fapi%2Fuser_spec.rb#L3
但目前我在本地未能重现此bug:
#<WeixinAuthorize::ResultHandler:0x007fa5658c27a8
@cn_msg="请求成功",
@code=0,
@en_msg="ok",
@result=
{"subscribe"=>1,
"openid"=>"o9k6BuB0kydAcPTc7sPxppB1GQqA",
"nickname"=>"lanrion",
"sex"=>1,
"language"=>"zh_CN",
"city"=>"广州",
"province"=>"广东",
"country"=>"中国",
"headimgurl"=>"http://wx.qlogo.cn/mmopen/00D5rpiboZkmsWnVUG0BehEEk6wHo4oU23IYHmGDSBiavuD51EHDdeNYsib2xptjWQUXIKhPV4uXWeMWzNPTgPVxwfxq3cOwF9l/0",
"subscribe_time"=>1430377768,
"remark"=>"dylan"}>
请描述如何重现bug的方法,或者可否贴出你产出这些错误的明文是什么。
谢谢~
这种错是针对特殊nickname 的时候才会出现
错误信息:
JSON::ParserError: lexical error: invalid character inside string.
2YA-Og_KNdQQ4QB8","nickname":"琦娅🍭","sex":2,"language
(right here) ------^
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/gems/yajl-ruby-1.2.1/lib/yajl/json_gem/parsing.rb:15:in `rescue in parse'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/gems/yajl-ruby-1.2.1/lib/yajl/json_gem/parsing.rb:12:in `parse'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/bundler/gems/weixin_authorize-8c826daf8ef1/lib/weixin_authorize.rb:56:in `load_json'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/bundler/gems/weixin_authorize-8c826daf8ef1/lib/weixin_authorize.rb:36:in `http_get_without_token'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/bundler/gems/weixin_authorize-8c826daf8ef1/lib/weixin_authorize/client.rb:67:in `http_get'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/bundler/gems/weixin_authorize-8c826daf8ef1/lib/weixin_authorize/api/user.rb:11:in `user'
from (irb):2
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/gems/railties-4.1.4/lib/rails/commands/console.rb:90:in `start'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/gems/railties-4.1.4/lib/rails/commands/console.rb:9:in `start'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:69:in `console'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
from /opt/rails_apps/weixin_hub/shared/bundle/ruby/2.1.0/gems/railties-4.1.4/lib/rails/commands.rb:17:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
"nickname":"琦娅🍭"
这个🍭 也是吗?
我打印你gem 包的rest client 请求
puts resource(get_api_url).get(params: headers)
输出下面内容
"{\"subscribe\":1,\"openid\":\"oH6****C2YA-Og_KNdQQ4QB8\",\"nickname\":\"\x14\xE7\x90\xA6\xE5\xA8\x85\xF0\x9F\x8D\xAD\",\"sex\":2,\"language\":\"zh_CN\",\"city\":\"\xE4\xB8\x9C\xE8\x8E\x9E\",\"province\":\"\xE5\xB9\xBF\xE4\xB8\x9C\",\"country\":\"\xE4\xB8\xAD\xE5\x9B\xBD\",\"headimgurl\":\"http:\\/\\/wx.qlogo.cn\\/mmopen\\/169t5I0ibYZf16iarTjdQWf3QW5VVKwXRGHSPVj0ibDibqYqLyEQxPMR1HBkibkUlEibmFj8zYkvApibIPicdtIb5tib3MC766DxTaM2D\\/0\",\"subscribe_time\":1431133972,\"remark\":\"\"}"
就是因为nickname 里面的\x14报错的,不能JSON parse
因为明文中有icon的问题,icon无法被当成正确的string 解析。
如果是icon 问题的话,那我去掉nickname里面的 \x14要可以转换了解析
我觉地是不是nickname 有特殊的符号,解析不了
我得想办法能重现一下。这个方法修改可能会影响到其他的API结果解析。
其实我一直也想重现,但是没有办法知道他的🍭是这么输入上去的,我觉得是不是可以把nickname 属性做一个特殊的处理
其实不会有什么影响了,因为我是替换 \u0014至\u001F 这个区间是ascii 控制字符
gsub(/[\u0014-\u001F]/, "")
我就是怕误替换,导致获取错误的数据。
而且目前这个错误,也一直未从其他开发者获取反馈,所以看是否是特殊情况或者环境因素。 关键还是要找出重现的方法,才能定位真正的问题。
@huxinghai1988 近些时间确实发现存在这个问题,感谢你前期做的工作,可否更新一下这个PR,我好合并进去。:smile:
@huxinghai1988 建议的话,重新fork一个,重新发一个PR吧。
@lanrion OK
@huxinghai1988 closed。
通过调试,返回数据结构
编码格式: ASCII-8BIT JSON parse 报错原因是因为nickname 包含了\x14 这个是ASCII control characters,所以在转换替换一下
不知道为什么微信nickname 还有这样的怪东西