smart_sms 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b9fa8f3418d450f565df408ff794eb83a960b58
4
- data.tar.gz: 4490c8952972f86e02148eb6ae2777a44a36df80
3
+ metadata.gz: 325ca64649f2a85722659b93eae872bb20b1c5b9
4
+ data.tar.gz: 5d44ed9d5c466c8884ddc8dbdee257423dcbaa50
5
5
  SHA512:
6
- metadata.gz: dad9f7408a3e13c4808d4c20fc1edf1a9103a5a2d4c22d6c07ba38e136c9a44506986d545957408d965b4e182acceecfc90ec36ca8086092665ac1309845cf06
7
- data.tar.gz: b79133e1dded6dea4467b313dbb3f6ea63db595eaf918eb3ae9839f0a45ab43a5d97aa7761693dd7607583416bea6bb5fcfe7cfd454d9a23b6516e48ff39b2f5
6
+ metadata.gz: 6956d9f1b4b1948f149340a9214095d42b5d1307d6f0a410f0c752e32a3d2077acb81c34b76026f2de3adc25129240f1e8c6a9e28acacb8daacaa6a89daa9d8a
7
+ data.tar.gz: a81043483f4b9c4e010a6793672fa17dacd9c841f0e3d3751791e2f060ac82d989f5f3709257f791e7bd9b62a75537cb28ba639ce71ec8c32a4d3a8d8be8dcc7
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_sms (0.0.1)
4
+ smart_sms (0.0.2)
5
5
  activerecord (>= 3.0, < 5.0)
6
6
  activesupport (>= 3.0, < 5.0)
7
7
 
@@ -24,9 +24,10 @@ GEM
24
24
  builder (3.0.4)
25
25
  crack (0.4.2)
26
26
  safe_yaml (~> 1.0.0)
27
+ database_cleaner (1.2.0)
27
28
  diff-lcs (1.2.5)
28
29
  i18n (0.6.1)
29
- multi_json (1.8.4)
30
+ multi_json (1.9.2)
30
31
  rake (10.2.2)
31
32
  rspec (2.14.1)
32
33
  rspec-core (~> 2.14.0)
@@ -37,7 +38,7 @@ GEM
37
38
  diff-lcs (>= 1.1.3, < 2.0)
38
39
  rspec-mocks (2.14.6)
39
40
  safe_yaml (1.0.1)
40
- tzinfo (0.3.38)
41
+ tzinfo (0.3.39)
41
42
  webmock (1.17.4)
42
43
  addressable (>= 2.2.7)
43
44
  crack (>= 0.3.2)
@@ -46,8 +47,9 @@ PLATFORMS
46
47
  ruby
47
48
 
48
49
  DEPENDENCIES
49
- bundler (~> 1.2)
50
+ bundler (>= 1.0.0)
51
+ database_cleaner (~> 1.2.0)
50
52
  rake
51
53
  rspec
52
54
  smart_sms!
