ruby on rails aliyun视频点播和短信接口签名

本文深入探讨了阿里云API的签名机制,包括视频点播、加密解密及短信服务的参数设置与签名生成过程。介绍了如何使用HMAC-SHA1进行签名,以及如何将参数转换为URL格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

require 'cgi'
module Aliyun
  class AliyunSign
    
    def create_sign_url(method, param, key, service_type)
      if service_type == 'video'
        param = video_param.merge(param)
      elsif service_type == 'auth'
        param = auth_param.merge(param)
      else 
        param = sms_param.merge(param)
      end
	  param[:Signature] = sign_param(method, key, param)
	  param
	end

    '''
    签名
    '''
    def sign_param(method, key, param)
      # 排序
      param = Tools::Sign.sort_param(param)
       # 转为url
      formatstr = to_query(param)
      stringto_sign = method.to_s +  '&%2F&' + formatstr
      # 签名
      signature = sign_string(stringto_sign, key).to_s.chomp
    end

    '''
    视频点播参数
    '''
    def video_param
      time_tamp = Time.now.utc.iso8601()
      nonce = Tools::GetRandString.rand_string(30)
      param = {
        Format: 'JSON', #返回值的类型,支持JSON与XML,默认为XML
        Version: '2017-03-21', #API版本号,为日期形式:YYYY-MM-DD,本版本对应为2017-03-21
        SignatureMethod: 'HMAC-SHA1',  #签名方式,目前支持HMAC-SHA1
        Timestamp: time_tamp, #ISO8601标准时间戳
        SignatureVersion: '1.0', #签名算法版本,目前版本是1.0
        SignatureNonce: nonce #唯一随机数
      }
    end
    '''
    加密揭密参数
    '''
    def auth_param
      time_tamp = Time.now.utc.iso8601()
      nonce = Tools::GetRandString.rand_string(30)
      param = {
        Format: 'JSON', #返回值的类型,支持JSON与XML,默认为XML
        Version: '2016-01-20', #API版本号,为日期形式:YYYY-MM-DD,本版本对应为2016-01-20
        SignatureMethod: 'HMAC-SHA1',  #签名方式,目前支持HMAC-SHA1
        Timestamp: time_tamp, #ISO8601标准时间戳
        SignatureVersion: '1.0' #签名算法版本,目前版本是1.0
      }
    end
    '''
    短信参数
    '''
    def sms_param
      time_tamp = Time.now.utc.iso8601()
      nonce = Tools::GetRandString.rand_string(30)
      param = {
        Format: 'JSON', #返回值的类型,支持JSON与XML,默认为XML
        RegionId: 'cn-hangzhou', #API支持的RegionID
        Version: '2017-05-25', #API版本号,为日期形式:YYYY-MM-DD,本版本对应为2017-05-25
        SignatureMethod: 'HMAC-SHA1',  #签名方式,目前支持HMAC-SHA1
        Timestamp: time_tamp, #ISO8601标准时间戳
        SignatureVersion: '1.0', #签名算法版本,目前版本是1.0
        SignatureNonce: nonce #唯一随机数
      }
    end
    '''
    hash转url参数格式化
    '''
    def to_query(param)
      format = []
      #url转义
      param.each_with_index do |value|
        format << "#{percent_encode(value[0])}=#{percent_encode(value[1])}"
      end
      percent_encode(format.join('&'))
    end
    ''' 
    替换字符
    '''
    def percent_encode(str)
			str = CGI::escape(str.to_s)
			str = str.gsub('/\+/','%20')
			str = str.gsub('/\*/','%2A')
			str = str.gsub('/%7E/','~')
    end
    '''
    生成签名
    '''
    def sign_string(stringto_sign, key)
      digest = OpenSSL::Digest.new('sha1')
      Base64.encode64(OpenSSL::HMAC.digest(digest, key, stringto_sign))
   end

  end
end

随机字符串

def self.rand_string(len = 6)
      chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
      Array.new(len, '').collect{chars[rand(chars.size)]}.join
    end

参数排序

'''
    参数从小到大排序
    '''
    def self.sort_param(data)
      data = data.sort{ |a,b| a.to_s <=> b.to_s }.to_h
    end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值