class AllpayWebService::Client

Attributes

hash_iv[RW]
hash_key[RW]
merchant_id[RW]

Public Class Methods

new(merchant_id:, hash_key:, hash_iv: raise_argument_error(msg: :missing_parameter, field: :merchant_id) if merchant_id.nil?) click to toggle source
# File lib/allpay/client.rb, line 30
def initialize merchant_id:, hash_key:, hash_iv:
  raise_argument_error(msg: :missing_parameter, field: :merchant_id) if merchant_id.nil?
  raise_argument_error(msg: :parameter_should_be, field: :merchant_id, data: "String") unless merchant_id.is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :merchant_id) if merchant_id.empty?
  raise_argument_error(msg: :reach_max_length, field: :merchant_id, length: 10) if merchant_id.size > 10

  raise_argument_error(msg: :missing_parameter, field: :hash_key) if hash_key.nil?
  raise_argument_error(msg: :parameter_should_be, field: :hash_key, data: "String") unless hash_key.is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :hash_key) if hash_key.empty?

  raise_argument_error(msg: :missing_parameter, field: :hash_iv) if hash_iv.nil?
  raise_argument_error(msg: :parameter_should_be, field: :hash_iv, data: "String") unless hash_iv.is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :hash_iv) if hash_iv.empty?

  @merchant_id = merchant_id
  @hash_key = hash_key
  @hash_iv = hash_iv
end

Public Instance Methods

create_trade(args = {}) click to toggle source

Create trade

