104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
|
import type {NextApiRequest, NextApiResponse} from "next";
|
|
import {withIronSessionApiRoute} from "iron-session/next";
|
|
import {sessionOptions} from "@/lib/session";
|
|
import axios from "axios";
|
|
import {v4} from "uuid";
|
|
import {OrderResponseBody} from "@paypal/paypal-js";
|
|
import {getAccessToken} from "@/utils/paypal";
|
|
|
|
export default withIronSessionApiRoute(handler, sessionOptions);
|
|
|
|
async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
if (req.method !== "POST") return res.status(404).json({ok: false, reason: "Method not supported!"});
|
|
if (!req.session.user) return res.status(401).json({ok: false});
|
|
|
|
const accessToken = await getAccessToken();
|
|
if (!accessToken) return res.status(401).json({ok: false, reason: "Authorization failed!"});
|
|
|
|
const {currencyCode, price, trackingId} = req.body as {
|
|
currencyCode: string;
|
|
price: number;
|
|
trackingId: string;
|
|
};
|
|
|
|
if (!trackingId) return res.status(401).json({ok: false, reason: "Missing tracking id!"});
|
|
|
|
const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders`;
|
|
const amount = {
|
|
currency_code: currencyCode,
|
|
value: price.toString(),
|
|
};
|
|
|
|
const data = {
|
|
purchase_units: [
|
|
{
|
|
invoice_id: `INV-${v4()}`,
|
|
amount: {
|
|
...amount,
|
|
breakdown: {
|
|
item_total: amount,
|
|
},
|
|
},
|
|
items: [
|
|
{
|
|
name: "Encoach Subscription",
|
|
quantity: "1",
|
|
category: "DIGITAL_GOODS",
|
|
unit_amount: amount,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payment_source: {
|
|
paypal: {
|
|
email_address: req.session.user.email || "",
|
|
address: {
|
|
address_line_1: "",
|
|
address_line_2: "",
|
|
admin_area_1: "",
|
|
admin_area_2: "",
|
|
// added default values as requsted by the client, using the default values recommended
|
|
// the paypal engineer, otherwise we would have to create something that would detect the location
|
|
// of the user and generate a valid postal code for that location...
|
|
country_code: "US",
|
|
postal_code: "94107",
|
|
},
|
|
experience_context: {
|
|
payment_method_preference: "IMMEDIATE_PAYMENT_REQUIRED",
|
|
locale: "en-US",
|
|
landing_page: "LOGIN",
|
|
shipping_preference: "NO_SHIPPING",
|
|
user_action: "PAY_NOW",
|
|
brand_name: "Encoach",
|
|
},
|
|
},
|
|
},
|
|
intent: "CAPTURE",
|
|
};
|
|
|
|
const headers = {
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
"PayPal-Client-Metadata-Id": trackingId,
|
|
},
|
|
};
|
|
console.log(
|
|
JSON.stringify({
|
|
url,
|
|
data,
|
|
headers,
|
|
}),
|
|
);
|
|
|
|
axios
|
|
.post<OrderResponseBody>(url, data, headers)
|
|
.then((request) => {
|
|
res.status(request.status).json(request.data);
|
|
})
|
|
.catch((err) => {
|
|
console.error(err.response.status, err.response.data);
|
|
res.status(err.response.status).json(err.response.data);
|
|
});
|
|
}
|