activemerchant 1.2.1 → 1.3.0

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.
Files changed (206) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG +310 -294
  3. data/CONTRIBUTERS +13 -0
  4. data/README +55 -31
  5. data/Rakefile +21 -13
  6. data/lib/active_merchant.rb +7 -0
  7. data/lib/active_merchant/billing/avs_result.rb +95 -0
  8. data/lib/active_merchant/billing/base.rb +8 -3
  9. data/lib/active_merchant/billing/check.rb +61 -0
  10. data/lib/active_merchant/billing/credit_card.rb +104 -80
  11. data/lib/active_merchant/billing/credit_card_formatting.rb +11 -8
  12. data/lib/active_merchant/billing/credit_card_methods.rb +76 -32
  13. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  14. data/lib/active_merchant/billing/expiry_date.rb +28 -0
  15. data/lib/active_merchant/billing/gateway.rb +47 -111
  16. data/lib/active_merchant/billing/gateways/authorize_net.rb +508 -121
  17. data/lib/active_merchant/billing/gateways/bogus.rb +26 -32
  18. data/lib/active_merchant/billing/gateways/brain_tree.rb +82 -70
  19. data/lib/active_merchant/billing/gateways/card_stream.rb +43 -15
  20. data/lib/active_merchant/billing/gateways/cyber_source.rb +9 -29
  21. data/lib/active_merchant/billing/gateways/data_cash.rb +18 -38
  22. data/lib/active_merchant/billing/gateways/efsnet.rb +23 -50
  23. data/lib/active_merchant/billing/gateways/eway.rb +8 -19
  24. data/lib/active_merchant/billing/gateways/exact.rb +17 -25
  25. data/lib/active_merchant/billing/gateways/linkpoint.rb +18 -25
  26. data/lib/active_merchant/billing/gateways/moneris.rb +9 -39
  27. data/lib/active_merchant/billing/gateways/net_registry.rb +113 -182
  28. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  29. data/lib/active_merchant/billing/gateways/pay_junction.rb +52 -73
  30. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  31. data/lib/active_merchant/billing/gateways/payflow.rb +13 -14
  32. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +55 -37
  33. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +4 -0
  34. data/lib/active_merchant/billing/gateways/payflow_express.rb +2 -4
  35. data/lib/active_merchant/billing/gateways/payment_express.rb +11 -30
  36. data/lib/active_merchant/billing/gateways/paypal.rb +3 -14
  37. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +36 -16
  38. data/lib/active_merchant/billing/gateways/paypal_express.rb +1 -2
  39. data/lib/active_merchant/billing/gateways/plugnpay.rb +7 -15
  40. data/lib/active_merchant/billing/gateways/protx.rb +24 -25
  41. data/lib/active_merchant/billing/gateways/psigate.rb +34 -71
  42. data/lib/active_merchant/billing/gateways/psl_card.rb +24 -19
  43. data/lib/active_merchant/billing/gateways/quickpay.rb +10 -24
  44. data/lib/active_merchant/billing/gateways/realex.rb +7 -19
  45. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  46. data/lib/active_merchant/billing/gateways/skip_jack.rb +437 -0
  47. data/lib/active_merchant/billing/gateways/trans_first.rb +5 -14
  48. data/lib/active_merchant/billing/gateways/trust_commerce.rb +100 -39
  49. data/lib/active_merchant/billing/gateways/usa_epay.rb +60 -55
  50. data/lib/active_merchant/billing/gateways/verifi.rb +32 -39
  51. data/lib/active_merchant/billing/gateways/viaklix.rb +31 -37
  52. data/lib/active_merchant/billing/integrations.rb +2 -0
  53. data/lib/active_merchant/billing/integrations/bogus.rb +5 -0
  54. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  55. data/lib/active_merchant/billing/integrations/chronopay.rb +5 -0
  56. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  57. data/lib/active_merchant/billing/integrations/gestpay.rb +5 -0
  58. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  59. data/lib/active_merchant/billing/integrations/hi_trust.rb +26 -0
  60. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  61. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +57 -0
  62. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  63. data/lib/active_merchant/billing/integrations/nochex.rb +5 -0
  64. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  65. data/lib/active_merchant/billing/integrations/paypal.rb +5 -0
  66. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  67. data/lib/active_merchant/billing/integrations/return.rb +35 -0
  68. data/lib/active_merchant/billing/integrations/two_checkout.rb +5 -0
  69. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  70. data/lib/active_merchant/billing/response.rb +12 -8
  71. data/lib/active_merchant/lib/posts_data.rb +39 -7
  72. data/lib/active_merchant/lib/requires_parameters.rb +2 -3
  73. data/lib/active_merchant/lib/utils.rb +18 -0
  74. data/lib/active_merchant/lib/validateable.rb +3 -3
  75. data/lib/support/gateway_support.rb +22 -9
  76. data/script/destroy +14 -0
  77. data/script/generate +7 -7
  78. data/test/fixtures.yml +25 -3
  79. data/test/remote/gateways/remote_authorize_net_test.rb +145 -0
  80. data/test/remote/gateways/remote_brain_tree_test.rb +118 -0
  81. data/test/{remote_tests → remote/gateways}/remote_card_stream_test.rb +56 -68
  82. data/test/{remote_tests → remote/gateways}/remote_cyber_source_test.rb +21 -32
  83. data/test/{remote_tests → remote/gateways}/remote_data_cash_test.rb +2 -2
  84. data/test/{remote_tests → remote/gateways}/remote_efsnet_test.rb +22 -34
  85. data/test/{remote_tests → remote/gateways}/remote_eway_test.rb +18 -15
  86. data/test/{remote_tests → remote/gateways}/remote_exact_test.rb +20 -19
  87. data/test/{remote_tests → remote/gateways}/remote_linkpoint_test.rb +31 -63
  88. data/test/remote/gateways/remote_moneris_test.rb +82 -0
  89. data/test/{remote_tests → remote/gateways}/remote_net_registry_test.rb +19 -54
  90. data/test/remote/gateways/remote_netbilling_test.rb +70 -0
  91. data/test/{remote_tests → remote/gateways}/remote_pay_junction_test.rb +41 -60
  92. data/test/remote/gateways/remote_pay_secure_test.rb +39 -0
  93. data/test/{remote_tests → remote/gateways}/remote_payflow_express_test.rb +2 -2
  94. data/test/{remote_tests → remote/gateways}/remote_payflow_test.rb +34 -38
  95. data/test/{remote_tests → remote/gateways}/remote_payflow_uk_test.rb +13 -12
  96. data/test/{remote_tests → remote/gateways}/remote_payment_express_test.rb +26 -36
  97. data/test/{remote_tests → remote/gateways}/remote_paypal_express_test.rb +3 -3
  98. data/test/{remote_tests → remote/gateways}/remote_paypal_test.rb +25 -21
  99. data/test/{remote_tests → remote/gateways}/remote_plugnpay_test.rb +18 -16
  100. data/test/{remote_tests → remote/gateways}/remote_protx_test.rb +33 -33
  101. data/test/remote/gateways/remote_psigate_test.rb +50 -0
  102. data/test/{remote_tests → remote/gateways}/remote_psl_card_test.rb +27 -26
  103. data/test/{remote_tests → remote/gateways}/remote_quickpay_test.rb +48 -48
  104. data/test/{remote_tests → remote/gateways}/remote_realex_test.rb +30 -33
  105. data/test/remote/gateways/remote_secure_pay_tech_test.rb +37 -0
  106. data/test/remote/gateways/remote_secure_pay_test.rb +28 -0
  107. data/test/remote/gateways/remote_skipjack_test.rb +105 -0
  108. data/test/{remote_tests → remote/gateways}/remote_trans_first_test.rb +7 -10
  109. data/test/remote/gateways/remote_trust_commerce_test.rb +152 -0
  110. data/test/{remote_tests → remote/gateways}/remote_usa_epay_test.rb +11 -22
  111. data/test/{remote_tests → remote/gateways}/remote_verifi_test.rb +27 -27
  112. data/test/{remote_tests → remote/gateways}/remote_viaklix_test.rb +8 -18
  113. data/test/{remote_tests → remote/integrations}/remote_gestpay_integration_test.rb +1 -1
  114. data/test/{remote_tests → remote/integrations}/remote_paypal_integration_test.rb +1 -1
  115. data/test/test_helper.rb +102 -61
  116. data/test/unit/avs_result_test.rb +59 -0
  117. data/test/unit/base_test.rb +33 -39
  118. data/test/unit/check_test.rb +76 -0
  119. data/test/unit/credit_card_formatting_test.rb +10 -15
  120. data/test/unit/credit_card_methods_test.rb +132 -17
  121. data/test/unit/credit_card_test.rb +157 -228
  122. data/test/unit/cvv_result_test.rb +33 -0
  123. data/test/unit/expiry_date_test.rb +21 -0
  124. data/test/unit/gateways/authorize_net_test.rb +180 -40
  125. data/test/unit/gateways/bogus_test.rb +2 -3
  126. data/test/unit/gateways/brain_tree_test.rb +63 -29
  127. data/test/unit/gateways/card_stream_test.rb +59 -6
  128. data/test/unit/gateways/cyber_source_test.rb +59 -40
  129. data/test/unit/gateways/data_cash_test.rb +82 -1
  130. data/test/unit/gateways/efsnet_test.rb +97 -44
  131. data/test/unit/gateways/eway_test.rb +55 -42
  132. data/test/unit/gateways/exact_test.rb +93 -55
  133. data/test/unit/gateways/gateway_test.rb +7 -0
  134. data/test/unit/gateways/linkpoint_test.rb +60 -58
  135. data/test/unit/gateways/moneris_test.rb +67 -76
  136. data/test/unit/gateways/net_registry_test.rb +351 -419
  137. data/test/unit/gateways/netbilling_test.rb +54 -0
  138. data/test/unit/gateways/pay_junction_test.rb +108 -46
  139. data/test/unit/gateways/pay_secure_test.rb +71 -0
  140. data/test/unit/gateways/payflow_express_test.rb +0 -8
  141. data/test/unit/gateways/payflow_test.rb +136 -65
  142. data/test/unit/gateways/payflow_uk_test.rb +0 -38
  143. data/test/unit/gateways/payment_express_test.rb +31 -51
  144. data/test/unit/gateways/paypal_express_test.rb +8 -2
  145. data/test/unit/gateways/paypal_test.rb +213 -54
  146. data/test/unit/gateways/plugnpay_test.rb +39 -32
  147. data/test/unit/gateways/protx_test.rb +45 -33
  148. data/test/unit/gateways/psigate_test.rb +146 -87
  149. data/test/unit/gateways/psl_card_test.rb +37 -24
  150. data/test/unit/gateways/quickpay_test.rb +33 -46
  151. data/test/unit/gateways/realex_test.rb +32 -31
  152. data/test/unit/gateways/secure_pay_tech_test.rb +44 -0
  153. data/test/unit/gateways/secure_pay_test.rb +35 -26
  154. data/test/unit/gateways/skip_jack_test.rb +125 -0
  155. data/test/unit/gateways/trans_first_test.rb +24 -37
  156. data/test/unit/gateways/trust_commerce_test.rb +47 -26
  157. data/test/unit/gateways/usa_epay_test.rb +52 -41
  158. data/test/unit/gateways/verifi_test.rb +41 -35
  159. data/test/unit/gateways/viaklix_test.rb +38 -32
  160. data/test/unit/generators/test_gateway_generator.rb +46 -0
  161. data/test/unit/generators/test_generator_helper.rb +20 -0
  162. data/test/unit/generators/test_integration_generator.rb +53 -0
  163. data/test/unit/integrations/action_view_helper_test.rb +7 -14
  164. data/test/unit/integrations/bogus_module_test.rb +4 -0
  165. data/test/unit/integrations/chronopay_module_test.rb +4 -0
  166. data/test/unit/integrations/gestpay_module_test.rb +4 -0
  167. data/test/unit/integrations/helpers/hi_trust_helper_test.rb +16 -0
  168. data/test/unit/integrations/hi_trust_module_test.rb +13 -0
  169. data/test/unit/integrations/nochex_module_test.rb +4 -0
  170. data/test/unit/integrations/notifications/hi_trust_notification_test.rb +38 -0
  171. data/test/unit/integrations/paypal_module_test.rb +4 -0
  172. data/test/unit/integrations/returns/chronopay_return_test.rb +11 -0
  173. data/test/unit/integrations/returns/gestpay_return_test.rb +10 -0
  174. data/test/unit/integrations/returns/hi_trust_return_test.rb +24 -0
  175. data/test/unit/integrations/returns/nochex_return_test.rb +10 -0
  176. data/test/unit/integrations/returns/paypal_return_test.rb +10 -0
  177. data/test/unit/integrations/returns/return_test.rb +11 -0
  178. data/test/unit/integrations/returns/two_checkout_return_test.rb +24 -0
  179. data/test/unit/integrations/two_checkout_module_test.rb +4 -0
  180. data/test/unit/posts_data_test.rb +86 -0
  181. data/test/unit/response_test.rb +15 -1
  182. data/test/unit/utils_test.rb +7 -0
  183. data/test/unit/validateable_test.rb +10 -6
  184. metadata +180 -142
  185. metadata.gz.sig +0 -0
  186. data/lib/active_merchant/billing/gateways/paypal/api_cert_chain.crt +0 -35
  187. data/script/generator/base.rb +0 -45
  188. data/script/generator/generator.rb +0 -24
  189. data/script/generator/generators/gateway/gateway_generator.rb +0 -14
  190. data/script/generator/generators/gateway/templates/gateway.rb +0 -73
  191. data/script/generator/generators/gateway/templates/gateway_test.rb +0 -41
  192. data/script/generator/generators/gateway/templates/remote_gateway_test.rb +0 -56
  193. data/script/generator/generators/integration/integration_generator.rb +0 -25
  194. data/script/generator/generators/integration/templates/helper.rb +0 -34
  195. data/script/generator/generators/integration/templates/helper_test.rb +0 -54
  196. data/script/generator/generators/integration/templates/integration.rb +0 -18
  197. data/script/generator/generators/integration/templates/module_test.rb +0 -9
  198. data/script/generator/generators/integration/templates/notification.rb +0 -100
  199. data/script/generator/generators/integration/templates/notification_test.rb +0 -41
  200. data/script/generator/manifest.rb +0 -20
  201. data/test/remote_tests/remote_authorize_net_test.rb +0 -113
  202. data/test/remote_tests/remote_brain_tree_test.rb +0 -78
  203. data/test/remote_tests/remote_moneris_test.rb +0 -110
  204. data/test/remote_tests/remote_psigate_test.rb +0 -87
  205. data/test/remote_tests/remote_secure_pay_test.rb +0 -36
  206. data/test/remote_tests/remote_trust_commerce_test.rb +0 -136