# File lib/allpay/client.rb, line 50
def create_trade args = {}
  raise_argument_error(msg: :parameter_should_be, field: "Parameter", data: "Hash") unless args.is_a? Hash

  # filter arguments by accept keys
  accept_keys = [
    :ServiceURL, :MerchantTradeNo, :MerchantTradeDate, :TotalAmount, :TradeDesc, :CardNo,
    :CardValidMM, :CardValidYY, :CardCVV2, :UnionPay, :Installment, :ThreeD, :CharSet,
    :Enn, :BankOnly, :Redeem, :PhoneNumber, :AddMember, :CName, :Email, :Remark, :PlatformID
  ]
  args = args.filter(accept_keys)

  raise_argument_error(msg: :missing_parameter, field: :ServiceURL) if args[:ServiceURL].nil?
  raise_argument_error(msg: :parameter_should_be, field: :ServiceURL, data: "String") unless args[:ServiceURL].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :ServiceURL) if args[:ServiceURL].empty?

  raise_argument_error(msg: :missing_parameter, field: :MerchantTradeNo) if args[:MerchantTradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :MerchantTradeNo, data: "String") unless args[:MerchantTradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :MerchantTradeNo) if args[:MerchantTradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :MerchantTradeNo, length: 20) if args[:MerchantTradeNo].size > 20

  raise_argument_error(msg: :missing_parameter, field: :MerchantTradeDate) if args[:MerchantTradeDate].nil?
  raise_argument_error(msg: :parameter_should_be, field: :MerchantTradeDate, data: "String") unless args[:MerchantTradeDate].is_a? String
  raise_argument_error(msg: :wrong_data_format, field: :MerchantTradeDate) unless /\A\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}\z/.match(args[:MerchantTradeDate])

  raise_argument_error(msg: :missing_parameter, field: :TotalAmount) if args[:TotalAmount].nil?
  raise_argument_error(msg: :parameter_should_be, field: :TotalAmount, data: "Integer") unless args[:TotalAmount].is_a? Integer
  raise_argument_error(msg: :parameter_should_be, field: :TotalAmount, data: "greater than 0") if args[:TotalAmount] <= 0

  raise_argument_error(msg: :missing_parameter, field: :TradeDesc) if args[:TradeDesc].nil?
  raise_argument_error(msg: :parameter_should_be, field: :TradeDesc, data: "String") unless args[:TradeDesc].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :TradeDesc) if args[:TradeDesc].empty?
  raise_argument_error(msg: :reach_max_length, field: :TradeDesc, length: 200) if args[:TradeDesc].size > 200

  raise_argument_error(msg: :missing_parameter, field: :CardNo) if args[:CardNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :CardNo, data: "Integer") unless args[:CardNo].is_a? Integer

  raise_argument_error(msg: :missing_parameter, field: :CardValidMM) if args[:CardValidMM].nil?
  raise_argument_error(msg: :parameter_should_be, field: :CardValidMM, data: "String") unless args[:CardValidMM].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :CardValidMM) if args[:CardValidMM].empty?
  raise_argument_error(msg: :reach_max_length, field: :CardValidMM, length: 2) if args[:CardValidMM].size > 2

  raise_argument_error(msg: :missing_parameter, field: :CardValidYY) if args[:CardValidYY].nil?
  raise_argument_error(msg: :parameter_should_be, field: :CardValidYY, data: "String") unless args[:CardValidYY].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :CardValidYY) if args[:CardValidYY].empty?
  raise_argument_error(msg: :reach_max_length, field: :CardValidYY, length: 2) if args[:CardValidYY].size > 2

  if args.has_key? :CardCVV2
    raise_argument_error(msg: :parameter_should_be, field: :CardCVV2, data: "Integer") unless args[:CardCVV2].is_a? Integer
  end

  # NOTE: Web Service 版本都帶 0。
  args.delete :UnionPay if args.has_key? :UnionPay
  # if args.has_key? :UnionPay
  #   raise_argument_error(msg: :parameter_should_be, field: :UnionPay, data: "Integer") unless args[:UnionPay].is_a? Integer
  # end

  if args.has_key? :Installment
    raise_argument_error(msg: :parameter_should_be, field: :Installment, data: "Integer") unless args[:Installment].is_a? Integer
  end

  if args.has_key? :ThreeD
    raise_argument_error(msg: :parameter_should_be, field: :ThreeD, data: "Integer") unless args[:ThreeD].is_a? Integer
    raise_argument_error(msg: :parameter_should_be, field: :ThreeD, data: ThreeD.readable_keys) unless ThreeD.values.include? args[:ThreeD]
  end

  if args.has_key? :CharSet
    raise_argument_error(msg: :parameter_should_be, field: :CharSet, data: "String") unless args[:CharSet].is_a? String
    raise_argument_error(msg: :parameter_should_be, field: :CharSet, data: CharSet.readable_keys) unless CharSet.values.include? args[:CharSet]
  end

  if args.has_key? :Enn
    raise_argument_error(msg: :parameter_should_be, field: :Enn, data: "String") unless args[:Enn].is_a? String
    raise_argument_error(msg: :parameter_should_be, field: :Enn, data: English.readable_keys) unless English.values.include? args[:Enn]
  end

  if args.has_key? :BankOnly
    raise_argument_error(msg: :parameter_should_be, field: :BankOnly, data: "String") unless args[:BankOnly].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :BankOnly, length: 120) if args[:BankOnly].size > 120
  end

  # NOTE: 目前 Web Service 是背景處理授權,尚未開放紅利折抵。
  args.delete :Redeem if args.has_key? :Redeem
  # if args.has_key? :Redeem
  #   raise_argument_error(msg: :parameter_should_be, field: :Redeem, data: "String") unless args[:Redeem].is_a? String
  #   raise_argument_error(msg: :reach_max_length, field: :Redeem, length: 1) if args[:Redeem].size > 1
  # end

  if args.has_key? :PhoneNumber
    raise_argument_error(msg: :parameter_should_be, field: :PhoneNumber, data: "String") unless args[:PhoneNumber].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :PhoneNumber, length: 10) if args[:PhoneNumber].size > 10
  end

  if args.has_key? :AddMember
    raise_argument_error(msg: :parameter_should_be, field: :AddMember, data: "String") unless args[:AddMember].is_a? String
    raise_argument_error(msg: :parameter_should_be, field: :AddMember, data: AddMember.readable_keys) unless AddMember.values.include? args[:AddMember]
  end

  if args[:AddMember] == AddMember::YES
    raise_argument_error(msg: :missing_parameter, field: :CName) if args[:CName].nil?
    raise_argument_error(msg: :parameter_should_be, field: :CName, data: "String") unless args[:CName].is_a? String
    raise_argument_error(msg: :cannot_be_empty, field: :CName) if args[:CName].empty?
    raise_argument_error(msg: :reach_max_length, field: :CName, length: 60) if args[:CName].size > 60
  end

  if args.has_key? :Email
    raise_argument_error(msg: :parameter_should_be, field: :Email, data: "String") unless args[:Email].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :Email, length: 100) if args[:Email].size > 100
  end

  if args.has_key? :Remark
    raise_argument_error(msg: :parameter_should_be, field: :Remark, data: "String") unless args[:Remark].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :Remark, length: 200) if args[:Remark].size > 200
  end

  if args.has_key? :PlatformID
    raise_argument_error(msg: :parameter_should_be, field: :PlatformID, data: "String") unless args[:PlatformID].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :PlatformID, length: 9) if args[:PlatformID].size > 9
  end

  service_url = args[:ServiceURL]
  args.delete :ServiceURL

  data = {
    MerchantID: @merchant_id,
    TradeDesc: "",
    CardCVV2: "",
    UnionPay: 0,
    Installment: 0,
    ThreeD: 0,
    CharSet: "utf-8",
    Enn: "",
    BankOnly: "",
    Redeem: "",
    PhoneNumber: "",
    AddMember: "0",
    CName: "",
    Email: "",
    Remark: "",
    PlatformID: ""
  }.merge(args)
  data[:TradeDesc] = CGI.escape(data[:TradeDesc])[0...200]
  data[:CardValidMM] = data[:CardValidMM].to_s.rjust(2, "0")
  data[:Remark] = CGI.escape(data[:Remark])[0...200]

  post_data = build_post_data trade_type: :create_trade, args: data

  response = request(service_url: service_url, data: post_data, is_soap_request: true)

  parse trade_type: :create_trade, response: response
