spree_paypal_api_checkout 0.0.7 → 0.1.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53c335900fbbe782e6fc7cfa78b36f258b514a9d9b9400cef65f7fb8c7cf69c7
|
4
|
+
data.tar.gz: 946f4fa867ded14d6c7f494df8d8e21377721b682df09fe7cffd312540268540
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d1754cdff574bb9bbe6b798663c02686228ec3a0e7fe30281b87dea2264245d2f296e849ad44145282305766678b5956834a8a44f0ed17c38e6a644abeb0719
|
7
|
+
data.tar.gz: aef76e65dae6694919ddc17f3c290de2a49be957ac913a9a0ba4863bfe0f1a576d7a10c7e7fcce1a658e087c1b48786514f21c329354094024a124b961986801
|
data/README.md
CHANGED
@@ -8,25 +8,26 @@ module Spree
|
|
8
8
|
additional_adjustments = order.all_adjustments.additional
|
9
9
|
tax_adjustments = additional_adjustments.tax
|
10
10
|
shipping_adjustments = additional_adjustments.shipping
|
11
|
+
promotion_adjustments = additional_adjustments.promotion
|
11
12
|
|
12
13
|
additional_adjustments.eligible.each do |adjustment|
|
13
14
|
# Because PayPal doesn't accept $0 items at all. See #10
|
14
15
|
# https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ECCustomizing
|
15
16
|
# "It can be a positive or negative value but not zero."
|
16
17
|
next if adjustment.amount.zero?
|
17
|
-
next if tax_adjustments.include?(adjustment) || shipping_adjustments.include?(adjustment)
|
18
|
+
next if tax_adjustments.include?(adjustment) || shipping_adjustments.include?(adjustment) || promotion_adjustments.include?(adjustment)
|
18
19
|
|
19
20
|
items << {
|
20
21
|
name: adjustment.label,
|
21
22
|
quantity: 1,
|
22
|
-
|
23
|
+
unit_amount: {
|
23
24
|
currency_code: order.currency,
|
24
25
|
value: adjustment.amount
|
25
26
|
}
|
26
27
|
}
|
27
28
|
end
|
28
29
|
|
29
|
-
pp_response = provider.create_order(order, express_checkout_request_details(order, items))
|
30
|
+
pp_response = provider.create_order(order, express_checkout_request_details(order: order, items: items, tax_adjustments: tax_adjustments, promotion_adjustments: promotion_adjustments))
|
30
31
|
|
31
32
|
render json: pp_response
|
32
33
|
end
|
@@ -48,15 +49,16 @@ module Spree
|
|
48
49
|
def proceed
|
49
50
|
order = current_order || raise(ActiveRecord::RecordNotFound)
|
50
51
|
order.payments.last.source.update(transaction_id: params[:transaction_id])
|
52
|
+
order.payments.last.update(response_code: params[:transaction_id])
|
51
53
|
order.next
|
54
|
+
path = checkout_state_path(order.state)
|
52
55
|
if order.complete?
|
53
56
|
flash.notice = Spree.t(:order_processed_successfully)
|
54
57
|
flash[:order_completed] = true
|
55
58
|
session[:order_id] = nil
|
56
|
-
|
57
|
-
else
|
58
|
-
redirect_to checkout_state_path(order.state)
|
59
|
+
path = completion_route(order)
|
59
60
|
end
|
61
|
+
render json: { redirect_to: path }
|
60
62
|
end
|
61
63
|
|
62
64
|
def cancel
|
@@ -70,31 +72,68 @@ module Spree
|
|
70
72
|
def line_item(item)
|
71
73
|
{
|
72
74
|
name: item.product.name,
|
73
|
-
|
75
|
+
sku: item.variant.sku,
|
74
76
|
quantity: item.quantity,
|
75
|
-
|
77
|
+
description: item.product.meta_description,
|
78
|
+
unit_amount: {
|
76
79
|
currency_code: item.order.currency,
|
77
80
|
value: item.price
|
78
81
|
},
|
79
|
-
|
82
|
+
item_category: "Physical"
|
80
83
|
}
|
81
84
|
end
|
82
85
|
|
83
|
-
def express_checkout_request_details order
|
86
|
+
def express_checkout_request_details order:, items:, tax_adjustments:, promotion_adjustments:
|
84
87
|
{
|
85
88
|
intent: 'CAPTURE',
|
86
89
|
purchase_units: [
|
87
90
|
{
|
88
91
|
amount: {
|
89
92
|
currency_code: current_order.currency,
|
90
|
-
value: order.total
|
93
|
+
value: order.total,
|
94
|
+
breakdown: {
|
95
|
+
item_total: {
|
96
|
+
currency_code: current_order.currency,
|
97
|
+
value: items.sum{|r| (r[:unit_amount][:value] * r[:quantity]) }
|
98
|
+
},
|
99
|
+
shipping: {
|
100
|
+
currency_code: current_order.currency,
|
101
|
+
value: current_order.shipments.sum(:cost)
|
102
|
+
},
|
103
|
+
tax_total: {
|
104
|
+
currency_code: current_order.currency,
|
105
|
+
value: tax_adjustments.sum(:amount)
|
106
|
+
},
|
107
|
+
discount: {
|
108
|
+
currency_code: current_order.currency,
|
109
|
+
value: promotion_adjustments.sum(:amount).abs
|
110
|
+
}
|
111
|
+
}
|
91
112
|
},
|
92
|
-
|
113
|
+
items: items,
|
114
|
+
shipping: address_options
|
93
115
|
},
|
94
116
|
]
|
95
117
|
}
|
96
118
|
end
|
97
119
|
|
120
|
+
def address_options
|
121
|
+
address = current_order.ship_address
|
122
|
+
{
|
123
|
+
name: { full_name: address.try(:full_name) },
|
124
|
+
address: {
|
125
|
+
address_line_1: address.address1,
|
126
|
+
address_line_2: address.address2,
|
127
|
+
# phone: address.phone,
|
128
|
+
admin_area_1: address.state_text,
|
129
|
+
admin_area_2: address.city,
|
130
|
+
country_code: address.country.iso,
|
131
|
+
postal_code: address.zipcode
|
132
|
+
},
|
133
|
+
type: 'SHIPPING'
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
98
137
|
def payment_method
|
99
138
|
Spree::PaymentMethod.find(params[:payment_method_id])
|
100
139
|
end
|
@@ -20,28 +20,14 @@ module Spree
|
|
20
20
|
'paypal_checkout'
|
21
21
|
end
|
22
22
|
|
23
|
-
def generate_client_token
|
24
|
-
uri = URI.parse("https://#{preferred_server}/v1/identity/generate-token")
|
25
|
-
request = Net::HTTP::Post.new(uri)
|
26
|
-
request['Authorization'] = "Bearer #{generate_access_token}"
|
27
|
-
request.content_type = "application/json"
|
28
|
-
|
29
|
-
req_options = { use_ssl: uri.scheme == "https" }
|
30
|
-
|
31
|
-
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
32
|
-
response = http.request(request)
|
33
|
-
end
|
34
|
-
return response
|
35
|
-
end
|
36
|
-
|
37
23
|
def generate_access_token
|
38
24
|
uri = URI.parse("https://#{preferred_server}/v1/oauth2/token")
|
39
25
|
request = Net::HTTP::Post.new(uri)
|
40
26
|
request.basic_auth("#{preferred_api_key}", "#{preferred_secret_key}")
|
41
|
-
request.content_type =
|
42
|
-
request.body =
|
27
|
+
request.content_type = 'application/json'
|
28
|
+
request.body = 'grant_type=client_credentials'
|
43
29
|
|
44
|
-
req_options = { use_ssl: uri.scheme ==
|
30
|
+
req_options = { use_ssl: uri.scheme == 'https' }
|
45
31
|
|
46
32
|
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
47
33
|
response = http.request(request)
|
@@ -49,46 +35,24 @@ module Spree
|
|
49
35
|
return JSON.parse(response.read_body)['access_token']
|
50
36
|
end
|
51
37
|
|
38
|
+
def generate_client_token
|
39
|
+
uri = URI.parse("https://#{preferred_server}/v1/identity/generate-token")
|
40
|
+
return post_response(uri)
|
41
|
+
end
|
42
|
+
|
52
43
|
def create_order order, body
|
53
44
|
uri = URI.parse("https://#{preferred_server}/v2/checkout/orders")
|
54
|
-
|
55
|
-
request['Authorization'] = "Bearer #{generate_access_token}"
|
56
|
-
request.content_type = "application/json"
|
57
|
-
|
58
|
-
request.body = body.to_json
|
59
|
-
req_options = { use_ssl: uri.scheme == "https" }
|
60
|
-
|
61
|
-
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
62
|
-
response = http.request(request)
|
63
|
-
end
|
64
|
-
return JSON.parse(response.read_body)
|
45
|
+
return post_response(uri, body)
|
65
46
|
end
|
66
47
|
|
67
48
|
def capture_payment order_id
|
68
49
|
uri = URI.parse("https://#{preferred_server}/v2/checkout/orders/#{order_id}/capture")
|
69
|
-
|
70
|
-
request['Authorization'] = "Bearer #{generate_access_token}"
|
71
|
-
request.content_type = "application/json"
|
72
|
-
req_options = { use_ssl: uri.scheme == "https" }
|
73
|
-
|
74
|
-
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
75
|
-
response = http.request(request)
|
76
|
-
end
|
77
|
-
return JSON.parse(response.read_body)
|
50
|
+
return post_response(uri)
|
78
51
|
end
|
79
52
|
|
80
53
|
def refund_payment id, body
|
81
54
|
uri = URI.parse("https://#{preferred_server}/v2/payments/captures/#{id}/refund")
|
82
|
-
|
83
|
-
request['Authorization'] = "Bearer #{generate_access_token}"
|
84
|
-
request.body = body.to_json
|
85
|
-
request.content_type = "application/json"
|
86
|
-
req_options = { use_ssl: uri.scheme == "https" }
|
87
|
-
|
88
|
-
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
89
|
-
response = http.request(request)
|
90
|
-
end
|
91
|
-
return JSON.parse(response.read_body)
|
55
|
+
return post_response(uri, body)
|
92
56
|
end
|
93
57
|
|
94
58
|
def purchase(amount, express_checkout, gateway_options={})
|
@@ -134,6 +98,19 @@ module Spree
|
|
134
98
|
end
|
135
99
|
refund_transaction_response
|
136
100
|
end
|
101
|
+
|
102
|
+
def post_response uri, body={}
|
103
|
+
request = Net::HTTP::Post.new(uri)
|
104
|
+
request['Authorization'] = "Bearer #{generate_access_token}"
|
105
|
+
request.content_type = 'application/json'
|
106
|
+
req_options = { use_ssl: uri.scheme == 'https' }
|
107
|
+
|
108
|
+
request.body = body.to_json if body.present?
|
109
|
+
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
110
|
+
response = http.request(request)
|
111
|
+
end
|
112
|
+
return JSON.parse(response.read_body)
|
113
|
+
end
|
137
114
|
end
|
138
115
|
end
|
139
116
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "spree_paypal_api_checkout".freeze
|
3
|
-
s.version = "0.0
|
3
|
+
s.version = "0.1.0"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
6
6
|
s.require_paths = ["lib".freeze]
|