Skip to content

Commit

Permalink
update Python Flask/Ruby Sinatra examples (#160)
Browse files Browse the repository at this point in the history
  • Loading branch information
LeonarthusMectus authored Oct 16, 2024
1 parent 2cdd5d3 commit 843672d
Show file tree
Hide file tree
Showing 16 changed files with 488 additions and 0 deletions.
1 change: 1 addition & 0 deletions advanced-integration/v2/server/python/.flaskenv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
FLASK_RUN_PORT=8080
41 changes: 41 additions & 0 deletions advanced-integration/v2/server/python/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Standard Integration Python Flask Sample

PayPal Standard Integration sample in Python using Flask

## Running the sample

1. **Setup a virtual environment**

```sh
python3 -m venv .venv
```

1. **Install the dependencies**

```sh
pip install -r requirements.txt
```

1. **Add your API credentials to the environment:**

- **Windows**

```powershell
$env:PAYPAL_CLIENT_ID = "<PAYPAL_CLIENT_ID>"
$env:PAYPAL_CLIENT_SECRET = "<PAYPAL_CLIENT_SECRET>"
```

- **Unix**

```bash
export PAYPAL_CLIENT_ID="<PAYPAL_CLIENT_ID>"
export PAYPAL_CLIENT_SECRET="<PAYPAL_CLIENT_SECRET>"
```

1. **Run the server**

```sh
flask --app server run
```

1. Go to [http://localhost:8080/](http://localhost:8080/)
2 changes: 2 additions & 0 deletions advanced-integration/v2/server/python/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Flask==3.0.3
paypal-server-sdk==0.5.2
86 changes: 86 additions & 0 deletions advanced-integration/v2/server/python/server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import logging
import os

from flask import Flask, request
from paypalserversdk.http.auth.o_auth_2 import ClientCredentialsAuthCredentials
from paypalserversdk.logging.configuration.api_logging_configuration import LoggingConfiguration, \
RequestLoggingConfiguration, ResponseLoggingConfiguration
from paypalserversdk.paypalserversdk_client import PaypalserversdkClient
from paypalserversdk.controllers.orders_controller import OrdersController
from paypalserversdk.models.amount_with_breakdown import AmountWithBreakdown
from paypalserversdk.models.checkout_payment_intent import CheckoutPaymentIntent
from paypalserversdk.models.order_request import OrderRequest
from paypalserversdk.models.purchase_unit_request import PurchaseUnitRequest
from paypalserversdk.api_helper import ApiHelper

app = Flask(__name__)

paypal_client: PaypalserversdkClient = PaypalserversdkClient(
client_credentials_auth_credentials=ClientCredentialsAuthCredentials(
o_auth_client_id=os.getenv('PAYPAL_CLIENT_ID'),
o_auth_client_secret=os.getenv('PAYPAL_CLIENT_SECRET')
),
logging_configuration=LoggingConfiguration(
log_level=logging.INFO,
# Disable masking of sensitive headers for Sandbox testing.
# This should be set to True (the default if unset)in production.
mask_sensitive_headers=False,
request_logging_config=RequestLoggingConfiguration(
log_headers=True,
log_body=True
),
response_logging_config=ResponseLoggingConfiguration(
log_headers=True,
log_body=True
)
)
)

'''
Health check
'''
@app.route('/', methods=['GET'])
def index():
return {"message": "Server is running"}

orders_controller: OrdersController = paypal_client.orders

'''
Create an order to start the transaction.
@see https://developer.paypal.com/docs/api/orders/v2/#orders_create
'''
@app.route('/api/orders', methods=['POST'])
def create_order():
request_body = request.get_json()
# use the cart information passed from the front-end to calculate the order amount detals
cart = request_body['cart']
order = orders_controller.orders_create({
"body": OrderRequest(
intent=CheckoutPaymentIntent.CAPTURE,
purchase_units=[
PurchaseUnitRequest(
AmountWithBreakdown(
currency_code='USD',
value='100.00'
)
)
]
),
"prefer": 'return=representation'
}
)
return ApiHelper.json_serialize(order.body)

'''
Capture payment for the created order to complete the transaction.
@see https://developer.paypal.com/docs/api/orders/v2/#orders_capture
'''
@app.route('/api/orders/<order_id>/capture', methods=['POST'])
def capture_order(order_id):
order = orders_controller.orders_capture({
'id': order_id,
'prefer': 'return=representation'
})
return ApiHelper.json_serialize(order.body)
1 change: 1 addition & 0 deletions advanced-integration/v2/server/ruby/.ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.3.5
9 changes: 9 additions & 0 deletions advanced-integration/v2/server/ruby/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

source "https://rubygems.org"

gem "paypal-server-sdk", "~> 0.5.2"
gem "puma", "~> 6.4"
gem "rackup", "~> 2.1"
gem "sinatra", "~> 4.0"
gem "sinatra-contrib", "~> 4.0"
37 changes: 37 additions & 0 deletions advanced-integration/v2/server/ruby/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Standard Integration Ruby Sinatra Sample

PayPal Standard Integration sample in Ruby using Sinatra

## Running the sample

1. **Ensure you have a supported Ruby version installed**: [Ruby Maintenance Branches](https://www.ruby-lang.org/en/downloads/branches/)

1. **Install the dependencies**

```bash
bundle install
```

1. **Add your API credentials to the environment:**

- **Windows**

```powershell
$env:PAYPAL_CLIENT_ID = "<PAYPAL_CLIENT_ID>"
$env:PAYPAL_CLIENT_SECRET = "<PAYPAL_CLIENT_SECRET>"
```

- **Unix**

```bash
export PAYPAL_CLIENT_ID="<PAYPAL_CLIENT_ID>"
export PAYPAL_CLIENT_SECRET="<PAYPAL_CLIENT_SECRET>"
```

1. **Run the server**

```bash
bundle exec ruby server.rb
```

1. Go to [http://localhost:8080/](http://localhost:8080/)
67 changes: 67 additions & 0 deletions advanced-integration/v2/server/ruby/server.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
require 'paypal_server_sdk'
require 'sinatra'
require 'sinatra/json'

include PaypalServerSdk

set :port, 8080

paypal_client = PaypalServerSdk::Client.new(
client_credentials_auth_credentials: ClientCredentialsAuthCredentials.new(
o_auth_client_id: ENV['PAYPAL_CLIENT_ID'],
o_auth_client_secret: ENV['PAYPAL_CLIENT_SECRET']
),
environment: Environment::SANDBOX,
logging_configuration: LoggingConfiguration.new(
mask_sensitive_headers: false,
log_level: Logger::INFO,
request_logging_config: RequestLoggingConfiguration.new(
log_headers: true,
log_body: true,
),
response_logging_config: ResponseLoggingConfiguration.new(
log_headers: true,
log_body: true
)
)
)

# Health Check
get '/' do
json :message => "Server is running"
end

# Create an order to start the transaction.
#
# @see https://developer.paypal.com/docs/api/orders/v2/#orders_create
post "/api/orders" do
# use the cart information passed from the front-end to calculate the order amount detals
cart = JSON.parse request.body.read
order_response = paypal_client.orders.orders_create({
'body' => OrderRequest.new(
intent: CheckoutPaymentIntent::CAPTURE,
purchase_units: [
PurchaseUnitRequest.new(
amount: AmountWithBreakdown.new(
currency_code: 'USD',
value: '100.00'
)
)
]
),
'prefer' => 'return=representation'
})
json order_response.data
end

# Capture payment for the created order to complete the transaction.
#
# @see https://developer.paypal.com/docs/api/orders/v2/#orders_capture
post '/api/orders/:order_id/capture' do |order_id|
capture_response = paypal_client.orders.orders_capture({
'id' => order_id,
'prefer' => 'return=representation'
})
json capture_response.data
rescue ErrorException => e
end
1 change: 1 addition & 0 deletions standard-integration/server/python/.flaskenv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
FLASK_RUN_PORT=8080
41 changes: 41 additions & 0 deletions standard-integration/server/python/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Standard Integration Python Flask Sample

PayPal Standard Integration sample in Python using Flask

## Running the sample

1. **Setup a virtual environment**

```sh
python3 -m venv .venv
```

1. **Install the dependencies**

```sh
pip install -r requirements.txt
```

1. **Add your API credentials to the environment:**

- **Windows**

```powershell
$env:PAYPAL_CLIENT_ID = "<PAYPAL_CLIENT_ID>"
$env:PAYPAL_CLIENT_SECRET = "<PAYPAL_CLIENT_SECRET>"
```

- **Unix**

```bash
export PAYPAL_CLIENT_ID="<PAYPAL_CLIENT_ID>"
export PAYPAL_CLIENT_SECRET="<PAYPAL_CLIENT_SECRET>"
```

1. **Run the server**

```sh
flask --app server run
```

1. Go to [http://localhost:8080/](http://localhost:8080/)
2 changes: 2 additions & 0 deletions standard-integration/server/python/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Flask==3.0.3
paypal-server-sdk==0.5.2
86 changes: 86 additions & 0 deletions standard-integration/server/python/server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import logging
import os

from flask import Flask, request
from paypalserversdk.http.auth.o_auth_2 import ClientCredentialsAuthCredentials
from paypalserversdk.logging.configuration.api_logging_configuration import LoggingConfiguration, \
RequestLoggingConfiguration, ResponseLoggingConfiguration
from paypalserversdk.paypalserversdk_client import PaypalserversdkClient
from paypalserversdk.controllers.orders_controller import OrdersController
from paypalserversdk.models.amount_with_breakdown import AmountWithBreakdown
from paypalserversdk.models.checkout_payment_intent import CheckoutPaymentIntent
from paypalserversdk.models.order_request import OrderRequest
from paypalserversdk.models.purchase_unit_request import PurchaseUnitRequest
from paypalserversdk.api_helper import ApiHelper

app = Flask(__name__)

paypal_client: PaypalserversdkClient = PaypalserversdkClient(
client_credentials_auth_credentials=ClientCredentialsAuthCredentials(
o_auth_client_id=os.getenv('PAYPAL_CLIENT_ID'),
o_auth_client_secret=os.getenv('PAYPAL_CLIENT_SECRET')
),
logging_configuration=LoggingConfiguration(
log_level=logging.INFO,
# Disable masking of sensitive headers for Sandbox testing.
# This should be set to True (the default if unset)in production.
mask_sensitive_headers=False,
request_logging_config=RequestLoggingConfiguration(
log_headers=True,
log_body=True
),
response_logging_config=ResponseLoggingConfiguration(
log_headers=True,
log_body=True
)
)
)

'''
Health check
'''
@app.route('/', methods=['GET'])
def index():
return {"message": "Server is running"}

orders_controller: OrdersController = paypal_client.orders

'''
Create an order to start the transaction.
@see https://developer.paypal.com/docs/api/orders/v2/#orders_create
'''
@app.route('/api/orders', methods=['POST'])
def create_order():
request_body = request.get_json()
# use the cart information passed from the front-end to calculate the order amount detals
cart = request_body['cart']
order = orders_controller.orders_create({
"body": OrderRequest(
intent=CheckoutPaymentIntent.CAPTURE,
purchase_units=[
PurchaseUnitRequest(
AmountWithBreakdown(
currency_code='USD',
value='100.00'
)
)
]
),
"prefer": 'return=representation'
}
)
return ApiHelper.json_serialize(order.body)

'''
Capture payment for the created order to complete the transaction.
@see https://developer.paypal.com/docs/api/orders/v2/#orders_capture
'''
@app.route('/api/orders/<order_id>/capture', methods=['POST'])
def capture_order(order_id):
order = orders_controller.orders_capture({
'id': order_id,
'prefer': 'return=representation'
})
return ApiHelper.json_serialize(order.body)
1 change: 1 addition & 0 deletions standard-integration/server/ruby/.ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.3.5
Loading

0 comments on commit 843672d

Please sign in to comment.