end
do_action(args = {}) click to toggle source

Execute action for trade

# File lib/allpay/client.rb, line 336
def do_action args = {}
  raise_argument_error(msg: :parameter_should_be, field: "Parameter", data: "Hash") unless args.is_a? Hash

  # filter arguments by accept keys
  accept_keys = [
    :ServiceURL, :MerchantTradeNo, :TradeNo, :Action, :TotalAmount, :PlatformID
  ]
  args = args.filter(accept_keys)

  raise_argument_error(msg: :missing_parameter, field: :ServiceURL) if args[:ServiceURL].nil?
  raise_argument_error(msg: :parameter_should_be, field: :ServiceURL, data: "String") unless args[:ServiceURL].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :ServiceURL) if args[:ServiceURL].empty?

  raise_argument_error(msg: :missing_parameter, field: :MerchantTradeNo) if args[:MerchantTradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :MerchantTradeNo, data: "String") unless args[:MerchantTradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :MerchantTradeNo) if args[:MerchantTradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :MerchantTradeNo, length: 20) if args[:MerchantTradeNo].size > 20

  raise_argument_error(msg: :missing_parameter, field: :TradeNo) if args[:TradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :TradeNo, data: "String") unless args[:TradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :TradeNo) if args[:TradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :TradeNo, length: 20) if args[:TradeNo].size > 20

  raise_argument_error(msg: :missing_parameter, field: :Action) if args[:Action].nil?
  raise_argument_error(msg: :parameter_should_be, field: :Action, data: "String") unless args[:Action].is_a? String
  raise_argument_error(msg: :parameter_should_be, field: :Action, data: ActionType.readable_keys) unless ActionType.values.include? args[:Action]

  raise_argument_error(msg: :missing_parameter, field: :TotalAmount) if args[:TotalAmount].nil?
  raise_argument_error(msg: :parameter_should_be, field: :TotalAmount, data: "Integer") unless args[:TotalAmount].is_a? Integer
  raise_argument_error(msg: :parameter_should_be, field: :TotalAmount, data: "greater than 0") if args[:TotalAmount] <= 0

  if args.has_key? :PlatformID
    raise_argument_error(msg: :parameter_should_be, field: :PlatformID, data: "String") unless args[:PlatformID].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :PlatformID, length: 9) if args[:PlatformID].size > 9
  end

  service_url = args[:ServiceURL]
  args.delete :ServiceURL

  data = {}.merge(args)

  post_data = build_post_data trade_type: :do_action, args: data

  response = request service_url: service_url, data: post_data, platform_id: args[:PlatformID]

  parse trade_type: :do_action, response: response
