From 5aed336c962f5e3174d0d8c7864a2059c227957c Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 27 May 2024 11:02:11 +0100 Subject: [PATCH 1/5] Added a log --- src/pages/api/paymob/webhook.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/api/paymob/webhook.ts b/src/pages/api/paymob/webhook.ts index 749dbd68..93830a3f 100644 --- a/src/pages/api/paymob/webhook.ts +++ b/src/pages/api/paymob/webhook.ts @@ -22,6 +22,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const transactionResult = req.body as TransactionResult; const authToken = await authenticatePaymob(); + console.log("WEBHOOK: ", transactionResult); if (!checkTransaction(authToken, transactionResult.transaction.order.id)) return res.status(404).json({ok: false}); if (!transactionResult.transaction.success) return res.status(200).json({ok: false}); From 9e651358d5b05d0fba03ae49d234214322fa3b24 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 27 May 2024 12:16:08 +0100 Subject: [PATCH 2/5] Updated the code to return a 400 when it is not a success --- src/pages/api/paymob/webhook.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/api/paymob/webhook.ts b/src/pages/api/paymob/webhook.ts index 93830a3f..a5e7d580 100644 --- a/src/pages/api/paymob/webhook.ts +++ b/src/pages/api/paymob/webhook.ts @@ -24,7 +24,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { console.log("WEBHOOK: ", transactionResult); if (!checkTransaction(authToken, transactionResult.transaction.order.id)) return res.status(404).json({ok: false}); - if (!transactionResult.transaction.success) return res.status(200).json({ok: false}); + if (!transactionResult.transaction.success) return res.status(400).json({ok: false}); const {userID, duration, duration_unit} = transactionResult.intention.extras.creation_extras as { userID: string; From 1f8e9106de53f3484f67384a0fc0b4e2725859e8 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 27 May 2024 12:19:25 +0100 Subject: [PATCH 3/5] Updated the code to set the expiry date to the end of the day --- src/pages/api/paymob/webhook.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/api/paymob/webhook.ts b/src/pages/api/paymob/webhook.ts index a5e7d580..acf2bdf5 100644 --- a/src/pages/api/paymob/webhook.ts +++ b/src/pages/api/paymob/webhook.ts @@ -43,7 +43,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const initialDate = moment(subscriptionExpirationDate).isAfter(moment()) ? moment(subscriptionExpirationDate) : moment(); - const updatedSubscriptionExpirationDate = moment(initialDate).add(duration, duration_unit).toISOString(); + const updatedSubscriptionExpirationDate = moment(initialDate).add(duration, duration_unit).endOf("day").toISOString(); await setDoc(userSnapshot.ref, {subscriptionExpirationDate: updatedSubscriptionExpirationDate}, {merge: true}); await setDoc(doc(db, "paypalpayments", v4()), { From 4166781f7e73175ff324bb320e2592dd348ef409 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 27 May 2024 13:05:38 +0100 Subject: [PATCH 4/5] Improved some issues with the payment --- src/components/PaymobPayment.tsx | 1 + src/pages/(status)/PaymentDue.tsx | 5 +- src/pages/api/paymob/index.ts | 7 ++- src/pages/api/paymob/webhook.ts | 2 +- src/pages/index.tsx | 14 ++---- src/pages/payment.tsx | 81 +++++++++++++------------------ 6 files changed, 47 insertions(+), 63 deletions(-) diff --git a/src/components/PaymobPayment.tsx b/src/components/PaymobPayment.tsx index 47cec9d6..6ff8b578 100644 --- a/src/components/PaymobPayment.tsx +++ b/src/components/PaymobPayment.tsx @@ -20,6 +20,7 @@ interface Props { export default function PaymobPayment({user, price, setIsPaymentLoading, currency, duration, duration_unit, onSuccess}: Props) { const [isLoading, setIsLoading] = useState(false); + console.log(user.id); const router = useRouter(); diff --git a/src/pages/(status)/PaymentDue.tsx b/src/pages/(status)/PaymentDue.tsx index 2d47a4c6..caf6496c 100644 --- a/src/pages/(status)/PaymentDue.tsx +++ b/src/pages/(status)/PaymentDue.tsx @@ -18,11 +18,10 @@ import PaymobPayment from "@/components/PaymobPayment"; interface Props { user: User; hasExpired?: boolean; - clientID: string; reload: () => void; } -export default function PaymentDue({user, hasExpired = false, clientID, reload}: Props) { +export default function PaymentDue({user, hasExpired = false, reload}: Props) { const [isLoading, setIsLoading] = useState(false); const [appliedDiscount, setAppliedDiscount] = useState(0); @@ -136,7 +135,6 @@ export default function PaymentDue({user, hasExpired = false, clientID, reload}: )} { @@ -176,7 +174,6 @@ export default function PaymentDue({user, hasExpired = false, clientID, reload}: {user.corporateInformation.payment.value} {user.corporateInformation.payment.currency} ( "https://oman.paymob.com/v1/intention/", - {...intention, payment_methods: [parseInt(process.env.PAYMOB_INTEGRATION_ID || "0")], items: []}, + { + ...intention, + payment_methods: [parseInt(process.env.PAYMOB_INTEGRATION_ID || "0")], + items: [], + extras: {...intention.extras, userID: req.session.user!.id}, + } as PaymentIntention, {headers: {Authorization: `Token ${process.env.PAYMOB_SECRET_KEY}`}}, ); const intentionResult = response.data; diff --git a/src/pages/api/paymob/webhook.ts b/src/pages/api/paymob/webhook.ts index acf2bdf5..8a54b75f 100644 --- a/src/pages/api/paymob/webhook.ts +++ b/src/pages/api/paymob/webhook.ts @@ -43,7 +43,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const initialDate = moment(subscriptionExpirationDate).isAfter(moment()) ? moment(subscriptionExpirationDate) : moment(); - const updatedSubscriptionExpirationDate = moment(initialDate).add(duration, duration_unit).endOf("day").toISOString(); + const updatedSubscriptionExpirationDate = moment(initialDate).add(duration, duration_unit).endOf("day").subtract(2, "hours").toISOString(); await setDoc(userSnapshot.ref, {subscriptionExpirationDate: updatedSubscriptionExpirationDate}, {merge: true}); await setDoc(doc(db, "paypalpayments", v4()), { diff --git a/src/pages/index.tsx b/src/pages/index.tsx index b74662b4..bd3365ea 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -49,7 +49,7 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => { redirect: { destination: "/login", permanent: false, - } + }, }; } @@ -63,7 +63,7 @@ interface Props { envVariables: {[key: string]: string}; } export default function Home(props: Props) { - const { envVariables} = props; + const {envVariables} = props; const [showDiagnostics, setShowDiagnostics] = useState(false); const [showDemographicInput, setShowDemographicInput] = useState(false); const [selectedScreen, setSelectedScreen] = useState("admin"); @@ -112,15 +112,7 @@ export default function Home(props: Props) { )} - {(user.status === "paymentDue" || checkIfUserExpired()) && ( - - )} + {(user.status === "paymentDue" || checkIfUserExpired()) && } ); } diff --git a/src/pages/payment.tsx b/src/pages/payment.tsx index f249b1c6..bc2984f3 100644 --- a/src/pages/payment.tsx +++ b/src/pages/payment.tsx @@ -1,62 +1,51 @@ /* eslint-disable @next/next/no-img-element */ import Head from "next/head"; -import { withIronSessionSsr } from "iron-session/next"; -import { sessionOptions } from "@/lib/session"; +import {withIronSessionSsr} from "iron-session/next"; +import {sessionOptions} from "@/lib/session"; import useUser from "@/hooks/useUser"; import PaymentDue from "./(status)/PaymentDue"; -import { useRouter } from "next/router"; +import {useRouter} from "next/router"; -export const getServerSideProps = withIronSessionSsr(({ req, res }) => { - const user = req.session.user; +export const getServerSideProps = withIronSessionSsr(({req, res}) => { + const user = req.session.user; - const envVariables: { [key: string]: string } = {}; - Object.keys(process.env) - .filter((x) => x.startsWith("NEXT_PUBLIC")) - .forEach((x: string) => { - envVariables[x] = process.env[x]!; - }); + const envVariables: {[key: string]: string} = {}; + Object.keys(process.env) + .filter((x) => x.startsWith("NEXT_PUBLIC")) + .forEach((x: string) => { + envVariables[x] = process.env[x]!; + }); - if (!user || !user.isVerified) { - return { + if (!user || !user.isVerified) { + return { redirect: { destination: "/login", permanent: false, - } + }, }; - } + } - return { - props: { user: req.session.user, envVariables }, - }; + return { + props: {user: req.session.user, envVariables}, + }; }, sessionOptions); -export default function Home({ - envVariables, -}: { - envVariables: { [key: string]: string }; -}) { - const { user } = useUser({ redirectTo: "/login" }); - const router = useRouter(); +export default function Home({envVariables}: {envVariables: {[key: string]: string}}) { + const {user} = useUser({redirectTo: "/login"}); + const router = useRouter(); - return ( - <> - - EnCoach - - - - - {user && ( - - )} - - ); + return ( + <> + + EnCoach + + + + + {user && } + + ); } From bdd862c63301506bc5f76e2c632d3f48fcd1af91 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 27 May 2024 13:08:11 +0100 Subject: [PATCH 5/5] Updated the state to be active on payment --- src/pages/api/paymob/webhook.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/api/paymob/webhook.ts b/src/pages/api/paymob/webhook.ts index 8a54b75f..b4cf1bb4 100644 --- a/src/pages/api/paymob/webhook.ts +++ b/src/pages/api/paymob/webhook.ts @@ -45,7 +45,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const updatedSubscriptionExpirationDate = moment(initialDate).add(duration, duration_unit).endOf("day").subtract(2, "hours").toISOString(); - await setDoc(userSnapshot.ref, {subscriptionExpirationDate: updatedSubscriptionExpirationDate}, {merge: true}); + await setDoc(userSnapshot.ref, {subscriptionExpirationDate: updatedSubscriptionExpirationDate, status: "active"}, {merge: true}); await setDoc(doc(db, "paypalpayments", v4()), { createdAt: new Date().toISOString(), currency: transactionResult.transaction.currency, @@ -65,10 +65,16 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const participants = (await Promise.all( groups.flatMap((x) => x.participants).map(async (x) => ({...(await getDoc(doc(db, "users", x))).data(), id: x})), )) as User[]; - const sameExpiryDateParticipants = participants.filter((x) => x.subscriptionExpirationDate === subscriptionExpirationDate); + const sameExpiryDateParticipants = participants.filter( + (x) => x.subscriptionExpirationDate === subscriptionExpirationDate && x.status !== "disabled", + ); for (const participant of sameExpiryDateParticipants) { - await setDoc(doc(db, "users", participant.id), {subscriptionExpirationDate: updatedSubscriptionExpirationDate}, {merge: true}); + await setDoc( + doc(db, "users", participant.id), + {subscriptionExpirationDate: updatedSubscriptionExpirationDate, status: "active"}, + {merge: true}, + ); } }