shoppe-paypal 1.0.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 +7 -0
- data/README.md +28 -0
- data/Rakefile +1 -0
- data/lib/shoppe/paypal/engine.rb +16 -0
- data/lib/shoppe/paypal/order_extensions.rb +40 -0
- data/lib/shoppe/paypal/payment_extensions.rb +23 -0
- data/lib/shoppe/paypal/version.rb +5 -0
- data/lib/shoppe/paypal.rb +56 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f1813df55015dfeec5bdca0267c32cf77dc9f493
|
4
|
+
data.tar.gz: a0ba3fd1776c4dee76d2e4390fb4222ada3e5450
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b73e4c91731564567a67b33b77b547e9faf40668fb7f31f4eb5524f399d462e6dd4649d8e573de3e62fa610370f744eadeff7ea1b6c68853b6a58af4e179dedd
|
7
|
+
data.tar.gz: b3bc80129b546e5fede96d68814450c4726cbd6c04b0bd5b8221aa5af56609543cd100e12b08fd2bb59fbf47e167564c55dd828581faf4ebe8f39ac655e18cfd
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# PayPal Shoppe Module
|
2
|
+
|
3
|
+
This module helps with including PayPal within your Shoppe application.
|
4
|
+
The information below explains how to get this module installed within your Rails application.
|
5
|
+
|
6
|
+
## Installing
|
7
|
+
|
8
|
+
Add the gem to your Gemfile and run `bundle install`
|
9
|
+
|
10
|
+
`gem "shoppe-paypal"`
|
11
|
+
|
12
|
+
For the latest up to date documentation, please see the [Shoppe tutorial page](http://tryshoppe.com/docs/payment-gateways/paypal).
|
13
|
+
|
14
|
+
## Workflow
|
15
|
+
|
16
|
+
+ Start an order
|
17
|
+
+ Give the user the decision of payment
|
18
|
+
+ Create a PayPal payment
|
19
|
+
+ Redirect the user to PayPal using the previous URL
|
20
|
+
+ User logs in & accepts payment
|
21
|
+
+ Redirected to success URL and payment details are stored with the order
|
22
|
+
+ Complete order
|
23
|
+
+ When the order is accepted in the Shoppe admin, the payment will be executed/captured
|
24
|
+
|
25
|
+
## To Do
|
26
|
+
|
27
|
+
+ Tests!
|
28
|
+
+ When rejecting an order, payment is not refunded
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Shoppe
|
2
|
+
module Paypal
|
3
|
+
class Engine < Rails::Engine
|
4
|
+
|
5
|
+
initializer "shoppe.paypal.initializer" do
|
6
|
+
Shoppe::Paypal.setup
|
7
|
+
end
|
8
|
+
|
9
|
+
config.to_prepare do
|
10
|
+
Shoppe::Order.send :include, Shoppe::Paypal::OrderExtensions
|
11
|
+
Shoppe::Payment.send :include, Shoppe::Paypal::PaymentExtensions
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Shoppe
|
2
|
+
module Paypal
|
3
|
+
module OrderExtensions
|
4
|
+
|
5
|
+
# Create a PayPal payment and respond with the approval URL
|
6
|
+
# Requires return_url and cancel_url parameters
|
7
|
+
def redirect_to_paypal(return_url, cancel_url)
|
8
|
+
@payment = PayPal::SDK::REST::Payment.new({
|
9
|
+
:intent => "sale",
|
10
|
+
:payer => {
|
11
|
+
:payment_method => "paypal" },
|
12
|
+
:redirect_urls => {
|
13
|
+
:return_url => return_url,
|
14
|
+
:cancel_url => cancel_url },
|
15
|
+
:transactions => [ {
|
16
|
+
:amount => {
|
17
|
+
:total => '%.2f' % self.total,
|
18
|
+
:currency => Shoppe::Paypal.currency },
|
19
|
+
:description => "Order #{self.number}" } ] } )
|
20
|
+
|
21
|
+
if @payment.create
|
22
|
+
@payment.links.find{|v| v.method == "REDIRECT" }.href
|
23
|
+
elsif @payment.error
|
24
|
+
raise Shoppe::Errors::PaymentDeclined, "There was an error contacting the payment processor"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Accept a PayPal payment after redirected back to the Rails app
|
29
|
+
def accept_paypal_payment(payment_id, token, payer_id)
|
30
|
+
self.payments.create(amount: self.total, method: "PayPal", reference: payment_id, refundable: true, confirmed: false)
|
31
|
+
|
32
|
+
self.properties["paypal_payment_id"] = payment_id
|
33
|
+
self.properties["paypal_payment_token"] = token
|
34
|
+
self.properties["paypal_payer_id"] = payer_id
|
35
|
+
self.save
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Shoppe
|
2
|
+
module Paypal
|
3
|
+
module PaymentExtensions
|
4
|
+
|
5
|
+
# Get the PayPal payment information from the API
|
6
|
+
def paypal_payment
|
7
|
+
return false unless self.method == "PayPal"
|
8
|
+
|
9
|
+
@paypal_payment ||= PayPal::SDK::REST::Payment.find(self.reference)
|
10
|
+
end
|
11
|
+
|
12
|
+
# The PayPal transaction URL
|
13
|
+
def transaction_url
|
14
|
+
if Rails.env.production?
|
15
|
+
"https://history.paypal.com/uk/cgi-bin/webscr?cmd=_history-details-from-hub&id=#{reference}"
|
16
|
+
else
|
17
|
+
"https://www.sandbox.paypal.com/uk/cgi-bin/webscr?cmd=_history-details-from-hub&id=#{reference}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'shoppe/paypal/version'
|
2
|
+
require 'shoppe/paypal/engine'
|
3
|
+
|
4
|
+
require 'shoppe/paypal/order_extensions'
|
5
|
+
require 'shoppe/paypal/payment_extensions'
|
6
|
+
|
7
|
+
module Shoppe
|
8
|
+
module Paypal
|
9
|
+
|
10
|
+
class << self
|
11
|
+
|
12
|
+
def client_id
|
13
|
+
Shoppe.settings.paypal_client_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def client_secret
|
17
|
+
Shoppe.settings.paypal_secret_id
|
18
|
+
end
|
19
|
+
|
20
|
+
def currency
|
21
|
+
Shoppe.settings.paypal_currency
|
22
|
+
end
|
23
|
+
|
24
|
+
def setup
|
25
|
+
# Set the configuration
|
26
|
+
Shoppe.add_settings_group :paypal, [:paypal_client_id, :paypal_secret_id, :currency]
|
27
|
+
|
28
|
+
# Require the PayPal library
|
29
|
+
require 'paypal-sdk-rest'
|
30
|
+
|
31
|
+
include PayPal::SDK::REST
|
32
|
+
|
33
|
+
# Configure the PayPal library
|
34
|
+
PayPal::SDK.configure({
|
35
|
+
mode: (Rails.env.production? ? "live" : "sandbox"),
|
36
|
+
client_id: Shoppe.settings.paypal_client_id,
|
37
|
+
client_secret: Shoppe.settings.paypal_secret_id
|
38
|
+
})
|
39
|
+
|
40
|
+
# When an order is accepted, attempt to capture/execute the payment
|
41
|
+
Shoppe::Order.before_acceptance do
|
42
|
+
self.payments.where(confirmed: false, method: "PayPal").each do |payment|
|
43
|
+
begin
|
44
|
+
payment.paypal_payment.execute(payer_id: payment.order.properties["paypal_payer_id"])
|
45
|
+
payment.update_attribute(:confirmed, true)
|
46
|
+
rescue
|
47
|
+
raise Shoppe::Errors::PaymentDeclined, "Payment ##{payment.id} could not be captured by PayPal. Investigate with PayPal. Do not accept the order."
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: shoppe-paypal
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dean Perry
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: shoppe
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: paypal-sdk-rest
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
description: A Shoppe module to assist with the integration of PayPal.
|
48
|
+
email:
|
49
|
+
- dean@voupe.com
|
50
|
+
executables: []
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- README.md
|
55
|
+
- Rakefile
|
56
|
+
- lib/shoppe/paypal.rb
|
57
|
+
- lib/shoppe/paypal/engine.rb
|
58
|
+
- lib/shoppe/paypal/order_extensions.rb
|
59
|
+
- lib/shoppe/paypal/payment_extensions.rb
|
60
|
+
- lib/shoppe/paypal/version.rb
|
61
|
+
homepage: http://voupe.com
|
62
|
+
licenses: []
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 2.2.2
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: A PayPal payment module for Shoppe.
|
84
|
+
test_files: []
|
85
|
+
has_rdoc:
|