GithubHelp home page GithubHelp logo

eric-guo / wechat Goto Github PK

View Code? Open in Web Editor NEW
1.3K 66.0 373.0 1.51 MB

API, command and message handling for WeChat in Rails

License: MIT License

Ruby 99.47% HTML 0.53%
wechat-sdk wechat-oauth wechat-framework wechat

wechat's People

Contributors

3014zhangshuo avatar acenqiu avatar bastengao avatar eric-guo avatar fahchen avatar feitian124 avatar fogisland avatar goofansu avatar guange2015 avatar hlltc avatar hophacker avatar huangxiangdan avatar huhao98 avatar jimmy0017 avatar kikyous avatar leepood avatar mechiland avatar oiahoon avatar paicha avatar qinmingyuan avatar skinnyworm avatar snow avatar tuliren avatar xiewenwei avatar xixilive avatar xmonkey avatar yiichou avatar zfben avatar zlei1 avatar zymiboxpay avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wechat's Issues

关于access_token问题

微信的 access_token,不是需要动态获取吗,为什么直接写在配置文件config/wechar.yml里?

希望添加多客服消息转发功能

下面是官方原文,出处

如果公众号处于开发模式,需要在接收到用户发送的消息时,返回一个MsgType为transfer_customer_service的消息,微信服务器在收到这条消息时,会把这次发送的消息转到多客服系统。用户被客服接入以后,客服关闭会话以前,处于会话过程中,用户发送的消息均会被直接转发至客服系统。

API请求能否增加timeout option?

如题,最近微信的API好像不稳定,有时请求会花很长时间,看了一下代码好像Wechat::ClientRestClient没有处理timeout

调用jsapi_ticket出现reach max api daily quota limit hint: [VAB1bA0573vr20](45009)

每次进入搜索页面就调用一次api填充页面的jssdk签名,因为在搜索页面中我要使用jssdk获取用户的地理位置。

示例controller如下:

class SearchesController < ApplicationController
  before_action :authenticate_user!
  before_action :set_jssdk

  def new
    @query = Query.new
  end

  def set_jssdk
      @hash = Wechat.api.jsapi_ticket.signature(request.original_url)
  end
end

问题:出现reach max api daily quota limit hint错误,但在重启rails服务后正常。

说明:

  • appid和secret没有给别人使用
  • 只开了一个rails服务

项目内执行wechat出错,Ruby2.1.5,ActiveSupport 4.2.1

λ ~/dev/lit/ wechat2* wechat
/Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext/module/deprecation.rb:21:in `deprecate': uninitialized constant ActiveSupport::Deprecation (NameError)
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext/class/delegating_attributes.rb:26:in `<class:Class>'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext/class/delegating_attributes.rb:6:in `<top (required)>'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext/class.rb:2:in `require'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext/class.rb:2:in `<top (required)>'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext.rb:2:in `require'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext.rb:2:in `block in <top (required)>'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext.rb:1:in `each'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/core_ext.rb:1:in `<top (required)>'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/wechat-0.6.0/bin/wechat:10:in `require'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/gems/wechat-0.6.0/bin/wechat:10:in `<top (required)>'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/bin/wechat:23:in `load'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/bin/wechat:23:in `<main>'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `eval'
    from /Users/xprimes/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `<main>'

能不能补充接收事件推送的示例

用户点击菜单之后会发送如下的数据:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>

服务器的处理:

  on :event, with:"CLICK" do |request, key|
    case key
      when "1" then request.reply.text "1"
      when "2" then request.reply.text "2"
      else "没有这个菜单!"
    end
  end

with 中代表的是事件的类型吗?如何获取到 message 中的 EventKey ?

生成二维码失败

网站生成二维码时调用的API,如果token失效导致生成二维码失败,微信API返回json格式的错误信息时用的Content-Type是text/plain,程序只对application/json格式的返回做处理,导致无法自动刷新token、从而连续失败;

def parse_response(response, as)
content_type = response.headers[:content_type]
parse_as = {
%r{^application/json} => :json,
%r{^text/plain} => :json, # 我加了这一行用以处理这个特例
%r{^image/.*} => :file
}.each_with_object([]) { |match, memo| memo << match[1] if content_type =~ match[0] }.first || as || :text

Can not use helper like root_path inside on block

  # 默认的文字信息responder
  on :text do |request, content|
    request.reply.text "echo: #{content}" #Just echo
  end

I can not use root_path inside on block because it is in the Controller class scope not in the Controller instance scope. Why not inside a instance scope so we can use all the benefit from rails like rendering xml template with XmlBuilder, url helpers, etc.

skip_verify_ssl: false的设置对命令行无效

命令行里执行wechat就报SSL的错误,我就把skip_verify_ssl: false加到~/.wechat.yml,但是无效

PS:感谢这个库,替换掉了我自己的逻辑,删了大片代码,很爽

wrong number of arguments (2 for 1) for subscribe event

 ArgumentError:
       wrong number of arguments (2 for 1)
     # ./app/controllers/wechats_controller.rb:26:in `block in <class:WechatsController>'
     # /home/ming/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/bundler/gems/wechat-e75d5cd12414/lib/wechat/responder.rb:141:in `block in run_responder'
     # /home/ming/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/bundler/gems/wechat-e75d5cd12414/lib/wechat/responder.rb:53:in `responder_for'
     # /home/ming/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/bundler/gems/wechat-e75d5cd12414/lib/wechat/responder.rb:132:in `run_responder'
     # /home/ming/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/bundler/gems/wechat-e75d5cd12414/lib/wechat/responder.rb:94:in `create'
  # 用户关注
  on :event, with: "subscribe" do |request|
      request.reply.text "欢迎关注!"
  end

