Sha256: c72478d82e6774ca20ef86a078401ebea22b5b07a3b4b69d2e398c5e9050cbe5

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

require 'digest/md5'
require 'openssl'
require 'base64'

module Alipay
  module Sign
    def self.generate(params)
      params = Utils.stringify_keys(params)
      sign_type = params.delete('sign_type') || Alipay.sign_type
      key = params.delete('key') || Alipay.key

      case sign_type
      when 'MD5'
        generate_md5(key, params)
      when 'RSA'
        raise NotImplementedError, "RSA sign is unimplemented"
      when 'DSA'
        raise NotImplementedError, "DSA sign is unimplemented"
      else
        raise ArgumentError, "wrong sign_type #{sign_type}, allow values: 'MD5', 'RSA', 'DSA'"
      end
    end

    def self.generate_md5(key, params)
      Digest::MD5.hexdigest("#{params_to_string(params)}#{key}")
    end

    def self.params_to_string(params)
      params.sort.map { |item| item.join('=') }.join('&')
    end

    def self.verify?(params)
      params = Utils.stringify_keys(params)

      sign_type = params.delete('sign_type')

      case sign_type
      when 'MD5'
        verify_md5?(params)
      when 'RSA'
        verify_rsa?(params)
      when 'DSA'
        raise NotImplementedError, "DSA verify is unimplemented"
      else
        raise ArgumentError, "wrong sign_type #{sign_type}, allow values: 'MD5', 'RSA', 'DSA'"
      end
    end

    def self.verify_md5?(params)
      key = params.delete('key') || Alipay.key
      sign = params.delete('sign')
      generate_md5(key, params) == sign
    end

    ALIPAY_RSA_PUBLIC_KEY = <<-EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRA
FljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQE
B/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5Ksi
NG9zpgmLCUYuLkxpLQIDAQAB
-----END PUBLIC KEY-----
    EOF

    def self.verify_rsa?(params)
      pkey = OpenSSL::PKey::RSA.new(ALIPAY_RSA_PUBLIC_KEY)
      digest = OpenSSL::Digest::SHA1.new
      sign = params.delete('sign')

      pkey.verify(digest, Base64.decode64(sign), params_to_string(params))
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
alipay-0.6.0.beta1 lib/alipay/sign.rb