Module: Aliyun::Sms

Defined in:
lib/aliyun/sms.rb,
lib/aliyun/sms/version.rb

Defined Under Namespace

Classes: Configuration

Constant Summary collapse

VERSION =
"1.1.1"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.configurationObject



30
31
32
# File 'lib/aliyun/sms.rb', line 30

def configuration
  @configuration ||= Configuration.new
end

Class Method Details

.canonicalized_query_string(params) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/aliyun/sms.rb', line 73

def canonicalized_query_string(params)
  cqstring = ''
  params.sort_by{|key, val| key}.each do |key, value|
    if cqstring.empty?
      cqstring += "#{encode(key)}=#{encode(value)}"
    else
      cqstring += "&#{encode(key)}=#{encode(value)}"
    end
  end
  cqstring
end

.config_paramsObject



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/aliyun/sms.rb', line 60

def config_params()
  params ={
    'AccessKeyId' => configuration.access_key_id,
    'Action' => configuration.action,
    'Format' => configuration.format,
    'RegionId' => configuration.region_id,
    'SignName' => configuration.sign_name,
    'SignatureMethod' => configuration.signature_method,
    'SignatureVersion' => configuration.signature_version,
    'Version' => configuration.version
  }
end

.configure {|configuration| ... } ⇒ Object

Yields:



34
35
36
# File 'lib/aliyun/sms.rb', line 34

def configure
  yield(configuration)
end

.encode(input) ⇒ Object

对字符串进行 PERCENT 编码



94
95
96
# File 'lib/aliyun/sms.rb', line 94

def encode(input)
  output = url_encode(input)
end

.get_params(user_params) ⇒ Object



56
57
58
# File 'lib/aliyun/sms.rb', line 56

def get_params(user_params)
  params = config_params.merge(user_params)
end

.get_url(user_params) ⇒ Object



49
50
51
52
53
54
# File 'lib/aliyun/sms.rb', line 49

def get_url(user_params)
  params = get_params(user_params)
  coded_params = canonicalized_query_string(params)
  key_secret = configuration.access_key_secret
  url = 'http://dysmsapi.aliyuncs.com/?' + 'Signature=' + sign(key_secret, coded_params) + '&' + coded_params
end

.seed_signature_nonceObject

生成短信唯一标识码,采用到微秒的时间戳



104
105
106
# File 'lib/aliyun/sms.rb', line 104

def seed_signature_nonce
  Time.now.utc.strftime("%Y%m%d%H%M%S%L")
end

.seed_timestampObject

生成短信时间戳



99
100
101
# File 'lib/aliyun/sms.rb', line 99

def seed_timestamp
  Time.now.utc.strftime("%FT%TZ")
end

.send(phone_numbers, template_code, template_param, out_id = '') ⇒ Object



38
39
40
41
42
43
44
45
46
47
# File 'lib/aliyun/sms.rb', line 38

def send(phone_numbers, template_code, template_param, out_id = '')
  Typhoeus.get(get_url({
    'PhoneNumbers' => phone_numbers,
    'TemplateCode' => template_code,
    'TemplateParam' => template_param,
    'OutId'	=> out_id,
    'SignatureNonce' => seed_signature_nonce,
    'Timestamp' => seed_timestamp
    }))
end

.sign(key_secret, coded_params) ⇒ Object

生成数字签名



86
87
88
89
90
91
# File 'lib/aliyun/sms.rb', line 86

def sign(key_secret, coded_params)
  key = key_secret + '&'
  signature = 'GET' + '&' + encode('/') + '&' +  encode(coded_params)
  sign = Base64.encode64("#{OpenSSL::HMAC.digest('sha1',key, signature)}")
  encode(sign.chomp)  # 通过chomp去掉最后的换行符 LF
end

.test_query_string(params) ⇒ Object

测试参数未编码时生成的字符串是否正确(多一道保险)



109
110
111
112
113
114
115
116
117
118
119
# File 'lib/aliyun/sms.rb', line 109

def test_query_string(params)
  qstring = ''
  params.sort_by{|key, val| key}.each do |key, value|
    if qstring.empty?
      qstring += "#{key}=#{value}"
    else
      qstring += "&#{key}=#{value}"
    end
  end
  qstring
end