From 87a1d7c2881beb23a682ab5216e948ffd54843ce Mon Sep 17 00:00:00 2001 From: Joao Ramos Date: Wed, 6 Mar 2024 18:59:11 +0000 Subject: [PATCH] Minor imporvements and logs --- src/pages/api/paypal/approve.ts | 65 +++++++++---------- src/pages/api/paypal/index.ts | 110 +++++++++++++++++++------------- src/pages/api/paypal/raas.ts | 35 +++++----- 3 files changed, 113 insertions(+), 97 deletions(-) diff --git a/src/pages/api/paypal/approve.ts b/src/pages/api/paypal/approve.ts index 2a176a3b..6b9eb601 100644 --- a/src/pages/api/paypal/approve.ts +++ b/src/pages/api/paypal/approve.ts @@ -42,16 +42,14 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { if (!trackingId) return res.status(401).json({ ok: false, reason: "Missing tracking id!" }); - const request = await axios.post( - `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders/${id}/capture`, - {}, - { - headers: { - Authorization: `Bearer ${accessToken}`, - "PayPal-Client-Metadata-Id": trackingId, - }, - } - ); + const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders/${id}/capture`; + const headers = { + headers: { + Authorization: `Bearer ${accessToken}`, + "PayPal-Client-Metadata-Id": trackingId, + }, + }; + const request = await axios.post(url, {}, headers); if (request.data.status === "COMPLETED") { const user = req.session.user; @@ -73,25 +71,24 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { }, { merge: true } ); - - try { - await setDoc( - doc(db, 'paypalpayments', v4()), - { - orderId: id, - userId: req.session.user.id, - status: request.data.status, - createdAt: new Date().toISOString(), - value: request.data.purchase_units[0].payments.captures[0].amount.value, - currency: request.data.purchase_units[0].payments.captures[0].amount.currency_code, - subscriptionDuration: duration, - subscriptionDurationUnit: duration_unit, - subscriptionExpirationDate: updatedExpirationDate.toISOString(), - } - ); - } catch(err) { - console.error('Failed to insert paypal payment!', err); - } + + try { + await setDoc(doc(db, "paypalpayments", v4()), { + orderId: id, + userId: req.session.user.id, + status: request.data.status, + createdAt: new Date().toISOString(), + value: request.data.purchase_units[0].payments.captures[0].amount.value, + currency: + request.data.purchase_units[0].payments.captures[0].amount + .currency_code, + subscriptionDuration: duration, + subscriptionDurationUnit: duration_unit, + subscriptionExpirationDate: updatedExpirationDate.toISOString(), + }); + } catch (err) { + console.error("Failed to insert paypal payment!", err); + } if (user.type === "corporate") { const snapshot = await getDocs(collection(db, "groups")); @@ -123,10 +120,8 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { return res.status(200).json({ ok: true }); } - res - .status(404) - .json({ - ok: false, - reason: "Order ID not found or purchase was not approved!", - }); + res.status(404).json({ + ok: false, + reason: "Order ID not found or purchase was not approved!", + }); } diff --git a/src/pages/api/paypal/index.ts b/src/pages/api/paypal/index.ts index 9a44eac4..2e793d31 100644 --- a/src/pages/api/paypal/index.ts +++ b/src/pages/api/paypal/index.ts @@ -1,62 +1,80 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type {NextApiRequest, NextApiResponse} from "next"; -import {app} from "@/firebase"; -import {getFirestore, collection, getDocs} from "firebase/firestore"; -import {withIronSessionApiRoute} from "iron-session/next"; -import {sessionOptions} from "@/lib/session"; +import type { NextApiRequest, NextApiResponse } from "next"; +import { app } from "@/firebase"; +import { getFirestore, collection, getDocs } from "firebase/firestore"; +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"; +import { v4 } from "uuid"; +import { OrderResponseBody } from "@paypal/paypal-js"; +import { getAccessToken } from "@/utils/paypal"; const db = getFirestore(app); 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}); + 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 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}; + 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!"}); + if (!trackingId) + return res.status(401).json({ ok: false, reason: "Missing tracking id!" }); - const request = await axios.post( - `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders`, - { - purchase_units: [ - { - amount: { - currency_code: currencyCode, - value: price.toString(), - }, - reference_id: v4(), - }, - ], - payment_source: { - paypal: { - email_address: req.session.user.email || "", - experience_context: { - payment_method_preference: "IMMEDIATE_PAYMENT_REQUIRED", - locale: "en-US", - landing_page: "LOGIN", - shipping_preference: "NO_SHIPPING", - user_action: "PAY_NOW", - }, + const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders`; + + const data = { + purchase_units: [ + { + invoice_id: `INV-${v4()}`, + amount: { + currency_code: currencyCode, + value: price.toString(), + }, + reference_id: v4(), + }, + ], + payment_source: { + paypal: { + email_address: req.session.user.email || "", + 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", - }, - { - headers: { - Authorization: `Bearer ${accessToken}`, - 'PayPal-Client-Metadata-Id': trackingId, - }, - }, - ); + }, + intent: "CAPTURE", + }; - res.status(request.status).json(request.data); + const headers = { + headers: { + Authorization: `Bearer ${accessToken}`, + "PayPal-Client-Metadata-Id": trackingId, + }, + }; + console.log( + JSON.stringify({ + url, + data, + headers, + }) + ); + + const request = await axios.post(url, data, headers); + + res.status(request.status).json(request.data); } diff --git a/src/pages/api/paypal/raas.ts b/src/pages/api/paypal/raas.ts index 9e67b6c8..1a26d3d1 100644 --- a/src/pages/api/paypal/raas.ts +++ b/src/pages/api/paypal/raas.ts @@ -26,24 +26,27 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const trackingId = `${req.session.user.id}-${Date.now()}`; const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v1/risk/transaction-contexts/${process.env.PAYPAL_MERCHANT_ID}/${trackingId}`; - - try { - const request = await axios.put( - url, + const data = { + additional_data: [ { - additional_data: [ - { - key: "user_id", - value: req.session.user.id, - }, - ], + key: "user_id", + value: req.session.user.id, }, - { - headers: { - Authorization: `Bearer ${accessToken}`, - }, - } - ); + ], + }; + + const headers = { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }; + console.log(JSON.stringify({ + url, + data, + headers, + })); + try { + const request = await axios.put(url, data, headers); return res.status(request.status).json({ ok: true,