0% found this document useful (0 votes)
57 views

Boton Js

This document defines an Express server that integrates with the PayPal REST API. It generates OAuth access tokens to authenticate API requests. It defines routes to create PayPal orders from cart data, capture payments, and serve a checkout frontend. Helper functions generate access tokens, create orders, and handle API responses. The server hosts static files, parses JSON request bodies, and returns HTTP responses from the PayPal APIs.
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views

Boton Js

This document defines an Express server that integrates with the PayPal REST API. It generates OAuth access tokens to authenticate API requests. It defines routes to create PayPal orders from cart data, capture payments, and serve a checkout frontend. Helper functions generate access tokens, create orders, and handle API responses. The server hosts static files, parses JSON request bodies, and returns HTTP responses from the PayPal APIs.
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 3

import express from "express";

import fetch from "node-fetch";


import "dotenv/config";
import path from "path";

const { PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, PORT = 8888 } = process.env;


const base = "https://api-m.sandbox.paypal.com";
const app = express();

// host static files


app.use(express.static("client"));

// parse post params sent in body in json format


app.use(express.json());

/**
* Generate an OAuth 2.0 access token for authenticating with PayPal REST APIs.
* @see https://developer.paypal.com/api/rest/authentication/
*/
const generateAccessToken = async () => {
try {
if (!PAYPAL_CLIENT_ID || !PAYPAL_CLIENT_SECRET) {
throw new Error("MISSING_API_CREDENTIALS");
}
const auth = Buffer.from(
PAYPAL_CLIENT_ID + ":" + PAYPAL_CLIENT_SECRET,
).toString("base64");
const response = await fetch(`${base}/v1/oauth2/token`, {
method: "POST",
body: "grant_type=client_credentials",
headers: {
Authorization: `Basic ${auth}`,
},
});

const data = await response.json();


return data.access_token;
} catch (error) {
console.error("Failed to generate Access Token:", error);
}
};

/**
* Create an order to start the transaction.
* @see https://developer.paypal.com/docs/api/orders/v2/#orders_create
*/
const createOrder = async (cart) => {
// use the cart information passed from the front-end to calculate the purchase
unit details
console.log(
"shopping cart information passed from the frontend createOrder() callback:",
cart,
);

const accessToken = await generateAccessToken();


const url = `${base}/v2/checkout/orders`;
const payload = {
intent: "CAPTURE",
purchase_units: [
{
amount: {
currency_code: "USD",
value: "100.00",
},
},
],
};

const response = await fetch(url, {


headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
// Uncomment one of these to force an error for negative testing (in sandbox
mode only). Documentation:
// https://developer.paypal.com/tools/sandbox/negative-testing/request-
headers/
// "PayPal-Mock-Response": '{"mock_application_codes":
"MISSING_REQUIRED_PARAMETER"}'
// "PayPal-Mock-Response": '{"mock_application_codes": "PERMISSION_DENIED"}'
// "PayPal-Mock-Response": '{"mock_application_codes":
"INTERNAL_SERVER_ERROR"}'
},
method: "POST",
body: JSON.stringify(payload),
});

return handleResponse(response);
};

/**
* Capture payment for the created order to complete the transaction.
* @see https://developer.paypal.com/docs/api/orders/v2/#orders_capture
*/
const captureOrder = async (orderID) => {
const accessToken = await generateAccessToken();
const url = `${base}/v2/checkout/orders/${orderID}/capture`;

const response = await fetch(url, {


method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
// Uncomment one of these to force an error for negative testing (in sandbox
mode only). Documentation:
// https://developer.paypal.com/tools/sandbox/negative-testing/request-
headers/
// "PayPal-Mock-Response": '{"mock_application_codes":
"INSTRUMENT_DECLINED"}'
// "PayPal-Mock-Response": '{"mock_application_codes":
"TRANSACTION_REFUSED"}'
// "PayPal-Mock-Response": '{"mock_application_codes":
"INTERNAL_SERVER_ERROR"}'
},
});

return handleResponse(response);
};
async function handleResponse(response) {
try {
const jsonResponse = await response.json();
return {
jsonResponse,
httpStatusCode: response.status,
};
} catch (err) {
const errorMessage = await response.text();
throw new Error(errorMessage);
}
}

app.post("/api/orders", async (req, res) => {


try {
// use the cart information passed from the front-end to calculate the order
amount detals
const { cart } = req.body;
const { jsonResponse, httpStatusCode } = await createOrder(cart);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to create order:", error);
res.status(500).json({ error: "Failed to create order." });
}
});

app.post("/api/orders/:orderID/capture", async (req, res) => {


try {
const { orderID } = req.params;
const { jsonResponse, httpStatusCode } = await captureOrder(orderID);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to create order:", error);
res.status(500).json({ error: "Failed to capture order." });
}
});

// serve index.html
app.get("/", (req, res) => {
res.sendFile(path.resolve("./client/checkout.html"));
});

app.listen(PORT, () => {
console.log(`Node server listening at http://localhost:${PORT}/`);
});

You might also like