activemerchant-kiddy 1.15.0.kiddy

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/CHANGELOG +688 -0
  2. data/CONTRIBUTORS +233 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +164 -0
  5. data/gem-public_cert.pem +20 -0
  6. data/lib/active_merchant/billing/avs_result.rb +98 -0
  7. data/lib/active_merchant/billing/base.rb +57 -0
  8. data/lib/active_merchant/billing/check.rb +68 -0
  9. data/lib/active_merchant/billing/credit_card.rb +172 -0
  10. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  11. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  12. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  13. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  14. data/lib/active_merchant/billing/gateway.rb +170 -0
  15. data/lib/active_merchant/billing/gateways/authorize_net.rb +671 -0
  16. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +858 -0
  17. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +309 -0
  18. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +282 -0
  19. data/lib/active_merchant/billing/gateways/beanstream.rb +139 -0
  20. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  21. data/lib/active_merchant/billing/gateways/blue_pay.rb +11 -0
  22. data/lib/active_merchant/billing/gateways/bogus.rb +132 -0
  23. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  24. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  25. data/lib/active_merchant/billing/gateways/braintree_blue.rb +293 -0
  26. data/lib/active_merchant/billing/gateways/braintree_orange.rb +17 -0
  27. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  28. data/lib/active_merchant/billing/gateways/cyber_source.rb +410 -0
  29. data/lib/active_merchant/billing/gateways/data_cash.rb +597 -0
  30. data/lib/active_merchant/billing/gateways/efsnet.rb +235 -0
  31. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  32. data/lib/active_merchant/billing/gateways/epay.rb +268 -0
  33. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  34. data/lib/active_merchant/billing/gateways/eway_managed.rb +231 -0
  35. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  36. data/lib/active_merchant/billing/gateways/federated_canada.rb +168 -0
  37. data/lib/active_merchant/billing/gateways/first_pay.rb +177 -0
  38. data/lib/active_merchant/billing/gateways/garanti.rb +262 -0
  39. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +250 -0
  40. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  41. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  42. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +55 -0
  43. data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
  44. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  45. data/lib/active_merchant/billing/gateways/iridium.rb +258 -0
  46. data/lib/active_merchant/billing/gateways/jetpay.rb +276 -0
  47. data/lib/active_merchant/billing/gateways/linkpoint.rb +454 -0
  48. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +156 -0
  49. data/lib/active_merchant/billing/gateways/merchant_ware.rb +289 -0
  50. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  51. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  52. data/lib/active_merchant/billing/gateways/moneris.rb +209 -0
  53. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  54. data/lib/active_merchant/billing/gateways/netaxept.rb +239 -0
  55. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  56. data/lib/active_merchant/billing/gateways/nmi.rb +13 -0
  57. data/lib/active_merchant/billing/gateways/ogone.rb +292 -0
  58. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
  59. data/lib/active_merchant/billing/gateways/orbital.rb +317 -0
  60. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  61. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  62. data/lib/active_merchant/billing/gateways/paybox_direct.rb +207 -0
  63. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  64. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  65. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  66. data/lib/active_merchant/billing/gateways/payflow.rb +253 -0
  67. data/lib/active_merchant/billing/gateways/payflow_express.rb +222 -0
  68. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  69. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  70. data/lib/active_merchant/billing/gateways/payment_express.rb +235 -0
  71. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +351 -0
  72. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +49 -0
  73. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  74. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  75. data/lib/active_merchant/billing/gateways/paypal_express.rb +177 -0
  76. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -0
  77. data/lib/active_merchant/billing/gateways/plugnpay.rb +298 -0
  78. data/lib/active_merchant/billing/gateways/psigate.rb +219 -0
  79. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  80. data/lib/active_merchant/billing/gateways/qbms.rb +295 -0
  81. data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
  82. data/lib/active_merchant/billing/gateways/quickpay.rb +218 -0
  83. data/lib/active_merchant/billing/gateways/realex.rb +311 -0
  84. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  85. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  86. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  87. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  88. data/lib/active_merchant/billing/gateways/sage_pay.rb +320 -0
  89. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  90. data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
  91. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  92. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +193 -0
  93. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  94. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  95. data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
  96. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  97. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  98. data/lib/active_merchant/billing/gateways/trust_commerce.rb +423 -0
  99. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  100. data/lib/active_merchant/billing/gateways/verifi.rb +233 -0
  101. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  102. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  103. data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
  104. data/lib/active_merchant/billing/gateways.rb +18 -0
  105. data/lib/active_merchant/billing/integrations/action_view_helper.rb +68 -0
  106. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  107. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  108. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  109. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  110. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  111. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  112. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  113. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  114. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
  115. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
  116. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
  117. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
  118. data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
  119. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
  120. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
  121. data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
  122. data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
  123. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  124. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  125. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  126. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  127. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  128. data/lib/active_merchant/billing/integrations/helper.rb +96 -0
  129. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  130. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  131. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  132. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  133. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +48 -0
  134. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
  135. data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
  136. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  137. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  138. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  139. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  140. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  141. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  142. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  143. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  144. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  145. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  146. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  147. data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
  148. data/lib/active_merchant/billing/integrations/return.rb +42 -0
  149. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
  150. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +111 -0
  151. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
  152. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
  153. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
  154. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  155. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  156. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  157. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  158. data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
  159. data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
  160. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +88 -0
  161. data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
  162. data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
  163. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +100 -0
  164. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
  165. data/lib/active_merchant/billing/integrations/world_pay.rb +38 -0
  166. data/lib/active_merchant/billing/integrations.rb +17 -0
  167. data/lib/active_merchant/billing/response.rb +32 -0
  168. data/lib/active_merchant/billing.rb +9 -0
  169. data/lib/active_merchant/common/connection.rb +177 -0
  170. data/lib/active_merchant/common/country.rb +328 -0
  171. data/lib/active_merchant/common/error.rb +26 -0
  172. data/lib/active_merchant/common/post_data.rb +24 -0
  173. data/lib/active_merchant/common/posts_data.rb +63 -0
  174. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  175. data/lib/active_merchant/common/utils.rb +22 -0
  176. data/lib/active_merchant/common/validateable.rb +81 -0
  177. data/lib/active_merchant/common.rb +14 -0
  178. data/lib/active_merchant/version.rb +3 -0
  179. data/lib/active_merchant.rb +50 -0
  180. data/lib/activemerchant.rb +1 -0
  181. data/lib/certs/cacert.pem +7815 -0
  182. data/lib/support/gateway_support.rb +58 -0
  183. data/lib/support/outbound_hosts.rb +25 -0
  184. metadata +273 -0