data/CONTRIBUTERS CHANGED
@@ -46,7 +46,20 @@ Viaklix Gateway (Sep 3, 2007)
46
46
  Braintree Gateway (Sep 4, 2007)
47
47
 
48
48
  * Originally contributed by Michael J. Mangino
49
+ * Portions of the BrainTree gateway by Jeremy Voorhis
49
50
 
50
51
  Concord Efsnet Gateway (Sep 7, 2007)
51
52
 
52
53
  * Originally contributed by snacktime
54
+
55
+ SecurePayTech Gateway (Oct 23, 2007)
56
+
57
+ * Originally contributed by Jasper Bryant-Greene
58
+
59
+ SkipJack Gateway (Nov 29, 2007)
60
+
61
+ * Originally contributed by Bill Bereza - http://atomicobject.com
62
+
63
+ HiTRUST Gateway (Dec 10, 2007)
64
+
65
+ * Jaded Pixel
data/README CHANGED
@@ -1,14 +1,16 @@
1
1
  = Active Merchant
2
2
 
3
- This library is supposed to aid in creating e-commerce software in Ruby.
4
- In the future we want to support all "good" payment gateways.
3
+ This library is supposed to aid in creating e-commerce software in Ruby.
4
+ In the future we want to support all "good" payment gateways.
5
5
 
