Skip to content

PayPal REST API implementation using PSR-7, PSR-17 and PSR-18

License

Notifications You must be signed in to change notification settings

8ctopus/paypal-rest-api

Repository files navigation

PayPal REST API

packagist downloads min php version license tests code coverage badge lines of code

A php implementation of the PayPal REST API using PSR-7, PSR-17 and PSR-18.

The package is a work in progress and contributions are welcome. For now, it covers Orders (one-time payments), subscriptions (Products, Plans and Subscriptions), and web hooks (receive notifications from PayPal when certain events occur). That's all that's needed to create a store, be it one-time payment or subscription based.

install package

composer require 8ctopus/paypal-rest-api

before you get started

Copy .env.example to .env and fill in your PayPal REST API credentials. If you don't have credentials yet, follow the guide:

https://developer.paypal.com/api/rest/

demo

Here's a code sample that shows how to make a one-time payment. To see all possibilites run demo.php. There is also a demo store using this package, check out PayPal sandbox.

use HttpSoft\Message\RequestFactory;
use HttpSoft\Message\StreamFactory;
use Nimbly\Shuttle\Shuttle;
use Oct8pus\PayPal\Orders;
use Oct8pus\PayPal\Orders\Intent;
use Oct8pus\PayPal\OAuth;
use Oct8pus\PayPal\HttpHandler;

require_once __DIR__ . '/vendor/autoload.php';

$handler = new HttpHandler(
    // PSR-18 http client
    new Shuttle(),
    // PSR-17 request factory
    new RequestFactory(),
    // PSR-7 stream factory
    new StreamFactory()
);

$sandbox = true;

// get authorization token
$auth = new OAuth($sandbox, $handler, 'rest.id', 'rest.pass');

$orders = new Orders($sandbox, $handler, $auth);

// create order
$response = $orders->create(Intent::Capture, 'USD', 10.0);

// you must redirect the user to approve the payment before you can capture
$redirectUrl = "https://www.sandbox.paypal.com/checkoutnow?token={$response['id']}";

...

// once the user has approved the payment, capture it
$response = $orders->capture($args['id']);

if ($response['status'] === 'COMPLETED') {
    echo 'payment processed!';
}

run tests

composer test

references