@@ -0,0 +1,253 @@
1
+ require File.dirname(__FILE__) + '/payflow/payflow_common_api'
2
+ require File.dirname(__FILE__) + '/payflow/payflow_response'
3
+ require File.dirname(__FILE__) + '/payflow_express'
4
+
5
+ module ActiveMerchant #:nodoc:
6
+ module Billing #:nodoc:
7
+ class PayflowGateway < Gateway
8
+ include PayflowCommonAPI
9
+
10
+ RECURRING_ACTIONS = Set.new([:add, :modify, :cancel, :inquiry, :reactivate, :payment])
11
+
12
+ self.supported_cardtypes = [:visa, :master, :american_express, :jcb, :discover, :diners_club]
13
+ self.homepage_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_payflow-pro-overview-outside'
14
+ self.display_name = 'PayPal Payflow Pro'
15
+
16
+ def authorize(money, credit_card_or_reference, options = {})
17
+ request = build_sale_or_authorization_request(:authorization, money, credit_card_or_reference, options)
18
+
19
+ commit(request, options)
20
+ end
21
+
22
+ def purchase(money, credit_card_or_reference, options = {})
23
+ request = build_sale_or_authorization_request(:purchase, money, credit_card_or_reference, options)
24
+
25
+ commit(request, options)
26
+ end
27
+
28
+ def credit(money, identification_or_credit_card, options = {})
29
+ if identification_or_credit_card.is_a?(String)
30
+ deprecated CREDIT_DEPRECATION_MESSAGE
31
+ # Perform referenced credit
32
+ refund(money, identification_or_credit_card, options)
33
+ else
34
+ # Perform non-referenced credit
35
+ request = build_credit_card_request(:credit, money, identification_or_credit_card, options)
36
+ commit(request, options)
37
+ end
38
+ end
39
+
40
+ def refund(money, reference, options = {})
41
+ commit(build_reference_request(:credit, money, reference, options), options)
42
+ end
43
+ # Adds or modifies a recurring Payflow profile. See the Payflow Pro Recurring Billing Guide for more details:
44
+ # https://www.paypal.com/en_US/pdf/PayflowPro_RecurringBilling_Guide.pdf
45
+ #
46
+ # Several options are available to customize the recurring profile:
47
+ #
48
+ # * <tt>profile_id</tt> - is only required for editing a recurring profile
49
+ # * <tt>starting_at</tt> - takes a Date, Time, or string in mmddyyyy format. The date must be in the future.
50
+ # * <tt>name</tt> - The name of the customer to be billed. If not specified, the name from the credit card is used.
51
+ # * <tt>periodicity</tt> - The frequency that the recurring payments will occur at. Can be one of
52
+ # :bimonthly, :monthly, :biweekly, :weekly, :yearly, :daily, :semimonthly, :quadweekly, :quarterly, :semiyearly
53
+ # * <tt>payments</tt> - The term, or number of payments that will be made
54
+ # * <tt>comment</tt> - A comment associated with the profile
55
+ def recurring(money, credit_card, options = {})
56
+ options[:name] = credit_card.name if options[:name].blank? && credit_card
57
+ request = build_recurring_request(options[:profile_id] ? :modify : :add, money, options) do |xml|
58
+ add_credit_card(xml, credit_card) if credit_card
59
+ end
60
+ commit(request, options.merge(:request_type => :recurring))
61
+ end
62
+
63
+ def cancel_recurring(profile_id)
64
+ request = build_recurring_request(:cancel, 0, :profile_id => profile_id)
65
+ commit(request, options.merge(:request_type => :recurring))
66
+ end
67
+
68
+ def recurring_inquiry(profile_id, options = {})
69
+ request = build_recurring_request(:inquiry, nil, options.update( :profile_id => profile_id ))
70
+ commit(request, options.merge(:request_type => :recurring))
71
+ end
72
+
73
+ def express
74
+ @express ||= PayflowExpressGateway.new(@options)
75
+ end
76
+
77
+ private
78
+ def build_sale_or_authorization_request(action, money, credit_card_or_reference, options)
79
+ if credit_card_or_reference.is_a?(String)
80
+ build_reference_sale_or_authorization_request(action, money, credit_card_or_reference, options)
81
+ else
82
+ build_credit_card_request(action, money, credit_card_or_reference, options)
83
+ end
84
+ end
85
+
86
+ def build_reference_sale_or_authorization_request(action, money, reference, options)
87
+ xml = Builder::XmlMarkup.new
88
+ xml.tag! TRANSACTIONS[action] do
89
+ xml.tag! 'PayData' do
90
+ xml.tag! 'Invoice' do
91
+ # Fields accepted by PayFlow and recommended to be provided even for Reference Transaction, per Payflow docs.
92
+ xml.tag! 'CustIP', options[:ip] unless options[:ip].blank?
93
+ xml.tag! 'InvNum', options[:order_id].to_s.gsub(/[^\w.]/, '') unless options[:order_id].blank?
94
+ xml.tag! 'Description', options[:description] unless options[:description].blank?
95
+ xml.tag! 'Comment', options[:comment] unless options[:comment].blank?
96
+ xml.tag!('ExtData', 'Name'=> 'COMMENT2', 'Value'=> options[:comment2]) unless options[:comment2].blank?
97
+
98
+ billing_address = options[:billing_address] || options[:address]
99
+ add_address(xml, 'BillTo', billing_address, options) if billing_address
100
+ add_address(xml, 'ShipTo', options[:shipping_address],options) if options[:shipping_address]
101
+
102
+ xml.tag! 'TotalAmt', amount(money), 'Currency' => options[:currency] || currency(money)
103
+ end
104
+ xml.tag! 'Tender' do
105
+ xml.tag! 'Card' do
106
+ xml.tag! 'ExtData', 'Name' => 'ORIGID', 'Value' => reference
107
+ end
108
+ end
109
+ end
110
+ end
111
+ xml.target!
112
+ end
113
+
114
+ def build_credit_card_request(action, money, credit_card, options)
115
+ xml = Builder::XmlMarkup.new
116
+ xml.tag! TRANSACTIONS[action] do
117
+ xml.tag! 'PayData' do
118
+ xml.tag! 'Invoice' do
119
+ xml.tag! 'CustIP', options[:ip] unless options[:ip].blank?
120
+ xml.tag! 'InvNum', options[:order_id].to_s.gsub(/[^\w.]/, '') unless options[:order_id].blank?
121
+ xml.tag! 'Description', options[:description] unless options[:description].blank?
122
+ # Comment and Comment2 will show up in manager.paypal.com as Comment1 and Comment2
123
+ xml.tag! 'Comment', options[:comment] unless options[:comment].blank?
124
+ xml.tag!('ExtData', 'Name'=> 'COMMENT2', 'Value'=> options[:comment2]) unless options[:comment2].blank?
125
+
126
+ billing_address = options[:billing_address] || options[:address]
127
+ add_address(xml, 'BillTo', billing_address, options) if billing_address
128
+ add_address(xml, 'ShipTo', options[:shipping_address], options) if options[:shipping_address]
129
+
130
+ xml.tag! 'TotalAmt', amount(money), 'Currency' => options[:currency] || currency(money)
131
+ end
132
+
133
+ xml.tag! 'Tender' do
134
+ add_credit_card(xml, credit_card)
135
+ end
136
+ end
137
+ end
138
+ xml.target!
139
+ end
140
+
141
+ def add_credit_card(xml, credit_card)
142
+ xml.tag! 'Card' do
143
+ xml.tag! 'CardType', credit_card_type(credit_card)
144
+ xml.tag! 'CardNum', credit_card.number
145
+ xml.tag! 'ExpDate', expdate(credit_card)
146
+ xml.tag! 'NameOnCard', credit_card.first_name
147
+ xml.tag! 'CVNum', credit_card.verification_value if credit_card.verification_value?
148
+
149
+ if requires_start_date_or_issue_number?(credit_card)
150
+ xml.tag!('ExtData', 'Name' => 'CardStart', 'Value' => startdate(credit_card)) unless credit_card.start_month.blank? || credit_card.start_year.blank?
151
+ xml.tag!('ExtData', 'Name' => 'CardIssue', 'Value' => format(credit_card.issue_number, :two_digits)) unless credit_card.issue_number.blank?
152
+ end
153
+ xml.tag! 'ExtData', 'Name' => 'LASTNAME', 'Value' => credit_card.last_name
154
+ end
155
+ end
156
+
157
+ def credit_card_type(credit_card)
158
+ return '' if card_brand(credit_card).blank?
159
+
160
+ CARD_MAPPING[card_brand(credit_card).to_sym]
161
+ end
162
+
163
+ def expdate(creditcard)
164
+ year = sprintf("%.4i", creditcard.year)
165
+ month = sprintf("%.2i", creditcard.month)
166
+
167
+ "#{year}#{month}"
168
+ end
169
+
170
+ def startdate(creditcard)
171
+ year = format(creditcard.start_year, :two_digits)
172
+ month = format(creditcard.start_month, :two_digits)
173
+
174
+ "#{month}#{year}"
175
+ end
176
+
177
+ def build_recurring_request(action, money, options)
178
+ unless RECURRING_ACTIONS.include?(action)
179
+ raise StandardError, "Invalid Recurring Profile Action: #{action}"
180
+ end
181
+
182
+ xml = Builder::XmlMarkup.new
183
+ xml.tag! 'RecurringProfiles' do
184
+ xml.tag! 'RecurringProfile' do
185
+ xml.tag! action.to_s.capitalize do
186
+ unless [:cancel, :inquiry].include?(action)
187
+ xml.tag! 'RPData' do
188
+ xml.tag! 'Name', options[:name] unless options[:name].nil?
189
+ xml.tag! 'TotalAmt', amount(money), 'Currency' => options[:currency] || currency(money)
190
+ xml.tag! 'PayPeriod', get_pay_period(options)
191
+ xml.tag! 'Term', options[:payments] unless options[:payments].nil?
192
+ xml.tag! 'Comment', options[:comment] unless options[:comment].nil?
193
+
194
+
195
+ if initial_tx = options[:initial_transaction]
196
+ requires!(initial_tx, [:type, :authorization, :purchase])
197
+ requires!(initial_tx, :amount) if initial_tx[:type] == :purchase
198
+
199
+ xml.tag! 'OptionalTrans', TRANSACTIONS[initial_tx[:type]]
200
+ xml.tag! 'OptionalTransAmt', amount(initial_tx[:amount]) unless initial_tx[:amount].blank?
201
+ end
202
+
203
+ xml.tag! 'Start', format_rp_date(options[:starting_at] || Date.today + 1 )
204
+ xml.tag! 'EMail', options[:email] unless options[:email].nil?
205
+
206
+ billing_address = options[:billing_address] || options[:address]
207
+ add_address(xml, 'BillTo', billing_address, options) if billing_address
208
+ add_address(xml, 'ShipTo', options[:shipping_address], options) if options[:shipping_address]
209
+ end
210
+ xml.tag! 'Tender' do
211
+ yield xml
212
+ end
213
+ end
214
+ if action != :add
215
+ xml.tag! "ProfileID", options[:profile_id]
216
+ end
217
+ if action == :inquiry
218
+ xml.tag! "PaymentHistory", ( options[:history] ? 'Y' : 'N' )
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+
225
+ def get_pay_period(options)
226
+ requires!(options, [:periodicity, :bimonthly, :monthly, :biweekly, :weekly, :yearly, :daily, :semimonthly, :quadweekly, :quarterly, :semiyearly])
227
+ case options[:periodicity]
228
+ when :weekly then 'Weekly'
229
+ when :biweekly then 'Bi-weekly'
230
+ when :semimonthly then 'Semi-monthly'
231
+ when :quadweekly then 'Every four weeks'
232
+ when :monthly then 'Monthly'
233
+ when :quarterly then 'Quarterly'
234
+ when :semiyearly then 'Semi-yearly'
235
+ when :yearly then 'Yearly'
236
+ end
237
+ end
238
+
239
+ def format_rp_date(time)
240
+ case time
241
+ when Time, Date then time.strftime("%m%d%Y")
242
+ else
243
+ time.to_s
244
+ end
245
+ end
246
+
247
+ def build_response(success, message, response, options = {})
248
+ PayflowResponse.new(success, message, response, options)
249
+ end
250
+ end
251
+ end
252
+ end
253
+
@@ -0,0 +1,222 @@
1
+ require File.dirname(__FILE__) + '/payflow/payflow_common_api'
2
+ require File.dirname(__FILE__) + '/payflow/payflow_express_response'
3
+ require File.dirname(__FILE__) + '/paypal_express_common'
4
+
5
+ module ActiveMerchant #:nodoc:
6
+ module Billing #:nodoc:
7
+ # ==General Parameters
8
+ # The following parameters are supported for #setup_authorization, #setup_purchase, #authorize and #purchase transactions. I've read
9
+ # in the docs that they recommend you pass the exact same parameters to both setup and authorize/purchase.
10
+ #
11
+ # This information was gleaned from a mix of:
12
+ # * PayFlow documentation
13
+ # * for key value pairs: {Express Checkout for Payflow Pro (PDF)}[https://cms.paypal.com/cms_content/US/en_US/files/developer/PFP_ExpressCheckout_PP.pdf]
14
+ # * XMLPay: {Payflow Pro XMLPay Developer's Guide (PDF)}[https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_PayflowPro_XMLPay_Guide.pdf]
15
+ # * previous ActiveMerchant code
16
+ # * trial & error
17
+ #
18
+ # The following parameters are currently supported.
19
+ # [<tt>:ip</tt>] (opt) Customer IP Address
20
+ # [<tt>:order_id</tt>] (opt) An order or invoice number. This will be passed through to the Payflow backend at manager.paypal.com, and show up as "Supplier Reference #"
21
+ # [<tt>:description</tt>] (opt) Order description, shown to buyer (after redirected to PayPal). If Order Line Items are used (see below), then the description is suppressed. This will not be passed through to the Payflow backend.
22
+ # [<tt>:billing_address</tt>] (opt) See ActiveMerchant::Billing::Gateway for details
23
+ # [<tt>:shipping_address</tt>] (opt) See ActiveMerchant::Billing::Gateway for details
24
+ # [<tt>:currency</tt>] (req) Currency of transaction, will be set to USD by default for PayFlow Express if not specified
25
+ # [<tt>:email</tt>] (opt) Email of buyer; used to pre-fill PayPal login screen
26
+ # [<tt>:payer_id</tt>] (opt) Unique PayPal buyer account identification number, as returned by details_for request
27
+ # [<tt>:token</tt>] (req for #authorize & #purchase) Token returned by setup transaction
28
+ # [<tt>:no_shipping</tt>] (opt) Boolean for whether or not to display shipping address to buyer
29
+ # [<tt>:address_override</tt>] (opt) Boolean. If true, display shipping address passed by parameters, rather than shipping address on file with PayPal
30
+ # [<tt>:allow_note</tt>] (opt) Boolean for permitting buyer to add note during checkout. Note contents can be retrieved with details_for transaction
31
+ # [<tt>:return_url</tt>] (req) URL to which the buyer’s browser is returned after choosing to pay.
32
+ # [<tt>:cancel_return_url</tt>] (req) URL to which the buyer is returned if the buyer cancels the order.
33
+ # [<tt>:notify_url</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
34
+ # [<tt>:comment</tt>] (opt) Comment field which will be reported to Payflow backend (at manager.paypal.com) as Comment1
35
+ # [<tt>:comment2</tt>] (opt) Comment field which will be reported to Payflow backend (at manager.paypal.com) as Comment2
36
+ #
37
+ # ==Line Items
38
+ # Support for order line items is available, but has to be enabled on the PayFlow backend. This is what I was told by Todd Sieber at Technical Support:
39
+ #
40
+ # <em>You will need to call Payflow Support at 1-888-883-9770, choose option #2. Request that they update your account in "Pandora" under Product Settings >> PayPal Mark and update the Features Bitmap to 1111111111111112. This is 15 ones and a two.</em>
41
+ #
42
+ # See here[https://www.x.com/message/206214#206214] for the forum discussion (requires login to {x.com}[https://x.com]
43
+ #
44
+ # [<tt>:items</tt>] (opt) Array of Order Line Items hashes. These are shown to the buyer after redirect to PayPal.
45
+ #
46
+ #
47
+ #
48
+ # The following keys are supported for line items:
49
+ # [<tt>:name</tt>] Name of line item
50
+ # [<tt>:description</tt>] Description of line item
51
+ # [<tt>:amount</tt>] Line Item Amount in Cents (as Integer)
52
+ # [<tt>:quantity</tt>] Line Item Quantity (default to 1 if left blank)
53
+ #
54
+ # ====Customization of Payment Page
55
+ # [<tt>:page_style</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
56
+ # [<tt>:header_image</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
57
+ # [<tt>:background_color</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
58
+ # ====Additional options for old Checkout Experience, being phased out in 2010 and 2011
59
+ # [<tt>:header_background_color</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
60
+ # [<tt>:header_border_color</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
61
+
62
+
63
+ class PayflowExpressGateway < Gateway
64
+ include PayflowCommonAPI
65
+ include PaypalExpressCommon
66
+
67
+ self.test_redirect_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'
68
+ self.homepage_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=xpt/merchant/ExpressCheckoutIntro-outside'
69
+ self.display_name = 'PayPal Express Checkout'
70
+
71
+ def authorize(money, options = {})
72
+ requires!(options, :token, :payer_id)
73
+ request = build_sale_or_authorization_request('Authorization', money, options)
74
+ commit(request, options)
75
+ end
76
+
77
+ def purchase(money, options = {})
78
+ requires!(options, :token, :payer_id)
79
+ request = build_sale_or_authorization_request('Sale', money, options)
80
+ commit(request, options)
81
+ end
82
+
83
+ def refund(money, identification, options = {})
84
+ request = build_reference_request(:credit, money, identification, options)
85
+ commit(request, options)
86
+ end
87
+
88
+ def credit(money, identification, options = {})
89
+ deprecated CREDIT_DEPRECATION_MESSAGE
90
+ refund(money, identification, options)
91
+ end
92
+
93
+ def setup_authorization(money, options = {})
94
+ requires!(options, :return_url, :cancel_return_url)
95
+
96
+ request = build_setup_express_sale_or_authorization_request('Authorization', money, options)
97
+ commit(request, options)
98
+ end
99
+
100
+ def setup_purchase(money, options = {})
101
+ requires!(options, :return_url, :cancel_return_url)
102
+
103
+ request = build_setup_express_sale_or_authorization_request('Sale', money, options)
104
+ commit(request, options)
105
+ end
106
+
107
+ def details_for(token)
108
+ request = build_get_express_details_request(token)
109
+ commit(request, options)
110
+ end
111
+
112
+ private
113
+ def build_get_express_details_request(token)
114
+ xml = Builder::XmlMarkup.new :indent => 2
115
+ xml.tag! 'GetExpressCheckout' do
116
+ xml.tag! 'Authorization' do
117
+ xml.tag! 'PayData' do
118
+ xml.tag! 'Tender' do
119
+ xml.tag! 'PayPal' do
120
+ xml.tag! 'Token', token
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ xml.target!
127
+ end
128
+
129
+ def build_setup_express_sale_or_authorization_request(action, money, options = {})
130
+ xml = Builder::XmlMarkup.new :indent => 2
131
+ xml.tag! 'SetExpressCheckout' do
132
+ xml.tag! action do
133
+ add_pay_data xml, money, options
134
+ end
135
+ end
136
+ xml.target!
137
+ end
138
+
139
+ def build_sale_or_authorization_request(action, money, options)
140
+ xml = Builder::XmlMarkup.new :indent => 2
141
+ xml.tag! 'DoExpressCheckout' do
142
+ xml.tag! action do
143
+ add_pay_data xml, money, options
144
+ end
145
+ end
146
+ xml.target!
147
+ end
148
+
149
+ def add_pay_data(xml, money, options)
150
+ xml.tag! 'PayData' do
151
+ xml.tag! 'Invoice' do
152
+ xml.tag! 'CustIP', options[:ip] unless options[:ip].blank?
153
+ xml.tag! 'InvNum', options[:order_id] unless options[:order_id].blank?
154
+ # Description field will be shown to buyer, unless line items are also being supplied (then only line items are shown).
155
+ xml.tag! 'Description', options[:description] unless options[:description].blank?
156
+ # Comment, Comment2 should make it to the backend at manager.paypal.com, as with Payflow credit card transactions
157
+ # but that doesn't seem to work (yet?). See: https://www.x.com/thread/51908?tstart=0
158
+ xml.tag! 'Comment', options[:comment] unless options[:comment].nil?
159
+ xml.tag!('ExtData', 'Name'=> 'COMMENT2', 'Value'=> options[:comment2]) unless options[:comment2].nil?
160
+
161
+ billing_address = options[:billing_address] || options[:address]
162
+ add_address(xml, 'BillTo', billing_address, options) if billing_address
163
+ add_address(xml, 'ShipTo', options[:shipping_address], options) if options[:shipping_address]
164
+
165
+ # Note: To get order line-items to show up with Payflow Express, this feature has to be enabled on the backend.
166
+ # Call Support at 888 883 9770, press 2. Then request that they update your account in "Pandora" under Product Settings >> PayPal
167
+ # Mark and update the Features Bitmap to 1111111111111112. This is 15 ones and a two.
168
+ # See here for the forum discussion: https://www.x.com/message/206214#206214
169
+ items = options[:items] || []
170
+ items.each_with_index do |item, index|
171
+ xml.tag! 'ExtData', 'Name' => "L_DESC#{index}", 'Value' => item[:description]
172
+ xml.tag! 'ExtData', 'Name' => "L_COST#{index}", 'Value' => amount(item[:amount])
173
+ xml.tag! 'ExtData', 'Name' => "L_QTY#{index}", 'Value' => item[:quantity] || '1'
174
+ xml.tag! 'ExtData', 'Name' => "L_NAME#{index}", 'Value' => item[:name]
175
+ # Note: An ItemURL is supported in Paypal Express (different API), but not PayFlow Express, as far as I can tell.
176
+ # L_URLn nor L_ITEMURLn seem to work
177
+ end
178
+ if items.any?
179
+ xml.tag! 'ExtData', 'Name' => 'CURRENCY', 'Value' => options[:currency] || currency(money)
180
+ xml.tag! 'ExtData', 'Name' => "ITEMAMT", 'Value' => amount(money)
181
+ end
182
+
183
+ xml.tag! 'TotalAmt', amount(money), 'Currency' => options[:currency] || currency(money)
184
+ end
185
+
186
+ xml.tag! 'Tender' do
187
+ add_paypal_details(xml, options)
188
+ end
189
+ end
190
+ end
191
+
192
+ def add_paypal_details(xml, options)
193
+ xml.tag! 'PayPal' do
194
+ xml.tag! 'EMail', options[:email] unless options[:email].blank?
195
+ xml.tag! 'ReturnURL', options[:return_url] unless options[:return_url].blank?
196
+ xml.tag! 'CancelURL', options[:cancel_return_url] unless options[:cancel_return_url].blank?
197
+ xml.tag! 'NotifyURL', options[:notify_url] unless options[:notify_url].blank?
198
+ xml.tag! 'PayerID', options[:payer_id] unless options[:payer_id].blank?
199
+ xml.tag! 'Token', options[:token] unless options[:token].blank?
200
+ xml.tag! 'NoShipping', options[:no_shipping] ? '1' : '0'
201
+ xml.tag! 'AddressOverride', options[:address_override] ? '1' : '0'
202
+ xml.tag! 'ButtonSource', application_id.to_s.slice(0,32) unless application_id.blank?
203
+
204
+ # Customization of the payment page
205
+ xml.tag! 'PageStyle', options[:page_style] unless options[:page_style].blank?
206
+ xml.tag! 'HeaderImage', options[:header_image] unless options[:header_image].blank?
207
+ xml.tag! 'PayflowColor', options[:background_color] unless options[:background_color].blank?
208
+ # Note: HeaderImage and PayflowColor apply to both the new (as of 2010) and the old checkout experience
209
+ # HeaderBackColor and HeaderBorderColor apply only to the old checkout experience which is being phased out.
210
+ xml.tag! 'HeaderBackColor', options[:header_background_color] unless options[:header_background_color].blank?
211
+ xml.tag! 'HeaderBorderColor', options[:header_border_color] unless options[:header_border_color].blank?
212
+ xml.tag! 'ExtData', 'Name' => 'ALLOWNOTE', 'Value' => options[:allow_note]
213
+ end
214
+ end
215
+
216
+ def build_response(success, message, response, options = {})
217
+ PayflowExpressResponse.new(success, message, response, options)
218
+ end
219
+ end
220
+ end
221
+ end
222
+
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/payflow_express'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class PayflowExpressUkGateway < PayflowExpressGateway
6
+ self.default_currency = 'GBP'
7
+ self.partner = 'PayPalUk'
8
+
9
+ self.supported_countries = ['GB']
10
+ self.homepage_url = 'https://www.paypal.com/uk/cgi-bin/webscr?cmd=_additional-payment-overview-outside'
11
+ self.display_name = 'PayPal Express Checkout (UK)'
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/payflow'
2
+ require File.dirname(__FILE__) + '/payflow_express_uk'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ class PayflowUkGateway < PayflowGateway
7
+ self.default_currency = 'GBP'
8
+ self.partner = 'PayPalUk'
9
+
10
+ def express
11
+ @express ||= PayflowExpressUkGateway.new(@options)
12
+ end
13
+
14
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover, :solo, :switch]
15
+ self.supported_countries = ['GB']
16
+ self.homepage_url = 'https://www.paypal.com/uk/cgi-bin/webscr?cmd=_wp-pro-overview-outside'
17
+ self.display_name = 'PayPal Website Payments Pro (UK)'
18
+ end
19
+ end
20
+ end
21
+