6
- This library is the foundation of commerce for http://www.shopify.com.
6
+ This library is the foundation of commerce for http://www.shopify.com.
7
7
 
8
- Please visit the {ActiveMerchant homepage}[http://activemerchant.org] for more resources, tutorials and other information about this project.
8
+ Please visit the {ActiveMerchant homepage}[http://activemerchant.org] for more resources, tutorials and other information about this project.
9
9
 
10
10
  == Supported Direct Payment Gateways
11
11
 
12
+ The {ActiveMerchant Wiki}[http://code.google.com/p/activemerchant/wiki] contains a {table of features supported by each gateway}[http://code.google.com/p/activemerchant/wiki/SupportedGatewayPaymentOperations].
13
+
12
14
  * {Authorize.net}[http://www.authorize.net/] - US
13
15
  * {Braintree}[http://www.braintreepaymentsolutions.com] - US
14
16
  * {CardStream}[http://www.cardstream.com/] - GB
@@ -20,7 +22,9 @@ Please visit the {ActiveMerchant homepage}[http://activemerchant.org] for more r
20
22
  * {LinkPoint}[http://www.linkpoint.com/] - US
21
23
  * {Moneris}[http://www.moneris.com/] - CA
22
24
  * {NetRegistry}[http://www.netregistry.com.au] - AU
25
+ * {NETbilling}[http://www.netbilling.com] - US
23
26
  * {PayJunction}[http://www.payjunction.com/] - US
27
+ * {PaySecure}[http://www.commsecure.com.au/paysecure.shtml] - AU
24
28
  * {PayPal Express Checkout}[https://www.paypal.com/cgi-bin/webscr?cmd=xpt/merchant/ExpressCheckoutIntro-outside] - US, CA, SG, AU
25
29
  * {PayPal Express Checkout (UK)}[https://www.paypal.com/uk/cgi-bin/webscr?cmd=_additional-payment-overview-outside] - GB
26
30
  * {PayPal Payflow Pro}[https://www.paypal.com/cgi-bin/webscr?cmd=_payflow-pro-overview-outside] - US, CA, SG, AU
@@ -35,26 +39,29 @@ Please visit the {ActiveMerchant homepage}[http://activemerchant.org] for more r
35
39
  * {Quickpay}[http://quickpay.dk/] - DK
36
40
  * {Realex}[http://www.realexpayments.com/] - IE, GB
37
41
  * {SecurePay}[http://www.securepay.com/] - US
42
+ * {SecurePayTech}[http://www.securepaytech.com/] - NZ
43
+ * {SkipJack}[http://www.skipjack.com/] - US, CA
38
44
  * {TransFirst}[http://www.transfirst.com/] - US
39
45
  * {TrustCommerce}[http://www.trustcommerce.com/] - US
40
- * {USA ePay}[http://www.usa_epay.com/] - US
46
+ * {USA ePay}[http://www.usaepay.com/] - US
41
47
  * {Verifi}[http://www.verifi.com/] - US
42
48
  * {ViaKLIX}[http://viaklix.com] - US
43
49
 
44
50
  == Supported Offsite Payment Gateways
45
-
51
+
46
52
  * {PayPal Website Payments Standard}[https://www.paypal.com/cgi-bin/webscr?cmd=_wp-standard-overview-outside]
47
53
  * Chronopay[http://www.chronopay.com]
48
54
  * Nochex[http://www.nochex.com]
49
55
  * {Banca Sella GestPay}[https://www.sella.it/banca/ecommerce/gestpay/gestpay.jsp]
50
56
  * {2 Checkout}[http://www.2checkout.com]
51
-
57
+ * {HiTRUST}[http://www.hitrust.com.hk/]
58
+
52
59
  == Download
53
60
 
54
61
  Currently this library is available with svn from:
55
62
 
56
- http://activemerchant.googlecode.com/svn/trunk/active_merchant
57
-
63
+ http://activemerchant.googlecode.com/svn/trunk/active_merchant
64
+
58
65
  == Installation
59
66
 
60
67
  === From Subversion
@@ -73,31 +80,48 @@ ActiveMerchant includes an init.rb file. This means that Rails will automaticall
73
80
 
74
81
  Installation from RubyGems
75
82
 
76
- > gem install activemerchant -y
83
+ > gem install activemerchant
77
84
 
78
85
  == Sample Usage
86
+ require 'rubygems'
87
+ require 'active_merchant'
88
+
89
+ # Use the TrustCommerce test servers
90
+ ActiveMerchant::Billing::Base.mode = :test
91
+
92
+ # ActiveMerchant accepts all amounts as Integer values in cents
93
+ # $10.00
94
+ amount = 1000
95
+
96
+ # The card verification value is also known as CVV2, CVC2, or CID
97
+ credit_card = ActiveMerchant::Billing::CreditCard.new(
98
+ :first_name => 'Bob',
99
+ :last_name => 'Bobsen',
100
+ :number => '4242424242424242',
101
+ :month => '8',
102
+ :year => '2012',
103
+ :verification_value => '123'
104
+ )
105
+
106
+ # Validating the card automatically detects the card type
107
+ if credit_card.valid?
108
+
109
+ # Create a gateway object for the TrustCommerce service
110
+ gateway = ActiveMerchant::Billing::TrustCommerceGateway.new(
111
+ :login => 'TestMerchant',
112
+ :password => 'password'
113
+ )
114
+
115
+ # Authorize for the amount
116
+ response = gateway.purchase(amount, credit_card)
79
117
 
80
- # 10 dollars in cents
81
- ten_dollars = 1000
82
-
83
- credit_card = CreditCard.new(
84
- :number => '4242424242424242',
85
- :month => 8,
86
- :year => 2006,
87
- :name => 'Tobias Luetke',
88
- :type => 'visa'
89
- )
90
-
91
- if creditcard.valid?
92
- gateway = ActiveMerchant::Billing::AuthorizeNetGateway.new(
93
- :login => 'LOGIN_ID',
94
- :password => 'TRANSACTION_KEY'
95
- )
96
- response = gateway.purchase(ten_dollars, credit_card)
97
-
98
118
  if response.success?
99
- ...
119
+ puts "Successfully charged $#{sprintf("%.2f", amount / 100)} to the credit card #{credit_card.display_number}"
100
120
  else
101
- raise StandardError.new( response.message )
121
+ raise StandardError, response.message
102
122
  end
103
- end
123
+ end
124
+
125
+ == Contributing
126
+
127
+ Please see the {ActiveMerchant Guide to Contributing}[http://code.google.com/p/activemerchant/wiki/Contributing] for information on adding a new gateway to ActiveMerchant.
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ require File.dirname(__FILE__) + '/lib/tasks/cia'
8
8
  require File.dirname(__FILE__) + '/lib/support/gateway_support'
9
9
 
10
10
 
11
- PKG_VERSION = "1.2.1"
11
+ PKG_VERSION = "1.3.0"
12
12
  PKG_NAME = "activemerchant"
13
13
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
14
14
 
@@ -30,7 +30,7 @@ namespace :test do
30
30
  end
31
31
 
32
32
  Rake::TestTask.new(:remote) do |t|
33
- t.pattern = 'test/remote_tests/*_test.rb'
33
+ t.pattern = 'test/remote/**/*_test.rb'
34
34
  t.ruby_opts << '-rubygems'
35
35
  t.verbose = true
36
36
  end
@@ -129,22 +129,30 @@ task :upload_rdoc => :rdoc do
129
129
  end
130
130
 
131
131
  namespace :gateways do
132
- desc 'Print the currently supported gateways in RDoc format'
133
- task :print_support_rdoc do
134
- support = GatewaySupport.new
135
- support.to_rdoc
136
- end
137
-
138
132
  desc 'Print the currently supported gateways'
139
- task :print_support do
133
+ task :print do
140
134
  support = GatewaySupport.new
141
135
  support.to_s
142
136
  end
143
137
 
144
- desc 'Print the currently supported gateways'
145
- task :print_support_textile do
146
- support = GatewaySupport.new
147
- support.to_textile
138
+ namespace :print do
139
+ desc 'Print the currently supported gateways in RDoc format'
140
+ task :rdoc do
141
+ support = GatewaySupport.new
142
+ support.to_rdoc
143
+ end
144
+
145
+ desc 'Print the currently supported gateways in Textile format'
146
+ task :textile do
147
+ support = GatewaySupport.new
148
+ support.to_textile
149
+ end
150
+
151
+ desc 'Print the gateway functionality supported by each gateway'
152
+ task :features do
153
+ support = GatewaySupport.new
154
+ support.features
155
+ end
148
156
  end
149
157
  end
150
158
 
@@ -40,6 +40,7 @@ end
40
40
 
41
41
  require 'cgi'
42
42
 
43
+ require 'active_merchant/lib/utils'
43
44
  require 'active_merchant/lib/error'
44
45
  require 'active_merchant/lib/validateable'
45
46
  require 'active_merchant/lib/posts_data'
@@ -49,6 +50,12 @@ require 'active_merchant/lib/requires_parameters'
49
50
  # Require the country class
50
51
  require 'active_merchant/lib/country'
51
52
 
53
+ # Address Verification
54
+ require 'active_merchant/billing/avs_result'
55
+
56
+ # Card Verfication Code
57
+ require 'active_merchant/billing/cvv_result'
58
+
52
59
  # CreditCard Utility class.
53
60
  require 'active_merchant/billing/credit_card_methods'
54
61
  require 'active_merchant/billing/credit_card_formatting'
@@ -0,0 +1,95 @@
1
+ module ActiveMerchant
2
+ module Billing
3
+ # Implements the Address Verification System
4
+ # https://www.wellsfargo.com/downloads/pdf/biz/merchant/visa_avs.pdf
5
+ # http://en.wikipedia.org/wiki/Address_Verification_System
6
+ # http://apps.cybersource.com/library/documentation/dev_guides/CC_Svcs_IG/html/app_avs_cvn_codes.htm#app_AVS_CVN_codes_7891_48375
7
+ # http://imgserver.skipjack.com/imgServer/5293710/AVS%20and%20CVV2.pdf
8
+ # http://www.emsecommerce.net/avs_cvv2_response_codes.htm
9
+ class AVSResult
10
+ MESSAGES = {
11
+ 'A' => 'Street address matches, but 5-digit and 9-digit postal code do not match.',
12
+ 'B' => 'Street address matches, but postal code not verified.',
13
+ 'C' => 'Street address and postal code do not match.',
14
+ 'D' => 'Street address and postal code match.',
15
+ 'E' => 'AVS data is invalid or AVS is not allowed for this card type.',
16
+ 'F' => 'Card member’s name does not match, but billing postal code matches.',
17
+ 'G' => 'Non-U.S. issuing bank does not support AVS.',
18
+ 'H' => 'Card member’s name does not match. Street address and postal code match.',
19
+ 'I' => 'Address not verified.',
20
+ 'J' => 'Card member’s name, billing address, and postal code match. Shipping information verified and chargeback protection guaranteed through the Fraud Protection Program.',
21
+ 'K' => 'Card member’s name matches but billing address and billing postal code do not match.',
22
+ 'L' => 'Card member’s name and billing postal code match, but billing address does not match.',
23
+ 'M' => 'Street address and postal code match.',
24
+ 'N' => 'Street address and postal code do not match.',
25
+ 'O' => 'Card member’s name and billing address match, but billing postal code does not match.',
26
+ 'P' => 'Postal code matches, but street address not verified.',
27
+ 'Q' => 'Card member’s name, billing address, and postal code match. Shipping information verified but chargeback protection not guaranteed.',
28
+ 'R' => 'System unavailable.',
29
+ 'S' => 'U.S.-issuing bank does not support AVS.',
30
+ 'T' => 'Card member’s name does not match, but street address matches.',
31
+ 'U' => 'Address information unavailable.',
32
+ 'V' => 'Card member’s name, billing address, and billing postal code match.',
33
+ 'W' => 'Street address does not match, but 9-digit postal code matches.',
34
+ 'X' => 'Street address and 9-digit postal code match.',
35
+ 'Y' => 'Street address and 5-digit postal code match.',
36
+ 'Z' => 'Street address does not match, but 5-digit postal code matches.'
37
+ }
38
+
39
+ # Map vendor's AVS result code to a postal match code
40
+ POSTAL_MATCH_CODE = {
41
+ 'Y' => %w( D H F H J L M P Q V W X Y Z ),
42
+ 'N' => %w( A C K N O ),
43
+ 'X' => %w( G S ),
44
+ nil => %w( B E I R T U )
45
+ }.inject({}) do |map, (type, codes)|
46
+ codes.each { |code| map[code] = type }
47
+ map
48
+ end
49
+
50
+ # Map vendor's AVS result code to a street match code
51
+ STREET_MATCH_CODE = {
52
+ 'Y' => %w( A B D H J M O Q T V X Y ),
53
+ 'N' => %w( C K L N P W Z ),
54
+ 'X' => %w( G S ),
55
+ nil => %w( E F I R U )
56
+ }.inject({}) do |map, (type, codes)|
57
+ codes.each { |code| map[code] = type }
58
+ map
59
+ end
60
+
61
+ attr_reader :code, :message, :street_match, :postal_match
62
+
63
+ def self.messages
64
+ MESSAGES
65
+ end
66
+
67
+ def initialize(attrs)
68
+ attrs ||= {}
69
+
70
+ @code = attrs[:code].upcase unless attrs[:code].blank?
71
+ @message = self.class.messages[code]
72
+
73
+ if attrs[:street_match].blank?
74
+ @street_match = STREET_MATCH_CODE[code]
75
+ else
76
+ @street_match = attrs[:street_match].upcase
77
+ end
78
+
79
+ if attrs[:postal_match].blank?
80
+ @postal_match = POSTAL_MATCH_CODE[code]
81
+ else
82
+ @postal_match = attrs[:postal_match].upcase
83
+ end
84
+ end
85
+
86
+ def to_hash
87
+ { 'code' => code,
88
+ 'message' => message,
89
+ 'street_match' => street_match,
90
+ 'postal_match' => postal_match
91
+ }
92
+ end
93
+ end
94
+ end
95
+ end
@@ -31,7 +31,7 @@ module ActiveMerchant #:nodoc:
31
31
  #
32
32
  # ActiveMerchant::Billing::Base.gateway('moneris').new
33
33
  def self.gateway(name)
34
- ActiveMerchant::Billing.const_get("#{name.to_s.downcase}_gateway".camelize)
34
+ Billing.const_get("#{name.to_s.downcase}_gateway".camelize)
35
35
  end
36
36
 
37
37
 
@@ -45,8 +45,13 @@ module ActiveMerchant #:nodoc:
45
45
  # notification = chronopay.notification(raw_post)
46
46
  #
47
47
  def self.integration(name)
48
- ActiveMerchant::Billing::Integrations.const_get("#{name.to_s.downcase}".camelize)
49
- end
48
+ Billing::Integrations.const_get("#{name.to_s.downcase}".camelize)
49
+ end
50
+
51
+ # A check to see if we're in test mode
52
+ def self.test?
53
+ self.gateway_mode == :test
54
+ end
50
55
  end
51
56
  end
52
57
  end
@@ -0,0 +1,61 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ # The Check object is a plain old Ruby object, similar to CreditCard. It supports validation
4
+ # of necessary attributes such as checkholder's name, routing and account numbers, but it is
5
+ # not backed by any database.
6
+ #
7
+ # You may use Check in place of CreditCard with any gateway that supports it. Currently, only
8
+ # +BrainTreeGateway+ supports the Check object.
9
+ class Check
10
+ include Validateable
11
+
12
+ attr_accessor :name, :routing_number, :account_number, :account_holder_type, :account_type
13
+
14
+ def initialize(args={})
15
+ args = args.with_indifferent_access
16
+ self.name = args[:name]
17
+ self.routing_number = args[:routing_number]
18
+ self.account_number = args[:account_number]
19
+ self.account_holder_type = args[:account_holder_type]
20
+ self.account_type = args[:account_type]
21
+ end
22
+
23
+ def validate
24
+ for attr in [:name, :routing_number, :account_number]
25
+ errors.add(attr, "cannot be empty") if self.send(attr).blank?
26
+ end
27
+
28
+ errors.add(:routing_number, "is invalid") unless valid_routing_number?
29
+
30
+ errors.add(:account_holder_type, "must be personal or business") if
31
+ !account_holder_type.blank? && !%w[business personal].include?(account_holder_type.to_s)
32
+
33
+ errors.add(:account_type, "must be checking or savings") if
34
+ !account_type.blank? && !%w[checking savings].include?(account_type.to_s)
35
+ end
36
+
37
+ def type
38
+ 'check'
39
+ end
40
+
41
+ # Routing numbers may be validated by calculating a checksum and dividing it by 10. The
42
+ # formula is:
43
+ # (3(d1 + d4 + d7) + 7(d2 + d5 + d8) + 1(d3 + d6 + d9))mod 10 = 0
44
+ # See http://en.wikipedia.org/wiki/Routing_transit_number#Internal_checksums
45
+ def valid_routing_number?
46
+ d = routing_number.to_s.split('').map(&:to_i).select { |d| (0..9).include?(d) }
47
+ case d.size
48
+ when 9 then
49
+ checksum = ((3 * (d[0] + d[3] + d[6])) +
50
+ (7 * (d[1] + d[4] + d[7])) +
51
+ (d[2] + d[5] + d[8])) % 10
52
+ case checksum
53
+ when 0 then true
54
+ else false
55
+ end
56
+ else false
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,111 +1,77 @@
1
1
  require 'time'
2
2
  require 'date'
3
+ require 'active_merchant/billing/expiry_date'
3
4
 
4
5
  module ActiveMerchant #:nodoc:
5
6
  module Billing #:nodoc:
7
+ # == Description
6
8
  # This credit card object can be used as a stand alone object. It acts just like an ActiveRecord object
7
9
  # but doesn't support the .save method as its not backed by a database.
10
+ #
11
+ # For testing purposes, use the 'bogus' credit card type. This card skips the vast majority of
12
+ # validations. This allows you to focus on your core concerns until you're ready to be more concerned
13
+ # with the details of particular creditcards or your gateway.
14
+ #
15
+ # == Testing With CreditCard
16
+ # Often when testing we don't care about the particulars of a given card type. When using the 'test'
17
+ # mode in your Gateway, there are six different valid card numbers: 1, 2, 3, 'success', 'fail',
18
+ # and 'error'.
19
+ #
20
+ #--
21
+ # For details, see CreditCardMethods#valid_number?
22
+ #++
23
+ #
24
+ # == Example Usage
25
+ # cc = CreditCard.new(
26
+ # :first_name => 'Steve',
27
+ # :last_name => 'Smith',
28
+ # :month => '9',
29
+ # :year => '2010',
30
+ # :type => 'visa',
31
+ # :number => '4242424242424242'
32
+ # )
33
+ #
34
+ # cc.valid? # => true
35
+ # cc.display_number # => XXXX-XXXX-XXXX-4242
36
+ #
8
37
  class CreditCard
9
38
  include CreditCardMethods
10
39
  include Validateable
11
40
 
41
+ ## Attributes
42
+
12
43
  cattr_accessor :require_verification_value
13
- self.require_verification_value = false
44
+ self.require_verification_value = true
14
45
 
15
- def self.requires_verification_value?
16
- require_verification_value
17
- end
18
-
19
- class ExpiryDate #:nodoc:
20
- attr_reader :month, :year
21
- def initialize(month, year)
22
- @month = month
23
- @year = year
24
- end
25
-
26
- def expired? #:nodoc:
27
- Time.now > expiration rescue true
28
- end
29
-
30
- def expiration #:nodoc:
31
- Time.parse("#{month}/#{month_days}/#{year} 23:59:59") rescue Time.at(0)
32
- end
33
-
34
- private
35
- def month_days
36
- mdays = [nil,31,28,31,30,31,30,31,31,30,31,30,31]
37
- mdays[2] = 29 if Date.leap?(year)
38
- mdays[month]
39
- end
40
- end
41
-
42
- # required
46
+ # Essential attributes for a valid, non-bogus creditcards
43
47
  attr_accessor :number, :month, :year, :type, :first_name, :last_name
44
48
 
45
- # required for Switch / Solo
49
+ # Required for Switch / Solo cards
46
50
  attr_accessor :start_month, :start_year, :issue_number
47
51
 
48
- # Optional verification_value (CVV, CVV2 etc)
49
- #
50
- # Gateways will try their best to run validation on the passed in value if it is supplied
51
- #
52
+ # Optional verification_value (CVV, CVV2 etc). Gateways will try their best to
53
+ # run validation on the passed in value if it is supplied
52
54
  attr_accessor :verification_value
53
55
 
54
- def before_validate
55
- self.type.downcase! if type.respond_to?(:downcase)
56
- self.month = month.to_i
57
- self.year = year.to_i
58
- self.number.to_s.gsub!(/[^\d]/, "")
56
+ # Provides proxy access to an expiry date object
57
+ def expiry_date
58
+ ExpiryDate.new(@month, @year)
59
59
  end
60
60
 
61
- def validate
62
- errors.add :year, "expired" if expired?
63
-
64
- errors.add :first_name, "cannot be empty" if @first_name.blank?
65
- errors.add :last_name, "cannot be empty" if @last_name.blank?
66
- errors.add :month, "is not a valid month" unless valid_month?(@month)
67
- errors.add :year, "is not a valid year" unless valid_expiry_year?(@year)
68
-
69
- # Bogus card is pretty much for testing purposes. Lets just skip these extra tests if its used
70
-
71
- return if type == 'bogus'
72
-
73
- errors.add :number, "is not a valid credit card number" unless CreditCard.valid_number?(number)
74
- errors.add :type, "is required" if type.blank?
75
- errors.add :type, "is invalid" unless CreditCard.card_companies.keys.include?(type)
76
-
77
- unless errors.on(:number) || errors.on(:type)
78
- CreditCard.type?(number) == type or
79
- errors.add :type, "is not the correct card type"
80
- end
81
-
82
- if CreditCard.requires_verification_value?
83
- errors.add :verification_value, "is required" unless verification_value?
84
- end
85
-
86
- if [ 'switch', 'solo' ].include?(type)
87
- unless valid_month?(@start_month) && valid_start_year?(@start_year) || valid_issue_number?(@issue_number)
88
- errors.add :start_month, "is invalid" unless valid_month?(@start_month)
89
- errors.add :start_year, "is invalid" unless valid_start_year?(@start_year)
90
- errors.add :issue_number, "cannot be empty" unless valid_issue_number?(@issue_number)
91
- end
92
- end
93
- end
94
-
95
61
  def expired?
96
62
  expiry_date.expired?
97
63
  end
98
64
 
99
65
  def name?
100
- @first_name != nil and @last_name != nil
66
+ first_name? && last_name?
101
67
  end
102
68
 
103
69
  def first_name?
104
- @first_name != nil
70
+ !@first_name.blank?
105
71
  end
106
72
 
107
73
  def last_name?
108
- @last_name != nil
74
+ !@last_name.blank?
109
75
  end
110
76
 
111
77
  def name
@@ -118,15 +84,73 @@ module ActiveMerchant #:nodoc:
118
84
 
119
85
  # Show the card number, with all but last 4 numbers replace with "X". (XXXX-XXXX-XXXX-4338)
120
86
  def display_number
121
- "XXXX-XXXX-XXXX-#{last_digits}"
87
+ self.class.mask(number)
122
88
  end
123
89
 
124
90
  def last_digits
125
- number.nil? ? "" : number.last(4)
91
+ self.class.last_digits(number)
126
92
  end
93
+
94
+ def validate
95
+ validate_essential_attributes
127
96
 
128
- def expiry_date
129
- ExpiryDate.new(@month, @year)
97
+ # Bogus card is pretty much for testing purposes. Lets just skip these extra tests if its used
98
+ return if type == 'bogus'
99
+
100
+ validate_card_type
101
+ validate_card_number
102
+ validate_verification_value
103
+ validate_switch_or_solo_attributes
104
+ end
105
+
106
+ def self.requires_verification_value?
107
+ require_verification_value
108
+ end
109
+
110
+ private
111
+
112
+ def before_validate #:nodoc:
113
+ self.month = month.to_i
114
+ self.year = year.to_i
115
+ self.number.to_s.gsub!(/[^\d]/, "")
116
+ self.type.downcase! if type.respond_to?(:downcase)
117
+ self.type = self.class.type?(number) if type.blank?
118
+ end
119
+
120
+ def validate_card_number #:nodoc:
121
+ errors.add :number, "is not a valid credit card number" unless CreditCard.valid_number?(number)
122
+ unless errors.on(:number) || errors.on(:type)
123
+ errors.add :type, "is not the correct card type" unless CreditCard.matching_type?(number, type)
124
+ end
125
+ end
126
+
127
+ def validate_card_type #:nodoc:
128
+ errors.add :type, "is required" if type.blank?
129
+ errors.add :type, "is invalid" unless CreditCard.card_companies.keys.include?(type)
130
+ end
131
+
132
+ def validate_essential_attributes #:nodoc:
133
+ errors.add :first_name, "cannot be empty" if @first_name.blank?
134
+ errors.add :last_name, "cannot be empty" if @last_name.blank?
135
+ errors.add :month, "is not a valid month" unless valid_month?(@month)
136
+ errors.add :year, "expired" if expired?
137
+ errors.add :year, "is not a valid year" unless valid_expiry_year?(@year)
138
+ end
139
+
140
+ def validate_switch_or_solo_attributes #:nodoc:
141
+ if %w[switch solo].include?(type)
142
+ unless valid_month?(@start_month) && valid_start_year?(@start_year) || valid_issue_number?(@issue_number)
143
+ errors.add :start_month, "is invalid" unless valid_month?(@start_month)
144
+ errors.add :start_year, "is invalid" unless valid_start_year?(@start_year)
145
+ errors.add :issue_number, "cannot be empty" unless valid_issue_number?(@issue_number)
146
+ end
147
+ end
148
+ end
149
+
150
+ def validate_verification_value #:nodoc:
151
+ if CreditCard.requires_verification_value?
152
+ errors.add :verification_value, "is required" unless verification_value?
153
+ end
130
154
  end
131
155
  end
132
156
  end