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 +4 -4
- data/Gemfile.lock +7 -5
- data/README.md +37 -3
- data/Rakefile +11 -1
- data/lib/generators/smart_sms/templates/smart_sms_config.rb +1 -0
- data/lib/smart_sms/account.rb +1 -1
- data/lib/smart_sms/config.rb +3 -1
- data/lib/smart_sms/has_sms_verification.rb +24 -20
- data/lib/smart_sms/helper/verification_code.rb +15 -1
- data/lib/smart_sms/message_service.rb +10 -0
- data/lib/smart_sms/template.rb +17 -0
- data/lib/smart_sms/version.rb +1 -1
- data/smart_sms.gemspec +5 -4
- data/spec/spec_helper.rb +2 -0
- metadata +24 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 325ca64649f2a85722659b93eae872bb20b1c5b9
|
4
|
+
data.tar.gz: 5d44ed9d5c466c8884ddc8dbdee257423dcbaa50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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.
|
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 (
|
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 [](https://travis-ci.org/lyfeyaj/smart_sms) [](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
|
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
|
data/lib/smart_sms/account.rb
CHANGED
data/lib/smart_sms/config.rb
CHANGED
@@ -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 :
|
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
|
-
|
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)
|
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:
|
90
|
-
end_time:
|
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
|
-
)
|
104
|
+
)
|
105
|
+
result['sms'].first
|
94
106
|
end
|
95
107
|
end
|
96
108
|
|
97
|
-
|
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
|
data/lib/smart_sms/template.rb
CHANGED
@@ -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
|
data/lib/smart_sms/version.rb
CHANGED
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
|
26
|
-
s.add_development_dependency
|
27
|
-
s.add_development_dependency
|
28
|
-
s.add_development_dependency
|
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
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.
|
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-
|
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:
|
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:
|
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:
|
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:
|
122
|
+
version: 1.17.0
|
109
123
|
description: A smart sms verification tool
|
110
124
|
email:
|
111
125
|
- lyfeyaj@gmail.com
|