Gem 一个处理短信发送及验证的 Gem - smart_sms

lyfeyaj · 2014年05月08日 · 最后由 jlj224 回复于 2016年09月26日 · 7504 次阅读

项目地址:https://github.com/lyfeyaj/smart_sms

从公司项目中抽出来的 gem, 方便自己以后的项目使用,也希望能帮到大家。

使用方法

结合 Rails 使用

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
基本用法 (不结合 Rails)

设置 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

感觉云片网的短信价还是很优惠的 5 分 5 立马注册了一个

@rainchen 很好的改进意见 :plus1: , 前后缀的添加,我会在下一个版本中考虑进去

不过已考虑了部分命名冲突的问题,关联的 messages 和其对应的 model 是可以指定名字的,比如

has_sms_verification :phone, :verified_at, messages: :sms_messages, class_name: 'SmartSMS::Message'

这样就可以使用 user.sms_messages 来查询历史信息了

@moioo 是啊,我也是比较了很多的短信供应商,最后发现云片相当便宜,而且 API 很完善

@lyfeyaj 有没有好一点的群发短信供应商

@moioo 目前的群发功能好像都受限,云片有群发功能,但是需要申请,你可以看下http://www.yunpian.com/api/sms.html里面的发短信通用接口

@yfractal 楼主跟你的 ID 好像。。

好像跟 ror 集成的很紧密的样子。。。

@ruby_sky 哈哈 确实。

赞,短信内容支持【签名】吗

@pobing 必须支持啊!

现在用的短信宝,看了一下云片的 API,貌似云片强大一些。

#15 楼 @jjzxcc 嗯,也打算用,现在用的推立方,感觉太慢了,而且不支持签名

@jjzxcc 云片的自定义功能更多一些,也更便宜,完全可以使用这个 gem 来创建自己的管理界面

@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 = {}) 不知道这是本来就这么设计,还是其他什么原因?

最后再次感谢分享!

@lyfeyaj 我在实际环境里测试了一下,发现user.deliver_fake_sms能正常使用,但是为什么 rails c 中会出错呢?

棒棒棒

@lyfeyaj 能不能支持 mongoid 呢 楼主 我想修改下支持 mongodb 的 能不能给点技术支持呢?

@itzzq 感谢反馈,

错误原因是因为没有正确初始化 User.messages_association_name 导致的, User.messages_association_name 只有在当 SmartSMS.config.store_sms_in_localtrue 的时候才会初始化

另外,大家如果有问题,尽可能到 github 上提交一个 issue, 因为 ruby-china 没有邮件回复提示,所有回复可能会不及时

@sandwind 有计划提供 mongoid 支持,但是因为最近项目太忙了,暂时没有时间做这件事情

你可以尝试提交一个 pull request, 我们来合作完成这件事情

lyfeyaj 关闭了讨论。 06月17日 01:46
需要 登录 后方可回复, 如果你还没有账号请 注册新账号