新手问题 微信自定义菜单,使用 net/http 标准库发起 POST,返回『40016』错误

ff4415 · 2016年11月16日 · 最后由 flowerwrong 回复于 2016年11月16日 · 3272 次阅读

代码

poJson = {
     "button":[
     {  
          "type":"click",
          "name":"sing",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {    
               "type":"view",
               "name":"search",
               "url":"http://www.soso.com/"
            },
            {
               "type":"view",
               "name":"video",
               "url":"http://v.qq.com/"
            },
            {
               "type":"click",
               "name":"favor",
               "key":"V1001_GOOD"
            }]
       }]
 }

uri = URI('https://api.weixin.qq.com/cgi-bin/token')
uri.query = URI.encode_www_form(params)

res = Net::HTTP.get_response(uri)
hash = JSON.parse res.body

uri = URI("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=#{hash["access_token"]}")

res = Net::HTTP.post_form(uri, "data" => poJson)

错误码

"{\"errcode\":40016,\"errmsg\":\"invalid button size hint: [dX4b8a0899vr22]\"}"

但是在微信接口测试工具里测试成功。

在这个问题上已经纠结 了一天,我怀疑是我的 post 包构造的有问题,希望大家能帮我指出。

已解决

换用 rest-client 解决了问题

gem 'rest-client', '~> 2.0'

require 'rest-client'

RestClient.post(url, payload.to_json)

提交成功

返回码: "{\"errcode\":0,\"errmsg\":\"ok\"}"

##中文问题

重新 post 一个带有中文的 json

返回错误码:

"{\"errcode\":40033,\"errmsg\":\"invalid charset. please check your request, if include \\\\uxxxx will create fail! hint: [xGNora0471vr20]\"}"

按照社区里的方法

require 'rest-client'

pj = {"button": buttons}

payload = pj.to_json.gsub!(/\\u([0-9a-z]{4})/) { |s| [$1.to_i(16)].pack("U") }
payload = pj.to_json if payload.blank?

RestClient.post(url, payload)

缺少这一行 payload = pj.to_json if payload.blank?

有时候会报错误码: "{\"errcode\":44002,\"errmsg\":\"empty post data hint: [FQ_D_0824vr18]\"}"

遗留问题

  • 在本地 rails c 调用"中文".to_json 解析中文很正常,为什么 post 过去就变成'\uxxxx'了。

  • 为什么用'net/http'标准库 post 就不行了。 我用Net::HTTP.post_form(uri, "data" => data) post 到了本地, p params["data"] 显示输出 "{\"button\":[{\"type\":\"click\",\"name\":\"xxx\",\"key\":\"18\"}]}" 看着都很正常。 问题到底是出在了哪里。😵 😭

poJson.to_json

已经试过了。还是返回一样的错误码。


payload = {button: buttons}
res = RestClient.post url, payload.to_json
JSON.parse(res.body)

#2 楼 @ff4415 res = Net::HTTP.post_form(uri, poJson.to_json)

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