Minor imporvements and logs

This commit is contained in:
Joao Ramos
2024-03-06 18:59:11 +00:00
parent 8e1fe15a24
commit 87a1d7c288
3 changed files with 113 additions and 97 deletions

View File

@@ -42,16 +42,14 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
if (!trackingId) if (!trackingId)
return res.status(401).json({ ok: false, reason: "Missing tracking id!" }); return res.status(401).json({ ok: false, reason: "Missing tracking id!" });
const request = await axios.post( const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders/${id}/capture`;
`${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders/${id}/capture`, const headers = {
{}, headers: {
{ Authorization: `Bearer ${accessToken}`,
headers: { "PayPal-Client-Metadata-Id": trackingId,
Authorization: `Bearer ${accessToken}`, },
"PayPal-Client-Metadata-Id": trackingId, };
}, const request = await axios.post(url, {}, headers);
}
);
if (request.data.status === "COMPLETED") { if (request.data.status === "COMPLETED") {
const user = req.session.user; const user = req.session.user;
@@ -73,25 +71,24 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
}, },
{ merge: true } { merge: true }
); );
try { try {
await setDoc( await setDoc(doc(db, "paypalpayments", v4()), {
doc(db, 'paypalpayments', v4()), orderId: id,
{ userId: req.session.user.id,
orderId: id, status: request.data.status,
userId: req.session.user.id, createdAt: new Date().toISOString(),
status: request.data.status, value: request.data.purchase_units[0].payments.captures[0].amount.value,
createdAt: new Date().toISOString(), currency:
value: request.data.purchase_units[0].payments.captures[0].amount.value, request.data.purchase_units[0].payments.captures[0].amount
currency: request.data.purchase_units[0].payments.captures[0].amount.currency_code, .currency_code,
subscriptionDuration: duration, subscriptionDuration: duration,
subscriptionDurationUnit: duration_unit, subscriptionDurationUnit: duration_unit,
subscriptionExpirationDate: updatedExpirationDate.toISOString(), subscriptionExpirationDate: updatedExpirationDate.toISOString(),
} });
); } catch (err) {
} catch(err) { console.error("Failed to insert paypal payment!", err);
console.error('Failed to insert paypal payment!', err); }
}
if (user.type === "corporate") { if (user.type === "corporate") {
const snapshot = await getDocs(collection(db, "groups")); 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 }); return res.status(200).json({ ok: true });
} }
res res.status(404).json({
.status(404) ok: false,
.json({ reason: "Order ID not found or purchase was not approved!",
ok: false, });
reason: "Order ID not found or purchase was not approved!",
});
} }

View File

@@ -1,62 +1,80 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction // Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type {NextApiRequest, NextApiResponse} from "next"; import type { NextApiRequest, NextApiResponse } from "next";
import {app} from "@/firebase"; import { app } from "@/firebase";
import {getFirestore, collection, getDocs} from "firebase/firestore"; import { getFirestore, collection, getDocs } from "firebase/firestore";
import {withIronSessionApiRoute} from "iron-session/next"; import { withIronSessionApiRoute } from "iron-session/next";
import {sessionOptions} from "@/lib/session"; import { sessionOptions } from "@/lib/session";
import axios from "axios"; import axios from "axios";
import {v4} from "uuid"; import { v4 } from "uuid";
import {OrderResponseBody} from "@paypal/paypal-js"; import { OrderResponseBody } from "@paypal/paypal-js";
import {getAccessToken} from "@/utils/paypal"; import { getAccessToken } from "@/utils/paypal";
const db = getFirestore(app); const db = getFirestore(app);
export default withIronSessionApiRoute(handler, sessionOptions); export default withIronSessionApiRoute(handler, sessionOptions);
async function handler(req: NextApiRequest, res: NextApiResponse) { async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "POST") return res.status(404).json({ok: false, reason: "Method not supported!"}); if (req.method !== "POST")
if (!req.session.user) return res.status(401).json({ok: false}); 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(); const accessToken = await getAccessToken();
if (!accessToken) return res.status(401).json({ok: false, reason: "Authorization failed!"}); 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<OrderResponseBody>( const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders`;
`${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders`,
{ const data = {
purchase_units: [ purchase_units: [
{ {
amount: { invoice_id: `INV-${v4()}`,
currency_code: currencyCode, amount: {
value: price.toString(), currency_code: currencyCode,
}, value: price.toString(),
reference_id: v4(), },
}, reference_id: v4(),
], },
payment_source: { ],
paypal: { payment_source: {
email_address: req.session.user.email || "", paypal: {
experience_context: { email_address: req.session.user.email || "",
payment_method_preference: "IMMEDIATE_PAYMENT_REQUIRED", experience_context: {
locale: "en-US", payment_method_preference: "IMMEDIATE_PAYMENT_REQUIRED",
landing_page: "LOGIN", locale: "en-US",
shipping_preference: "NO_SHIPPING", landing_page: "LOGIN",
user_action: "PAY_NOW", shipping_preference: "NO_SHIPPING",
}, user_action: "PAY_NOW",
brand_name: "Encoach",
}, },
}, },
intent: "CAPTURE", },
}, intent: "CAPTURE",
{ };
headers: {
Authorization: `Bearer ${accessToken}`,
'PayPal-Client-Metadata-Id': trackingId,
},
},
);
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<OrderResponseBody>(url, data, headers);
res.status(request.status).json(request.data);
} }

View File

@@ -26,24 +26,27 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
const trackingId = `${req.session.user.id}-${Date.now()}`; 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}`; const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v1/risk/transaction-contexts/${process.env.PAYPAL_MERCHANT_ID}/${trackingId}`;
const data = {
try { additional_data: [
const request = await axios.put(
url,
{ {
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({ return res.status(request.status).json({
ok: true, ok: true,