Immediate capture

DocsCurrent


Use this integration to capture money from your buyers and move it to your sellers instantly.

Know before you code

Required

To use this integration you must:

Run in Postman

Note: This server-side integration uses the Orders REST API for this server-side integration. You’ll need to set intent to capture in the create order call for this feature to work.

1. Generate PayPal-Auth-Assertion header

You’ll need to Pass the PayPal-Auth-Assertion header with the standard Content-Type, Authorization, and PayPal-Request-ID headers. The value of the `PayPal-Auth-Assertion` header can be generated as follows:

1const clientId = "CLIENT-ID";
2const sellerPayerId = "SELLER=PAYER=ID"
3const jwt = getAuthAssertionValue(clientId, sellerPayerId);
4console.log(jwt);
5function getAuthAssertionValue(clientId, sellerPayerId) {
6 const header = {
7 "alg": "none"
8 };
9 const encodedHeader = base64url(header);
10 const payload = {
11 "iss": clientId,
12 "payer_id": sellerPayerId
13 };
14 const encodedPayload = base64url(payload);
15 return `${encodedHeader}.${encodedPayload}.`;
16}
17function base64url(json) {
18 return btoa(JSON.stringify(json)).replace(/=+$/, '').replace(/+/g, '-').replace(///g, '_');
19}

Note: This example contains two period (.) characters, which are required.

Modify the code

  • Use the client ID of the platform or marketplace from the PayPal Developer dashboard for `clientID`.
  • The sellerPayerId is the payer ID of the reciving seller's PayPal account. You can also use email instead of payer_id and supply the email address of the seller's PayPal account.

Example functions to generate the PayPal-Auth-Assertion header:

Node.js

1const clientID = "CLIENT-ID";
2const merchantIDOrEmail = "identity_seller@paypal.com";
3const auth1 = Buffer.from('{"alg":"none"}').toString("base64");
4const auth2 = Buffer.from(`{"iss":${clientID},"payer_id":${merchantIDOrEmail}}`).toString("base64");
5const authAssertionHeader = `${auth1}.${auth2}.`;

Java

1import org.apache.commons.codec.binary.Base64;
2public class Base64Encode {
3public static void main(String[] args) {
4String header = "{"alg":"none"}";
5String payload = " {"email":"identity_seller@paypal.com","iss":"CLIENT-ID"}";
6//iss is the client id of the actor and email is the email id of the subject
7byte[] encodedBytes = Base64.encodeBase64(header.getBytes());
8System.out.println("Header encoded " + new String(encodedBytes));
9byte[] encodedBytesPayload = Base64.encodeBase64(payload.getBytes());
10System.out.println("Payload encoded " + new String(encodedBytesPayload));
11System.out.println("Paypal-Auth-Assertion=" + new String(encodedBytes) + "." + new String(encodedBytesPayload) + ".");
12 }
13}

2. Create order

You must first create an order and capture funds. To create an order, copy the following code and modify as follows:

  • Replace BN-CODE with your PayPal attribution ID
  • Replace PAYPAL-AUTH-ASSERTION with your PayPal auth assertion generated from Step 1.
  • Use the purchase_units/payee object to specify the end receiver of the funds.
  • Set the purchase_units/payment_instruction/disbursement_mode field to `DELAYED`.
  • Use the purchase_units/payment_instruction/platform_fees array to specify fees for the order. You must onboard your seller with the PARTNER_FEE feature to use this array.

Sample request - cURL

1curl -v -X POST https://api-m.sandbox.paypal.com/v2/checkout/orders
2-H 'Content-Type: application/json' -H 'Authorization: Bearer ACCESS-TOKEN'
3-H 'PayPal-Partner-Attribution-Id: BN-CODE'
4-H 'PayPal-Auth-Assertion: PAYPAL-AUTH-ASSERTION'
5-d '{
6"intent": "CAPTURE",
7"purchase_units": [
8 {
9 "amount": {
10 "currency_code": "USD",
11 "value": "100.00"
12 },
13 "payment_instruction": {
14 "disbursement_mode": "INSTANT",
15 "platform_fees": [
16 {
17 "amount": {
18 "currency_code": "USD",
19 "value": "25.00"
20 }
21 }
22 ]
23 }
24 }
25 ]
26}

Sample request - Node