53
- webmock
55
+ webmock (~> 1.17.0)
data/README.md CHANGED
@@ -1,4 +1,38 @@
1
- SmartSMS 短信认证或校验服务
2
- =========
1
+ SmartSMS [![Build Status](https://travis-ci.org/lyfeyaj/smart_sms.png?branch=master)](https://travis-ci.org/lyfeyaj/smart_sms) [![Code Climate](https://codeclimate.com/github/lyfeyaj/smart_sms.png)](https://codeclimate.com/github/lyfeyaj/smart_sms)
2
+ ===================================
3
+
4
+ 提供在中国境内发送短信, 校验, 以及 ActiveRecord 集成功能
5
+
6
+ 功能特点
7
+ --------
8
+
9
+ * 集成了 [云片网络](http://www.yunpian.com) 的所有短信服务API
10
+ - 发送, 查询模板短信, 通用短信
11
+ - 查询, 修改用户信息
12
+ - 查询默认模板, 自定义模板
13
+ - 新增, 修改, 删除自定义模板
14
+ - 查询用户短信回复
15
+ * 集成了 ActiveRecord 支持
16
+ * 集成了方便的验证码生成工具
17
+ * 强大的配置选项, 几行代码即可集成所有功能
18
+
19
+ ## 安装
20
+
21
+ gem install smart_sms
22
+
23
+ ### 或者从 `github` 安装最新的开发版本
24
+
25
+ git clone http://github.com/lyfeyaj/smart_sms.git
26
+ cd smart_sms
27
+ rake install
28
+
29
+ ## 使用
30
+
31
+ ### 结合 Rails 使用
32
+
33
+ ### 其他
34
+
35
+ ## 使用方法和例子
36
+
37
+
3
38
 
4
- 集成了 [云片网络](http://www.yunpian.com) 的短信服务
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core'
5
+ require 'rspec/core/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec) do |spec|
8
+ spec.pattern = FileList['spec/**/*_spec.rb']
9
+ end
10
+
11
+ task :default => "spec:all"
@@ -8,6 +8,7 @@ SmartSMS.configure do |config|
8
8
  # config.page_num = 1
9
9
  # config.page_size = 20
10
10
  # config.company = '云片网'
11
+ # config.expires_in = 1.hour
11
12
  # config.default_interval = 1.day
12
13
  # config.store_sms_in_local = false
13
14
  # config.verification_code_algorithm = :simple
@@ -14,7 +14,7 @@ module SmartSMS
14
14
  # emergency_mobile: 紧急联系人手机号
15
15
  # alarm_balance: 短信余额提醒阈值。一天只提示一次
16
16
  def set options = {}
17
- Request.post 'tpl/get.json', options
17
+ Request.post 'user/set.json', options
18
18
  end
19
19
  end
20
20
  end
@@ -26,7 +26,8 @@ module SmartSMS
26
26
  config_accessor :page_num # 获取信息时, 指定默认的页数
27
27
  config_accessor :page_size # 获取信息时, 一页包含信息数量
28
28
  config_accessor :company # 默认公司名称
29
- config_accessor :default_interval # 查询短信时的时间段: end_time - start_time
29
+ config_accessor :expires_in # 短信验证过期时间
30
+ config_accessor :default_interval # 查询短信时的默认时间段: end_time - start_time
30
31
  config_accessor :store_sms_in_local # 是否存储SMS信息在本地: true or false
31
32
  config_accessor :verification_code_algorithm # :simple, :middle, :complex
32
33
  end
@@ -39,6 +40,7 @@ module SmartSMS
39
40
  config.page_num = 1
40
41
  config.page_size = 20
41
42
  config.company = '云片网'
43
+ config.expires_in = 1.hour
42
44
  config.default_interval = 1.day
43
45
  config.store_sms_in_local = false
44
46
  config.verification_code_algorithm = :simple
@@ -18,7 +18,7 @@ module SmartSMS
18
18
  # :class_name 自定义的Message类名称. 默认是 `::SmartSMS::Message`
19
19
  # :messages 自定义的Message关联名称. 默认是 `:versions`.
20
20
  #
21
- def has_sms_verification moible_column, verification_column, options = {}
21
+ def has_sms_verification moible_column = :phone, verification_column = :verified_at, options = {}
22
22
  send :include, InstanceMethods
23
23
 
24
24
  # 用于判断是否已经验证的字段, Datetime 类型, 例如 :verified_at
@@ -29,7 +29,7 @@ module SmartSMS
29
29
  self.sms_mobile_column = moible_column
30
30
 
31
31
  class_attribute :verify_regexp
32
- self.verify_regexp = /(【.+】|[^a-zA-Z0-9\.\-\+_])/
32
+ self.verify_regexp = /(【.+】|[^a-zA-Z0-9\.\-\+_])/ # 用于抽取校验码, 如若修改过模板, 可能需要修改这个这正则
33
33
 
34
34
  if SmartSMS.config.store_sms_in_local
35
35
 
@@ -55,6 +55,7 @@ module SmartSMS
55
55
 
56
56
  module InstanceMethods
57
57
 
58
+ # 非安全verify!方法, 验证成功后会存储成功的结果到数据表中
58
59
  def verify! code
59
60
  result = verify code
60
61
  if result
@@ -63,6 +64,8 @@ module SmartSMS
63
64
  end
64
65
  end
65
66
 
67
+ # 安全verify方法, 用于校验短信验证码是否正确, 返回: true 或 false
68
+ #
66
69
  def verify code
67
70
  sms = latest_message
68
71
  return false if sms.blank?
@@ -73,33 +76,45 @@ module SmartSMS
73
76
  end
74
77
  end
75
78
 
79
+ # 判断是否已经验证成功
80
+ #
76
81
  def verified?
77
- self[self.class.sms_verification_column].present?
82
+ verified_at.present?
78
83
  end
79
84
 
80
85
  def verified_at
81
86
  self[self.class.sms_verification_column]
82
87
  end
83
88
 
89
+ # 获取最新的一条有效短信记录
90
+ #
84
91
  def latest_message
92
+ end_time = Time.now
93
+ start_time = end_time - SmartSMS.config.expires_in # the verification code will be expired within 1 hour
85
94
  if SmartSMS.config.store_sms_in_local
86
- self.send(self.class.messages_association_name).last
95
+ self.send(self.class.messages_association_name)
96
+ .where("send_time >= ? and send_time <= ?", start_time, end_time)
97
+ .last
87
98
  else
88
- SmartSMS.find(
89
- start_time: (Time.now - 1.hour),
90
- end_time: Time.now,
99
+ result = SmartSMS.find(
100
+ start_time: start_time,
101
+ end_time: end_time,
91
102
  mobile: self.send(self.class.sms_mobile_column),
92
103
  page_size: 1
93
- )['sms'].first
104
+ )
105
+ result['sms'].first
94
106
  end
95
107
  end
96
108
 
97
- def deliver text = random_verification_code
109
+ # 发送短信至手机
110
+ #
111
+ def deliver text = SmartSMS::VerificationCode.random
98
112
  result = SmartSMS.deliver self.send(self.class.sms_mobile_column), text
99
113
  if result['code'] == 0
100
114
  sms = SmartSMS.find_by_sid(result['result']['sid'])['sms']
101
115
  if SmartSMS.config.store_sms_in_local
102
116
  message = self.send(self.messages_association_name).build sms
117
+ message.send_time = Time.parse sms['send_time']
103
118
  message.code = text
104
119
  message.save
105
120
  else
@@ -111,17 +126,6 @@ module SmartSMS
111
126
  end
112
127
  end
113
128
 
114
- def random_verification_code
115
- case SmartSMS.config.verification_code_algorithm
116
- when :simple
117
- SmartSMS::VerificationCode.simple
118
- when :middle
119
- SmartSMS::VerificationCode.middle
120
- when :complex
121
- SmartSMS::VerificationCode.complex
122
- end
123
- end
124
-
125
129
  end
126
130
  end
127
131
  end
@@ -3,12 +3,26 @@ require 'securerandom'
3
3
  module SmartSMS
4
4
  module VerificationCode
5
5
  extend self
6
+
7
+ REGISTERED_ALGORITHMS = [:simple, :middle, :complex]
8
+
9
+ def random algorithm = ''
10
+ algorithm = SmartSMS.config.verification_code_algorithm if algorithm.blank?
11
+ if REGISTERED_ALGORITHMS.include? algorithm
12
+ SmartSMS::VerificationCode.send algorithm
13
+ else
14
+ raise NoMethodError
15
+ end
16
+ end
17
+
18
+ private
19
+
6
20
  def simple
7
21
  SecureRandom.random_number.to_s.slice(-6..-1)
8
22
  end
9
23
 
10
24
  def middle
11
- SecureRandom.base64.slice(1..6).downcase
25
+ SecureRandom.base64.gsub!(/[^0-9a-zA-Z]/,'').slice(1..6).downcase
12
26
  end
13
27
 
14
28
  def complex
@@ -9,6 +9,13 @@ module SmartSMS
9
9
 
10
10
  DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
11
11
 
12
+ # 发送短信到手机, 默认使用模板发送, 提供通用接口支持
13
+ # phone: 需要接受短信的手机号码
14
+ # content: 短信验证内容
15
+ #
16
+ # Options:
17
+ # :method 如若要使用通用短信接口, 需要 :method => :general
18
+ # :tpl_id 选择发送短信的模板, 默认是2
12
19
  def deliver phone, content, options = {}
13
20
  if options[:method] == :general
14
21
  Request.post 'sms/send.json', mobile: phone, text: content, extend: options[:extend]
@@ -20,10 +27,13 @@ module SmartSMS
20
27
  end
21
28
  end
22
29
 
30
+ # 根据sid来查询短信记录
31
+ #
23
32
  def find_by_sid sid
24
33
  Request.post 'sms/get.json', sid: sid
25
34
  end
26
35
 
36
+ # 参见 `find_messages` 方法
27
37
  def find options = {}
28
38
  find_messages 'sms/get.json', options
29
39
  end
@@ -1,22 +1,39 @@
1
+ # encoding: utf-8
2
+
1
3
  module SmartSMS
2
4
  module Template
3
5
  extend self
6
+
7
+ # 取默认模板
8
+ # Options:
9
+ # tpl_id: 指定tpl_id时返回tpl_id对应的默认模板. 未指定时返回所有默认模板
10
+ #
4
11
  def find_default tpl_id = ''
5
12
  Request.post 'tpl/get_default.json', tpl_id: tpl_id
6
13
  end
7
14
 
15
+ # 取自定义模板
16
+ # Options:
17
+ # tpl_id: 指定tpl_id时返回tpl_id对应的自定义模板. 未指定时返回所有自定义模板
18
+ #
8
19
  def find tpl_id = ''
9
20
  Request.post 'tpl/get.json', tpl_id: tpl_id
10
21
  end
11
22
 
23
+ # 创建新模板
24
+ # 规则请参见: <http://www.yunpian.com/api/tpl.html>
25
+ #
12
26
  def create tpl_content = ''
13
27
  Request.post 'tpl/add.json', tpl_content: tpl_content
14
28
  end
15
29
 
30
+ # 更新模板, 需指定id和content
31
+ #
16
32
  def update tpl_id = '', tpl_content = ''
17
33
  Request.post 'tpl/update.json', tpl_id: tpl_id, tpl_content: tpl_content
18
34
  end
19
35
 
36
+ # 删除模板, 需指定id
20
37
  def destroy tpl_id = ''
21
38
  Request.post 'tpl/del.json', tpl_id: tpl_id
22
39
  end
@@ -1,3 +1,3 @@
1
1
  module SmartSMS
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/smart_sms.gemspec CHANGED
@@ -22,8 +22,9 @@ Gem::Specification.new do |s|
22
22
  s.add_dependency 'activerecord', ['>= 3.0', '< 5.0']
23
23
  s.add_dependency 'activesupport', ['>= 3.0', '< 5.0']
24
24
 
25
- s.add_development_dependency "bundler", "~> 1.2"
26
- s.add_development_dependency "rake"
27
- s.add_development_dependency "rspec"
28
- s.add_development_dependency "webmock"
25
+ s.add_development_dependency 'bundler', ['>= 1.0.0']
26
+ s.add_development_dependency 'rake', ['>= 0']
27
+ s.add_development_dependency 'rspec', ['>= 0']
28
+ s.add_development_dependency 'database_cleaner', ['~> 1.2.0']
29
+ s.add_development_dependency "webmock", ['~> 1.17.0']
29
30
  end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,8 @@ require 'bundler/setup'
5
5
  require 'webmock/rspec'
6
6
  require 'smart_sms'
7
7
 
8
+ require 'database_cleaner'
9
+
8
10
  #WebMock.allow_net_connect!
9
11
  RSpec.configure do |config|
10
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_sms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - lyfeyaj
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-04 00:00:00.000000000 Z
11
+ date: 2014-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -54,16 +54,16 @@ dependencies:
54
54
  name: bundler
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - "~>"
57
+ - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: '1.2'
59
+ version: 1.0.0
60
60
  type: :development
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - "~>"
64
+ - - ">="
65
65
  - !ruby/object:Gem::Version
66
- version: '1.2'
66
+ version: 1.0.0
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: rake
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -92,20 +92,34 @@ dependencies:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: database_cleaner
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 1.2.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 1.2.0
95
109
  - !ruby/object:Gem::Dependency
96
110
  name: webmock
97
111
  requirement: !ruby/object:Gem::Requirement
98
112
  requirements:
99
- - - ">="
113
+ - - "~>"
100
114
  - !ruby/object:Gem::Version
101
- version: '0'
115
+ version: 1.17.0
102
116
  type: :development
103
117
  prerelease: false
104
118
  version_requirements: !ruby/object:Gem::Requirement
105
119
  requirements:
106
- - - ">="
120
+ - - "~>"
107
121
  - !ruby/object:Gem::Version
108
- version: '0'
122
+ version: 1.17.0
109
123
  description: A smart sms verification tool
110
124
  email:
111
125
  - lyfeyaj@gmail.com