Skip to content
This repository was archived by the owner on Aug 22, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions sample/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,31 @@ class="fa fa-exclamation-triangle"></i> Report Issues </a>
</div>
<!-- List group -->
<ul class="list-group">
<li class="list-group-item">
<div class="row">
<div class="col-md-8"><h5>PayPal Payments with Checkout.JS - Basic example injecting the Payment ID directly to the PayPal button source</small></h5>
</div>
<div class="col-md-4">
<a href="payments/CreatePaymentUsingCheckoutJs.php" class="btn btn-primary pull-left execute">
Try It
<i class="fa fa-play-circle-o"></i>
</a>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h6>Step II: Execute after Success
<small>(required step after user approval)</small></h6>
</div>
<div class="col-md-4">
<a
href="doc/payments/ExecutePayment.html"
class="btn btn-default pull-right">Part II : Source <i
class="fa fa-file-code-o"></i></a>

</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="col-md-8"><h5>PayPal Payments - similar to Express Checkout in Classic APIs</small></h5>
Expand Down
152 changes: 152 additions & 0 deletions sample/payments/CreatePaymentUsingCheckoutJs.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
<?php

// # Create Payment using PayPal as payment method
// This sample code demonstrates how you can process a
// PayPal Account based Payment.
// API used: /v1/payments/payment

require __DIR__ . '/../bootstrap.php';
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;

// ### Payer
// A resource representing a Payer that funds a payment
// For paypal account payments, set payment method
// to 'paypal'.
$payer = new Payer();
$payer->setPaymentMethod("paypal");

// ### Itemized information
// (Optional) Lets you specify item wise
// information
$item1 = new Item();
$item1->setName('Ground Coffee 40 oz')
->setCurrency('USD')
->setQuantity(1)
->setSku("123123") // Similar to `item_number` in Classic API
->setPrice(7.5);
$item2 = new Item();
$item2->setName('Granola bars')
->setCurrency('USD')
->setQuantity(5)
->setSku("321321") // Similar to `item_number` in Classic API
->setPrice(2);

$itemList = new ItemList();
$itemList->setItems(array($item1, $item2));

// ### Additional payment details
// Use this optional field to set additional
// payment information such as tax, shipping
// charges etc.
$details = new Details();
$details->setShipping(1.2)
->setTax(1.3)
->setSubtotal(17.50);

// ### Amount
// Lets you specify a payment amount.
// You can also specify additional details
// such as shipping, tax.
$amount = new Amount();
$amount->setCurrency("USD")
->setTotal(20)
->setDetails($details);

// ### Transaction
// A transaction defines the contract of a
// payment - what is the payment for and who
// is fulfilling it.
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($itemList)
->setDescription("Payment description")
->setInvoiceNumber(uniqid());

// ### Redirect urls
// Set the urls that the buyer must be redirected to after
// payment approval/ cancellation.
$baseUrl = getBaseUrl();
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl("$baseUrl/ExecutePayment.php?success=true")
->setCancelUrl("$baseUrl/ExecutePayment.php?success=false");

// ### Payment
// A Payment Resource; create one using
// the above types and intent set to 'sale'
$payment = new Payment();
$payment->setIntent("sale")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->setTransactions(array($transaction));


// For Sample Purposes Only.
$request = clone $payment;

// ### Create Payment
// Create a payment by calling the 'create' method
// passing it a valid apiContext.
// (See bootstrap.php for more on `ApiContext`)
// The return object contains the state and the
// url to which the buyer must be redirected to
// for payment approval
try {
$payment->create($apiContext);
} catch (Exception $ex) {
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printError("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", null, $request, $ex);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Created Payment Using PayPal. Please visit the URL to Approve. -> Error creating Payment

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy and Paste from existing the CreatePayment example. What do you suggest?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add changes to both.

exit(1);
}

// ### Get redirect url
// The API response provides the url that you must redirect
// the buyer to. Retrieve the url from the $payment->getApprovalLink()
// method
$approvalUrl = $payment->getApprovalLink();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We won't need this.



// Checkout JS https://developer.paypal.com/demo/checkout/#/pattern/server
// NOTE: The checkout.js script should be added to your head element not directly to the body as shown in the sample here.
echo '<script src="https://www.paypalobjects.com/api/checkout.js"></script>';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might be able to just finish the PHP script here, and load the script as a normal HTML tag.

<!DOCTYPE html>
<html>

<?php
... //This is where all our PHP code goes
?>

<head>
   <script src="https://www.paypalobjects.com/api/checkout.js"></script>
    ... // rest of your js code
</head>
<body>

</body>
</html>


// NOTE: As an Alternative you can make a request with paypal.request.post to a page that returns the Payment ID value
echo "<script>
paypal.Button.render({
env: 'sandbox', // sandbox | production
// Show the buyer a 'Pay Now' button in the checkout flow
commit: true,
// payment() is called when the button is clicked
payment: function() {
// Return the Payment ID
return '$payment->id';
},
// onAuthorize() is called when the buyer approves the payment
onAuthorize: function(data, actions) {
// Redirect to existing Execute Payment
return actions.redirect();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there other options than doing a redirect ? Can I fetch all the relevant field here, and make a normal HTTP post call to my server to do an execute for me ? It would be nice to mention the most common flow used.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the simplest way with the existing sample set up, I plan on creating another example with Ajax calls using the PayPal request object that is built into the Checkout library.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should just stick to one. Let people do other's from documentation

},
onCancel: function(data, actions) {
return actions.redirect();
}
}, '#paypal-button-container');
</script>";


// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printResult("Created Payment Using PayPal. Please click the PayPal Checkout button to Approve.", "Payment", $payment->id . "<br>Click here to Approve the Payment:<br> <div id=\"paypal-button-container\"></div>", $request, $payment);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not need this.

Copy link
Author

@randstraw randstraw Oct 30, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will refactor per an above comment, in the current state it is needed because of this
<div id=\"paypal-button-container\"></div> output.


return $payment;
2 changes: 1 addition & 1 deletion sample/payments/CreatePaymentUsingPayPal.php
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,6 @@
$approvalUrl = $payment->getApprovalLink();

// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printResult("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", "<a href='$approvalUrl' >$approvalUrl</a>", $request, $payment);
ResultPrinter::printResult("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", $payment->id . "<br>Please visit the URL to Approve: <a href='$approvalUrl' >$approvalUrl</a>", $request, $payment);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would print Please visit the URL to Approve. twice.


return $payment;