lanrion / weixin_authorize

微信 Ruby 高级API weixin_authorize http://github.com/lanrion/weixin_authorize .
MIT License
322 stars 116 forks source link

获取微信个人信息时JSON parse 报错 #52

Closed huxinghai closed 9 years ago

huxinghai commented 9 years ago

通过调试,返回数据结构

"{\"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\":\"\"}"

编码格式: ASCII-8BIT JSON parse 报错原因是因为nickname 包含了\x14 这个是ASCII control characters,所以在转换替换一下

不知道为什么微信nickname 还有这样的怪东西

lanrion commented 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的方法,或者可否贴出你产出这些错误的明文是什么。

谢谢~

huxinghai commented 9 years ago

这种错是针对特殊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>'
lanrion commented 9 years ago

"nickname":"琦娅🍭"

这个🍭 也是吗?

huxinghai commented 9 years ago

我打印你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

lanrion commented 9 years ago

因为明文中有icon的问题,icon无法被当成正确的string 解析。

huxinghai commented 9 years ago

如果是icon 问题的话,那我去掉nickname里面的 \x14要可以转换了解析

e69418e1-99fb-4a92-af6b-1b50fbfb8532

我觉地是不是nickname 有特殊的符号,解析不了

lanrion commented 9 years ago

我得想办法能重现一下。这个方法修改可能会影响到其他的API结果解析。

huxinghai commented 9 years ago

其实我一直也想重现,但是没有办法知道他的🍭是这么输入上去的,我觉得是不是可以把nickname 属性做一个特殊的处理

huxinghai commented 9 years ago

其实不会有什么影响了,因为我是替换 \u0014至\u001F 这个区间是ascii 控制字符

lanrion commented 9 years ago
gsub(/[\u0014-\u001F]/, "")

我就是怕误替换,导致获取错误的数据。

而且目前这个错误,也一直未从其他开发者获取反馈,所以看是否是特殊情况或者环境因素。 关键还是要找出重现的方法,才能定位真正的问题。

lanrion commented 9 years ago

@huxinghai1988 近些时间确实发现存在这个问题,感谢你前期做的工作,可否更新一下这个PR,我好合并进去。:smile:

lanrion commented 9 years ago

@huxinghai1988 建议的话,重新fork一个,重新发一个PR吧。

huxinghai commented 9 years ago

@lanrion OK

lanrion commented 9 years ago

@huxinghai1988 closed。