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 +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 [![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
|
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
|