end
query_trade(args = {}) click to toggle source

Query trade information

# File lib/allpay/client.rb, line 295
def query_trade args = {}
  raise_argument_error(msg: :parameter_should_be, field: "Parameter", data: "Hash") unless args.is_a? Hash

  # filter arguments by accept keys
  accept_keys = [
    :ServiceURL, :MerchantTradeNo, :PlatformID
  ]
  args = args.filter(accept_keys)

  raise_argument_error(msg: :missing_parameter, field: :ServiceURL) if args[:ServiceURL].nil?
  raise_argument_error(msg: :parameter_should_be, field: :ServiceURL, data: "String") unless args[:ServiceURL].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :ServiceURL) if args[:ServiceURL].empty?

  raise_argument_error(msg: :missing_parameter, field: :MerchantTradeNo) if args[:MerchantTradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :MerchantTradeNo, data: "String") unless args[:MerchantTradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :MerchantTradeNo) if args[:MerchantTradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :MerchantTradeNo, length: 20) if args[:MerchantTradeNo].size > 20

  if args.has_key? :PlatformID
    raise_argument_error(msg: :parameter_should_be, field: :PlatformID, data: "String") unless args[:PlatformID].is_a? String
    raise_argument_error(msg: :cannot_be_empty, field: :PlatformID) if args[:PlatformID].nil? or args[:PlatformID].empty?
    raise_argument_error(msg: :reach_max_length, field: :PlatformID, length: 9) if args[:PlatformID].size > 9
  end

  trade_type = args[:PlatformID].nil? ? :query_trade : :platform_query_trade

  service_url = args[:ServiceURL]
  args.delete :ServiceURL

  data = {
    PlatformID: ""
  }.merge(args)

  post_data = build_post_data trade_type: trade_type, args: data

  response = request(service_url: service_url, data: post_data, is_soap_request: true)

  parse trade_type: :query_trade, response: response
end
resend_otp(args = {}) click to toggle source

Resend otp code

# File lib/allpay/client.rb, line 251
def resend_otp args = {}
  raise_argument_error(msg: :parameter_should_be, field: "Parameter", data: "Hash") unless args.is_a? Hash

  # filter arguments by accept keys
  accept_keys = [
    :ServiceURL, :MerchantTradeNo, :TradeNo, :PlatformID
  ]
  args = args.filter(accept_keys)

  raise_argument_error(msg: :missing_parameter, field: :ServiceURL) if args[:ServiceURL].nil?
  raise_argument_error(msg: :parameter_should_be, field: :ServiceURL, data: "String") unless args[:ServiceURL].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :ServiceURL) if args[:ServiceURL].empty?

  raise_argument_error(msg: :missing_parameter, field: :MerchantTradeNo) if args[:MerchantTradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :MerchantTradeNo, data: "String") unless args[:MerchantTradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :MerchantTradeNo) if args[:MerchantTradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :MerchantTradeNo, length: 20) if args[:MerchantTradeNo].size > 20

  raise_argument_error(msg: :missing_parameter, field: :TradeNo) if args[:TradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :TradeNo, data: "String") unless args[:TradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :TradeNo) if args[:TradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :TradeNo, length: 20) if args[:TradeNo].size > 20

  if args.has_key? :PlatformID
    raise_argument_error(msg: :parameter_should_be, field: :PlatformID, data: "String") unless args[:PlatformID].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :PlatformID, length: 9) if args[:PlatformID].size > 9
  end

  service_url = args[:ServiceURL]
  args.delete :ServiceURL

  data = {
    MerchantID: @merchant_id,
    PlatformID: ""
  }.merge(args)

  post_data = build_post_data trade_type: :resend_otp, args: data

  response = request(service_url: service_url, data: post_data, is_soap_request: true)

  parse trade_type: :resend_otp, response: response
end
verify_order_by_otp(args = {}) click to toggle source

Verify order by otp code

