eric-guo / wechat Goto Github PK
View Code? Open in Web Editor NEWAPI, command and message handling for WeChat in Rails
License: MIT License
API, command and message handling for WeChat in Rails
License: MIT License
微信的 access_token,不是需要动态获取吗,为什么直接写在配置文件config/wechar.yml里?
如题,想在钉钉里面使用,是否可以支持,需要调整什么吗?
下面是官方原文,出处
如果公众号处于开发模式,需要在接收到用户发送的消息时,返回一个MsgType为transfer_customer_service的消息,微信服务器在收到这条消息时,会把这次发送的消息转到多客服系统。用户被客服接入以后,客服关闭会话以前,处于会话过程中,用户发送的消息均会被直接转发至客服系统。
如果在rails中还要进行devise的话是否还要与omniauth-wechat-oauth2 一起使用 ,也就是两个插件一起使用啊
如题,最近微信的API好像不稳定,有时请求会花很长时间,看了一下代码好像Wechat::Client
中RestClient
没有处理timeout
今天碰到这种情况,起了 4 个 unicorn worker,然后在 access_token 过期的时候,这四个 worker 都是满负荷,导致都在刷新 access_token,然后其他的 worker 拿到的新 token 用不了接着去刷新 token,接着就这样死循环了。。。
未关注用户在扫码关注时无法触发 “on :scan, with: 'qrscene_'”这个,仍然只能触发“on :event, with: 'subscribe'”这条
每次进入搜索页面就调用一次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服务后正常。
说明:
λ ~/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
?
微信服务号生成带参数的二维码后扫描,如果用户之前没有关注,可以正常收到“subscribe”事件并处理。
如果用户已经关注过,无法收到"SCAN"事件。
网站生成二维码时调用的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
# 默认的文字信息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.
命令行里执行wechat就报SSL的错误,我就把skip_verify_ssl: false
加到~/.wechat.yml
,但是无效
PS:感谢这个库,替换掉了我自己的逻辑,删了大片代码,很爽
Rake release seems to create gem package multiple times
The code in the bin/wechat:291:in 'oauth2_url'
calls a wrong method.
pls check it : )
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个. 我继续跟一下.
寫入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
進行系統權限更改嗎?
我在使用jssdk的时候,当token过期后,就会报Wechat::AccessTokenExpiredError的错误
如果图文消息中,存在空的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>
As requested, we should add Wechat QR code support.
升级到最新的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)
我们现在用混合使用wechat的服务端API,和js-sdk
所以我们自己有加入'ticket/getticket'的支持
如果可以加入我发起Pull request
Ruby 2.2.3
Rails 4.2.3
request.reply.news(0...1) do |article, i|
article.item title: "title", description: "desc", pic_url: 'http://www.baidu.com/img/bdlogo.gif', url: 'http://www.baidu.com/'
end
这里之前是没有问题的,但是现在是失效的,原因未知,请帮忙检查,谢谢
Rails generator is required to integrate devise oauth2 and wechat responders for existing rails project.
参数写死:signature=9beb5b249c3677956590959b584896d40dba8785×tamp=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
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
哪里没有配置吗?
use material add to upload a image, always this error:
block in request': media data missing hint: HjjhHa0639ent1 (Wechat::ResponseError)
any help? plz
用户关注微信号的时候 发送一条文本信息给用户
hi ,
gem 非常好。
不过有个问题: 对于没有认证过的 订阅号怎么办? 没有appid, appsecret.. 我知道的很多朋友都是只有 “未认证的订阅号”.
如果这两样没有的话,可以使用这个GEM吗?
谢谢
思维
发现在rails4.x的版本上不支持啊!希望可以更新!
我尝试反复获取access_token,发现每次获取的access token都不同,但是我看代码应该不会这样的。
我发现如果启动服务器之前,如果/var/tmp/access_token文件不存在,则这个问题总是存在。
我调试了一下发现读出文件的created_at为0,所以总是刷新
如果在启动server之前文件就存在,则貌似没有问题。
另外这里不会发生多线程写文件的冲突吗?
感谢贡献,并恭喜接手项目呵呵。
我看代码里面判断过期时间是3*60,3个小时?微信文档里面是2个小时吧?另外以后是否可以提供被动刷新token的方法呢。
如题Rails4.2bundle未成功。gemspec 改版本也没有bundle成功
Filter chain halted as :verify_signature rendered or redirected 按照教程,报错
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来配置的,服务器配置没有问题,但是不知道为啥微信服务器传数据过来的时候会报错。
从文件的方面来看,这就是一个类似库的项目,为何会依赖特定的版本的Rails? 刚好比我的生产环境高0.01。
新手,请见谅。
当使用多台机器时,除了42001: access_token超时, 40014:不合法的access_token,还有可能出现{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint"} 错误。感觉也需要更新access_token.
由于我现在的主要开发语言不再是Ruby,所以可能没有太多精力维护这个项目了。希望Ruby社区的开发者能接手这个项目。
这个项目有很多有趣的想法,特别是API设计上,至今我还觉得挺满意的,但是很多细节包括
还需要进一步的改进,有兴趣的开发者可以回复报名,谢谢。
微信公众平台报警提示 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
这个报错会在短时间大量退订的时候出现,应该是微信设置了容许少量错误返回
我会在#39 合并后的基础上,大改代码,所以准备占个坑先。
企业号的API调用地址是https//qyapi.weixin.qq.com/
,而不是惯常的https://api.weixin.qq.com/
除了在controller里引入wechat_responder
,还有别的方法可以在这个controller中调用PlainController.wechat.jsapi_ticket.signature(request.original_url)
吗?
Wechat only accept news message with less than 10 articles.
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×tamp=timestamp_value&nonce=nonce_value
返回Incomplete response received from application
如题。可否提供个简单的示例。thanks
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.