以上的代码不工作了, 好像和 cd0b874 有关.

define_singleton_method :process, responder[:proc]
send(:process, *args.unshift(request))

看上去似乎是 define_singleton_method 动态定义的方法只需要一个参数, 但 unshift 出来了2个. 我继续跟一下.

自定義菜單, no such file or directory

寫入menu.yaml後執行wechat menu_create menu.yaml 返回 No such file or directory,根據提示的文件地址找到gem下wechat文件 318行menu = YAML.load(File.read(menu_yaml_path)),但文件中找不到申明menu_yaml_path的地方。是我哪裏錯了,還是需要對menu.yaml進行系統權限更改嗎?

图文消息的空链接问题

如果图文消息中,存在空的URL node,在微信中会打开空白页面,微信中是允许不带链接的图文消息的,前提是消息中不包含URL节点。

如下面的被动响应图文消息会在微信中打开空页面:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title> 
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url/>
</item>
</Articles>
</xml> 

而下面的被动响应图文消息不会在微信中打开空页面:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title> 
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
</item>
</Articles>
</xml> 

uninitialized constant ActionController::Responder (NameError)

升级到最新的commit 6a925af 后, 使用它的项目报如下错误:

/home/ming/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/responders-2.1.0/lib/action_controller/respond_with.rb:10:in `block in <module:RespondWith>': uninitialized constant ActionController::Responder (NameError)

有考虑加入ticket的支持么?

我们现在用混合使用wechat的服务端API,和js-sdk
所以我们自己有加入'ticket/getticket'的支持
如果可以加入我发起Pull request

Create rails generators

Rails generator is required to integrate devise oauth2 and wechat responders for existing rails project.

本地接入调试成功,部署到Heroku就403。

参数写死:signature=9beb5b249c3677956590959b584896d40dba8785&timestamp=12345&nonce=abcde&echostr=hahaha4
本地调试顺利返回echostr值,部署到Heroku就403了,头大中,验证方法提取出来写入controller还能通过:

class WechatSupportsController < ApplicationController
  skip_before_filter :verify_authenticity_token
  before_filter :check_weixin_legality

  def show
    render :text => params[:echostr]
  end

  def create
    if params[:xml][:MsgType] == "text"
      render "echo", :formats => :xml
    end
  end
  private
    def check_weixin_legality
      array = ["wechat", params[:timestamp], params[:nonce]].sort
      render :text => "Forbiden", :status => 403 if params[:signature] != Digest::SHA1.hexdigest(array.join)
    end
end

wechat.yml:

default: &default
  appid: "*******"
  secret: "**********"
  token:    "wechat"
  access_token: "/var/tmp/wechat_access_token"

production:
  appid: <%= ENV['WECHAT_APPID'] %>
  secret: <%= ENV['WECHAT_APP_SECRET'] %>
  token:      <%= ENV['WECHAT_TOKEN'] %>
  access_token:  <%= ENV['WECHAT_ACCESS_TOKEN'] %>

development:
  <<: *default

test:
  <<: *default

:verify_signature rendered or redirected

config/wechat.yml
default: &default
  appid: "wxdddddddddddd"
  secret: "36cddddddddd"
  token:  "neonn"
  access_token: "/var/tmp/wechat_access_token"

production:
  <<: *default

在公众号里也设置了 token等,

出现错误,

Filter chain halted as :verify_signature rendered or redirected

哪里没有配置吗?

material add 41005

use material add to upload a image, always this error:
block in request': media data missing hint: HjjhHa0639ent1 (Wechat::ResponseError)

any help? plz

建议完善 README

hi ,
gem 非常好。
不过有个问题: 对于没有认证过的 订阅号怎么办? 没有appid, appsecret.. 我知道的很多朋友都是只有 “未认证的订阅号”.
如果这两样没有的话,可以使用这个GEM吗?

谢谢
思维

报告一个问题

我尝试反复获取access_token,发现每次获取的access token都不同,但是我看代码应该不会这样的。
我发现如果启动服务器之前,如果/var/tmp/access_token文件不存在,则这个问题总是存在。
我调试了一下发现读出文件的created_at为0,所以总是刷新
如果在启动server之前文件就存在,则貌似没有问题。

另外这里不会发生多线程写文件的冲突吗?

关于access token的过期时间

感谢贡献,并恭喜接手项目呵呵。
我看代码里面判断过期时间是3*60,3个小时?微信文档里面是2个小时吧?另外以后是否可以提供被动刷新token的方法呢。

gem报错

SyntaxError (/Users/byte/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/bundler/gems/wechat-rails-b7acbc05aa5c/lib/wechat/message.rb:27: syntax error, unexpected ':', expecting ';' or '\n'
      def item title: "title", description: nil, p...
                     ^
/Users/byte/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/bundler/gems/wechat-rails-b7acbc05aa5c/lib/wechat/message.rb:27: syntax error, unexpected ',', expecting keyword_end
      def item title: "title", description: nil, pic_url: n...
                              ^
/Users/byte/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/bundler/gems/wechat-rails-b7acbc05aa5c/lib/wechat/message.rb:27: Can't assign to nil
...tle: "title", description: nil, pic_url: nil, url: nil
...                               ^
/Users/byte/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/bundler/gems/wechat-rails-b7acbc05aa5c/lib/wechat/message.rb:27: Can't assign to nil
...description: nil, pic_url: nil, url: nil

按照README来配置的,服务器配置没有问题,但是不知道为啥微信服务器传数据过来的时候会报错。

添加错误码40001处理

当使用多台机器时,除了42001: access_token超时, 40014:不合法的access_token,还有可能出现{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint"} 错误。感觉也需要更新access_token.

我想将这个项目的所有权转交给其他感兴趣的开发者,请大家报名

由于我现在的主要开发语言不再是Ruby,所以可能没有太多精力维护这个项目了。希望Ruby社区的开发者能接手这个项目。

这个项目有很多有趣的想法,特别是API设计上,至今我还觉得挺满意的,但是很多细节包括

  • 是否要使用restful-client
  • 对新API的支持
  • 如何配置本地的AccessToken存储服务等

还需要进一步的改进,有兴趣的开发者可以回复报名,谢谢。

微信提示 UnSubscribe 返回内容不合法

微信公众平台报警提示 UnSubscribe 返回内容不合法
具体报错信息:

Appid: wx********6d63a
昵称: *
社区助手
时间: 2015-11-13 17:11:00
内容: 微信服务器向公众号推送消息或事件后,得到的回应不合法
次数: 5分钟 159次
错误样例: [OpenID=oAXFPt2m_VFQfnsrNX5DCqfzfOvs][Stamp=1447405860][3rdUrl10=http://_/api/weixin_mp/][Msg=Subscribe][Event=UnSubscribe][ip=
][response_length=234][response_content=
oAXFPt2m_VF**_CqfzfOvs
gh_b66
***eb
1447405860
text
user can not receive this message
]
报警排查指引,请见: http://url.cn/ab0jnP

这个报错会在短时间大量退订的时候出现,应该是微信设置了容许少量错误返回

普通controller如何调用jsapi_ticket?

除了在controller里引入wechat_responder,还有别的方法可以在这个controller中调用PlainController.wechat.jsapi_ticket.signature(request.original_url)吗?

"application did not send a complete response

App 30814 stderr: [ 2015-10-21 11:32:42.9762 30835/0xb8107b48(Worker 1) utils.rb:86 ]: ***         Exception RuntimeError in Rack application object (Missing `secret_token` and                         `secret_key_base` for 'production' environment, set these values in                         `config/secrets.yml`) (process 30835, thread 0xb8107b48(Worker 1)):
App 30814 stderr:       from /home/cong/projects/pingtanfeiyu/vendor/bundle/ruby/2.2.0                    /gems/railties-4.2.4/lib/rails/application.rb:534:in `validate_secret_key_config!'
App 30814 stderr:       from /home/cong/projects/pingtanfeiyu/vendor/bundle/ruby/2.2.0                    /gems/railties-4.2.4/lib/rails/application.rb:246:in `env_config'
App 30814 stderr:       from /home/cong/projects/pingtanfeiyu/vendor/bundle/ruby/2.2.0                    /gems/railties-4.2.4/lib/rails/engine.rb:514:in `call'
App 30814 stderr:       from /home/cong/projects/pingtanfeiyu/vendor/bundle/ruby/2.2.0                    /gems/railties-4.2.4/lib/rails/application.rb:165:in `call'
App 30814 stderr:       from /usr/lib/ruby/vendor_ruby/phusion_passenger                                        /rack/thread_handler_extension.rb:94:in                         `process_request'
App 30814 stderr:       from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler                /thread_handler.rb:151:in `accept_and_process_next_request'
App 30814 stderr:       from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler                /thread_handler.rb:112:in `main_loop'
App 30814 stderr:       from /usr/lib/ruby/vendor_ruby/phusion_passenger                                        /request_handler.rb:415:in `block (3 levels) in                 start_threads'
App 30814 stderr:       from /usr/lib/ruby/vendor_ruby/phusion_passenger/utils.rb:112:in `block in     create_thread_and_abort_on_exception'
[ 2015-10-21 11:32:42.9769 30188/b61d1b40 age/Cor/Req/Utils.cpp:95 ]: [Client 1-11] Sending     502 response: application did not send a complete respons                                                    

部署环境:passenger + nginx + digitalocean + ubuntu
微信认证:token验证失败
模拟请求:http://domain/wechat?signature=signature_value&echostr=echostr_value&timestamp=timestamp_value&nonce=nonce_value返回Incomplete response received from application

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.