activemerchant 1.38.1 → 1.39.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +23 -0
- data/CONTRIBUTORS +8 -0
- data/README.md +65 -59
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +6 -2
- data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +1 -1
- data/lib/active_merchant/billing/gateways/blue_pay.rb +0 -3
- data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +2 -2
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +70 -67
- data/lib/active_merchant/billing/gateways/cyber_source.rb +2 -4
- data/lib/active_merchant/billing/gateways/eway_rapid.rb +75 -2
- data/lib/active_merchant/billing/gateways/moneris.rb +62 -10
- data/lib/active_merchant/billing/gateways/money_movers.rb +160 -0
- data/lib/active_merchant/billing/gateways/ogone.rb +21 -8
- data/lib/active_merchant/billing/gateways/orbital/avs_result.rb +6 -6
- data/lib/active_merchant/billing/gateways/payflow_uk.rb +2 -2
- data/lib/active_merchant/billing/gateways/paymill.rb +12 -2
- data/lib/active_merchant/billing/gateways/paypal.rb +2 -2
- data/lib/active_merchant/billing/gateways/quickpay.rb +32 -2
- data/lib/active_merchant/billing/gateways/realex.rb +11 -7
- data/lib/active_merchant/billing/gateways/sage_pay.rb +1 -1
- data/lib/active_merchant/billing/gateways/secure_net.rb +7 -10
- data/lib/active_merchant/billing/gateways/spreedly_core.rb +9 -2
- data/lib/active_merchant/billing/gateways/stripe.rb +1 -1
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +4 -2
- data/lib/active_merchant/billing/gateways/wirecard.rb +1 -1
- data/lib/active_merchant/billing/gateways/worldpay.rb +2 -2
- data/lib/active_merchant/billing/integrations/a1agregator/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/action_view_helper.rb +2 -1
- data/lib/active_merchant/billing/integrations/bit_pay/helper.rb +41 -0
- data/lib/active_merchant/billing/integrations/bit_pay/notification.rb +56 -0
- data/lib/active_merchant/billing/integrations/bit_pay.rb +18 -0
- data/lib/active_merchant/billing/integrations/chronopay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/citrus/helper.rb +40 -0
- data/lib/active_merchant/billing/integrations/citrus/notification.rb +133 -0
- data/lib/active_merchant/billing/integrations/citrus/return.rb +40 -0
- data/lib/active_merchant/billing/integrations/citrus.rb +51 -0
- data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/directebanking/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/dotpay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/dwolla/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/gestpay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/helper.rb +1 -1
- data/lib/active_merchant/billing/integrations/liqpay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/liqpay/return.rb +1 -1
- data/lib/active_merchant/billing/integrations/maksuturva/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/nochex/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/paxum/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/paypal/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +13 -2
- data/lib/active_merchant/billing/integrations/payu_in/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/payu_in_paisa/helper.rb +19 -0
- data/lib/active_merchant/billing/integrations/payu_in_paisa/notification.rb +23 -0
- data/lib/active_merchant/billing/integrations/payu_in_paisa/return.rb +16 -0
- data/lib/active_merchant/billing/integrations/payu_in_paisa.rb +30 -0
- data/lib/active_merchant/billing/integrations/platron/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/pxpay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/quickpay/helper.rb +28 -6
- data/lib/active_merchant/billing/integrations/quickpay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/rbkmoney/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/robokassa/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +1 -1
- data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/web_pay/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/webmoney/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/world_pay/notification.rb +1 -1
- data/lib/active_merchant/version.rb +1 -1
- data/lib/support/gateway_support.rb +16 -10
- data.tar.gz.sig +0 -0
- metadata +23 -3
- metadata.gz.sig +2 -2
data/CHANGELOG
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
= ActiveMerchant CHANGELOG
|
2
2
|
|
3
|
+
* Moneris: Add optional (off by default) verification_value support [duff]
|
4
|
+
* Citrus: New Integration [viatechs, melari]
|
5
|
+
* Payu Paisa: New Integration [melari]
|
6
|
+
* Spreedly: Pass country with other address fields [hoenth]
|
7
|
+
* SecureNet: Fix order of xml params [duff]
|
8
|
+
* Paymill: Add support for void [duff]
|
9
|
+
* Add MoneyMovers gateway [jeffutter]
|
10
|
+
* Ogone: Add a :store_amount option [rymai]
|
11
|
+
* Ogone: Require TLSv1 [ntalbott]
|
12
|
+
* Moneris: Add support for purchasecorrection [pgib]
|
13
|
+
* Spreedly: Add ability to retain on success [duff]
|
14
|
+
* Spreedly: Pass verification value [duff]
|
15
|
+
* Paymill: Add support for specifying the :customer [Sbastien]
|
16
|
+
* Realex: Correct AVS input format [ExxKA]
|
17
|
+
* USAEpay Transaction: Use sandbox when in test mode [radar]
|
18
|
+
* Braintree Blue: Do not use global config [rdj]
|
19
|
+
* eWay Rapid: Add response messages [BenZhang]
|
20
|
+
* Paysbuy: Add 'Pending' notification status [divineforest]
|
21
|
+
* Cybersource: Use standard :phone field [cade]
|
22
|
+
* Orbital: Fix/tweak AVS codes [boone]
|
23
|
+
* Quickpay: Add v7 support [larspind]
|
24
|
+
* Authorize.Net CIM: Add option to not mark transactions as test [alanandrade]
|
25
|
+
|
3
26
|
== Version 1.38.1 (September 16, 2013)
|
4
27
|
|
5
28
|
* Moneris: Remove verification_value support [melari]
|
data/CONTRIBUTORS
CHANGED
data/README.md
CHANGED
@@ -81,102 +81,108 @@ For more in-depth documentation and tutorials, see [GettingStarted.md](GettingSt
|
|
81
81
|
|
82
82
|
The [ActiveMerchant Wiki](http://github.com/Shopify/active_merchant/wikis) contains a [table of features supported by each gateway](http://github.com/Shopify/active_merchant/wikis/gatewayfeaturematrix).
|
83
83
|
|
84
|
-
* [Authorize.Net](http://www.authorize.net/) - US
|
85
84
|
* [Authorize.Net CIM](http://www.authorize.net/) - US
|
85
|
+
* [Authorize.Net](http://www.authorize.net/) - US, CA, GB
|
86
86
|
* [Balanced](https://www.balancedpayments.com/) - US
|
87
|
-
* [Banwire](
|
88
|
-
* [Barclays ePDQ
|
89
|
-
* [Barclays ePDQ
|
90
|
-
* [
|
87
|
+
* [Banwire](http://www.banwire.com/) - MX
|
88
|
+
* [Barclays ePDQ Extra Plus](http://www.barclaycard.co.uk/business/accepting-payments/epdq-ecomm/) - GB
|
89
|
+
* [Barclays ePDQ MPI](http://www.barclaycard.co.uk/business/accepting-payments/epdq-mpi/) - GB
|
90
|
+
* [Be2Bill](http://www.be2bill.com/) - FR
|
91
|
+
* [Beanstream.com](http://www.beanstream.com/) - CA, US
|
91
92
|
* [BluePay](http://www.bluepay.com/) - US
|
92
|
-
* [Braintree](http://www.braintreepaymentsolutions.com) - US
|
93
|
-
* [
|
94
|
-
* [
|
95
|
-
* [
|
96
|
-
* [
|
93
|
+
* [Braintree](http://www.braintreepaymentsolutions.com) - US, CA, AU, AD, AT, BE, BG, CY, CZ, DK, EE, FI, FR, GI, DE, GR, HU, IS, IM, IE, IT, LV, LI, LT, LU, MT, MC, NL, NO, PL, PT, RO, SM, SK, SI, ES, SE, CH, TR, GB
|
94
|
+
* [CardSave](http://www.cardsave.net/) - GB
|
95
|
+
* [CardStream](http://www.cardstream.com/) - GB
|
96
|
+
* [CertoDirect](http://www.certodirect.com/) - BE, BG, CZ, DK, DE, EE, IE, EL, ES, FR, IT, CY, LV, LT, LU, HU, MT, NL, AT, PL, PT, RO, SI, SK, FI, SE, GB
|
97
|
+
* [CyberSource](http://www.cybersource.com) - US, BR, CA, CN, DK, FI, FR, DE, JP, MX, NO, SE, GB, SG
|
98
|
+
* [DataCash](http://www.datacash.com/) - GB
|
97
99
|
* [Efsnet](http://www.concordefsnet.com/) - US
|
98
|
-
* [Elavon MyVirtualMerchant](http://www.elavon.com) - US, CA
|
99
|
-
* [ePay](http://
|
100
|
+
* [Elavon MyVirtualMerchant](http://www.elavon.com/) - US, CA
|
101
|
+
* [ePay](http://epay.dk/) - DK, SE, NO
|
100
102
|
* [EVO Canada](http://www.evocanada.com/) - CA
|
101
|
-
* [eWAY](http://www.eway.com.au/) - AU
|
102
|
-
* [
|
103
|
+
* [eWAY](http://www.eway.com.au/) - AU, NZ, GB
|
104
|
+
* [eWAY Rapid 3.0](http://www.eway.com.au/) - AU
|
103
105
|
* [E-xact](http://www.e-xact.com) - CA, US
|
104
|
-
* [Fat Zebra](https://www.fatzebra.com.au) - AU
|
106
|
+
* [Fat Zebra](https://www.fatzebra.com.au/) - AU
|
105
107
|
* [Federated Canada](http://www.federatedcanada.com/) - CA
|
106
108
|
* [Finansbank WebPOS](https://www.fbwebpos.com/) - US, TR
|
109
|
+
* [First Pay](http://www.first-pay.com) - US
|
107
110
|
* [FirstData Global Gateway e4](http://www.firstdata.com) - CA, US
|
108
|
-
* [
|
109
|
-
* [Garanti Sanal POS](https://ccpos.garanti.com.tr/ccRaporlar/garanti/ccReports) - US, TR
|
111
|
+
* [Garanti Sanal POS](https://sanalposweb.garanti.com.tr) - US, TR
|
110
112
|
* [HDFC](http://www.hdfcbank.com/sme/sme-details/merchant-services/guzh6m0i) - IN
|
111
|
-
* [
|
113
|
+
* [IATSPayments](http://www.iatspayments.com/) - US, CA, GB
|
114
|
+
* [Inspire Commerce](http://www.inspiregateway.com) - US
|
112
115
|
* [InstaPay](http://www.instapayllc.com) - US
|
113
|
-
* [Iridium](http://www.iridiumcorp.co.uk/) -
|
116
|
+
* [Iridium](http://www.iridiumcorp.co.uk/) - GB, ES
|
114
117
|
* [iTransact](http://www.itransact.com/) - US
|
115
|
-
* [JetPay](http://www.jetpay.com) - US
|
118
|
+
* [JetPay](http://www.jetpay.com/) - US
|
116
119
|
* [LinkPoint](http://www.linkpoint.com/) - US
|
117
|
-
* [Litle](http://www.litle.com/) - US
|
118
|
-
* [Merchant e-Solutions](http://merchante-solutions.com/) - US
|
119
|
-
* [
|
120
|
-
* [
|
120
|
+
* [Litle & Co.](http://www.litle.com/) - US
|
121
|
+
* [Merchant e-Solutions](http://www.merchante-solutions.com/) - US
|
122
|
+
* [Merchant One Gateway](http://merchantone.com/) - US
|
123
|
+
* [MerchantWARE](http://merchantwarehouse.com/merchantware) - US
|
124
|
+
* [MerchantWarrior](http://www.merchantwarrior.com/) - AU
|
121
125
|
* [Mercury](http://www.mercurypay.com) - US
|
126
|
+
* [Metrics Global](http://www.metricsglobal.com) - US
|
122
127
|
* [MasterCard Internet Gateway Service (MiGS)](http://mastercard.com/mastercardsps) - AU, AE, BD, BN, EG, HK, ID, IN, JO, KW, LB, LK, MU, MV, MY, NZ, OM, PH, QA, SA, SG, TT, VN
|
123
128
|
* [Modern Payments](http://www.modpay.com) - US
|
124
129
|
* [Moneris](http://www.moneris.com/) - CA
|
125
|
-
* [Moneris US](http://www.monerisusa.com/) - US
|
126
|
-
* [
|
127
|
-
* [
|
128
|
-
* [Netaxept](http://www.betalingsterminal.no/Netthandel-forside) - NO, DK, SE, FI
|
129
|
-
* [NETbilling](http://www.netbilling.com) - US
|
130
|
-
* [NetPay](http://www.netpay.com.mx) - MX
|
130
|
+
* [Moneris (US)](http://www.monerisusa.com/) - US
|
131
|
+
* [MoneyMovers](http://mmoa.us/) - US
|
132
|
+
* [NAB Transact](http://transact.nab.com.au) - AU
|
131
133
|
* [NetRegistry](http://www.netregistry.com.au) - AU
|
134
|
+
* [BBS Netaxept](http://www.betalingsterminal.no/Netthandel-forside/) - NO, DK, SE, FI
|
135
|
+
* [NETbilling](http://www.netbilling.com) - US
|
136
|
+
* [NETPAY Gateway](http://www.netpay.com.mx) - MX
|
132
137
|
* [NMI](http://nmi.com/) - US
|
133
|
-
* [Ogone
|
134
|
-
* [Optimal Payments](http://www.optimalpayments.com/) - CA, US,
|
135
|
-
* [Orbital Paymentech](http://chasepaymentech.com/) -
|
136
|
-
* [PayBox Direct](http://www.paybox.com) - FR
|
137
|
-
* [PayFast](https://www.payfast.co.za/) - ZA
|
138
|
+
* [Ogone](http://www.ogone.com/) - BE, DE, FR, NL, AT, CH
|
139
|
+
* [Optimal Payments](http://www.optimalpayments.com/) - CA, US, GB
|
140
|
+
* [Orbital Paymentech](http://chasepaymentech.com/) - US, CA
|
138
141
|
* [PayGate PayXML](http://paygate.co.za/) - US, ZA
|
139
142
|
* [PayJunction](http://www.payjunction.com/) - US
|
140
|
-
* [PaymentExpress](http://www.paymentexpress.com/) - AU, MY, NZ, SG, ZA, UK, US
|
141
|
-
* [PAYMILL](https://www.paymill.com) - AD, AT, BE, CH, CY, CZ, DE, DK, EE, ES, FI, FO, FR, GB, GR, HU, IE, IL, IS, IT, LI, LT, LU, LV, MT, NL, NO, PL, PT, SE, SI, SK, TR, VA
|
142
|
-
* [PayPal Express Checkout](https://www.paypal.com/cgi-bin/webscr?cmd=xpt/merchant/ExpressCheckoutIntro-outside) - US, CA, SG, AU
|
143
|
-
* [PayPal Payflow Pro](https://www.paypal.com/cgi-bin/webscr?cmd=_payflow-pro-overview-outside) - US, CA, SG, AU
|
144
|
-
* [PayPal Website Payments Pro (UK)](https://www.paypal.com/uk/cgi-bin/webscr?cmd=_wp-pro-overview-outside) - UK
|
145
|
-
* [PayPal Website Payments Pro (CA)](https://www.paypal.com/cgi-bin/webscr?cmd=_wp-pro-overview-outside) - CA
|
146
|
-
* [PayPal Express Checkout](https://www.paypal.com/cgi-bin/webscr?cmd=xpt/merchant/ExpressCheckoutIntro-outside) - US
|
147
|
-
* [PayPal Website Payments Pro (US)](https://www.paypal.com/cgi-bin/webscr?cmd=_wp-pro-overview-outside) - US
|
148
143
|
* [PaySecure](http://www.commsecure.com.au/paysecure.shtml) - AU
|
149
|
-
* [
|
144
|
+
* [Paybox Direct](http://www.paybox.com/) - FR
|
145
|
+
* [PaymentExpress](http://www.paymentexpress.com/) - AU, CA, DE, ES, FR, GB, HK, IE, MY, NL, NZ, SG, US, ZA
|
146
|
+
* [PAYMILL](https://paymill.com) - AD, AT, BE, BG, CH, CY, CZ, DE, DK, EE, ES, FI, FO, FR, GB, GI, GR, HU, IE, IL, IS, IT, LI, LT, LU, LV, MT, NL, NO, PL, PT, RO, SE, SI, SK, TR, VA
|
147
|
+
* [PayPal Express Checkout](https://www.paypal.com/webapps/mpp/express-checkout) - US, CA, SG, AU
|
148
|
+
* [PayPal Express Checkout (UK)](https://www.paypal.com/uk/webapps/mpp/express-checkout) - GB
|
149
|
+
* [PayPal Payflow Pro](https://www.paypal.com/webapps/mpp/payflow-payment-gateway) - US, CA, SG, AU
|
150
|
+
* [PayPal Payments Pro (US)](https://www.paypal.com/us/webapps/mpp/paypal-payments-pro) - US
|
151
|
+
* [PayPal Payments Pro (UK)](https://www.paypal.com/uk/webapps/mpp/pro) - GB
|
152
|
+
* [PayPal Website Payments Pro (CA)](https://www.paypal.com/cgi-bin/webscr?cmd=_wp-pro-overview-outside) - CA
|
153
|
+
* [PayPal Express Checkout for Digital Goods](https://www.x.com/community/ppx/xspaces/digital_goods) - AU, CA, CN, FI, GB, ID, IN, IT, MY, NO, NZ, PH, PL, SE, SG, TH, VN
|
154
|
+
* [Paystation](http://paystation.co.nz) - NZ
|
155
|
+
* [Pay Way](http://www.payway.com.au) - AU
|
150
156
|
* [Pin](http://www.pin.net.au/) - AU
|
151
157
|
* [Plug'n Pay](http://www.plugnpay.com/) - US
|
152
158
|
* [Psigate](http://www.psigate.com/) - CA
|
153
|
-
* [PSL Payment Solutions](http://www.paymentsolutionsltd.com/) -
|
154
|
-
* [Quantum](http://www.quantumgateway.com) - US
|
159
|
+
* [PSL Payment Solutions](http://www.paymentsolutionsltd.com/) - GB
|
155
160
|
* [QuickBooks Merchant Services](http://payments.intuit.com/) - US
|
161
|
+
* [Quantum Gateway](http://www.quantumgateway.com) - US
|
156
162
|
* [Quickpay](http://quickpay.dk/) - DK, SE
|
157
|
-
* [
|
158
|
-
* [
|
159
|
-
* [
|
160
|
-
* [SagePay](http://www.sagepay.com) - UK
|
163
|
+
* [Realex](http://www.realexpayments.com/) - IE, GB, FR, BE, NL, LU, IT
|
164
|
+
* [Redsys](http://www.redsys.es/) - ES
|
165
|
+
* [SagePay](http://www.sagepay.com) - GB, IE
|
161
166
|
* [Sage Payment Solutions](http://www.sagepayments.com) - US, CA
|
162
|
-
* [Sallie Mae](http://www.salliemae.com) - US
|
163
|
-
* [
|
164
|
-
* [
|
165
|
-
* [SecurePay](http://www.securepay.com/) - US
|
167
|
+
* [Sallie Mae](http://www.salliemae.com/) - US
|
168
|
+
* [Samurai](https://samurai.feefighters.com) - US
|
169
|
+
* [SecureNet](http://www.securenet.com/) - US
|
170
|
+
* [SecurePay](http://www.securepay.com/) - US, CA, GB, AU
|
166
171
|
* [SecurePayTech](http://www.securepaytech.com/) - NZ
|
167
172
|
* [SkipJack](http://www.skipjack.com/) - US, CA
|
168
|
-
* [Spreedly
|
169
|
-
* [Stripe](https://stripe.com/) - US, CA, GB
|
173
|
+
* [Spreedly](https://spreedly.com) - AD, AE, AT, AU, BD, BE, BG, BN, CA, CH, CY, CZ, DE, DK, EE, EG, ES, FI, FR, GB, GI, GR, HK, HU, ID, IE, IL, IM, IN, IS, IT, JO, KW, LB, LI, LK, LT, LU, LV, MC, MT, MU, MV, MX, MY, NL, NO, NZ, OM, PH, PL, PT, QA, RO, SA, SE, SG, SI, SK, SM, TR, TT, UM, US, VA, VN, ZA
|
174
|
+
* [Stripe](https://stripe.com/) - US, CA, GB, AU, IE, FR, NL, BE, DE, ES
|
170
175
|
* [TransFirst](http://www.transfirst.com/) - US
|
176
|
+
* [NELiX TransaX](https://www.nelixtransax.com/) - US
|
171
177
|
* [Transnational](http://www.tnbci.com/) - US
|
172
178
|
* [TrustCommerce](http://www.trustcommerce.com/) - US
|
173
179
|
* [USA ePay](http://www.usaepay.com/) - US
|
174
180
|
* [Verifi](http://www.verifi.com/) - US
|
175
181
|
* [ViaKLIX](http://viaklix.com) - US
|
176
|
-
* [
|
182
|
+
* [Vindicia](http://www.vindicia.com/) - US, CA, GB, AU, MX, BR, DE, KR, CN, HK
|
177
183
|
* [WebPay](https://webpay.jp/) - JP
|
178
|
-
* [Wirecard](http://www.wirecard.com) - DE
|
179
|
-
* [WorldPay](http://www.worldpay.com) - AU,
|
184
|
+
* [Wirecard](http://www.wirecard.com) - AD, CY, GI, IM, MT, RO, CH, AT, DK, GR, IT, MC, SM, TR, BE, EE, HU, LV, NL, SK, GB, BG, FI, IS, LI, NO, SI, VA, FR, IL, LT, PL, ES, CZ, DE, IE, LU, PT, SE
|
185
|
+
* [WorldPay](http://www.worldpay.com/) - HK, US, GB, AU, AD, BE, CH, CY, CZ, DE, DK, ES, FI, FR, GI, GR, HU, IE, IL, IT, LI, LU, MC, MT, NL, NO, NZ, PL, PT, SE, SG, SI, SM, TR, UM, VA
|
180
186
|
|
181
187
|
## Supported Offsite Payment Gateways
|
182
188
|
|
@@ -94,10 +94,14 @@ module ActiveMerchant #:nodoc:
|
|
94
94
|
# * <tt>:password</tt> -- The Authorize.Net Transaction Key. (REQUIRED)
|
95
95
|
# * <tt>:test</tt> -- +true+ or +false+. If true, perform transactions against the test server.
|
96
96
|
# Otherwise, perform transactions against the production server.
|
97
|
+
# * <tt>:test_requests</tt> -- +true+ or +false+. If true, perform transactions without the
|
98
|
+
# test flag. This is useful when you need to generate card declines, AVS or CVV erros.
|
99
|
+
# Will hold the same value as :test by default.
|
97
100
|
# * <tt>:delimiter</tt> -- The delimiter used in the direct response. Default is ',' (comma).
|
98
101
|
def initialize(options = {})
|
99
102
|
requires!(options, :login, :password)
|
100
103
|
super
|
104
|
+
@options[:test_requests] = test? if @options[:test_requests].nil?
|
101
105
|
end
|
102
106
|
|
103
107
|
# Creates a new customer profile along with any customer payment profiles and customer shipping addresses
|
@@ -605,7 +609,7 @@ module ActiveMerchant #:nodoc:
|
|
605
609
|
|
606
610
|
def build_create_customer_profile_transaction_request(xml, options)
|
607
611
|
options[:extra_options] ||= {}
|
608
|
-
options[:extra_options].merge!('x_test_request' => 'TRUE') if @options[:
|
612
|
+
options[:extra_options].merge!('x_test_request' => 'TRUE') if @options[:test_requests]
|
609
613
|
|
610
614
|
add_transaction(xml, options[:transaction])
|
611
615
|
tag_unless_blank(xml, 'extraOptions', format_extra_options(options[:extra_options]))
|
@@ -842,7 +846,7 @@ module ActiveMerchant #:nodoc:
|
|
842
846
|
response_params = parse(action, xml)
|
843
847
|
|
844
848
|
message = response_params['messages']['message']['text']
|
845
|
-
test_mode =
|
849
|
+
test_mode = @options[:test_requests] || message =~ /Test Mode/
|
846
850
|
success = response_params['messages']['result_code'] == 'Ok'
|
847
851
|
response_params['direct_response'] = parse_direct_response(response_params['direct_response']) if response_params['direct_response']
|
848
852
|
transaction_id = response_params['direct_response']['transaction_id'] if response_params['direct_response']
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require "digest/sha2"
|
2
|
+
|
3
|
+
module ActiveMerchant #:nodoc:
|
4
|
+
module Billing #:nodoc:
|
5
|
+
class Be2billGateway < Gateway
|
6
|
+
self.test_url = 'https://secure-test.be2bill.com/front/service/rest/process.php'
|
7
|
+
self.live_url = 'https://secure-magenta1.be2bill.com/front/service/rest/process.php'
|
8
|
+
|
9
|
+
self.display_name = 'Be2Bill'
|
10
|
+
self.homepage_url = 'http://www.be2bill.com/'
|
11
|
+
self.supported_countries = ['FR']
|
12
|
+
self.supported_cardtypes = [:visa, :master, :american_express]
|
13
|
+
self.default_currency = 'EUR'
|
14
|
+
self.money_format = :cents
|
15
|
+
|
16
|
+
# These options are mandatory on be2bill (cf. tests) :
|
17
|
+
#
|
18
|
+
# options = { :order_id => order.id,
|
19
|
+
# :customer_id => user.id,
|
20
|
+
# :description => "Some description",
|
21
|
+
# :referrer => request.env['HTTP_REFERER'],
|
22
|
+
# :user_agent => request.env['HTTP_USER_AGENT'],
|
23
|
+
# :ip => request.remote_ip,
|
24
|
+
# :email => user.email }
|
25
|
+
|
26
|
+
def initialize(options = {})
|
27
|
+
requires!(options, :login, :password)
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
def authorize(money, creditcard, options = {})
|
32
|
+
post = {}
|
33
|
+
add_invoice(post, options)
|
34
|
+
add_creditcard(post, creditcard)
|
35
|
+
add_customer_data(post, options)
|
36
|
+
|
37
|
+
commit('authorization', money, post)
|
38
|
+
end
|
39
|
+
|
40
|
+
def purchase(money, creditcard, options = {})
|
41
|
+
post = {}
|
42
|
+
add_invoice(post, options)
|
43
|
+
add_creditcard(post, creditcard)
|
44
|
+
add_customer_data(post, options)
|
45
|
+
|
46
|
+
commit('payment', money, post)
|
47
|
+
end
|
48
|
+
|
49
|
+
def capture(money, authorization, options = {})
|
50
|
+
post = {}
|
51
|
+
add_invoice(post, options)
|
52
|
+
post[:TRANSACTIONID] = authorization
|
53
|
+
|
54
|
+
commit('capture', money, post)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def add_customer_data(post, options)
|
60
|
+
post[:CLIENTREFERRER] = options[:referrer]
|
61
|
+
post[:CLIENTUSERAGENT] = options[:user_agent]
|
62
|
+
post[:CLIENTIP] = options[:ip]
|
63
|
+
post[:CLIENTEMAIL] = options[:email]
|
64
|
+
post[:CLIENTIDENT] = options[:customer_id]
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_invoice(post, options)
|
68
|
+
post[:ORDERID] = options[:order_id]
|
69
|
+
post[:DESCRIPTION] = options[:description]
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_creditcard(post, creditcard)
|
73
|
+
post[:CARDFULLNAME] = creditcard ? creditcard.name : ''
|
74
|
+
post[:CARDCODE] = creditcard ? creditcard.number : ''
|
75
|
+
post[:CARDVALIDITYDATE] = creditcard ? "%02d-%02s" % [creditcard.month, creditcard.year.to_s[-2..-1]] : ''
|
76
|
+
post[:CARDCVV] = creditcard ? creditcard.verification_value : ''
|
77
|
+
end
|
78
|
+
|
79
|
+
def parse(response)
|
80
|
+
ActiveSupport::JSON.decode(response)
|
81
|
+
end
|
82
|
+
|
83
|
+
def commit(action, money, parameters)
|
84
|
+
parameters[:IDENTIFIER] = @options[:login]
|
85
|
+
parameters[:AMOUNT] = amount(money)
|
86
|
+
parameters[:VERSION] = '2.0'
|
87
|
+
|
88
|
+
url = (test? ? self.test_url : self.live_url)
|
89
|
+
response = parse(ssl_post(url, post_data(action, parameters)))
|
90
|
+
|
91
|
+
Response.new(
|
92
|
+
successful?(response),
|
93
|
+
message_from(response),
|
94
|
+
response,
|
95
|
+
:authorization => response['TRANSACTIONID'],
|
96
|
+
:test => test?
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def successful?(response)
|
101
|
+
%w(0000 0001).include?(response['EXECCODE'])
|
102
|
+
end
|
103
|
+
|
104
|
+
def message_from(response)
|
105
|
+
if successful?(response)
|
106
|
+
"Approved : #{response['MESSAGE']}"
|
107
|
+
else
|
108
|
+
"Declined (#{response['EXECCODE']} - #{response['MESSAGE']}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def post_data(action, parameters = {})
|
113
|
+
{
|
114
|
+
:method => action,
|
115
|
+
:params => parameters.merge(HASH: signature(parameters, action))
|
116
|
+
}.to_query
|
117
|
+
end
|
118
|
+
|
119
|
+
def signature(parameters, action)
|
120
|
+
parameters[:OPERATIONTYPE] = action unless parameters[:OPERATIONTYPE]
|
121
|
+
|
122
|
+
signature = @options[:password]
|
123
|
+
parameters.sort.each do |key, value|
|
124
|
+
signature += ("#{key.upcase}=#{value}" + @options[:password])
|
125
|
+
end
|
126
|
+
|
127
|
+
Digest::SHA256.hexdigest(signature)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -63,7 +63,7 @@ module ActiveMerchant #:nodoc:
|
|
63
63
|
base.default_currency = 'CAD'
|
64
64
|
|
65
65
|
# The countries the gateway supports merchants from as 2 digit ISO country codes
|
66
|
-
base.supported_countries = ['CA']
|
66
|
+
base.supported_countries = ['CA', 'US']
|
67
67
|
|
68
68
|
# The card types supported by the payment gateway
|
69
69
|
base.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb]
|
@@ -14,8 +14,6 @@ module ActiveMerchant #:nodoc:
|
|
14
14
|
AVS_ERRORS = %w( A E N R W Z )
|
15
15
|
AVS_REASON_CODES = %w(27 45)
|
16
16
|
|
17
|
-
FRAUD_REVIEW_STATUSES = %w( E 0 )
|
18
|
-
|
19
17
|
FIELD_MAP = {
|
20
18
|
'TRANS_ID' => :transaction_id,
|
21
19
|
'STATUS' => :response_code,
|
@@ -344,7 +342,6 @@ module ActiveMerchant #:nodoc:
|
|
344
342
|
Response.new(success, message, parsed,
|
345
343
|
:test => test?,
|
346
344
|
:authorization => (parsed[:rebid] && parsed[:rebid] != '' ? parsed[:rebid] : parsed[:transaction_id]),
|
347
|
-
:fraud_review => FRAUD_REVIEW_STATUSES.include?(parsed[:response_code]),
|
348
345
|
:avs_result => { :code => parsed[:avs_result_code] },
|
349
346
|
:cvv_result => parsed[:card_code]
|
350
347
|
)
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module BraintreeCommon
|
2
2
|
def self.included(base)
|
3
|
-
base.supported_countries =
|
3
|
+
base.supported_countries = %w(US CA AU AD AT BE BG CY CZ DK EE FI FR GI DE GR HU IS IM IE IT LV LI LT LU MT MC NL NO PL PT RO SM SK SI ES SE CH TR GB)
|
4
4
|
base.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club]
|
5
5
|
base.homepage_url = 'http://www.braintreepaymentsolutions.com'
|
6
6
|
base.display_name = 'Braintree'
|
7
7
|
base.default_currency = 'USD'
|
8
8
|
end
|
9
|
-
end
|
9
|
+
end
|
@@ -23,33 +23,18 @@ module ActiveMerchant #:nodoc:
|
|
23
23
|
# Setting an ActiveMerchant +wiredump_device+ will automatically
|
24
24
|
# configure the Braintree logger (via the Braintree gem's
|
25
25
|
# configuration) when the BraintreeBlueGateway is instantiated.
|
26
|
-
# Additionally, the log level will be set to +DEBUG+.
|
27
|
-
# all you have to do is set the +wiredump_device+ and you'll
|
28
|
-
#
|
29
|
-
#
|
26
|
+
# Additionally, the log level will be set to +DEBUG+. Therefore,
|
27
|
+
# all you have to do is set the +wiredump_device+ and you'll get
|
28
|
+
# your debug output from your HTTP interactions with the remote
|
29
|
+
# gateway. (Don't enable this in production.) The ActiveMerchant
|
30
|
+
# implementation doesn't mess with the Braintree::Configuration
|
31
|
+
# globals at all, so there won't be any side effects outside
|
32
|
+
# Active Merchant.
|
30
33
|
#
|
31
|
-
#
|
34
|
+
# If no +wiredump_device+ is set, the logger in
|
35
|
+
# +Braintree::Configuration.logger+ will be cloned and the log
|
36
|
+
# level set to +WARN+.
|
32
37
|
#
|
33
|
-
# ActiveMerchant::Billing::BraintreeBlueGateway.wiredump_device = Logger.new(STDOUT)
|
34
|
-
# # => #<Logger:0x107d385f8 ...>
|
35
|
-
#
|
36
|
-
# Braintree::Configuration.logger
|
37
|
-
# # => (some other logger, created by default by the gem)
|
38
|
-
#
|
39
|
-
# Braintree::Configuration.logger.level
|
40
|
-
# # => 1 (INFO)
|
41
|
-
#
|
42
|
-
# ActiveMerchant::Billing::BraintreeBlueGateway.new(:merchant_id => 'x', :public_key => 'x', :private_key => 'x')
|
43
|
-
#
|
44
|
-
# Braintree::Configuration.logger
|
45
|
-
# # => #<Logger:0x107d385f8 ...>
|
46
|
-
#
|
47
|
-
# Braintree::Configuration.logger.level
|
48
|
-
# # => 0 (DEBUG)
|
49
|
-
#
|
50
|
-
# Alternatively, you can avoid setting the +wiredump_device+
|
51
|
-
# and set +Braintree::Configuration.logger+ and/or
|
52
|
-
# +Braintree::Configuration.logger.level+ directly.
|
53
38
|
class BraintreeBlueGateway < Gateway
|
54
39
|
include BraintreeCommon
|
55
40
|
|
@@ -61,18 +46,24 @@ module ActiveMerchant #:nodoc:
|
|
61
46
|
|
62
47
|
super
|
63
48
|
|
64
|
-
Braintree::Configuration.merchant_id = options[:merchant_id]
|
65
|
-
Braintree::Configuration.public_key = options[:public_key]
|
66
|
-
Braintree::Configuration.private_key = options[:private_key]
|
67
|
-
Braintree::Configuration.environment = (options[:environment] || (test? ? :sandbox : :production)).to_sym
|
68
|
-
Braintree::Configuration.custom_user_agent = "ActiveMerchant #{ActiveMerchant::VERSION}"
|
69
|
-
|
70
49
|
if wiredump_device
|
71
|
-
|
72
|
-
|
50
|
+
logger = ((Logger === wiredump_device) ? wiredump_device : Logger.new(wiredump_device))
|
51
|
+
logger.level = Logger::DEBUG
|
73
52
|
else
|
74
|
-
Braintree::Configuration.logger.
|
53
|
+
logger = Braintree::Configuration.logger.clone
|
54
|
+
logger.level = Logger::WARN
|
75
55
|
end
|
56
|
+
|
57
|
+
@configuration = Braintree::Configuration.new(
|
58
|
+
:merchant_id => options[:merchant_id],
|
59
|
+
:public_key => options[:public_key],
|
60
|
+
:private_key => options[:private_key],
|
61
|
+
:environment => (options[:environment] || (test? ? :sandbox : :production)).to_sym,
|
62
|
+
:custom_user_agent => "ActiveMerchant #{ActiveMerchant::VERSION}",
|
63
|
+
:logger => logger,
|
64
|
+
)
|
65
|
+
|
66
|
+
@braintree_gateway = Braintree::Gateway.new( @configuration )
|
76
67
|
end
|
77
68
|
|
78
69
|
def authorize(money, credit_card_or_vault_id, options = {})
|
@@ -81,7 +72,7 @@ module ActiveMerchant #:nodoc:
|
|
81
72
|
|
82
73
|
def capture(money, authorization, options = {})
|
83
74
|
commit do
|
84
|
-
result =
|
75
|
+
result = @braintree_gateway.transaction.submit_for_settlement(authorization, amount(money).to_s)
|
85
76
|
Response.new(result.success?, message_from_result(result))
|
86
77
|
end
|
87
78
|
end
|
@@ -101,7 +92,7 @@ module ActiveMerchant #:nodoc:
|
|
101
92
|
money = amount(money).to_s if money
|
102
93
|
|
103
94
|
commit do
|
104
|
-
result =
|
95
|
+
result = @braintree_gateway.transaction.refund(transaction_id, money)
|
105
96
|
Response.new(result.success?, message_from_result(result),
|
106
97
|
{:braintree_transaction => (transaction_hash(result.transaction) if result.success?)},
|
107
98
|
{:authorization => (result.transaction.id if result.success?)}
|
@@ -111,7 +102,7 @@ module ActiveMerchant #:nodoc:
|
|
111
102
|
|
112
103
|
def void(authorization, options = {})
|
113
104
|
commit do
|
114
|
-
result =
|
105
|
+
result = @braintree_gateway.transaction.void(authorization)
|
115
106
|
Response.new(result.success?, message_from_result(result),
|
116
107
|
{:braintree_transaction => (transaction_hash(result.transaction) if result.success?)},
|
117
108
|
{:authorization => (result.transaction.id if result.success?)}
|
@@ -132,7 +123,7 @@ module ActiveMerchant #:nodoc:
|
|
132
123
|
:expiration_year => creditcard.year.to_s
|
133
124
|
}
|
134
125
|
}
|
135
|
-
result =
|
126
|
+
result = @braintree_gateway.customer.create(merge_credit_card_options(parameters, options))
|
136
127
|
Response.new(result.success?, message_from_result(result),
|
137
128
|
{
|
138
129
|
:braintree_customer => (customer_hash(result.customer) if result.success?),
|
@@ -146,7 +137,7 @@ module ActiveMerchant #:nodoc:
|
|
146
137
|
def update(vault_id, creditcard, options = {})
|
147
138
|
braintree_credit_card = nil
|
148
139
|
commit do
|
149
|
-
braintree_credit_card =
|
140
|
+
braintree_credit_card = @braintree_gateway.customer.find(vault_id).credit_cards.detect { |cc| cc.default? }
|
150
141
|
return Response.new(false, 'Braintree::NotFoundError') if braintree_credit_card.nil?
|
151
142
|
|
152
143
|
options.merge!(:update_existing_token => braintree_credit_card.token)
|
@@ -159,14 +150,14 @@ module ActiveMerchant #:nodoc:
|
|
159
150
|
}
|
160
151
|
}, options)[:credit_card]
|
161
152
|
|
162
|
-
result =
|
153
|
+
result = @braintree_gateway.customer.update(vault_id,
|
163
154
|
:first_name => creditcard.first_name,
|
164
155
|
:last_name => creditcard.last_name,
|
165
156
|
:email => options[:email],
|
166
157
|
:credit_card => credit_card_params
|
167
158
|
)
|
168
159
|
Response.new(result.success?, message_from_result(result),
|
169
|
-
:braintree_customer => (customer_hash(
|
160
|
+
:braintree_customer => (customer_hash(@braintree_gateway.customer.find(vault_id)) if result.success?),
|
170
161
|
:customer_vault_id => (result.customer.id if result.success?)
|
171
162
|
)
|
172
163
|
end
|
@@ -174,7 +165,7 @@ module ActiveMerchant #:nodoc:
|
|
174
165
|
|
175
166
|
def unstore(customer_vault_id, options = {})
|
176
167
|
commit do
|
177
|
-
|
168
|
+
@braintree_gateway.customer.delete(customer_vault_id)
|
178
169
|
Response.new(true, "OK")
|
179
170
|
end
|
180
171
|
end
|
@@ -232,33 +223,46 @@ module ActiveMerchant #:nodoc:
|
|
232
223
|
end
|
233
224
|
end
|
234
225
|
|
226
|
+
def response_params(result)
|
227
|
+
params = {}
|
228
|
+
if result.success?
|
229
|
+
params[:braintree_transaction] = transaction_hash(result.transaction)
|
230
|
+
params[:customer_vault_id] = result.transaction.customer_details.id
|
231
|
+
end
|
232
|
+
params
|
233
|
+
end
|
234
|
+
|
235
|
+
def response_options(result)
|
236
|
+
options = {}
|
237
|
+
if result.success?
|
238
|
+
options[:authorization] = result.transaction.id
|
239
|
+
end
|
240
|
+
if result.transaction
|
241
|
+
options[:avs_result] = {
|
242
|
+
:code => nil, :message => nil,
|
243
|
+
:street_match => result.transaction.avs_street_address_response_code,
|
244
|
+
:postal_match => result.transaction.avs_postal_code_response_code
|
245
|
+
}
|
246
|
+
options[:cvv_result] = result.transaction.cvv_response_code
|
247
|
+
end
|
248
|
+
options
|
249
|
+
end
|
250
|
+
|
251
|
+
def message_from_transaction_result(result)
|
252
|
+
if result.transaction && result.transaction.status == "gateway_rejected"
|
253
|
+
"Transaction declined - gateway rejected"
|
254
|
+
elsif result.transaction
|
255
|
+
"#{result.transaction.processor_response_code} #{result.transaction.processor_response_text}"
|
256
|
+
else
|
257
|
+
message_from_result(result)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
235
261
|
def create_transaction(transaction_type, money, credit_card_or_vault_id, options)
|
236
262
|
transaction_params = create_transaction_parameters(money, credit_card_or_vault_id, options)
|
237
|
-
|
238
263
|
commit do
|
239
|
-
result =
|
240
|
-
|
241
|
-
if result.success?
|
242
|
-
response_params[:braintree_transaction] = transaction_hash(result.transaction)
|
243
|
-
response_params[:customer_vault_id] = result.transaction.customer_details.id
|
244
|
-
response_options[:authorization] = result.transaction.id
|
245
|
-
end
|
246
|
-
if result.transaction
|
247
|
-
response_options[:avs_result] = {
|
248
|
-
:code => nil, :message => nil,
|
249
|
-
:street_match => result.transaction.avs_street_address_response_code,
|
250
|
-
:postal_match => result.transaction.avs_postal_code_response_code
|
251
|
-
}
|
252
|
-
response_options[:cvv_result] = result.transaction.cvv_response_code
|
253
|
-
if result.transaction.status == "gateway_rejected"
|
254
|
-
message = "Transaction declined - gateway rejected"
|
255
|
-
else
|
256
|
-
message = "#{result.transaction.processor_response_code} #{result.transaction.processor_response_text}"
|
257
|
-
end
|
258
|
-
else
|
259
|
-
message = message_from_result(result)
|
260
|
-
end
|
261
|
-
response = Response.new(result.success?, message, response_params, response_options)
|
264
|
+
result = @braintree_gateway.transaction.send(transaction_type, transaction_params)
|
265
|
+
response = Response.new(result.success?, message_from_transaction_result(result), response_params(result), response_options(result))
|
262
266
|
response.cvv_result['message'] = ''
|
263
267
|
response
|
264
268
|
end
|
@@ -398,4 +402,3 @@ module ActiveMerchant #:nodoc:
|
|
398
402
|
end
|
399
403
|
end
|
400
404
|
end
|
401
|
-
|