@hyperse/paypal-node-sdk
Version:
NodeJS SDK for PayPal Checkout APIs
258 lines (220 loc) • 9.84 kB
Markdown
# /paypal-node-sdk
<p align="left">
<a aria-label="Build" href="https://github.com/hyperse-io/paypal-node-sdk/actions?query=workflow%3ACI">
<img alt="build" src="https://img.shields.io/github/actions/workflow/status/hyperse-io/paypal-node-sdk/ci-integrity.yml?branch=main&label=ci&logo=github&style=flat-quare&labelColor=000000" />
</a>
<a aria-label="stable version" href="https://www.npmjs.com/package/@hyperse/paypal-node-sdk">
<img alt="stable version" src="https://img.shields.io/npm/v/%40hyperse%2Fpaypal-node-sdk?branch=main&label=version&logo=npm&style=flat-quare&labelColor=000000" />
</a>
<a>
<img alt="LoC" src="https://img.shields.io/bundlephobia/min/%40hyperse%2Fpaypal-node-sdk?style=flat-quare&labelColor=000000" />
</a>
<a aria-label="Top language" href="https://github.com/hyperse-io/paypal-node-sdk/search?l=typescript">
<img alt="GitHub top language" src="https://img.shields.io/github/languages/top/hyperse-io/paypal-node-sdk?style=flat-square&labelColor=000&color=blue">
</a>
<a aria-label="Licence" href="https://github.com/hyperse-io/paypal-node-sdk/blob/main/LICENSE">
<img alt="Licence" src="https://img.shields.io/github/license/hyperse-io/paypal-node-sdk?style=flat-quare&labelColor=000000" />
</a>
</p>
## PayPal Checkout API SDK for NodeJS

