bitfluent-activemerchant 1.5.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +520 -0
- data/CONTRIBUTORS +138 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +136 -0
- data/gem-public_cert.pem +20 -0
- data/lib/active_merchant/billing/avs_result.rb +98 -0
- data/lib/active_merchant/billing/base.rb +57 -0
- data/lib/active_merchant/billing/check.rb +68 -0
- data/lib/active_merchant/billing/credit_card.rb +159 -0
- data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
- data/lib/active_merchant/billing/cvv_result.rb +38 -0
- data/lib/active_merchant/billing/expiry_date.rb +34 -0
- data/lib/active_merchant/billing/gateway.rb +163 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +654 -0
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +736 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +244 -0
- data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
- data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
- data/lib/active_merchant/billing/gateways/bogus.rb +102 -0
- data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
- data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
- data/lib/active_merchant/billing/gateways/cyber_source.rb +406 -0
- data/lib/active_merchant/billing/gateways/data_cash.rb +593 -0
- data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
- data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
- data/lib/active_merchant/billing/gateways/eway.rb +277 -0
- data/lib/active_merchant/billing/gateways/exact.rb +222 -0
- data/lib/active_merchant/billing/gateways/first_pay.rb +172 -0
- data/lib/active_merchant/billing/gateways/garanti.rb +222 -0
- data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
- data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
- data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -0
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
- data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
- data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
- data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
- data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
- data/lib/active_merchant/billing/gateways/ogone.rb +279 -0
- data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
- data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
- data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
- data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
- data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
- data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
- data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
- data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
- data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
- data/lib/active_merchant/billing/gateways/paypal_express.rb +135 -0
- data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
- data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
- data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
- data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
- data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
- data/lib/active_merchant/billing/gateways/realex.rb +200 -0
- data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
- data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
- data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
- data/lib/active_merchant/billing/gateways/sage.rb +146 -0
- data/lib/active_merchant/billing/gateways/sage_pay.rb +309 -0
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
- data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
- data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
- data/lib/active_merchant/billing/gateways/smart_ps.rb +265 -0
- data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
- data/lib/active_merchant/billing/gateways/transax.rb +25 -0
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
- data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
- data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
- data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
- data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
- data/lib/active_merchant/billing/gateways.rb +18 -0
- data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
- data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
- data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
- data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
- data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
- data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
- data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
- data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
- data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
- data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
- data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
- data/lib/active_merchant/billing/integrations/helper.rb +93 -0
- data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
- data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
- data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
- data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
- data/lib/active_merchant/billing/integrations/ipay88/helper.rb +120 -0
- data/lib/active_merchant/billing/integrations/ipay88/return.rb +121 -0
- data/lib/active_merchant/billing/integrations/ipay88.rb +40 -0
- data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
- data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
- data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
- data/lib/active_merchant/billing/integrations/notification.rb +62 -0
- data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
- data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
- data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
- data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
- data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
- data/lib/active_merchant/billing/integrations/quickpay.rb +17 -0
- data/lib/active_merchant/billing/integrations/return.rb +35 -0
- data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
- data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
- data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
- data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
- data/lib/active_merchant/billing/integrations.rb +29 -0
- data/lib/active_merchant/billing/response.rb +32 -0
- data/lib/active_merchant/billing.rb +9 -0
- data/lib/active_merchant/common/connection.rb +172 -0
- data/lib/active_merchant/common/country.rb +319 -0
- data/lib/active_merchant/common/error.rb +26 -0
- data/lib/active_merchant/common/post_data.rb +24 -0
- data/lib/active_merchant/common/posts_data.rb +47 -0
- data/lib/active_merchant/common/requires_parameters.rb +16 -0
- data/lib/active_merchant/common/utils.rb +18 -0
- data/lib/active_merchant/common/validateable.rb +76 -0
- data/lib/active_merchant/common.rb +14 -0
- data/lib/active_merchant.rb +38 -0
- data/lib/activemerchant.rb +1 -0
- data/lib/certs/cacert.pem +7815 -0
- data/lib/support/gateway_support.rb +58 -0
- data/lib/support/outbound_hosts.rb +25 -0
- metadata +235 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module HiTrust
|
|
5
|
+
class Return < ActiveMerchant::Billing::Integrations::Return
|
|
6
|
+
SUCCESS = "00"
|
|
7
|
+
CODES = { "00" => "Operation completed successfully",
|
|
8
|
+
"-1" => "Unable to initialize winsock dll.",
|
|
9
|
+
"-2" => "Can't create stream socket.",
|
|
10
|
+
"-3" => "No Request Message.",
|
|
11
|
+
"-4" => "Can't connect to server.",
|
|
12
|
+
"-5" => "Send socket error.",
|
|
13
|
+
"-6" => "Couldn't receive data.",
|
|
14
|
+
"-7" => "Receive Broken message.",
|
|
15
|
+
"-8" => "Unable to initialize Envirnment.",
|
|
16
|
+
"-9" => "Can't Read Server RSA File.",
|
|
17
|
+
"-10" => "Can't Read Client RSA File.",
|
|
18
|
+
"-11" => "Web Server error.",
|
|
19
|
+
"-12" => "Receive Message type error.",
|
|
20
|
+
"-13" => "No Request Message.",
|
|
21
|
+
"-14" => "No Response Content.",
|
|
22
|
+
"-18" => "Merchant Update URL not found.",
|
|
23
|
+
"-19" => "Server URL not find Domain or IP.",
|
|
24
|
+
"-20" => "Server URL only can fill http or https.",
|
|
25
|
+
"-21" => "Server Config File open error.",
|
|
26
|
+
"-22" => "Server RSA Key File open error.",
|
|
27
|
+
"-23" => "Server RSA Key File read error.",
|
|
28
|
+
"-24" => "Server Config File have some errors, Please to check it.",
|
|
29
|
+
"-25" => "Merchant Config File open error.",
|
|
30
|
+
"-26" => "Merchant RSA Key File open error.",
|
|
31
|
+
"-27" => "Merchant RSA Key File read error.",
|
|
32
|
+
"-28" => "Merchant Config File has some errors, Please to check it.",
|
|
33
|
+
"-29" => "Server Type is unknown.",
|
|
34
|
+
"-30" => "Comm Type is unknown.",
|
|
35
|
+
"-31" => "Input Parameter [ORDERNO] is null or empty.",
|
|
36
|
+
"-32" => "Input Parameter [STOREID] is null or empty.",
|
|
37
|
+
"-33" => "Input Parameter [ORDERDESC] is null or empty.",
|
|
38
|
+
"-34" => "Input Parameter [CURRENCY] is null or empty.",
|
|
39
|
+
"-35" => "Input Parameter [AMOUNT] is null or empty.",
|
|
40
|
+
"-36" => "Input Parameter [ORDERURL] is null or empty.",
|
|
41
|
+
"-37" => "Input Parameter [RETURNURL] is null or empty.",
|
|
42
|
+
"-38" => "Input Parameter [DEPOSIT] is null or empty.",
|
|
43
|
+
"-39" => "Input Parameter [QUERYFLAG] is null or empty.",
|
|
44
|
+
"-40" => "Input Parameter [UPDATEURL] is null or empty.",
|
|
45
|
+
"-41" => "Input Parameter [MERUPDATEURL] is null or empty.",
|
|
46
|
+
"-42" => "Input Parameter [KEY] is null or empty.",
|
|
47
|
+
"-43" => "Input Parameter [MAC] is null or empty.",
|
|
48
|
+
"-44" => "Input Parameter [CIPHER] is null or empty.",
|
|
49
|
+
"-45" => "Input Parameter [TrxType] is wrong.",
|
|
50
|
+
"-100" => "TrustLink Server is closed. Or Merchant Server IP is not consistent with TrustLink Server setting.",
|
|
51
|
+
"-101" => "TrustLink Server receives NULL.",
|
|
52
|
+
"-308" => "Order Number already exists.",
|
|
53
|
+
"positive" => "Response from Bank. Please contact with Acquirer Bank Service or HiTRUST Call Center."
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
def success?
|
|
57
|
+
params['retcode'] == SUCCESS
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def message
|
|
61
|
+
CODES[ params['retcode'] ]
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
module ActiveMerchant #:nodoc:
|
|
3
|
+
module Billing #:nodoc:
|
|
4
|
+
module Integrations #:nodoc:
|
|
5
|
+
module HiTrust
|
|
6
|
+
autoload :Helper, File.dirname(__FILE__) + '/hi_trust/helper.rb'
|
|
7
|
+
autoload :Return, File.dirname(__FILE__) + '/hi_trust/return.rb'
|
|
8
|
+
autoload :Notification, File.dirname(__FILE__) + '/hi_trust/notification.rb'
|
|
9
|
+
|
|
10
|
+
TEST_URL = 'https://testtrustlink.hitrust.com.tw/TrustLink/TrxReq'
|
|
11
|
+
LIVE_URL = 'https://trustlink.hitrust.com.tw/TrustLink/TrxReq'
|
|
12
|
+
|
|
13
|
+
def self.service_url
|
|
14
|
+
ActiveMerchant::Billing::Base.integration_mode == :test ? TEST_URL : LIVE_URL
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.notification(post)
|
|
18
|
+
Notification.new(post)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.return(query_string)
|
|
22
|
+
Return.new(query_string)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
require "digest/sha1"
|
|
2
|
+
|
|
3
|
+
module ActiveMerchant #:nodoc:
|
|
4
|
+
module Billing #:nodoc:
|
|
5
|
+
module Integrations #:nodoc:
|
|
6
|
+
module Ipay88
|
|
7
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
8
|
+
include RequiresParameters
|
|
9
|
+
|
|
10
|
+
# Currencies supported
|
|
11
|
+
# MYR (Malaysian Ringgit - for all payment methods except China Union Pay and PayPal)
|
|
12
|
+
# USD (US Dollar - only for PayPal)
|
|
13
|
+
# CNY (Yuan Renminbi - only for China Union Pay)
|
|
14
|
+
SUPPORTED_CURRENCIES = %w[MYR USD CNY]
|
|
15
|
+
|
|
16
|
+
# Languages supported
|
|
17
|
+
# ISO-8859-1 (English)
|
|
18
|
+
# UTF-8 (Unicode)
|
|
19
|
+
# GB2312 (Chinese Simplified)
|
|
20
|
+
# GD18030 (Chinese Simplified)
|
|
21
|
+
# BIG5 (Chinese Traditional)
|
|
22
|
+
SUPPORTED_LANGS = %w[ISO-8859-1 UTF-8 GB2312 GD18030 BIG5]
|
|
23
|
+
|
|
24
|
+
# Payment methods supported
|
|
25
|
+
# 8 (Alliance Online Transfer)
|
|
26
|
+
# 10 (AmBank)
|
|
27
|
+
# 21 (China Union Pay)
|
|
28
|
+
# 20 (CIMB Click)
|
|
29
|
+
# 2 (Credit Card MYR)
|
|
30
|
+
# 16 (FPX)
|
|
31
|
+
# 15 (Hong Leong Bank Transfer)
|
|
32
|
+
# 6 (Maybank2u.com)
|
|
33
|
+
# 23 (MEPS Cash)
|
|
34
|
+
# 17 (Mobile Money)
|
|
35
|
+
# 33 (PayPal)
|
|
36
|
+
# 14 (RHB)
|
|
37
|
+
PAYMENT_METHODS = %w[8 10 21 20 2 16 15 6 23 17 33 14]
|
|
38
|
+
|
|
39
|
+
attr_reader :amount_in_cents
|
|
40
|
+
|
|
41
|
+
def initialize(order, account, options = {})
|
|
42
|
+
requires!(options, :amount, :currency)
|
|
43
|
+
@amount_in_cents = options[:amount]
|
|
44
|
+
super
|
|
45
|
+
add_field mappings[:signature], signature
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def amount=(money)
|
|
49
|
+
cents = money.respond_to?(:cents) ? money.cents : money
|
|
50
|
+
if money.is_a?(String) or cents.to_i < 0
|
|
51
|
+
raise ArgumentError, "money amount must be either a Money object or a positive integer in cents."
|
|
52
|
+
end
|
|
53
|
+
add_field mappings[:amount], sprintf("%.2f", cents.to_f/100)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def currency(symbol)
|
|
57
|
+
raise ArgumentError, "unsupported currency" unless SUPPORTED_CURRENCIES.include?(symbol)
|
|
58
|
+
add_field mappings[:currency], symbol
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def language(lang)
|
|
62
|
+
raise ArgumentError, "unsupported language" unless SUPPORTED_LANGS.include?(lang)
|
|
63
|
+
add_field mappings[:language], lang
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def payment(pay_method)
|
|
67
|
+
raise ArgumentError, "unsupported payment method" unless PAYMENT_METHODS.include?(pay_method.to_s)
|
|
68
|
+
add_field mappings[:payment], pay_method
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Generate a Base64-encoded SHA1 given a string
|
|
72
|
+
def self.sign(str)
|
|
73
|
+
[Digest::SHA1.digest(str)].pack("m").chomp
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def signature
|
|
77
|
+
self.class.sign(self.sig_components)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# MerchantCode (required)
|
|
81
|
+
mapping :account, "MerchantCode"
|
|
82
|
+
# Amount (required)
|
|
83
|
+
mapping :amount, "Amount"
|
|
84
|
+
# Currency (required)
|
|
85
|
+
mapping :currency, "Currency"
|
|
86
|
+
# RefNo (required)
|
|
87
|
+
mapping :order, "RefNo"
|
|
88
|
+
# ProdDesc (required)
|
|
89
|
+
mapping :description, "ProdDesc"
|
|
90
|
+
# UserName (required)
|
|
91
|
+
# UserEmail (required)
|
|
92
|
+
# UserContact (required)
|
|
93
|
+
mapping :customer, :name => "UserName",
|
|
94
|
+
:email => "UserEmail",
|
|
95
|
+
:phone => "UserContact"
|
|
96
|
+
# Remark
|
|
97
|
+
mapping :remark, "Remark"
|
|
98
|
+
# Lang
|
|
99
|
+
mapping :language, "Lang"
|
|
100
|
+
# PaymentId
|
|
101
|
+
mapping :payment, "PaymentId"
|
|
102
|
+
# ResponseURL
|
|
103
|
+
mapping :return_url, "ResponseURL"
|
|
104
|
+
# Signature
|
|
105
|
+
mapping :signature, "Signature"
|
|
106
|
+
|
|
107
|
+
protected
|
|
108
|
+
def sig_components #:nodoc:
|
|
109
|
+
components = [Ipay88.merchant_key]
|
|
110
|
+
components << fields[mappings[:account]]
|
|
111
|
+
components << fields[mappings[:order]]
|
|
112
|
+
components << amount_in_cents
|
|
113
|
+
components << fields[mappings[:currency]]
|
|
114
|
+
components.join
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
require "digest/sha1"
|
|
2
|
+
|
|
3
|
+
module ActiveMerchant #:nodoc:
|
|
4
|
+
module Billing #:nodoc:
|
|
5
|
+
module Integrations #:nodoc:
|
|
6
|
+
module Ipay88
|
|
7
|
+
class Return < ActiveMerchant::Billing::Integrations::Return
|
|
8
|
+
include ActiveMerchant::PostsData
|
|
9
|
+
|
|
10
|
+
# Merchant Code assigned by iPay88
|
|
11
|
+
def account
|
|
12
|
+
params["MerchantCode"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# The payment method
|
|
16
|
+
def payment
|
|
17
|
+
params["PaymentId"].to_i
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Unique merchant transaction number
|
|
21
|
+
def order
|
|
22
|
+
params["RefNo"]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# The payment with two decimals
|
|
26
|
+
def amount
|
|
27
|
+
params["Amount"]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# The currency. List of possible values:
|
|
31
|
+
# <tt>MYR</tt>::
|
|
32
|
+
# <tt>USD</tt>::
|
|
33
|
+
# <tt>CNY</tt>::
|
|
34
|
+
def currency
|
|
35
|
+
params["Currency"]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Merchant remark
|
|
39
|
+
def remark
|
|
40
|
+
params["Remark"]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Transaction ID from iPay88
|
|
44
|
+
def transaction
|
|
45
|
+
params["TransId"]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Bank's approval code
|
|
49
|
+
def auth_code
|
|
50
|
+
params["AuthCode"]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Payment status. List of possible values:
|
|
54
|
+
# <tt>1</tt>:: Success
|
|
55
|
+
# <tt>0</tt>:: Fail
|
|
56
|
+
def status
|
|
57
|
+
params["Status"]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# The error description. List of possible values:
|
|
61
|
+
# <tt>Duplicate reference number</tt>::
|
|
62
|
+
# <tt>Invalid merchant</tt>::
|
|
63
|
+
# <tt>Invalid parameters</tt>::
|
|
64
|
+
# <tt>Overlimit per transaction</tt>::
|
|
65
|
+
# <tt>Payment not allowed</tt>::
|
|
66
|
+
# <tt>Permission not allow</tt>::
|
|
67
|
+
# <tt>Signature not match</tt>::
|
|
68
|
+
# <tt>Status not approved</tt>::
|
|
69
|
+
def error
|
|
70
|
+
params["ErrDesc"]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# The hash signature
|
|
74
|
+
def signature
|
|
75
|
+
params["Signature"]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Convenience method to check if the request is secure by
|
|
79
|
+
# checking the incoming signature against our own generated
|
|
80
|
+
# signature
|
|
81
|
+
def secure?
|
|
82
|
+
self.generated_signature == self.signature
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Was the transaction successful?
|
|
86
|
+
def success?
|
|
87
|
+
self.secure? && self.requery == "00" && self.status == "1"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
protected
|
|
91
|
+
def generated_signature #:nodoc:
|
|
92
|
+
Helper.sign(self.sig_components)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def sig_components #:nodoc:
|
|
96
|
+
components = [Ipay88.merchant_key]
|
|
97
|
+
[:account, :payment, :order, :amount_in_cents, :currency, :status].each do |i|
|
|
98
|
+
components << self.send(i)
|
|
99
|
+
end
|
|
100
|
+
components.join
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def requery #:nodoc:
|
|
104
|
+
data = { "MerchantCode" => self.account, "RefNo" => self.order, "Amount" => self.amount }
|
|
105
|
+
params = parameterize(data)
|
|
106
|
+
ssl_post Ipay88.service_url, params, { "Content-Length" => params.size.to_s, "User-Agent" => "Active Merchant -- http://activemerchant.org" }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
def parameterize(params) #:nodoc:
|
|
111
|
+
params.reject { |k, v| v.blank? }.keys.sort.collect { |key| "#{key}=#{CGI.escape(params[key].to_s)}" }.join("&")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def amount_in_cents #:nodoc:
|
|
115
|
+
@amount_in_cents ||= (self.amount || "").gsub(/[.,]/, "")
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Ipay88
|
|
5
|
+
autoload :Return, "active_merchant/billing/integrations/ipay88/return.rb"
|
|
6
|
+
autoload :Helper, "active_merchant/billing/integrations/ipay88/helper.rb"
|
|
7
|
+
autoload :Notification, "active_merchant/billing/integrations/ipay88/notification.rb"
|
|
8
|
+
|
|
9
|
+
mattr_accessor :merch_key
|
|
10
|
+
|
|
11
|
+
# The merchant key provided to you by iPay88.
|
|
12
|
+
def self.merchant_key
|
|
13
|
+
self.merch_key
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Set the merchant key (in a Rails initializer, for example)
|
|
17
|
+
#
|
|
18
|
+
# ActiveMerchant::Billing::Integrations::Ipay88.merchant_key = "foo"
|
|
19
|
+
#
|
|
20
|
+
def self.merchant_key=(key)
|
|
21
|
+
self.merch_key = key
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The URL to POST your payment form to
|
|
25
|
+
def self.service_url
|
|
26
|
+
"https://www.mobile88.com/epayment/entry.asp"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# The requery URL upon returning from iPay88
|
|
30
|
+
def self.entry_url
|
|
31
|
+
"https://www.mobile88.com/epayment/enquiry.asp"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.return(query_string)
|
|
35
|
+
Return.new(query_string)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Nochex
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
# Required Parameters
|
|
7
|
+
# email
|
|
8
|
+
# amount
|
|
9
|
+
mapping :account, 'email'
|
|
10
|
+
mapping :amount, 'amount'
|
|
11
|
+
|
|
12
|
+
# Set the field status = test for testing with accounts:
|
|
13
|
+
# Account Password
|
|
14
|
+
# test1@nochex.com 123456
|
|
15
|
+
# test2@nochex.com 123456
|
|
16
|
+
# def initialize(order, account, options = {})
|
|
17
|
+
# super
|
|
18
|
+
# add_field('status', 'test')
|
|
19
|
+
# end
|
|
20
|
+
|
|
21
|
+
# Need to format the amount to have 2 decimal places
|
|
22
|
+
def amount=(money)
|
|
23
|
+
cents = money.respond_to?(:cents) ? money.cents : money
|
|
24
|
+
if money.is_a?(String) or cents.to_i <= 0
|
|
25
|
+
raise ArgumentError, 'money amount must be either a Money object or a positive integer in cents.'
|
|
26
|
+
end
|
|
27
|
+
add_field mappings[:amount], sprintf("%.2f", cents.to_f/100)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Optional Parameters
|
|
31
|
+
# ordernumber
|
|
32
|
+
mapping :order, 'ordernumber'
|
|
33
|
+
|
|
34
|
+
# firstname
|
|
35
|
+
# lastname
|
|
36
|
+
# email_address_sender
|
|
37
|
+
mapping :customer, :first_name => 'firstname',
|
|
38
|
+
:last_name => 'lastname',
|
|
39
|
+
:email => 'email_address_sender'
|
|
40
|
+
|
|
41
|
+
# town
|
|
42
|
+
# firstline
|
|
43
|
+
# county
|
|
44
|
+
# postcode
|
|
45
|
+
mapping :billing_address, :city => 'town',
|
|
46
|
+
:address1 => 'firstline',
|
|
47
|
+
:state => 'county',
|
|
48
|
+
:zip => 'postcode'
|
|
49
|
+
|
|
50
|
+
# responderurl
|
|
51
|
+
mapping :notify_url, 'responderurl'
|
|
52
|
+
|
|
53
|
+
# returnurl
|
|
54
|
+
mapping :return_url, 'returnurl'
|
|
55
|
+
|
|
56
|
+
# cancelurl
|
|
57
|
+
mapping :cancel_return_url, 'cancelurl'
|
|
58
|
+
|
|
59
|
+
# description
|
|
60
|
+
mapping :description, 'description'
|
|
61
|
+
|
|
62
|
+
# Currently unmapped
|
|
63
|
+
# logo
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'date'
|
|
3
|
+
|
|
4
|
+
module ActiveMerchant #:nodoc:
|
|
5
|
+
module Billing #:nodoc:
|
|
6
|
+
module Integrations #:nodoc:
|
|
7
|
+
module Nochex
|
|
8
|
+
# Parser and handler for incoming Automatic Payment Confirmations from Nochex.
|
|
9
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
|
10
|
+
include ActiveMerchant::PostsData
|
|
11
|
+
|
|
12
|
+
def complete?
|
|
13
|
+
status == 'Completed'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Id of the order we passed to Nochex
|
|
17
|
+
def item_id
|
|
18
|
+
params['order_id']
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def transaction_id
|
|
22
|
+
params['transaction_id']
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def currency
|
|
26
|
+
'GBP'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# When was this payment received by the client.
|
|
30
|
+
def received_at
|
|
31
|
+
# U.K. Format: 27/09/2006 22:30:54
|
|
32
|
+
return if params['transaction_date'].blank?
|
|
33
|
+
time = params['transaction_date'].scan(/\d+/)
|
|
34
|
+
Time.utc(time[2], time[1], time[0], time[3], time[4], time[5])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def payer_email
|
|
38
|
+
params['from_email']
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def receiver_email
|
|
42
|
+
params['to_email']
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def security_key
|
|
46
|
+
params['security_key']
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# the money amount we received in X.2 decimal.
|
|
50
|
+
def gross
|
|
51
|
+
sprintf("%.2f", params['amount'].to_f)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Was this a test transaction?
|
|
55
|
+
def test?
|
|
56
|
+
params['status'] == 'test'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def status
|
|
60
|
+
'Completed'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Acknowledge the transaction to Nochex. This method has to be called after a new
|
|
64
|
+
# apc arrives. Nochex will verify that all the information we received are correct and will return a
|
|
65
|
+
# ok or a fail. This is very similar to the PayPal IPN scheme.
|
|
66
|
+
#
|
|
67
|
+
# Example:
|
|
68
|
+
#
|
|
69
|
+
# def nochex_ipn
|
|
70
|
+
# notify = NochexNotification.new(request.raw_post)
|
|
71
|
+
#
|
|
72
|
+
# if notify.acknowledge
|
|
73
|
+
# ... process order ... if notify.complete?
|
|
74
|
+
# else
|
|
75
|
+
# ... log possible hacking attempt ...
|
|
76
|
+
# end
|
|
77
|
+
def acknowledge
|
|
78
|
+
payload = raw
|
|
79
|
+
|
|
80
|
+
response = ssl_post(Nochex.notification_confirmation_url, payload,
|
|
81
|
+
'Content-Length' => "#{payload.size}",
|
|
82
|
+
'User-Agent' => "Active Merchant -- http://activemerchant.org",
|
|
83
|
+
'Content-Type' => "application/x-www-form-urlencoded"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
raise StandardError.new("Faulty Nochex result: #{response}") unless ["AUTHORISED", "DECLINED"].include?(response)
|
|
87
|
+
|
|
88
|
+
response == "AUTHORISED"
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
|
|
2
|
+
module ActiveMerchant #:nodoc:
|
|
3
|
+
module Billing #:nodoc:
|
|
4
|
+
module Integrations #:nodoc:
|
|
5
|
+
# To start with Nochex, follow the instructions for installing
|
|
6
|
+
# ActiveMerchant as a plugin, as described on
|
|
7
|
+
# http://www.activemerchant.org/.
|
|
8
|
+
#
|
|
9
|
+
# The plugin will automatically add the ActionView helper for
|
|
10
|
+
# ActiveMerchant, which will allow you to make the Nochex payments.
|
|
11
|
+
# The idea behind the helper is that it generates an invisible
|
|
12
|
+
# forwarding screen that will automatically redirect the user.
|
|
13
|
+
# So you would collect all the information about the order and then
|
|
14
|
+
# simply render the hidden form, which redirects the user to Nochex.
|
|
15
|
+
#
|
|
16
|
+
# The syntax of the helper is as follows:
|
|
17
|
+
#
|
|
18
|
+
# <% payment_service_for 'order id', 'nochex_user_id',
|
|
19
|
+
# :amount => 50.00,
|
|
20
|
+
# :service => :nochex,
|
|
21
|
+
# :html => { :id => 'nochex-form' } do |service| %>
|
|
22
|
+
#
|
|
23
|
+
# <% service.customer :first_name => 'Cody',
|
|
24
|
+
# :last_name => 'Fauser',
|
|
25
|
+
# :phone => '(555)555-5555',
|
|
26
|
+
# :email => 'cody@example.com' %>
|
|
27
|
+
#
|
|
28
|
+
# <% service.billing_address :city => 'Ottawa',
|
|
29
|
+
# :address1 => '21 Snowy Brook Lane',
|
|
30
|
+
# :address2 => 'Apt. 36',
|
|
31
|
+
# :state => 'ON',
|
|
32
|
+
# :country => 'CA',
|
|
33
|
+
# :zip => 'K1J1E5' %>
|
|
34
|
+
#
|
|
35
|
+
# <% service.invoice '#1000' %>
|
|
36
|
+
# <% service.shipping '0.00' %>
|
|
37
|
+
# <% service.tax '0.00' %>
|
|
38
|
+
#
|
|
39
|
+
# <% service.notify_url url_for(:action => 'notify', :only_path => false) %>
|
|
40
|
+
# <% service.return_url url_for(:action => 'done', :only_path => false) %>
|
|
41
|
+
# <% service.cancel_return_url 'http://mystore.com' %>
|
|
42
|
+
# <% end %>
|
|
43
|
+
#
|
|
44
|
+
# The notify_url is the URL that the Nochex IPN will be sent. You can
|
|
45
|
+
# handle the notification in your controller action as follows:
|
|
46
|
+
#
|
|
47
|
+
# class NotificationController < ApplicationController
|
|
48
|
+
# include ActiveMerchant::Billing::Integrations
|
|
49
|
+
#
|
|
50
|
+
# def notify
|
|
51
|
+
# notification = Nochex::Notification.new(request.raw_post)
|
|
52
|
+
#
|
|
53
|
+
# begin
|
|
54
|
+
# # Acknowledge notification with Nochex
|
|
55
|
+
# raise StandardError, 'Illegal Notification' unless notification.acknowledge
|
|
56
|
+
# # Process the payment
|
|
57
|
+
# rescue => e
|
|
58
|
+
# logger.warn("Illegal notification received: #{e.message}")
|
|
59
|
+
# ensure
|
|
60
|
+
# head(:ok)
|
|
61
|
+
# end
|
|
62
|
+
# end
|
|
63
|
+
# end
|
|
64
|
+
module Nochex
|
|
65
|
+
autoload :Return, File.dirname(__FILE__) + '/nochex/return.rb'
|
|
66
|
+
autoload :Helper, File.dirname(__FILE__) + '/nochex/helper.rb'
|
|
67
|
+
autoload :Notification, File.dirname(__FILE__) + '/nochex/notification.rb'
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
mattr_accessor :service_url
|
|
71
|
+
self.service_url = 'https://www.nochex.com/nochex.dll/checkout'
|
|
72
|
+
|
|
73
|
+
mattr_accessor :notification_confirmation_url
|
|
74
|
+
self.notification_confirmation_url = 'https://www.nochex.com/nochex.dll/apc/apc'
|
|
75
|
+
|
|
76
|
+
# Simply a convenience method that returns a new
|
|
77
|
+
# ActiveMerchant::Billing::Integrations::Nochex::Notification
|
|
78
|
+
def self.notification(post)
|
|
79
|
+
Notification.new(post)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def self.return(query_string)
|
|
83
|
+
Return.new(query_string)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|