Class: AllpayInvoice::Invoice

Inherits:
Object
  • Object
show all
Defined in:
lib/allpay_invoice/invoice.rb

Constant Summary collapse

PRE_ENCODE_COLUMN =
[:CustomerName, :CustomerAddr , :CustomerEmail, :ItemName, :ItemWord, :InvoiceRemark, :InvCreateDate, :NotifyMail, :Reason, :IIS_Customer_Name, :IIS_Customer_Addr]
BLACK_LIST_COLUMN =
[:ItemName, :ItemWord, :InvoiceRemark, :Reason]
PRODUCTION_API_HOST =
'https://einvoice.allpay.com.tw'.freeze
TEST_API_HOST =
'http://einvoice-stage.allpay.com.tw'.freeze
TEST_OPTIONS =
{
  merchant_id: '2000132',
  hash_key: 'ejCk326UnaZWKisg',
  hash_iv: 'q9jcZX8Ib9LM8wYk'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Invoice

Returns a new instance of Invoice.



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/allpay_invoice/invoice.rb', line 22

def initialize(options = {})
  @options = { mode: :production }.merge!(options)
  case @options[:mode]
  when :production
    option_required! :merchant_id, :hash_key, :hash_iv
  when :test
    @options = TEST_OPTIONS.merge(options)
  else
    fail InvalidMode, 'option :mode is either :test or :production'
  end
  @options.freeze
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



20
21
22
# File 'lib/allpay_invoice/invoice.rb', line 20

def options
  @options
end

Instance Method Details

#allowance(overwrite_params = {}) ⇒ Object

開立折讓API url_encode => NotifyMail / ItemName / ItemWord 在產生 CheckMacValue 時,須將 ItemName 及 ItemWord 等欄位排除



88
89
90
91
# File 'lib/allpay_invoice/invoice.rb', line 88

def allowance(overwrite_params = {})
  res = request '/Invoice/Allowance', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#allowance_invalid(overwrite_params = {}) ⇒ Object

折讓作廢API url_encode => Reason 在產生 CheckMacValue 時,須將 ItemName 及 ItemWord 等欄位排除



104
105
106
107
# File 'lib/allpay_invoice/invoice.rb', line 104

def allowance_invalid(overwrite_params = {})
  res = request '/AllowanceInvalid', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#api_hostObject



35
36
37
38
39
40
# File 'lib/allpay_invoice/invoice.rb', line 35

def api_host
  case @options[:mode]
  when :production then PRODUCTION_API_HOST
  when :test then TEST_API_HOST
  end
end

#delay_issue(overwrite_params = {}) ⇒ Object

延遲或觸發開立發票API url_encode => CustomerEmail / CustomerName / CustomerAddr / ItemName / ItemWord / InvoiceRemark 在產生 CheckMacValue 時, 須將 ItemName、ItemWord 及 InvoiceRemark 等欄位排除



80
81
82
83
# File 'lib/allpay_invoice/invoice.rb', line 80

def delay_issue(overwrite_params = {})
  res = request '/Invoice/DelayIssue', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#generate_params(overwrite_params = {}) ⇒ Object



56
57
58
59
60
61
62
# File 'lib/allpay_invoice/invoice.rb', line 56

def generate_params(overwrite_params = {})
  result = overwrite_params
  result[:TimeStamp] = Time.now.to_i
  result[:MerchantID] = @options[:merchant_id]
  result[:CheckMacValue] = make_mac(result)
  result
end

#invoice_notify(overwrite_params = {}) ⇒ Object

發送通知API



142
143
144
145
# File 'lib/allpay_invoice/invoice.rb', line 142

def invoice_notify(overwrite_params = {})
  res = request '/Notify/InvoiceNotify', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#issue(overwrite_params = {}) ⇒ Object

一般開立發票API url_encode => CustomerAddr / CustomerName / CustomerEmail / ItemName / ItemWord / InvCreateDate / InvoiceRemark 在產生 CheckMacValue 時,須將 ItemName、ItemWord 及 InvoiceRemark 等欄位排除



72
73
74
75
# File 'lib/allpay_invoice/invoice.rb', line 72

def issue(overwrite_params = {})
  res = request '/Invoice/Issue', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#issue_invalid(overwrite_params = {}) ⇒ Object

發票作廢API url_encode => Reason 在產生 CheckMacValue 時,須將 Reason 欄位排除



96
97
98
99
# File 'lib/allpay_invoice/invoice.rb', line 96

def issue_invalid(overwrite_params = {})
  res = request '/Invoice/IssueInvalid', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#make_mac(params = {}) ⇒ Object



42
43
44
45
46
47
48
# File 'lib/allpay_invoice/invoice.rb', line 42

def make_mac(params = {})
  sort_hash = pre_encode(params.clone).sort_by { |x| x.to_s.downcase }
  raw = sort_hash.map! { |k, v| "#{k}=#{v}" }.join('&')
  str = "HashKey=#{@options[:hash_key]}&#{raw}&HashIV=#{@options[:hash_iv]}"
  url_encoded = CGI.escape(str).downcase!
  Digest::MD5.hexdigest(url_encoded).upcase!
end

#query_allowance(overwrite_params = {}) ⇒ Object

查詢折讓明細API url_encode => ItemName / ItemWord / IIS_Customer_Name 在產生 CheckMacValue 時,須將 ItemName、ItemWord 等欄位排除



128
129
130
131
# File 'lib/allpay_invoice/invoice.rb', line 128

def query_allowance(overwrite_params = {})
  res = request '/Query/Allowance', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#query_allowance_invalid(overwrite_params = {}) ⇒ Object

查詢折讓作廢明細API url_encode => Reason 在產生 CheckMacValue 時,須將 Reason 等欄位排除



136
137
138
139
# File 'lib/allpay_invoice/invoice.rb', line 136

def query_allowance_invalid(overwrite_params = {})
  res = request '/Query/AllowanceInvalid', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#query_issue(overwrite_params = {}) ⇒ Object

查詢發票API url_encode => IIS_Customer_Name / IIS_Customer_Addr / ItemName / ItemWord / InvoiceRemark 在產生 CheckMacValue 時,須將 ItemName、ItemWord 及 InvoiceRemark 等欄位排除



112
113
114
115
# File 'lib/allpay_invoice/invoice.rb', line 112

def query_issue(overwrite_params = {})
  res = request '/Query/Issue', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#query_issue_invalid(overwrite_params = {}) ⇒ Object

查詢作廢發票API url_encode => Reason 在產生 CheckMacValue 時,須將 Reason 等欄位排除



120
121
122
123
# File 'lib/allpay_invoice/invoice.rb', line 120

def query_issue_invalid(overwrite_params = {})
  res = request '/Query/IssueInvalid', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#request(path, params = {}) ⇒ Object



64
65
66
67
# File 'lib/allpay_invoice/invoice.rb', line 64

def request(path, params = {})
  api_url = URI.join(api_host + path)
  Net::HTTP.post_form api_url, params
end

#trigger_issue(overwrite_params = {}) ⇒ Object

付款完成觸發或延遲開立發票API



148
149
150
151
# File 'lib/allpay_invoice/invoice.rb', line 148

def trigger_issue(overwrite_params = {})
  res = request '/Invoice/TriggerIssue', generate_params(overwrite_params)
  Hash[res.body.split('&').map! { |i| i.split('=') }]
end

#verify_mac(params = {}) ⇒ Object



50
51
52
53
54
# File 'lib/allpay_invoice/invoice.rb', line 50

def verify_mac(params = {})
  stringified_keys = params.stringify_keys
  check_mac_value = stringified_keys.delete('CheckMacValue')
  make_mac(stringified_keys) == check_mac_value
end