# File lib/allpay/client.rb, line 202
def verify_order_by_otp args = {}
  raise_argument_error(msg: :parameter_should_be, field: "Parameter", data: "Hash") unless args.is_a? Hash

  # filter argumentss by accept keys
  accept_keys = [
    :ServiceURL, :MerchantTradeNo, :TradeNo, :OtpCode, :PlatformID
  ]
  args = args.filter(accept_keys)

  raise_argument_error(msg: :missing_parameter, field: :ServiceURL) if args[:ServiceURL].nil?
  raise_argument_error(msg: :parameter_should_be, field: :ServiceURL, data: "String") unless args[:ServiceURL].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :ServiceURL) if args[:ServiceURL].empty?

  raise_argument_error(msg: :missing_parameter, field: :MerchantTradeNo) if args[:MerchantTradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :MerchantTradeNo, data: "String") unless args[:MerchantTradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :MerchantTradeNo) if args[:MerchantTradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :MerchantTradeNo, length: 20) if args[:MerchantTradeNo].size > 20

  raise_argument_error(msg: :missing_parameter, field: :TradeNo) if args[:TradeNo].nil?
  raise_argument_error(msg: :parameter_should_be, field: :TradeNo, data: "String") unless args[:TradeNo].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :TradeNo) if args[:TradeNo].empty?
  raise_argument_error(msg: :reach_max_length, field: :TradeNo, length: 20) if args[:TradeNo].size > 20

  raise_argument_error(msg: :missing_parameter, field: :OtpCode) if args[:OtpCode].nil?
  raise_argument_error(msg: :parameter_should_be, field: :OtpCode, data: "String") unless args[:OtpCode].is_a? String
  raise_argument_error(msg: :cannot_be_empty, field: :OtpCode) if args[:OtpCode].empty?
  raise_argument_error(msg: :reach_max_length, field: :OtpCode, length: 10) if args[:OtpCode].size > 10

  if args.has_key? :PlatformID
    raise_argument_error(msg: :parameter_should_be, field: :PlatformID, data: "String") unless args[:PlatformID].is_a? String
    raise_argument_error(msg: :reach_max_length, field: :PlatformID, length: 9) if args[:PlatformID].size > 9
  end

  service_url = args[:ServiceURL]
  args.delete :ServiceURL

  data = {
    MerchantID: @merchant_id,
    PlatformID: ""
  }.merge(args)

  post_data = build_post_data trade_type: :verify_order_by_otp, args: data

  response = request(service_url: service_url, data: post_data, is_soap_request: true)

  parse trade_type: :verify_order_by_otp, response: response
end

Private Instance Methods

