piggybak_braintree 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/app/assets/javascript/payments.js.erb +3 -0
- data/app/models/piggybak_braintree/payment_calculator/braintree.rb +39 -0
- data/app/views/piggybak/orders/_payment.html.erb +28 -0
- data/config/routes.rb +2 -0
- data/lib/piggybak_braintree.rb +5 -0
- data/lib/piggybak_braintree/engine.rb +26 -0
- data/lib/piggybak_braintree/payment_decorator.rb +40 -0
- data/lib/piggybak_braintree/piggybak_orders_controller_decorator.rb +76 -0
- data/lib/piggybak_braintree/version.rb +3 -0
- metadata +68 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: adaccf828d79ec9668ed86acf84ab9c9d5a01be6
|
4
|
+
data.tar.gz: 3406f37f4f1461adeb7d288e0013b451a4854805
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 817f53fd86e5797ff757e68408777d3b070d235f6db419ee84d42c1821ab4d04b2111408640cd9e826d2107e4f330f5a8a67cd6779c59e1d134e80c6b5da0fbb
|
7
|
+
data.tar.gz: 762ed963fdc4113515fb19a740c08711444bf1ccc9b032b382386d4bcefe6a7acc359e597ed255f75c85217e1042ba59ce48291f35d37ba7be775a934571fb3f
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# PiggybakBraintree
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'piggybak_braintree'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install piggybak_braintree
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
1. Fork it ( https://github.com/[my-github-username]/piggybak_braintree/fork )
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
31
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module PiggybakBraintree
|
2
|
+
class PaymentCalculator::Braintree
|
3
|
+
KEYS = ['private_key', 'public_key', 'merchant_id']
|
4
|
+
KLASS = ::Braintree
|
5
|
+
|
6
|
+
def initialize(payment_method)
|
7
|
+
@payment_method = payment_method
|
8
|
+
end
|
9
|
+
|
10
|
+
def configure
|
11
|
+
Braintree::Configuration.environment = gateway_mode
|
12
|
+
Braintree::Configuration.merchant_id = merchant_id
|
13
|
+
Braintree::Configuration.public_key = public_key
|
14
|
+
Braintree::Configuration.private_key = private_key
|
15
|
+
end
|
16
|
+
|
17
|
+
def client_token
|
18
|
+
Braintree::ClientToken.generate
|
19
|
+
end
|
20
|
+
|
21
|
+
def gateway_mode
|
22
|
+
Piggybak.config.activemerchant_mode
|
23
|
+
end
|
24
|
+
|
25
|
+
def private_key
|
26
|
+
@payment_method.key_values["private_key".to_sym]
|
27
|
+
end
|
28
|
+
|
29
|
+
def public_key
|
30
|
+
@payment_method.key_values["public_key".to_sym]
|
31
|
+
end
|
32
|
+
|
33
|
+
def merchant_id
|
34
|
+
@payment_method.key_values["merchant_id".to_sym]
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<script src="https://js.braintreegateway.com/v2/braintree.js"></script>
|
2
|
+
<h1>Braintree transaction</h1>
|
3
|
+
<%= f.fields_for :line_items, @order.line_items.detect { |li| li.line_item_type == "payment" } do |line_item_f| %>
|
4
|
+
<%= line_item_f.hidden_field :line_item_type, { :value => "payment" } %>
|
5
|
+
<%= line_item_f.fields_for :payment do |payment| %>
|
6
|
+
<div class="item">
|
7
|
+
<%= payment.label :number %>
|
8
|
+
<%= tag :input, {:type => :text, :class => "card-number required", :id => 'myid', data: {'braintree-name' => 'number'}, :name => 'payment_number'}%>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="item">
|
12
|
+
<%= payment.label :verification_value %>
|
13
|
+
<%= tag :input, {:type => :text, :class => "card-cvc required", data: {'braintree-name' => 'cvv'}, :name => 'cvv'}%>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="item">
|
17
|
+
<%= payment.label :month %>
|
18
|
+
<%= content_tag :select, options_for_select(1.upto(12).to_a), {:class=> 'card-expiry-month', data: {'braintree-name' => 'expiration_month'}}%> /
|
19
|
+
<%= content_tag :select, options_for_select(Time.now.year.upto(Time.now.year + 10).to_a), {:class=> 'card-expiry-year', data: {'braintree-name' => 'expiration_year'}}%>
|
20
|
+
</div>
|
21
|
+
<% end -%>
|
22
|
+
<% end -%>
|
23
|
+
|
24
|
+
<script type="text/javascript" charset="utf-8">
|
25
|
+
$(document).ready(function() {
|
26
|
+
braintree_setup();
|
27
|
+
});
|
28
|
+
</script>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'piggybak_braintree/payment_decorator'
|
2
|
+
|
3
|
+
module PiggybakBraintree
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
isolate_namespace PiggybakBraintree
|
6
|
+
require 'braintree'
|
7
|
+
|
8
|
+
config.to_prepare do
|
9
|
+
Piggybak::Payment.send(:include, ::PiggybakBraintree::PaymentDecorator)
|
10
|
+
Piggybak::OrdersController.send(:include, ::PiggybakBraintree::PiggybakOrdersControllerDecorator)
|
11
|
+
end
|
12
|
+
|
13
|
+
initializer "piggybak_realtime_shipping.add_calculators" do
|
14
|
+
Piggybak.config do |config|
|
15
|
+
#Ensures that stripe is the only calculator because Piggybak
|
16
|
+
#only supports one active calculator
|
17
|
+
config.payment_calculators = ["::PiggybakBraintree::PaymentCalculator::Braintree"]
|
18
|
+
# Override the default country
|
19
|
+
config.default_country = "LV"
|
20
|
+
# Override the activemerchant billing mode
|
21
|
+
config.activemerchant_mode = :sandbox
|
22
|
+
config.additional_line_item_attributes = [:payment_method_nonce]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module PiggybakBraintree
|
2
|
+
module PaymentDecorator
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attr_accessor :payment_method_nonce
|
7
|
+
attr_accessible :payment_method_nonce
|
8
|
+
|
9
|
+
validates_presence_of :payment_method_nonce, :on => :create
|
10
|
+
|
11
|
+
[:month, :year, :payment_method_id].each do |field|
|
12
|
+
_validators.reject!{ |key, _| key == field }
|
13
|
+
|
14
|
+
_validate_callbacks.reject! do |callback|
|
15
|
+
callback.raw_filter.attributes == [field]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def credit_card
|
20
|
+
self.payment_method_nonce
|
21
|
+
end
|
22
|
+
|
23
|
+
def process(order)
|
24
|
+
return true if !self.new_record?
|
25
|
+
|
26
|
+
calculator = ::PiggybakBraintree::PaymentCalculator::Braintree.new(self.payment_method)
|
27
|
+
Braintree::Configuration.environment = calculator.gateway_mode
|
28
|
+
Braintree::Configuration.merchant_id = calculator.merchant_id
|
29
|
+
Braintree::Configuration.public_key = calculator.public_key
|
30
|
+
Braintree::Configuration.private_key = calculator.private_key
|
31
|
+
|
32
|
+
raise
|
33
|
+
result = Braintree::Transaction.sale(
|
34
|
+
:amount => (order.total_due * 100).to_i,
|
35
|
+
:payment_method_nonce => self.credit_card
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module PiggybakBraintree
|
2
|
+
module PiggybakOrdersControllerDecorator
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
def submit
|
7
|
+
response.headers['Cache-Control'] = 'no-cache'
|
8
|
+
@cart = Piggybak::Cart.new(request.cookies["cart"])
|
9
|
+
|
10
|
+
if request.post?
|
11
|
+
logger = Logger.new("#{Rails.root}/#{Piggybak.config.logging_file}")
|
12
|
+
|
13
|
+
begin
|
14
|
+
ActiveRecord::Base.transaction do
|
15
|
+
@order = Piggybak::Order.new(orders_params)
|
16
|
+
@order.create_payment_shipment
|
17
|
+
|
18
|
+
if Piggybak.config.logging
|
19
|
+
clean_params = params[:order].clone
|
20
|
+
clean_params[:line_items_attributes].each do |k, li_attr|
|
21
|
+
if li_attr[:line_item_type] == "payment" && li_attr.has_key?(:payment_attributes)
|
22
|
+
if li_attr[:payment_attributes].has_key?(:number)
|
23
|
+
li_attr[:payment_attributes][:number] = li_attr[:payment_attributes][:number].mask_cc_number
|
24
|
+
end
|
25
|
+
if li_attr[:payment_attributes].has_key?(:verification_value)
|
26
|
+
li_attr[:payment_attributes][:verification_value] = li_attr[:payment_attributes][:verification_value].mask_csv
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order received with params #{clean_params.inspect}"
|
31
|
+
end
|
32
|
+
@order.initialize_user(current_user)
|
33
|
+
|
34
|
+
@order.ip_address = request.remote_ip
|
35
|
+
@order.user_agent = request.user_agent
|
36
|
+
@order.add_line_items(@cart)
|
37
|
+
|
38
|
+
if Piggybak.config.logging
|
39
|
+
logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order contains: #{cookies["cart"]} for user #{current_user ? current_user.email : 'guest'}"
|
40
|
+
end
|
41
|
+
|
42
|
+
if @order.save
|
43
|
+
if Piggybak.config.logging
|
44
|
+
logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order saved: #{@order.inspect}"
|
45
|
+
end
|
46
|
+
|
47
|
+
cookies["cart"] = { :value => '', :path => '/' }
|
48
|
+
session[:last_order] = @order.id
|
49
|
+
redirect_to piggybak.receipt_url
|
50
|
+
else
|
51
|
+
if Piggybak.config.logging
|
52
|
+
logger.warn "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order failed to save #{@order.errors.full_messages} with #{@order.inspect}."
|
53
|
+
end
|
54
|
+
raise Exception, @order.errors.full_messages
|
55
|
+
end
|
56
|
+
end
|
57
|
+
rescue Exception => e
|
58
|
+
if Piggybak.config.logging
|
59
|
+
logger.warn "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order exception: #{e.inspect}"
|
60
|
+
end
|
61
|
+
if @order.errors.empty?
|
62
|
+
@order.errors[:base] << "Your order could not go through. Please try again."
|
63
|
+
end
|
64
|
+
end
|
65
|
+
else
|
66
|
+
@order = Piggybak::Order.new
|
67
|
+
@order.create_payment_shipment
|
68
|
+
@order.initialize_user(current_user)
|
69
|
+
payment_method = ::PiggybakBraintree::PaymentCalculator::Braintree.new(@order.payment_method)
|
70
|
+
payment_method.configure
|
71
|
+
@client_token = payment_method.client_token
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: piggybak_braintree
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Toms Strubergs
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: breaintree
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.55.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.55.0
|
27
|
+
description: Integration of Braintree payment gateway for use with Piggybak
|
28
|
+
email:
|
29
|
+
- toms.strubergs@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- README.md
|
35
|
+
- Rakefile
|
36
|
+
- app/assets/javascript/payments.js.erb
|
37
|
+
- app/models/piggybak_braintree/payment_calculator/braintree.rb
|
38
|
+
- app/views/piggybak/orders/_payment.html.erb
|
39
|
+
- config/routes.rb
|
40
|
+
- lib/piggybak_braintree.rb
|
41
|
+
- lib/piggybak_braintree/engine.rb
|
42
|
+
- lib/piggybak_braintree/payment_decorator.rb
|
43
|
+
- lib/piggybak_braintree/piggybak_orders_controller_decorator.rb
|
44
|
+
- lib/piggybak_braintree/version.rb
|
45
|
+
homepage: https://github.com/cardiner/piggybak_braintree
|
46
|
+
licenses: []
|
47
|
+
metadata: {}
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 2.4.3
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Piggybak Braintree
|
68
|
+
test_files: []
|