activemerchant 1.42.6 → 1.42.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NzkyMTMwMmZlNGQ4MDhiNTI0NDFmYjIzOTI1ZjZjNTNjNTIwY2E1Yw==
4
+ NDRjYjY2NmNjZWUyNDMwMjdhOTZjOGMyMzJjOTUxYWMxNjFlNjVkNw==
5
5
  data.tar.gz: !binary |-
6
- ZDg2OWFmMzE4NTA0NjI0MTJkZWQyYzYyZDVkMzk0MTYwODYwNDI4YQ==
6
+ ZTFjN2I2ZjQ3ZTdkZTIwZWY0ZGY0OTFhNzhjOTkwYWIxNDFlYTI3OA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzM5NTgxYTc4MzU3MjY1Y2MwNGExZjAyMzVlNWIyZTJlNmI3ZWY2MzhhZjE5
10
- ODc5OGIxMGFjMGRhZmNkOTc5YmZjNzUyZmY5ZGEwZTVhMDUzMTFkNjljYWIz
11
- MDQzMmU3MDlmNDhkMjkxMDIwOTVkNzFjZTkyMDBjZGY0NzU4Nzg=
9
+ OTZiMWRlNzE0OWZmOWQwZjk2NjNlZmJjYmYxOGNhMWIzMjk4ZDAxMDg5MjZk
10
+ Y2I3ZDVhYjkzZDA4NTAyYjk0ZDU3ZjZkODAyMmEzOWVjMjg1OTJlNmRiYzg4
11
+ YTQ5YTc4ZGRjMmVmZGU5N2ZlMWI0MjdiNmRjZjUyZmVlN2NhMzU=
12
12
  data.tar.gz: !binary |-
13
- MWFmNTMzZWNhMDhmOTE3MDQzYTU1ZTFlZTFkYjQ4NTMxZWM3YTBlNGU5YWM1
14
- ZjgzMzc3MTEzOWY5ZjhkYTFmMDY5ZmI4NWFmMjI0YTA1YjMzOTM4YjUyMGEz
15
- Y2M4YWVjOWNhZjVjMTZjOTNlMWQ4NzQ4ZjRiMWRiYWJhYjcyNTQ=
13
+ YTY3ZGViYTg2MTIxOTFhZmFhMzE5Y2JiZmYxNzZlMzMzMDJhNDYwNTA1OTE0
14
+ ZDEzNWQ1OGYyZjJkOTM5ODE0OGViNGFiNmFmNjg3NDczMmQyOTI1OWYyMDZi
15
+ ZTZjYzVkZWM5ZTFhNzhkOGU4MTc3YWY1NGI3OWMyM2Q0OGIzYTA=
Binary file
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG CHANGED
@@ -1,5 +1,17 @@
1
1
  = ActiveMerchant CHANGELOG
2
2
 
3
+ == Version 1.42.7 (March 18, 2014)
4
+
5
+ * SagePay: Add support for ReferrerID [markabe]
6
+ * Cecabank: Fix expiration date formatting [duff]
7
+ * Add WePay gateway [faizalzakaria]
8
+ * SmartPs: Add ECI option to SmartPs [odorcicd]
9
+ * Rescue and re-raise ActionViewHelperError when offsite helpers raise an error [odorcicd]
10
+ * Add FirstGiving gateway [faizalzakaria]
11
+ * FirstGiving: Fix refunds [ntalbott]
12
+ * Samurai: Handle server errors [ntalbott]
13
+ * WePay: Fix refund [duff]
14
+
3
15
  == Version 1.42.6 (February 24, 2014)
4
16
 
5
17
  * Litle: Truncate order_id [duff]
@@ -460,3 +460,11 @@ Openpay (February 2014)
460
460
  maxiPago (February 2014)
461
461
 
462
462
  * (alexandremcosta)