### To consolidate support across various channels, we have currently turned off the feature of GitHub issues. Please visit https://www.paypal.com/support to submit your request or ask questions within our community forum.
**Welcome to PayPal NodeJS SDK**. This repository contains PayPal's NodeJS SDK and samples for [v2/checkout/orders](https://developer.paypal.com/docs/api/orders/v2/) and [v2/payments](https://developer.paypal.com/docs/api/payments/v2/) APIs.
This is a part of the next major PayPal SDK. It includes a simplified interface to only provide simple model objects and blueprints for HTTP calls. This repo currently contains functionality for PayPal Checkout APIs which includes [Orders V2](https://developer.paypal.com/docs/api/orders/v2/) and [Payments V2](https://developer.paypal.com/docs/api/payments/v2/).
Please refer to the [PayPal Checkout Integration Guide](https://developer.paypal.com/docs/checkout/) for more information.
## Usage
### Binaries
It is not mandatory to fork this repository for using the PayPal SDK. You can refer [PayPal Checkout Server SDK](https://developer.paypal.com/docs/checkout/reference/server-integration) for configuring and working with SDK without forking this code.
For contirbuting or referrring the samples, You can fork/refer this repository.
## Examples
### Creating an Order
#### Code to Execute:
```javascript
import { core, orders, payments } from '/paypal-node-sdk';
// Creating an environment
let clientId = '<<PAYPAL-CLIENT-ID>>';
let clientSecret = '<<PAYPAL-CLIENT-SECRET>>';
// This sample uses SandboxEnvironment. In production, use LiveEnvironment
let environment = new core.SandboxEnvironment(clientId, clientSecret);
let client = new core.PayPalHttpClient(environment);
// Construct a request object and set desired parameters
// Here, OrdersCreateRequest() creates a POST request to /v2/checkout/orders
let request = new orders.OrdersCreateRequest();
request.requestBody({
intent: 'CAPTURE',
purchase_units: [
{
amount: {
currency_code: 'USD',
value: '100.00',
},
},
],
});
// Call API with your client and get a response for your call
let createOrder = async function () {
let response = await client.execute(request);
console.log(`Response: ${JSON.stringify(response)}`);
// If call returns body in response, you can get the deserialized version from the result attribute of the response.
console.log(`Order: ${JSON.stringify(response.result)}`);
};
createOrder();
```
#### Example Output:
```
{
"id": "4VW45368HJ294683Y",
"links": [
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/4VW45368HJ294683Y",
"method": "GET",
"rel": "self"
},
{
"href": "https://www.sandbox.paypal.com/checkoutnow?token=4VW45368HJ294683Y",
"method": "GET",
"rel": "approve"
},
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/4VW45368HJ294683Y",
"method": "PATCH",
"rel": "update"
},
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/4VW45368HJ294683Y/capture",
"method": "POST",
"rel": "capture"
}
],
"status": "CREATED"
}
```
## Capturing an Order
Before Capturing an order, it should be approved by the buyer using approve link in the create order response.
### Code to Execute:
```javascript
let captureOrder = async function (orderId) {
request = new orders.OrdersCaptureRequest(orderId);
request.requestBody({});
// Call API with your client and get a response for your call
let response = await client.execute(request);
console.log(`Response: ${JSON.stringify(response)}`);
// If call returns body in response, you can get the deserialized version from the result attribute of the response.
console.log(`Capture: ${JSON.stringify(response.result)}`);
};
let capture = captureOrder('REPLACE-WITH-APPROVED-ORDER-ID');
```
#### Example Output:
```JSON
{
"id": "96J43722461654618",
"links": [
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/96J43722461654618",
"method": "GET",
"rel": "self"
}
],
"payer": {
"address": {
"country_code": "US"
},
"email_address": "byer@example.com",
"name": {
"given_name": "John",
"surname": "Doe"
},
"payer_id": "XXXXXXXXXXX",
"phone": {
"phone_number": {
"national_number": "111-111-1111"
}
}
},
"purchase_units": [
{
"payments": {
"captures": [
{
"amount": {
"currency_code": "USD",
"value": "100.00"
},
"create_time": "2019-02-05T02:44:14Z",
"final_capture": true,
"id": "7XU44982RK2157057",
"links": [
{
"href": "https://api.sandbox.paypal.com/v2/payments/captures/7XU44982RK2157057",
"method": "GET",
"rel": "self"
},
{
"href": "https://api.sandbox.paypal.com/v2/payments/captures/7XU44982RK2157057/refund",
"method": "POST",
"rel": "refund"
},
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/96J43722461654618",
"method": "GET",
"rel": "up"
}
],
"seller_protection": {
"dispute_categories": [
"ITEM_NOT_RECEIVED",
"UNAUTHORIZED_TRANSACTION"
],
"status": "ELIGIBLE"
},
"seller_receivable_breakdown": {
"gross_amount": {
"currency_code": "USD",
"value": "100.00"
},
"net_amount": {
"currency_code": "USD",
"value": "96.80"
},
"paypal_fee": {
"currency_code": "USD",
"value": "3.20"
}
},
"status": "COMPLETED",
"update_time": "2019-02-05T02:44:14Z"
}
]
},
"reference_id": "default",
"shipping": {
"address": {
"address_line_1": "1 Main St",
"admin_area_1": "CA",
"admin_area_2": "San Jose",
"country_code": "US",
"postal_code": "95131"
},
"name": {
"full_name": "John Doe"
}
}
}
],
"status": "COMPLETED"
}
```
## Running tests
To run integration tests using your client id and secret, clone this repository and run the following command:
```sh
$ npm install
$ PAYPAL_CLIENT_ID=YOUR_SANDBOX_CLIENT_ID PAYPAL_CLIENT_SECRET=YOUR_SANDBOX_CLIENT_SECRET npm test
```
## Samples
You can start off by trying out [creating and capturing an order](https://github.com/hyperse-io/paypal-node-sdk/tree/main/samples/CaptureIntentExamples/runAll.ts)
Note: Update the `payPalClient.ts` with your sandbox client credentials or pass your client credentials as environment variable while executing the samples.[creating and capturing an order](https://github.com/hyperse-io/paypal-node-sdk/tree/main/samples/CaptureIntentExamples/runAll.ts)
## Note
PayPalHttpClient used as part of this project returns Promises
You can read more about Promises here: https://www.promisejs.org/
## License
Code released under [SDK LICENSE](LICENSE)