payfast 1.0.0 → 1.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 +4 -4
- data/lib/generators.rb +56 -0
- data/lib/onsite_payments.rb +64 -0
- data/lib/templates/config.yml +20 -0
- data/lib/templates/controller.rb +47 -0
- data/lib/templates/helper.rb +6 -0
- data/lib/templates/index.html.erb +11 -0
- data/lib/templates/make_payment.html.erb +15 -0
- data/lib/templates/migration.rb +12 -0
- data/lib/templates/model.rb +2 -0
- data/lib/templates/routes.rb +7 -0
- metadata +41 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d93902540cd8d2052c2c21f4c1ad469be1cbb9532f3c6ba20bcaa4d84047b28
|
4
|
+
data.tar.gz: beef56fd565707a474944374d320bac4a369a10e68c4ac35c4d462e58cd38186
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be4c605758122af4e5fdb7e768852e0c76f02b6ee97e4bdf95eb8fe1a8dec2dabe4aae87e72c28e9e49a6f4a0a380a501d917666cccd09dd6845ad1a3c75ee9d
|
7
|
+
data.tar.gz: 5540c7288967670d4e87f87f32de82519b1ff127ec3e43c37c960ddc2bace989c9f8e25d28ee35d3160bee62aea10d7d84be6f4c911e6bf2e8c70a13e998132c
|
data/lib/generators.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module Payfast
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
7
|
+
|
8
|
+
def modify_routes
|
9
|
+
insert_into_file "config/routes.rb", after: "Rails.application.routes.draw do\n" do
|
10
|
+
# Read and insert the contents of your routes template file
|
11
|
+
File.read(File.join(__dir__, "templates", "routes.rb"))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_controller
|
16
|
+
template "controller.rb", File.join("app/controllers", "#{controller_file_name}_controller.rb")
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_views
|
20
|
+
actions.each do |action|
|
21
|
+
template "#{action}.html.erb", File.join("app/views", controller_file_name, "#{action}.html.erb")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_view_helper
|
26
|
+
template "helper.rb", "app/helpers/carts_helper.rb"
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_migration
|
30
|
+
template "migration.rb", "db/migrate/#{timestamp}_create_carts.rb"
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_config_file
|
34
|
+
template "config.yml", "config/payfast.yml"
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_model
|
38
|
+
template "model.rb", "app/models/cart.rb"
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def controller_file_name
|
44
|
+
"carts"
|
45
|
+
end
|
46
|
+
|
47
|
+
def timestamp
|
48
|
+
Time.now.strftime("%Y%m%d%H%M%S")
|
49
|
+
end
|
50
|
+
|
51
|
+
def actions
|
52
|
+
%w(index make_payment)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "uri"
|
3
|
+
|
4
|
+
module Payfast
|
5
|
+
class OnsitePayments
|
6
|
+
def self.generate_signature(payload)
|
7
|
+
passphrase = Rails.application.config_for(:payfast).passphrase
|
8
|
+
|
9
|
+
if passphrase
|
10
|
+
payload[:passphrase] = passphrase
|
11
|
+
end
|
12
|
+
|
13
|
+
url_encoded = data_to_string(payload)
|
14
|
+
create_hash(url_encoded, "md5")
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.requestPayment(payload)
|
18
|
+
payload_with_config = {
|
19
|
+
merchant_id: Rails.application.config_for(:payfast).merchant_id,
|
20
|
+
merchant_key: Rails.application.config_for(:payfast).merchant_key,
|
21
|
+
return_url: Rails.application.config_for(:payfast).return_url,
|
22
|
+
cancel_url: Rails.application.config_for(:payfast).cancel_url,
|
23
|
+
notify_url: Rails.application.config_for(:payfast).notify_url,
|
24
|
+
}.merge(payload)
|
25
|
+
|
26
|
+
puts payload_with_config
|
27
|
+
|
28
|
+
signature = generate_signature(payload_with_config)
|
29
|
+
payload_with_config[:signature] = signature
|
30
|
+
|
31
|
+
pf_param_string = data_to_string(payload_with_config)
|
32
|
+
base_url = Rails.application.config_for(:payfast).base_url
|
33
|
+
|
34
|
+
puts pf_param_string
|
35
|
+
|
36
|
+
uri = URI.parse(base_url)
|
37
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
38
|
+
http.use_ssl = true if uri.scheme == "https"
|
39
|
+
|
40
|
+
request = Net::HTTP::Post.new(uri.path)
|
41
|
+
request.body = pf_param_string
|
42
|
+
|
43
|
+
begin
|
44
|
+
response = http.request(request)
|
45
|
+
JSON.parse(response.body)
|
46
|
+
rescue StandardError => e
|
47
|
+
puts "Error: #{e.message}"
|
48
|
+
return false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def self.data_to_string(payload)
|
55
|
+
URI.encode_www_form(payload)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.create_hash(data, algorithm)
|
59
|
+
digest = Digest.const_get(algorithm.upcase).new
|
60
|
+
digest.update(data)
|
61
|
+
digest.hexdigest
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
development:
|
2
|
+
merchant_id: <%#= Rails.application.credentials.payfast.merchant_id %>
|
3
|
+
merchant_key: <%#= Rails.application.credentials.payfast.merchant_key %>
|
4
|
+
passphrase: <%#= Rails.application.credentials.payfast.passphrase %>
|
5
|
+
base_url: https://sandbox.payfast.co.za/onsite/process
|
6
|
+
# Replace with your own urls
|
7
|
+
return_url: https://1c8e-102-69-134-39.ngrok-free.app/carts/return_url
|
8
|
+
cancel_url: https://1c8e-102-69-134-39.ngrok-free.app/carts/cancel
|
9
|
+
notify_url: https://1c8e-102-69-134-39.ngrok-free.app/carts/notify
|
10
|
+
js_bundle: https://sandbox.payfast.co.za/onsite/engine.js
|
11
|
+
production:
|
12
|
+
merchant_id: <%#= Rails.application.credentials.payfast_merchant_id %>
|
13
|
+
merchant_key: <%#= Rails.application.credentials.payfast_merchant_key %>
|
14
|
+
passphrase: <%#= Rails.application.credentials.passphrase %>
|
15
|
+
base_url: https://www.payfast.co.za/onsite/process
|
16
|
+
# Replace with your own urls
|
17
|
+
return_url: https://1c8e-102-69-134-39.ngrok-free.app/carts/return_url
|
18
|
+
cancel_url: https://1c8e-102-69-134-39.ngrok-free.app/carts/cancel
|
19
|
+
notify_url: https://1c8e-102-69-134-39.ngrok-free.app/carts/notify
|
20
|
+
js_bundle: https://www.payfast.co.za/onsite/engine.js
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class CartsController < ApplicationController
|
2
|
+
def index
|
3
|
+
end
|
4
|
+
|
5
|
+
def new
|
6
|
+
@cart = Cart.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
payload = {
|
11
|
+
email_address: cart_params[:email_address],
|
12
|
+
amount: cart_params[:amount],
|
13
|
+
item_name: cart_params[:item_name],
|
14
|
+
}
|
15
|
+
|
16
|
+
payment_identifier = Payfast::OnsitePayments.requestPayment(payload)
|
17
|
+
|
18
|
+
@cart = Cart.new(cart_params)
|
19
|
+
@cart.payment_uuid = payment_identifier["uuid"]
|
20
|
+
|
21
|
+
if @cart.save
|
22
|
+
redirect_to make_payment_cart_path(@cart)
|
23
|
+
else
|
24
|
+
render :new, status: :unprocessable_entity
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def make_payment
|
29
|
+
@cart = Cart.find(params[:id])
|
30
|
+
end
|
31
|
+
|
32
|
+
def success
|
33
|
+
@cart = Cart.find(params[:id])
|
34
|
+
@cart.is_paid = true
|
35
|
+
redirect_to root_path, notice: "Transcation Successful"
|
36
|
+
end
|
37
|
+
|
38
|
+
def failure
|
39
|
+
redirect_to root_path, notice: "Transcation Canceled"
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def cart_params
|
45
|
+
params.require(:cart).permit(:item_name, :amount, :email_address)
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<form action="/carts" method="POST">
|
2
|
+
<!-- uncomment this and surround this erb tags -->
|
3
|
+
<!-- hidden_field_tag :authenticity_token, form_authenticity_token -->
|
4
|
+
<input type="hidden" name="authenticity_token" >
|
5
|
+
<input type="hidden" name="cart[amount]" value="500">
|
6
|
+
<input type="hidden" name="cart[email_address]" value="test@test.com">
|
7
|
+
<input type="hidden" name="cart[item_name]" value="test item">
|
8
|
+
|
9
|
+
<p>Item R500 </p>
|
10
|
+
<input type="submit" name="commit" value="Pay" data-disable-with="Pay">
|
11
|
+
</form>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
<script>
|
3
|
+
// set the uuid to uuid = @cart.payment_uuid. surround @carts.payment_uuid with erb tags
|
4
|
+
const uuid = ``
|
5
|
+
window.payfast_do_onsite_payment({uuid}, function (result) {
|
6
|
+
if (result === true) {
|
7
|
+
// redirect success_cart_path(@cart)
|
8
|
+
window.location.href = ``
|
9
|
+
}
|
10
|
+
else {
|
11
|
+
// Redirect to failure_cart_path(@cart)
|
12
|
+
window.location.href = ``
|
13
|
+
}
|
14
|
+
});
|
15
|
+
</script>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: payfast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dellan Muchengapadare
|
@@ -11,25 +11,47 @@ cert_chain: []
|
|
11
11
|
date: 2023-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
21
25
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 11.2.2
|
23
34
|
type: :development
|
24
35
|
prerelease: false
|
25
36
|
version_requirements: !ruby/object:Gem::Requirement
|
26
37
|
requirements:
|
27
38
|
- - "~>"
|
28
39
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
|
40
|
+
version: 11.2.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rails
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 7.0.7
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
31
53
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
54
|
+
version: 7.0.7
|
33
55
|
description: ''
|
34
56
|
email: mactunechy@gmail.com
|
35
57
|
executables: []
|
@@ -38,6 +60,16 @@ extra_rdoc_files: []
|
|
38
60
|
files:
|
39
61
|
- LICENSE
|
40
62
|
- README.md
|
63
|
+
- lib/generators.rb
|
64
|
+
- lib/onsite_payments.rb
|
65
|
+
- lib/templates/config.yml
|
66
|
+
- lib/templates/controller.rb
|
67
|
+
- lib/templates/helper.rb
|
68
|
+
- lib/templates/index.html.erb
|
69
|
+
- lib/templates/make_payment.html.erb
|
70
|
+
- lib/templates/migration.rb
|
71
|
+
- lib/templates/model.rb
|
72
|
+
- lib/templates/routes.rb
|
41
73
|
homepage: https://github.com/mactunechy/payfast-gem
|
42
74
|
licenses:
|
43
75
|
- MIT
|
@@ -50,7 +82,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
50
82
|
requirements:
|
51
83
|
- - ">="
|
52
84
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
85
|
+
version: '0'
|
54
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
87
|
requirements:
|
56
88
|
- - ">="
|