项目地址:https://github.com/lyfeyaj/smart_sms
从公司项目中抽出来的 gem, 方便自己以后的项目使用,也希望能帮到大家。
在 Gemfile
里面添加:
gem 'smart_sms'
然后
bundle
rails g smart_sms:config
# 配置一下api_key, `config/initializers/smart_sms_config.rb`
SmartSMS.configure do |config|
config.api_key = 'your_api_key'
end
最后
# 在现有的 model 中声明 `has_sms_verification`
class User < ActiveRecord::Base
has_sms_verification # 默认使用字段 :phone, :verified_at, 可自定义指定, 例如, :mobile, :confirmed_at
end
于是
# 发送短信验证码
user.deliver # 将会生成一个随机的验证码发送至手机
# 查询历史短信记录
user.messages
# 查询是否已经验证
user.verified?
# 校验验证码
user.verify! '123456'
# 查询最新的一条有效短信记录
user.latest_message
设置 api_key
SmartSMS.configure { |c| c.api_key = 'your_api_key' }
发送短信
SmartSMS.deliver 13522948742, 'SmartSMS WOW!'
https://github.com/lyfeyaj/smart_sms
比较了很多家短信服务商,云片网络的服务比较完善,可以自定义短信模板,查询信息等,而且短信延迟很小,基本上 5s 左右能发送到手机。所以这个 gem 封装了云片网的所有短信功能,有兴趣的童鞋可以看下他们的API 文档
目前这个 gem 已经在公司项目的生产环境中,一切运行良好,放心使用 ^_^
感谢分享,不过 has_sms_verification 追加的一些方法命名不是很好, 比如: user.messages 因为 user 可能已经有站内信息功能 (User has_many :messages),这样就会有冲突
user.deliver 这个命名相当不直观 (用户发送?发送什么?邮件?快递?)
最起码要这些应该都加入一个 sms 前缀或关键词,例如: user.deliver_sms user.sms_messages user.sms_verified? user.sms_verify! '123456' user.latest_sms_message
@rainchen 很好的改进意见 :plus1: , 前后缀的添加,我会在下一个版本中考虑进去
不过已考虑了部分命名冲突的问题,关联的 messages 和其对应的 model 是可以指定名字的,比如
has_sms_verification :phone, :verified_at, messages: :sms_messages, class_name: 'SmartSMS::Message'
这样就可以使用 user.sms_messages 来查询历史信息了
@moioo 目前的群发功能好像都受限,云片有群发功能,但是需要申请,你可以看下http://www.yunpian.com/api/sms.html里面的发短信通用接口
@lyfeyaj 首先感谢分享,最近项目刚好需要短信平台。可是用了之后发现一些问题: 1、按照 github 的文档,与 Rails 结合使用,设置本地存储之后
#model/user.rb
has_sms_verification :phone_number, :verified_at
然后使用 rails c 进行测试user.deliver_fake_sms
,报错:
NoMethodError: undefined method `messages_association_name' for #<Class:0x007fe9fa5f7878>
from /Users/itzzq/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/dynamic_matchers.rb:22:in `method_missing'
from /Users/itzzq/.rvm/gems/ruby-2.1.0/gems/smart_sms-0.1.0/lib/smart_sms/has_sms_verification.rb:136:in `save_or_return_message'
from /Users/itzzq/.rvm/gems/ruby-2.1.0/gems/smart_sms-0.1.0/lib/smart_sms/has_sms_verification.rb:129:in `deliver_fake_sms'
from (irb):3
from /Users/itzzq/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:90:in `start'
from /Users/itzzq/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:9:in `start'
from /Users/itzzq/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands.rb:62:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
但是使用基本用法,不依赖 Rails 的话可以正常使用。
2、在我阅读了 gem 源码之后,发现既然可以跟 Rails 结合,但是在 has_sms_verification.rb 中的 deliver 方法和 message_service.rb 中的 deliver 方法接口不对应……
前者是deliver(text = SmartSMS::VerificationCode.random)
后者是deliver(phone, content, options = {})
不知道这是本来就这么设计,还是其他什么原因?
最后再次感谢分享!
@itzzq 感谢反馈,
错误原因是因为没有正确初始化 User.messages_association_name
导致的,
User.messages_association_name
只有在当 SmartSMS.config.store_sms_in_local
为 true
的时候才会初始化
另外,大家如果有问题,尽可能到 github 上提交一个 issue, 因为 ruby-china 没有邮件回复提示,所有回复可能会不及时
@sandwind 有计划提供 mongoid 支持,但是因为最近项目太忙了,暂时没有时间做这件事情
你可以尝试提交一个 pull request, 我们来合作完成这件事情