smart_sms 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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