463
+
464
+ WePay (March 2014)
465
+
466
+ * Faizal Zakaria (faizalzakaria)
467
+
468
+ FirstGiving (March 2014)
469
+
470
+ * Faizal Zakaria (faizalzakaria)
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  [![Build Status](https://travis-ci.org/Shopify/active_merchant.png?branch=master)](https://travis-ci.org/Shopify/active_merchant)
3
3
  [![Code Climate](https://codeclimate.com/github/Shopify/active_merchant.png)](https://codeclimate.com/github/Shopify/active_merchant)
4
4
 
5
- Active Merchant is an extraction from the e-commerce system [Shopify](http://www.shopify.com).
5
+ Active Merchant is an extraction from the ecommerce system [Shopify](http://www.shopify.com).
6
6
  Shopify's requirements for a simple and unified API to access dozens of different payment
7
7
  gateways with very different internal APIs was the chief principle in designing the library.
8
8
 
@@ -40,39 +40,41 @@ Or, if you're using Bundler, just add the following to your Gemfile:
40
40
  This simple example demonstrates how a purchase can be made using a person's
41
41
  credit card details.
42
42
 
43
- require 'rubygems'
44
- require 'active_merchant'
45
-
46
- # Use the TrustCommerce test servers
47
- ActiveMerchant::Billing::Base.mode = :test
48
-
49
- gateway = ActiveMerchant::Billing::TrustCommerceGateway.new(
50
- :login => 'TestMerchant',
51
- :password => 'password')
52
-
53
- # ActiveMerchant accepts all amounts as Integer values in cents
54
- amount = 1000 # $10.00
55
-
56
- # The card verification value is also known as CVV2, CVC2, or CID
57
- credit_card = ActiveMerchant::Billing::CreditCard.new(
58
- :first_name => 'Bob',
59
- :last_name => 'Bobsen',
60
- :number => '4242424242424242',
61
- :month => '8',
62
- :year => Time.now.year+1,
63
- :verification_value => '000')
64
-
65
- # Validating the card automatically detects the card type
66
- if credit_card.valid?
67
- # Capture $10 from the credit card
68
- response = gateway.purchase(amount, credit_card)
69
-
70
- if response.success?
71
- puts "Successfully charged $#{sprintf("%.2f", amount / 100)} to the credit card #{credit_card.display_number}"
72
- else
73
- raise StandardError, response.message
74
- end
75
- end
43
+ ```ruby
44
+ require 'rubygems'
45
+ require 'active_merchant'
46
+
47
+ # Use the TrustCommerce test servers
48
+ ActiveMerchant::Billing::Base.mode = :test
49
+
50
+ gateway = ActiveMerchant::Billing::TrustCommerceGateway.new(
51
+ :login => 'TestMerchant',
52
+ :password => 'password')
53
+
54
+ # ActiveMerchant accepts all amounts as Integer values in cents
55
+ amount = 1000 # $10.00
56
+
57
+ # The card verification value is also known as CVV2, CVC2, or CID
58
+ credit_card = ActiveMerchant::Billing::CreditCard.new(
59
+ :first_name => 'Bob',
60
+ :last_name => 'Bobsen',
61
+ :number => '4242424242424242',
62
+ :month => '8',
63
+ :year => Time.now.year+1,
64
+ :verification_value => '000')
65
+
66
+ # Validating the card automatically detects the card type
67
+ if credit_card.valid?
68
+ # Capture $10 from the credit card
69
+ response = gateway.purchase(amount, credit_card)
70
+
71
+ if response.success?
72
+ puts "Successfully charged $#{sprintf("%.2f", amount / 100)} to the credit card #{credit_card.display_number}"
73
+ else
74
+ raise StandardError, response.message
75
+ end
76
+ end
77
+ ```
76
78
 
77
79
  For more in-depth documentation and tutorials, see [GettingStarted.md](GettingStarted.md) and the
78
80
  [API documentation](http://rubydoc.info/github/Shopify/active_merchant/master/file/README.md).
@@ -83,7 +85,7 @@ The [ActiveMerchant Wiki](http://github.com/Shopify/active_merchant/wikis) conta
83
85
 
84
86
  * [App55](https://www.app55.com/) - AU, BR, CA, CH, CL, CN, CO, CZ, DK, EU, GB, HK, HU, ID, IS, JP, KE, KR, MX, MY, NO, NZ, PH, PL, TH, TW, US, VN, ZA
85
87
  * [Authorize.Net CIM](http://www.authorize.net/) - US
86
- * [Authorize.Net](http://www.authorize.net/) - US, CA, GB
88
+ * [Authorize.Net](http://www.authorize.net/) - AD, AT, AU, BE, BG, CA, CH, CY, CZ, DE, DK, ES, FI, FR, GB, GB, GI, GR, HU, IE, IT, LI, LU, MC, MT, NL, NO, PL, PT, RO, SE, SI, SK, SM, TR, US, VA
87
89
  * [Balanced](https://www.balancedpayments.com/) - US
88
90
  * [Banwire](http://www.banwire.com/) - MX
89
91
  * [Barclays ePDQ Extra Plus](http://www.barclaycard.co.uk/business/accepting-payments/epdq-ecomm/) - GB
@@ -111,6 +113,7 @@ The [ActiveMerchant Wiki](http://github.com/Shopify/active_merchant/wikis) conta
111
113
  * [Finansbank WebPOS](https://www.fbwebpos.com/) - US, TR
112
114
  * [First Pay](http://www.first-pay.com) - US
113
115
  * [FirstData Global Gateway e4](http://www.firstdata.com) - CA, US
116
+ * [FirstGiving](http://www.firstgiving.com/) - US
114
117
  * [Garanti Sanal POS](https://sanalposweb.garanti.com.tr) - US, TR
115
118
  * [HDFC](http://www.hdfcbank.com/sme/sme-details/merchant-services/guzh6m0i) - IN
116
119
  * [IATSPayments](http://www.iatspayments.com/) - US, CA, GB
@@ -191,6 +194,7 @@ The [ActiveMerchant Wiki](http://github.com/Shopify/active_merchant/wikis) conta
191
194
  * [ViaKLIX](http://viaklix.com) - US
192
195
  * [Vindicia](http://www.vindicia.com/) - US, CA, GB, AU, MX, BR, DE, KR, CN, HK
193
196
  * [WebPay](https://webpay.jp/) - JP
197
+ * [WePay](https://www.wepay.com/) - US
194
198
  * [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
195
199
  * [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
196
200
 
@@ -43,7 +43,7 @@ module ActiveMerchant #:nodoc:
43
43
 
44
44
  self.default_currency = 'USD'
45
45
 
46
- self.supported_countries = ['US', 'CA', 'GB']
46
+ self.supported_countries = %w(AD AT AU BE BG CA CH CY CZ DE DK ES FI FR GB GB GI GR HU IE IT LI LU MC MT NL NO PL PT RO SE SI SK SM TR US VA)
47
47
  self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb]
48
48
  self.homepage_url = 'http://www.authorize.net/'
49
49
  self.display_name = 'Authorize.Net'
@@ -98,11 +98,15 @@ module ActiveMerchant #:nodoc:
98
98
 
99
99
  def add_creditcard(post, creditcard)
100
100
  post['PAN'] = creditcard.number
101
- post['Caducidad'] = "#{creditcard.year}#{creditcard.month}"
101
+ post['Caducidad'] = expdate(creditcard)
102
102
  post['CVV2'] = creditcard.verification_value
103
103
  post['Pago_elegido'] = CECA_MODE
104
104
  end
105
105
 
106
+ def expdate(creditcard)
107
+ "#{format(creditcard.year, :four_digits)}#{format(creditcard.month, :two_digits)}"
108
+ end
109
+
106
110
  def parse(body)
107
111
  response = {}
108
112
 
@@ -0,0 +1,143 @@
1
+ require 'nokogiri'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class FirstGivingGateway < Gateway
6
+ self.test_url = 'http://usapisandbox.fgdev.net'
7
+ self.live_url = 'https://api.firstgiving.com'
8
+
9
+ self.supported_countries = ['US']
10
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
11
+ self.homepage_url = 'http://www.firstgiving.com/'
12
+ self.default_currency = 'USD'
13
+ self.display_name = 'FirstGiving'
14
+
15
+ def initialize(options = {})
16
+ requires!(options, :application_key, :security_token, :charity_id)
17
+ super
18
+ end
19
+
20
+ def purchase(money, creditcard, options = {})
21
+ post = {}
22
+ add_invoice(post, options)
23
+ add_creditcard(post, creditcard)
24
+ add_address(post, options)
25
+ add_customer_data(post, options)
26
+ add_donation_data(post, money, options)
27
+ commit('/donation/creditcard', post)
28
+ end
29
+
30
+ def refund(money, identifier, options = {})
31
+ get = {}
32
+ get[:transactionId] = identifier
33
+ get[:tranType] = 'REFUNDREQUEST'
34
+ commit("/transaction/refundrequest?" + encode(get))
35
+ end
36
+
37
+ private
38
+
39
+ def add_donation_data(post, money, options)
40
+ post[:amount] = amount(money)
41
+ post[:charityId] = @options[:charity_id]
42
+ post[:description] = (options[:description] || "Purchase")
43
+ post[:currencyCode] = (options[:currency] || currency(money))
44
+ end
45
+
46
+ def add_customer_data(post, options)
47
+ post[:billToEmail] = (options[:email] || "activemerchant@example.com")
48
+ post[:remoteAddr] = (options[:ip] || "127.0.0.1")
49
+ end
50
+
51
+ def add_address(post, options)
52
+ if(billing_address = (options[:billing_address] || options[:address]))
53
+ post[:billToAddressLine1] = billing_address[:address1]
54
+ post[:billToCity] = billing_address[:city]
55
+ post[:billToState] = billing_address[:state]
56
+ post[:billToZip] = billing_address[:zip]
57
+ post[:billToCountry] = billing_address[:country]
58
+ end
59
+ end
60
+
61
+ def add_invoice(post, options)
62
+ post[:orderId] = options[:order_id]
63
+ end
64
+
65
+ def add_creditcard(post, creditcard)
66
+ post[:billToFirstName] = creditcard.first_name
67
+ post[:billToLastName] = creditcard.last_name
68
+ post[:ccNumber] = creditcard.number
69
+ post[:ccType] = creditcard_brand(creditcard.brand)
70
+ post[:ccExpDateMonth] = creditcard.month
71
+ post[:ccExpDateYear] = creditcard.year
72
+ post[:ccCardValidationNum] = creditcard.verification_value
73
+ end
74
+
75
+ def parse(body)
76
+ response = {}
77
+
78
+ xml = Nokogiri::XML(body)
79
+ element = xml.xpath("//firstGivingDonationApi/firstGivingResponse").first
80
+
81
+ element.attributes.each do |name, attribute|
82
+ response[name] = attribute.content
83
+ end
84
+ element.children.each do |child|
85
+ next if child.text?
86
+ response[child.name] = child.text
87
+ end
88
+
89
+ response
90
+ end
91
+
92
+ def commit(action, post=nil)
93
+ url = (test? ? self.test_url : self.live_url) + action
94
+
95
+ begin
96
+ if post
97
+ response = parse(ssl_post(url, post_data(post), headers))
98
+ else
99
+ response = parse(ssl_get(url, headers))
100
+ end
101
+ rescue ResponseError => e
102
+ response = parse(e.response.body)
103
+ end
104
+
105
+ Response.new(
106
+ (response["acknowledgement"] == "Success"),
107
+ (response["friendlyErrorMessage"] || response["verboseErrorMessage"] || response["acknowledgement"]),
108
+ response,
109
+ authorization: response["transactionId"],
110
+ test: test?,
111
+ )
112
+ end
113
+
114
+ def post_data(post)
115
+ post.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
116
+ end
117
+
118
+ def encode(hash)
119
+ hash.collect{|(k,v)| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"}.join('&')
120
+ end
121
+
122
+ def creditcard_brand(brand)
123
+ case brand
124
+ when "visa" then "VI"
125
+ when "master" then "MC"
126
+ when "discover" then "DI"
127
+ when "american_express" then "AX"
128
+ else
129
+ raise "Unhandled credit card brand #{brand}"
130
+ end
131
+ end
132
+
133
+ def headers
134
+ {
135
+ "User-Agent" => "ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
136
+ "JG_APPLICATIONKEY" => "#{@options[:application_key]}",
137
+ "JG_SECURITYTOKEN" => "#{@options[:security_token]}"
138
+ }
139
+ end
140
+ end
141
+ end
142
+ end
143
+
@@ -177,6 +177,8 @@ module ActiveMerchant #:nodoc:
177
177
  USE_ORDER_ID = 'O' # Use OrderID field
178
178
  USE_COMMENTS = 'D' # Use Comments field
179
179
 
180
+ SENSITIVE_FIELDS = [:account_num]
181
+
180
182
  def initialize(options = {})
181
183
  requires!(options, :merchant_id)
182
184
  requires!(options, :login, :password) unless options[:ip_authentication]
@@ -431,7 +433,8 @@ module ActiveMerchant #:nodoc:
431
433
  recurring_parse_element(response, node)
432
434
  end
433
435
  end
434
- response
436
+
437
+ response.delete_if { |k,_| SENSITIVE_FIELDS.include?(k) }
435
438
  end
436
439
 
437
440
  def recurring_parse_element(response, node)
@@ -293,6 +293,10 @@ module ActiveMerchant #:nodoc:
293
293
  :VPSProtocol => "2.23"
294
294
  )
295
295
 
296
+ if(application_id && (application_id != Gateway.application_id))
297
+ parameters.update(:ReferrerID => application_id)
298
+ end
299
+
296
300
  parameters.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
297
301
  end
298
302
 
@@ -32,6 +32,8 @@ module ActiveMerchant #:nodoc:
32
32
 
33
33
  authorize = Samurai::Processor.authorize(token, amount(money), processor_options(options))
34
34
  handle_result(authorize)
35
+ rescue ActiveResource::ServerError => e
36
+ Response.new(false, e.message, {}, test: test?)
35
37
  end
36
38
 
37
39
  def purchase(money, credit_card_or_vault_id, options = {})
@@ -40,21 +42,29 @@ module ActiveMerchant #:nodoc:
40
42
 
41
43
  purchase = Samurai::Processor.purchase(token, amount(money), processor_options(options))
42
44
  handle_result(purchase)
45
+ rescue ActiveResource::ServerError => e
46
+ Response.new(false, e.message, {}, test: test?)
43
47
  end
44
48
 
45
49
  def capture(money, authorization_id, options = {})
46
50
  transaction = Samurai::Transaction.find(authorization_id)
47
51
  handle_result(transaction.capture(amount(money)))
52
+ rescue ActiveResource::ServerError => e
53
+ Response.new(false, e.message, {}, test: test?)
48
54
  end
49
55
 
50
56
  def refund(money, transaction_id, options = {})
51
57
  transaction = Samurai::Transaction.find(transaction_id)
52
58
  handle_result(transaction.credit(amount(money)))
59
+ rescue ActiveResource::ServerError => e
60
+ Response.new(false, e.message, {}, test: test?)
53
61
  end
54
62
 
55
63
  def void(transaction_id, options = {})
56
64
  transaction = Samurai::Transaction.find(transaction_id)
57
65
  handle_result(transaction.void)
66
+ rescue ActiveResource::ServerError => e
67
+ Response.new(false, e.message, {}, test: test?)
58
68
  end
59
69
 
60
70
  def store(creditcard, options = {})
@@ -78,6 +88,8 @@ module ActiveMerchant #:nodoc:
78
88
  Response.new(result.is_sensitive_data_valid,
79
89
  message_from_result(result),
80
90
  { :payment_method_token => result.is_sensitive_data_valid && result.payment_method_token })
91
+ rescue ActiveResource::ServerError => e
92
+ Response.new(false, e.message, {}, test: test?)
81
93
  end
82
94
 
83
95
  private
@@ -43,6 +43,7 @@ module ActiveMerchant #:nodoc:
43
43
  add_currency(post, money, options)
44
44
  add_taxes(post, options)
45
45
  add_processor(post, options)
46
+ add_eci(post, options)
46
47
  commit('sale', money, post)
47
48
  end
48
49
 
@@ -207,6 +208,10 @@ module ActiveMerchant #:nodoc:
207
208
  post[:transactionid] = auth
208
209
  end
209
210
 
211
+ def add_eci(post, options)
212
+ post[:billing_method] = options[:eci] if options[:eci]
213
+ end
214
+
210
215
  def parse(body)
211
216
  results = {}
212
217
  body.split(/&/).each do |pair|
@@ -0,0 +1,189 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class WepayGateway < Gateway
4
+ self.test_url = 'https://stage.wepayapi.com/v2'
5
+ self.live_url = 'https://wepayapi.com/v2'
6
+
7
+ self.supported_countries = ['US']
8
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
9
+ self.homepage_url = 'https://www.wepay.com/'
10
+ self.default_currency = 'USD'
11
+ self.display_name = 'WePay'
12
+
13
+ def initialize(options = {})
14
+ requires!(options, :client_id, :account_id, :access_token)
15
+ super(options)
16
+ end
17
+
18
+ def purchase(money, payment_method, options = {})
19
+ post = {}
20
+ if payment_method.is_a?(String)
21
+ purchase_with_token(post, money, payment_method, options)
22
+ else
23
+ MultiResponse.run do |r|
24
+ r.process { store(payment_method, options) }
25
+ r.process { purchase_with_token(post, money, split_authorization(r.authorization).first, options) }
26
+ end
27
+ end
28
+ end
29
+
30
+ def authorize(money, payment_method, options = {})
31
+ post = {auto_capture: 0}
32
+ if payment_method.is_a?(String)
33
+ purchase_with_token(post, money, payment_method, options)
34
+ else
35
+ MultiResponse.run do |r|
36
+ r.process { store(payment_method, options) }
37
+ r.process { purchase_with_token(post, money, split_authorization(r.authorization).first, options) }
38
+ end
39
+ end
40
+ end
41
+
42
+ def capture(money, identifier, options = {})
43
+ post = {}
44
+ post[:checkout_id] = split_authorization(identifier).first
45
+ commit('/checkout/capture', post)
46
+ end
47
+
48
+ def void(identifier, options = {})
49
+ post = {}
50
+ post[:checkout_id] = split_authorization(identifier).first
51
+ post[:cancel_reason] = (options[:description] || "Void")
52
+ commit('/checkout/cancel', post)
53
+ end
54
+
55
+ def refund(money, identifier, options = {})
56
+ checkout_id, original_amount = split_authorization(identifier)
57
+
58
+ post = {}
59
+ post[:checkout_id] = checkout_id
60
+ if(money && (original_amount != amount(money)))
61
+ post[:amount] = amount(money)
62
+ end
63
+ post[:refund_reason] = (options[:description] || "Refund")
64
+ post[:app_fee] = options[:application_fee] if options[:application_fee]
65
+ post[:payer_email_message] = options[:payer_email_message] if options[:payer_email_message]
66
+ post[:payee_email_message] = options[:payee_email_message] if options[:payee_email_message]
67
+ commit("/checkout/refund", post)
68
+ end
69
+
70
+ def store(creditcard, options = {})
71
+ requires!(options, :email)
72
+
73
+ post = {}
74
+ post[:client_id] = @options[:client_id]
75
+ post[:user_name] = "#{creditcard.first_name} #{creditcard.last_name}"
76
+ post[:email] = options[:email]
77
+ post[:cc_number] = creditcard.number
78
+ post[:cvv] = creditcard.verification_value
79
+ post[:expiration_month] = creditcard.month
80
+ post[:expiration_year] = creditcard.year
81
+ post[:original_ip] = options[:ip] if options[:ip]
82
+ post[:original_device] = options[:device_fingerprint] if options[:device_fingerprint]
83
+ if(billing_address = (options[:billing_address] || options[:address]))
84
+ post[:address] = {
85
+ "address1" => billing_address[:address1],
86
+ "city" => billing_address[:city],
87
+ "state" => billing_address[:state],
88
+ "country" => billing_address[:country]
89
+ }
90
+ if(post[:country] == "US")
91
+ post[:address]["zip"] = billing_address[:zip]
92
+ else
93
+ post[:address]["postcode"] = billing_address[:zip]
94
+ end
95
+ end
96
+ commit('/credit_card/create', post)
97
+ end
98
+
99
+ private
100
+
101
+ def purchase_with_token(post, money, token, options)
102
+ add_token(post, token)
103
+ add_product_data(post, money, options)
104
+ commit('/checkout/create', post)
105
+ end
106
+
107
+ def add_product_data(post, money, options)
108
+ post[:account_id] = @options[:account_id]
109
+ post[:amount] = amount(money)
110
+ post[:short_description] = (options[:description] || "Purchase")
111
+ post[:type] = (options[:type] || "GOODS")
112
+ post[:currency] = (options[:currency] || currency(money))
113
+ post[:long_description] = options[:long_description] if options[:long_description]
114
+ post[:payer_email_message] = options[:payer_email_message] if options[:payer_email_message]
115
+ post[:payee_email_message] = options[:payee_email_message] if options[:payee_email_message]
116
+ post[:reference_id] = options[:order_id] if options[:order_id]
117
+ post[:app_fee] = options[:application_fee] if options[:application_fee]
118
+ post[:fee_payer] = options[:fee_payer] if options[:fee_payer]
119
+ post[:redirect_uri] = options[:redirect_uri] if options[:redirect_uri]
120
+ post[:callback_uri] = options[:callback_uri] if options[:callback_uri]
121
+ post[:fallback_uri] = options[:fallback_uri] if options[:fallback_uri]
122
+ post[:require_shipping] = options[:require_shipping] if options[:require_shipping]
123
+ post[:shipping_fee] = options[:shipping_fee] if options[:shipping_fee]
124
+ post[:charge_tax] = options[:charge_tax] if options[:charge_tax]
125
+ post[:mode] = options[:mode] if options[:mode]
126
+ post[:preapproval_id] = options[:preapproval_id] if options[:preapproval_id]
127
+ post[:prefill_info] = options[:prefill_info] if options[:prefill_info]
128
+ post[:funding_sources] = options[:funding_sources] if options[:funding_sources]
129
+ end
130
+
131
+ def add_token(post, token)
132
+ post[:payment_method_id] = token
133
+ post[:payment_method_type] = "credit_card"
134
+ end
135
+
136
+ def parse(response)
137
+ JSON.parse(response)
138
+ end
139
+
140
+ def commit(action, params, options={})
141
+ begin
142
+ response = parse(ssl_post(
143
+ ((test? ? test_url : live_url) + action),
144
+ params.to_json,
145
+ headers
146
+ ))
147
+ rescue ResponseError => e
148
+ response = parse(e.response.body)
149
+ end
150
+
151
+ Response.new(
152
+ success_from(response),
153
+ message_from(response),
154
+ response,
155
+ authorization: authorization_from(response, params),
156
+ test: test?
157
+ )
158
+ end
159
+
160
+ def success_from(response)
161
+ (!response["error"])
162
+ end
163
+
164
+ def message_from(response)
165
+ (response["error"] ? response["error_description"] : "Success")
166
+ end
167
+
168
+ def authorization_from(response, params)
169
+ return response["credit_card_id"].to_s if response["credit_card_id"]
170
+
171
+ [response["checkout_id"], params[:amount]].join('|')
172
+ end
173
+
174
+ def split_authorization(authorization)
175
+ auth, original_amount = authorization.to_s.split("|")
176
+ [auth, original_amount]
177
+ end
178
+
179
+ def headers
180
+ {
181
+ "Content-Type" => "application/json",
182
+ "User-Agent" => "ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
183
+ "Authorization" => "Bearer #{@options[:access_token]}"
184
+ }
185
+ end
186
+ end
187
+ end
188
+ end
189
+
@@ -3,6 +3,8 @@ require 'action_pack'
3
3
  module ActiveMerchant #:nodoc:
4
4
  module Billing #:nodoc:
5
5
  module Integrations #:nodoc:
6
+ ActionViewHelperError = Class.new(StandardError)
7
+
6
8
  module ActionViewHelper
7
9
  # This helper allows the usage of different payment integrations
8
10
  # through a single form helper. Payment integrations are the
@@ -67,6 +69,8 @@ module ActiveMerchant #:nodoc:
67
69
 
68
70
  concat(result.respond_to?(:html_safe) ? result.html_safe : result)
69
71
  nil
72
+ rescue => e
73
+ raise ActionViewHelperError.new(e)
70
74
  end
71
75
  end
72
76
  end
@@ -38,6 +38,8 @@ module ActiveMerchant #:nodoc:
38
38
  def form_fields
39
39
  invoice = create_invoice
40
40
 
41
+ raise StandardError, "Invalid response while retrieving BitPay Invoice ID. Please try again." unless invoice
42
+
41
43
  {"id" => invoice['id']}
42
44
  end
43
45
 
@@ -36,8 +36,12 @@ module ActiveMerchant #:nodoc:
36
36
 
37
37
  def acknowledge(authcode = nil)
38
38
  # paydollar supports multiple signature keys, therefore we need to check if any
39
- # of their signatures matches ours
40
- @params['secureHash'].split(',').include? generate_secure_hash
39
+ # of their signatures match ours
40
+ hash = @params['secureHash']
41
+ if !hash
42
+ return false
43
+ end
44
+ hash.split(',').include? generate_secure_hash
41
45
  end
42
46
 
43
47
  private
@@ -1,3 +1,3 @@
1
1
  module ActiveMerchant
2
- VERSION = "1.42.6"
2
+ VERSION = "1.42.7"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemerchant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.42.6
4
+ version: 1.42.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
@@ -38,7 +38,7 @@ cert_chain:
38
38
  U1BPVm5oYkZKM3ZTWFkxdWxQL1I2WFc5dm53CjZra1FpMmZIaFUyMHVnTXpw
39
39
  ODgxRWl4citUakMwUnZVZXJMRzdnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUt
40
40
  LS0tLQo=
41
- date: 2014-02-25 00:00:00.000000000 Z
41
+ date: 2014-03-18 00:00:00.000000000 Z
42
42
  dependencies:
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: activesupport
@@ -272,6 +272,7 @@ files:
272
272
  - lib/active_merchant/billing/gateways/fat_zebra.rb
273
273
  - lib/active_merchant/billing/gateways/federated_canada.rb
274
274
  - lib/active_merchant/billing/gateways/finansbank.rb
275
+ - lib/active_merchant/billing/gateways/first_giving.rb
275
276
  - lib/active_merchant/billing/gateways/first_pay.rb
276
277
  - lib/active_merchant/billing/gateways/firstdata_e4.rb
277
278
  - lib/active_merchant/billing/gateways/garanti.rb
@@ -379,6 +380,7 @@ files:
379
380
  - lib/active_merchant/billing/gateways/viaklix.rb
380
381
  - lib/active_merchant/billing/gateways/vindicia.rb
381
382
  - lib/active_merchant/billing/gateways/webpay.rb
383
+ - lib/active_merchant/billing/gateways/wepay.rb
382
384
  - lib/active_merchant/billing/gateways/wirecard.rb
383
385
  - lib/active_merchant/billing/gateways/worldpay.rb
384
386
  - lib/active_merchant/billing/gateways.rb
@@ -387,9 +389,6 @@ files:
387
389
  - lib/active_merchant/billing/integrations/a1agregator/status.rb
388
390
  - lib/active_merchant/billing/integrations/a1agregator.rb
389
391
  - lib/active_merchant/billing/integrations/action_view_helper.rb
390
- - lib/active_merchant/billing/integrations/alipay/helper.rb
391
- - lib/active_merchant/billing/integrations/alipay/notification.rb
392
- - lib/active_merchant/billing/integrations/alipay.rb
393
392
  - lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb
394
393
  - lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb
395
394
  - lib/active_merchant/billing/integrations/authorize_net_sim.rb
metadata.gz.sig CHANGED
Binary file
@@ -1,18 +0,0 @@
1
- require File.dirname(__FILE__) + '/alipay/helper.rb'
2
- require File.dirname(__FILE__) + '/alipay/notification.rb'
3
-
4
- module ActiveMerchant #:nodoc:
5
- module Billing #:nodoc:
6
- module Integrations #:nodoc:
7
- module Alipay
8
-
9
- mattr_accessor :service_url
10
- self.service_url = 'https://www.example.com'
11
-
12
- def self.notification(post)
13
- Notification.new(post)
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,34 +0,0 @@
1
- module ActiveMerchant #:nodoc:
2
- module Billing #:nodoc:
3
- module Integrations #:nodoc:
4
- module Alipay
5
- class Helper < ActiveMerchant::Billing::Integrations::Helper
6
- # Replace with the real mapping
7
- mapping :account, ''
8
- mapping :amount, ''
9
-
10
- mapping :order, ''
11
-
12
- mapping :customer, :first_name => '',
13
- :last_name => '',
14
- :email => '',
15
- :phone => ''
16
-
17
- mapping :billing_address, :city => '',
18
- :address1 => '',
19
- :address2 => '',
20
- :state => '',
21
- :zip => '',
22
- :country => ''
23
-
24
- mapping :notify_url, ''
25
- mapping :return_url, ''
26
- mapping :cancel_return_url, ''
27
- mapping :description, ''
28
- mapping :tax, ''
29
- mapping :shipping, ''
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,101 +0,0 @@
1
- require 'net/http'
2
-
3
- module ActiveMerchant #:nodoc:
4
- module Billing #:nodoc:
5
- module Integrations #:nodoc:
6
- module Alipay
7
- class Notification < ActiveMerchant::Billing::Integrations::Notification
8
- def complete?
9
- params['']
10
- end
11
-
12
- def item_id
13
- params['']
14
- end
15
-
16
- def transaction_id
17
- params['']
18
- end
19
-
20
- # When was this payment received by the client.
21
- def received_at
22
- params['']
23
- end
24
-
25
- def payer_email
26
- params['']
27
- end
28
-
29
- def receiver_email
30
- params['']
31
- end
32
-
33
- def security_key
34
- params['']
35
- end
36
-
37
- # the money amount we received in X.2 decimal.
38
- def gross
39
- params['']
40
- end
41
-
42
- # Was this a test transaction?
43
- def test?
44
- params[''] == 'test'
45
- end
46
-
47
- def status
48
- params['']
49
- end
50
-
51
- # Acknowledge the transaction to Alipay. This method has to be called after a new
52
- # apc arrives. Alipay will verify that all the information we received are correct and will return a
53
- # ok or a fail.
54
- #
55
- # Example:
56
- #
57
- # def ipn
58
- # notify = AlipayNotification.new(request.raw_post)
59
- #
60
- # if notify.acknowledge
61
- # ... process order ... if notify.complete?
62
- # else
63
- # ... log possible hacking attempt ...
64
- # end
65
- def acknowledge(authcode = nil)
66
- payload = raw
67
-
68
- uri = URI.parse(Alipay.notification_confirmation_url)
69
-
70
- request = Net::HTTP::Post.new(uri.path)
71
-
72
- request['Content-Length'] = "#{payload.size}"
73
- request['User-Agent'] = "Active Merchant -- http://home.leetsoft.com/am"
74
- request['Content-Type'] = "application/x-www-form-urlencoded"
75
-
76
- http = Net::HTTP.new(uri.host, uri.port)
77
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless @ssl_strict
78
- http.use_ssl = true
79
-
80
- response = http.request(request, payload)
81
-
82
- # Replace with the appropriate codes
83
- raise StandardError.new("Faulty Alipay result: #{response.body}") unless ["AUTHORISED", "DECLINED"].include?(response.body)
84
- response.body == "AUTHORISED"
85
- end
86
-
87
- private
88
-
89
- # Take the posted data and move the relevant data into a hash
90
- def parse(post)
91
- @raw = post.to_s
92
- for line in @raw.split('&')
93
- key, value = *line.scan( %r{^([A-Za-z0-9_.-]+)\=(.*)$} ).flatten
94
- params[key] = CGI.unescape(value.to_s) if key.present?
95
- end
96
- end
97
- end
98
- end
99
- end
100
- end
101
- end