新手问题 [已解决] 微信自定义菜单,用沙盒测试显示没问题,自己 post 就回复"errcode"=>40016, "errmsg"=>"invalid button size"

chairy11 · 2015年06月25日 · 最后由 chairy11 回复于 2015年06月27日 · 6873 次阅读

问题

微信自定义菜单,如果我在自己的控制台执行,结果会是{"errcode"=>40016, "errmsg"=>"invalid button size"}

根据全局返回码说明解释:40016 不合法的按钮个数

但在官方提供的沙盒测试中是显示成功的

真的很奇怪,这是什么情况? 我找到之前的一个帖子《微信自定义菜单的 post》,说是中文问题。 但我尝试:

  1. config/application.rb里加了config.encoding = "utf-8",
  2. 把 json 数据包所有中文都改为英文了,
  3. 又在代码里加上data = menu.to_json.gsub!(/\\u([0-9a-z]{4})/) { |s| [$1.to_i(16)].pack("U") }
  4. 加上了 content_type RestClient.post url, params: data, content_type: "application/json"

结果还是出现同样的错误提示。

后来我把按钮数减少到两三个很多,也还是出错。

莫名其妙呀…… 哪位大牛有办法呀?

解决方案

是我之前用 RestClient 没写对,多写了个 params: data

response = RestClient.post url, params: data, content_type: "application/json"

改为

response = RestClient.post url, data, :content_type => :json

好吧,我果然很二…… 请忽略我……

加一个试试

json = menus.to_json.gsub!(/\\u([0-9a-z]{4})/) { |s| [$1.to_i(16)].pack('U') }
json = menus.to_json if json.blank?
url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=#{access_token}"
res = RestClient.post url, json
JSON.parse res

#1 楼 @flowerwrong 你这个是在我的代码的基础上插入一句

json = menus.to_json if json.blank?

没看懂啊…… 为什么要插入这句?

而第二句会覆盖第一句吧?我的 json 也没有为空的情况,而是暂时是写死的,直接写在方法里面了……

#2 楼 @chairy11 你直接复制过去试试

faraday 的参考: 40016:

Faraday.post "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=#{at}", {button: [{'type' => 'click', 'name' => 'xxx', 'key' =>'18'}]}

正常:

Faraday.post "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=#{at}", {button: [{'type' => 'click', 'name' => 'xxx', 'key' =>'18'}]}.to_json

#1 楼 @flowerwrong #4 楼 @as181920 解决了。 可能是我之前用 RestClient 没写对,多写了个params: data

response = RestClient.post url, params: data, content_type: "application/json"

改为

response = RestClient.post url, data, :content_type => :json

好吧,我果然很二……

谢谢两位:)

#5 楼 @ruby_sky 就是看着复杂,没敢用你写的几个 gem…… 其实我都下了源码来参考的……

#8 楼 @ruby_sky 其实我还真在考虑用的…… 但我这是正式要用的企业项目,又怕你以后不维护了啊…… 另外一点,就是觉得文档还是不够丰富(可能也是我对微信开发了解还不够)…… 所以还得多研究研究再说……

另外一点就是想知道与wechat-rails相比,应该用哪个。 这几个 gem 我还没搞懂区别在哪,什么场合用哪个……主要是我看源码还没看懂,啊哈哈……

#10 楼 @chairy11 看维护频率与 API 完善情况。 后续会陆续出一些【微信开发系列】的贴子到 Ruby China。

#11 楼 @ruby_sky 哦,赞,我等着哦!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号