1var express = require('express');
2var request = require('request');
3express().post('/my-server/create-order', function(req, res) {
4 request.post('https://api-m.sandbox.paypal.com/v2/checkout/orders', {
5 headers: {
6 "Content-Type": "application/json",
7 "Authorization": "Bearer ACCESS-TOKEN",
8 "PayPal-Partner-Attribution-Id": "BN-CODE",
9 "PayPal-Auth-Assertion": "PAYPAL-AUTH-ASSERTION"
10 },
11 body: {
12 "intent": "CAPTURE",
13 "purchase_units": [{
14 "amount": {
15 "currency_code": "USD",
16 "value": "100.00"
17 },
18 "payment_instruction": {
19 "disbursement_mode": "INSTANT",
20 "platform_fees": [{
21 "amount": {
22 "currency_code": "USD",
23 "value": "25.00"
24 }
25 }]
26 }
27 }],
28 },
29 json: true
30 }, function(err, response, body) {
31 if (err) {
32 console.error(err);
33 return res.sendStatus(500);
34 }
35 res.json({
36 id: body.id
37 });
38 });
39});

3. Capture order

After your buyer approves the order, call capture order to capture the buyer’s funds.

Copy the following code and modify as follows:

  • Replace ACCESS-TOKEN with your access token.
  • Replace BN-CODE with your PayPal partner attribution ID.
  • Replace PAYPAL-AUTH-ASSERTION with your PayPal auth assertion generated from Step 1.

Sample request - cURL

1curl -v -k -X POST https://api-m.paypal.com/v2/checkout/orders/5O190127TN364715T/capture
2-H 'Content-Type: application/json'
3-H 'Authorization: Bearer ACCESS-TOKEN'
4-H 'PayPal-Partner-Attribution-Id: BN-CODE'
5-H 'PayPal-Auth-Assertion: PAYPAL-AUTH-ASSERTION'
6-d '{}'

Sample request - Node

1var express = require('express');
2var request = require('request');
3express().post('/my-server/handle-approve/:id', function(req, res) {
4 var OrderID = req.params.id;
5 request.post('https://api-m.sandbox.paypal.com/v2/checkout/orders/' + OrderID + '/capture', {
6 headers: {
7 "Content-Type": "application/json",
8 "Authorization": "Bearer ACCESS-TOKEN",
9 "PayPal-Partner-Attribution-Id": "BN-CODE",
10 "PayPal-Auth-Assertion": "PAYPAL-AUTH-ASSERTION"
11 }
12 }, function(err, response, body) {
13 if (err) {
14 console.error(err);
15 return res.sendStatus(500);
16 }
17 res.json({
18 status: 'success'
19 });
20 });
21});

Note: Note: Orders cannot be captured until the status of the order is set to APPROVED. The order status is set to APPROVED when the buyer successfully completes the checkout flow.

4. Show order details

To see your order details, pass the order ID as a path parameter in a show order details call.

Copy the following code and modify as follows:

  • Replace ACCESS-TOKEN with your access token.
  • Replace BN-CODE with your PayPal partner attribution ID.
  • Replace PAYPAL-AUTH-ASSERTION with your PayPal auth assertion generated from Step 1.

Sample request - cURL

1curl -v -X GET https://api-m.sandbox.paypal.com/v2/checkout/orders/5O190127TN364715T
2-H "Content-Type: application/json"
3-H 'Authorization: Bearer ACCESS-TOKEN'
4-H 'PayPal-Partner-Attribution-Id: BN-CODE'
5-H 'PayPal-Auth-Assertion: PAYPAL-AUTH-ASSERTION'

Sample request - Node

1var http = require("https");
2var options = {
3 "method": "GET",
4 "hostname": "api-m.sandbox.paypal.com",
5 "port": null,
6 "path": "/v2/checkout/orders/5O190127TN364715T",
7 "headers": {
8 "Content-Type": "application/json",
9 "Authorization": "Bearer ACCESS-TOKEN",
10 "PayPal-Partner-Attribution-Id": "BN-CODE",
11 "PayPal-Auth-Assertion": "PAYPAL-AUTH-ASSERTION"
12 }
13};
14var req = http.request(options, function(res) {
15 var chunks = [];
16 res.on("data", function(chunk) {
17 chunks.push(chunk);
18 });
19 res.on("end", function() {
20 var body = Buffer.concat(chunks);
21 console.log(body.toString());
22 });
23});
24req.end();

Next steps

Recommended
Integration Checklist

Go through the integration checklist before you go live.