build_post_data(trade_type:, args: case trade_type) click to toggle source
# File lib/allpay/client.rb, line 412
def build_post_data trade_type:, args:
  case trade_type
  when :create_trade
    xml_data= "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Root><Data><MerchantID>#{@merchant_id}</MerchantID><MerchantTradeNo>#{args[:MerchantTradeNo]}</MerchantTradeNo><MerchantTradeDate>#{args[:MerchantTradeDate]}</MerchantTradeDate><TotalAmount>#{args[:TotalAmount]}</TotalAmount><TradeDesc>#{args[:TradeDesc]}</TradeDesc><CardNo>#{args[:CardNo]}</CardNo><CardValidMM>#{args[:CardValidMM]}</CardValidMM><CardValidYY>#{args[:CardValidYY]}</CardValidYY><CardCVV2>#{args[:CardCVV2]}</CardCVV2><UnionPay>#{args[:UnionPay]}</UnionPay><Installment>#{args[:Installment]}</Installment><ThreeD>#{args[:ThreeD]}</ThreeD><CharSet>#{args[:CharSet]}</CharSet><Enn>#{args[:Enn]}</Enn><BankOnly>#{args[:BankOnly]}</BankOnly><Redeem>#{args[:Redeem]}</Redeem><PhoneNumber>#{args[:PhoneNumber]}</PhoneNumber><AddMember>#{args[:AddMember]}</AddMember><CName>#{args[:CName]}</CName><Email>#{args[:Email]}</Email><Remark>#{args[:Remark]}</Remark><PlatformID>#{args[:PlatformID]}</PlatformID></Data></Root>"
    encrypted_data = encrypt(xml_data)
    "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><CreateTrade xmlns=\"http://PaymentCenter.AllPay.com.tw/\"><merchantID>#{@merchant_id}</merchantID><xmlData>#{encrypted_data}</xmlData></CreateTrade></soap12:Body></soap12:Envelope>"
  when :verify_order_by_otp
    xml_data = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Root><Data><MerchantID>#{args[:MerchantID]}</MerchantID><MerchantTradeNo>#{args[:MerchantTradeNo]}</MerchantTradeNo><TradeNo>#{args[:TradeNo]}</TradeNo><OtpCode>#{args[:OtpCode]}</OtpCode><PlatformID>#{args[:PlatformID]}</PlatformID></Data></Root>"
    encrypted_data = encrypt(xml_data)
    "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><VerifyOrderByOtp xmlns=\"http://PaymentCenter.AllPay.com.tw/\"><merchantID>#{@merchant_id}</merchantID><xmlData>#{encrypted_data}</xmlData></VerifyOrderByOtp></soap12:Body></soap12:Envelope>"
  when :resend_otp
    xml_data = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Root><Data><MerchantID>#{args[:MerchantID]}</MerchantID><MerchantTradeNo>#{args[:MerchantTradeNo]}</MerchantTradeNo><TradeNo>#{args[:TradeNo]}</TradeNo><PlatformID></PlatformID></Data></Root>"
    encrypted_data = encrypt(xml_data)
    "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><ResendOtp xmlns=\"http://PaymentCenter.AllPay.com.tw/\"><merchantID>#{@merchant_id}</merchantID><xmlData>#{encrypted_data}</xmlData></ResendOtp></soap12:Body></soap12:Envelope>"
  when :query_trade
    merchant_trade_no = encrypt(args[:MerchantTradeNo])
    "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><QueryTrade xmlns=\"http://PaymentCenter.AllPay.com.tw/\"><merchantID>#{@merchant_id}</merchantID><merchantTradeNo>#{merchant_trade_no}</merchantTradeNo></QueryTrade></soap12:Body></soap12:Envelope>"
  when :platform_query_trade
    merchant_trade_no = encrypt(args[:MerchantTradeNo])
    platform_id = encrypt(args[:PlatformID])
    "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><PlatformQueryTrade xmlns=\"http://PaymentCenter.AllPay.com.tw/\"><merchantID>#{@merchant_id}</merchantID><merchantTradeNo>#{merchant_trade_no}</merchantTradeNo><PlatformID>#{platform_id}</PlatformID></PlatformQueryTrade></soap12:Body></soap12:Envelope>"
  when :do_action
    encrypt("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Root><Data><MerchantID>#{@merchant_id}</MerchantID><MerchantTradeNo>#{args[:MerchantTradeNo]}</MerchantTradeNo><TradeNo>#{args[:TradeNo]}</TradeNo><Action>#{args[:Action]}</Action><TotalAmount>#{args[:TotalAmount]}</TotalAmount></Data></Root>")
  end
decrypt(encrypted_data) click to toggle source

Decrypt(by AES-128-CBC) and decode(by base64) data

# File lib/allpay/client.rb, line 401
def decrypt encrypted_data
  encrypted_data = Base64.strict_decode64(encrypted_data)

  decipher = OpenSSL::Cipher::AES128.new(:CBC)
  decipher.decrypt
  decipher.key = @hash_key
  decipher.iv = @hash_iv
  plain_data = decipher.update(encrypted_data) + decipher.final
  CGI.unescape plain_data
end
encrypt(plain_data) click to toggle source

Encode(by base64) and encrypt(by AES-128-CBC) data

# File lib/allpay/client.rb, line 391
def encrypt plain_data
  cipher = OpenSSL::Cipher::AES128.new(:CBC)
  cipher.encrypt
  cipher.key = @hash_key
  cipher.iv = @hash_iv
  encrypted_data = cipher.update(plain_data) + cipher.final
  Base64.strict_encode64(encrypted_data)
end
raise_argument_error(args) click to toggle source
# File lib/allpay/client.rb, line 386
def raise_argument_error args
  raise ArgumentError, ErrorMessage.generate(args)
end