module Aliyun::Sms

Constants

VERSION

Attributes

configuration[W]

Public Class Methods

canonicalized_query_string(params) click to toggle source
# File lib/aliyun/sms.rb, line 85
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_params() click to toggle source
# File lib/aliyun/sms.rb, line 72
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
configuration() click to toggle source
# File lib/aliyun/sms.rb, line 30
def configuration
  @configuration ||= Configuration.new
end
configure() { |configuration| ... } click to toggle source
# File lib/aliyun/sms.rb, line 34
def configure
  yield(configuration)
end
encode(input) click to toggle source

对字符串进行 PERCENT 编码

# File lib/aliyun/sms.rb, line 106
def encode(input)
  output = url_encode(input)
end
get_params(user_params) click to toggle source
# File lib/aliyun/sms.rb, line 68
def get_params(user_params)
  params = config_params.merge(user_params)
end
get_url(user_params) click to toggle source
# File lib/aliyun/sms.rb, line 61
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_nonce() click to toggle source

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

# File lib/aliyun/sms.rb, line 116
def seed_signature_nonce
  Time.now.utc.strftime("%Y%m%d%H%M%S%L")
end
seed_timestamp() click to toggle source

生成短信时间戳

# File lib/aliyun/sms.rb, line 111
def seed_timestamp
  Time.now.utc.strftime("%FT%TZ")
end
send(phone_numbers, template_code, template_param, out_id = '') click to toggle source
# 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
send_globle(mobile, text, from, type = 'OTP') click to toggle source
# File lib/aliyun/sms.rb, line 49
def send_globle(mobile, text, from, type = 'OTP')
  Typhoeus.get(get_url({
    'Action' => 'SendMessageToGlobe',
    'Message' => text,
    'To' => mobile,
    'From'        => from,
    'Type' => type,
    'SignatureNonce' => seed_signature_nonce,
    'Timestamp' => seed_timestamp
    }))
end
sign(key_secret, coded_params) click to toggle source

生成数字签名

# File lib/aliyun/sms.rb, line 98
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) click to toggle source

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

# File lib/aliyun/sms.rb, line 121
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