From c3138a863da873ca714bbf1285175a76b9816a6b Mon Sep 17 00:00:00 2001 From: "web@ppanel" Date: Wed, 12 Mar 2025 21:17:04 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(payment):=20Fix=20payment=20?= =?UTF-8?q?related=20type=20definitions=20and=20update=20payment=20method?= =?UTF-8?q?=20references?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/app/dashboard/order/page.tsx | 2 +- apps/admin/services/admin/index.ts | 2 +- apps/admin/services/admin/typings.d.ts | 31 ++--- apps/admin/services/common/index.ts | 2 +- apps/admin/services/common/typings.d.ts | 27 ++--- apps/user/app/(main)/(user)/payment/page.tsx | 6 +- .../user/app/(main)/purchasing/order/page.tsx | 24 ++-- .../app/(main)/purchasing/order/stripe.tsx | 109 ------------------ .../(user) => components}/payment/stripe.tsx | 12 +- apps/user/package.json | 4 +- apps/user/services/common/index.ts | 2 +- apps/user/services/common/typings.d.ts | 27 ++--- apps/user/services/user/index.ts | 2 +- apps/user/services/user/typings.d.ts | 29 ++--- bun.lockb | Bin 615704 -> 615672 bytes 15 files changed, 88 insertions(+), 191 deletions(-) delete mode 100644 apps/user/app/(main)/purchasing/order/stripe.tsx rename apps/user/{app/(main)/(user) => components}/payment/stripe.tsx (95%) diff --git a/apps/admin/app/dashboard/order/page.tsx b/apps/admin/app/dashboard/order/page.tsx index 373ad5b..a52803f 100644 --- a/apps/admin/app/dashboard/order/page.tsx +++ b/apps/admin/app/dashboard/order/page.tsx @@ -116,7 +116,7 @@ export default function Page(props: any) { diff --git a/apps/admin/services/admin/index.ts b/apps/admin/services/admin/index.ts index f9e3438..37cdd29 100644 --- a/apps/admin/services/admin/index.ts +++ b/apps/admin/services/admin/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as ads from './ads'; diff --git a/apps/admin/services/admin/typings.d.ts b/apps/admin/services/admin/typings.d.ts index 72cceb8..286059b 100644 --- a/apps/admin/services/admin/typings.d.ts +++ b/apps/admin/services/admin/typings.d.ts @@ -224,7 +224,7 @@ declare namespace API { coupon_discount?: number; commission: number; fee_amount: number; - method?: string; + payment_id: number; trade_no?: string; status?: number; subscribe_id?: number; @@ -493,7 +493,7 @@ declare namespace API { }; type GetAvailablePaymentMethodsResponse = { - list: PaymenMethod[]; + list: PaymentMethod[]; }; type GetCouponListParams = { @@ -921,7 +921,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; - method: string; + payment: PaymentMethod; fee_amount: number; trade_no: string; status: number; @@ -943,6 +943,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; + payment: PaymentMethod; method: string; fee_amount: number; trade_no: string; @@ -961,17 +962,6 @@ declare namespace API { list?: OrdersStatistics[]; }; - type PaymenMethod = { - id: number; - name: string; - platform: string; - description: string; - icon: string; - fee_mode: number; - fee_percent: number; - fee_amount: number; - }; - type PaymentConfig = { id: number; name: string; @@ -986,6 +976,17 @@ declare namespace API { enable: boolean; }; + type PaymentMethod = { + id: number; + name: string; + platform: string; + description: string; + icon: string; + fee_mode: number; + fee_percent: number; + fee_amount: number; + }; + type PaymentMethodDetail = { id: number; name: string; @@ -1520,7 +1521,7 @@ declare namespace API { type UpdateOrderStatusRequest = { id: number; status: number; - method?: string; + payment_id?: number; trade_no?: string; }; diff --git a/apps/admin/services/common/index.ts b/apps/admin/services/common/index.ts index 73b3bda..61ba129 100644 --- a/apps/admin/services/common/index.ts +++ b/apps/admin/services/common/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as auth from './auth'; diff --git a/apps/admin/services/common/typings.d.ts b/apps/admin/services/common/typings.d.ts index e91d415..9b3c09c 100644 --- a/apps/admin/services/common/typings.d.ts +++ b/apps/admin/services/common/typings.d.ts @@ -195,7 +195,7 @@ declare namespace API { }; type GetAvailablePaymentMethodsResponse = { - list: PaymenMethod[]; + list: PaymentMethod[]; }; type GetGlobalConfigResponse = { @@ -328,7 +328,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; - method: string; + payment: PaymentMethod; fee_amount: number; trade_no: string; status: number; @@ -350,6 +350,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; + payment: PaymentMethod; method: string; fee_amount: number; trade_no: string; @@ -360,17 +361,6 @@ declare namespace API { updated_at: number; }; - type PaymenMethod = { - id: number; - name: string; - platform: string; - description: string; - icon: string; - fee_mode: number; - fee_percent: number; - fee_amount: number; - }; - type PaymentConfig = { id: number; name: string; @@ -385,6 +375,17 @@ declare namespace API { enable: boolean; }; + type PaymentMethod = { + id: number; + name: string; + platform: string; + description: string; + icon: string; + fee_mode: number; + fee_percent: number; + fee_amount: number; + }; + type PaymentMethodDetail = { id: number; name: string; diff --git a/apps/user/app/(main)/(user)/payment/page.tsx b/apps/user/app/(main)/(user)/payment/page.tsx index 5075d24..efa3a7e 100644 --- a/apps/user/app/(main)/(user)/payment/page.tsx +++ b/apps/user/app/(main)/(user)/payment/page.tsx @@ -1,6 +1,7 @@ 'use client'; import { Display } from '@/components/display'; +import StripePayment from '@/components/payment/stripe'; import { SubscribeBilling } from '@/components/subscribe/billing'; import { SubscribeDetail } from '@/components/subscribe/detail'; import useGlobalStore from '@/config/use-global'; @@ -25,7 +26,6 @@ import { useTranslations } from 'next-intl'; import Link from 'next/link'; import { QRCodeCanvas } from 'qrcode.react'; import { useEffect, useState } from 'react'; -import StripePayment from './stripe'; export default function Page() { const t = useTranslations('order'); @@ -106,7 +106,7 @@ export default function Page() {
- {data?.method && {data?.method}} + {data?.payment.name || data?.payment.platform}
@@ -223,7 +223,7 @@ export default function Page() { )} - {data?.status === 1 && payment?.type === 'Stripe' && ( + {data?.status === 1 && payment?.type === 'stripe' && (

{t('waitingForPayment')}

{countdownDisplay}

diff --git a/apps/user/app/(main)/purchasing/order/page.tsx b/apps/user/app/(main)/purchasing/order/page.tsx index 1e3096f..8a53187 100644 --- a/apps/user/app/(main)/purchasing/order/page.tsx +++ b/apps/user/app/(main)/purchasing/order/page.tsx @@ -1,6 +1,7 @@ 'use client'; import { Display } from '@/components/display'; +import StripePayment from '@/components/payment/stripe'; import { SubscribeBilling } from '@/components/subscribe/billing'; import { SubscribeDetail } from '@/components/subscribe/detail'; import useGlobalStore from '@/config/use-global'; @@ -25,7 +26,6 @@ import { useTranslations } from 'next-intl'; import Link from 'next/link'; import { QRCodeCanvas } from 'qrcode.react'; import { useEffect, useState } from 'react'; -import StripePayment from './stripe'; export default function Page() { const t = useTranslations('order'); @@ -111,7 +111,7 @@ export default function Page() {
- {data?.payment && {t(`methods.${data?.payment}`)}} + {data?.payment.name || data?.payment.platform}
@@ -228,19 +228,19 @@ export default function Page() {
)} - {data?.status === 1 && payment?.type === 'stripe' && ( + {data?.status === 1 && payment?.type === 'Stripe' && (
-

{t('scanToPay')}

+

{t('waitingForPayment')}

{countdownDisplay}

{payment.stripe && } -
- - -
+ {/*
+ + +
*/}
)} diff --git a/apps/user/app/(main)/purchasing/order/stripe.tsx b/apps/user/app/(main)/purchasing/order/stripe.tsx deleted file mode 100644 index 62f5741..0000000 --- a/apps/user/app/(main)/purchasing/order/stripe.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { Elements, useStripe } from '@stripe/react-stripe-js'; -import { loadStripe, PaymentIntentResult } from '@stripe/stripe-js'; -import { QRCodeCanvas } from 'qrcode.react'; -import React, { useCallback, useEffect, useMemo, useState } from 'react'; - -interface StripePaymentProps { - method: string; - client_secret: string; - publishable_key: string; -} - -const StripePayment: React.FC = ({ - method, - client_secret, - publishable_key, -}) => { - const stripePromise = useMemo(() => loadStripe(publishable_key), [publishable_key]); - - return ( - - - - ); -}; - -const CheckoutForm: React.FC> = ({ - client_secret, - method, -}) => { - const stripe = useStripe(); - const [errorMessage, setErrorMessage] = useState(null); - const [qrCodeUrl, setQrCodeUrl] = useState(null); - const [isSubmitted, setIsSubmitted] = useState(false); - - const handleError = useCallback((message: string) => { - setErrorMessage(message); - setIsSubmitted(false); - }, []); - - const confirmPayment = useCallback(async (): Promise => { - if (!stripe) { - handleError('Stripe.js is not loaded.'); - return null; - } - - if (method === 'alipay') { - return await stripe.confirmAlipayPayment( - client_secret, - { return_url: window.location.href }, - { handleActions: false }, - ); - } - - return await stripe.confirmWechatPayPayment( - client_secret, - { - payment_method_options: { wechat_pay: { client: 'web' } }, - }, - { handleActions: false }, - ); - }, [client_secret, method, stripe, handleError]); - - const autoSubmit = useCallback(async () => { - if (isSubmitted) return; - - setIsSubmitted(true); - - try { - const result = await confirmPayment(); - if (!result) return; - - const { error, paymentIntent } = result; - if (error) return handleError(error.message!); - - if (paymentIntent?.status === 'requires_action') { - const nextAction = paymentIntent.next_action as any; - const qrUrl = - method === 'alipay' - ? nextAction?.alipay_handle_redirect?.url - : nextAction?.wechat_pay_display_qr_code?.image_url_svg; - - setQrCodeUrl(qrUrl || null); - } - } catch (error) { - handleError('An unexpected error occurred'); - } - }, [confirmPayment, isSubmitted, handleError, method]); - - useEffect(() => { - autoSubmit(); - }, [autoSubmit]); - - return qrCodeUrl ? ( - - ) : ( - errorMessage - ); -}; - -export default StripePayment; diff --git a/apps/user/app/(main)/(user)/payment/stripe.tsx b/apps/user/components/payment/stripe.tsx similarity index 95% rename from apps/user/app/(main)/(user)/payment/stripe.tsx rename to apps/user/components/payment/stripe.tsx index f1eb134..99028be 100644 --- a/apps/user/app/(main)/(user)/payment/stripe.tsx +++ b/apps/user/components/payment/stripe.tsx @@ -145,9 +145,9 @@ const CardPaymentForm: React.FC = ({ clientSecret, onError value={cardholderName} onChange={(e) => setCardholderName(e.target.value)} placeholder={t('name_placeholder')} - className={errors.name ? 'border-red-500' : ''} + className={errors.name ? 'border-destructive' : ''} /> - {errors.name &&

{errors.name}

} + {errors.name &&

{errors.name}

} {/* Card Number */} @@ -166,7 +166,7 @@ const CardPaymentForm: React.FC = ({ clientSecret, onError /> - {errors.cardNumber &&

{errors.cardNumber}

} + {errors.cardNumber &&

{errors.cardNumber}

}
@@ -184,7 +184,9 @@ const CardPaymentForm: React.FC = ({ clientSecret, onError onChange={(e) => handleChange(e, 'cardExpiry')} />
- {errors.cardExpiry &&

{errors.cardExpiry}

} + {errors.cardExpiry && ( +

{errors.cardExpiry}

+ )} {/* Security Code */} @@ -201,7 +203,7 @@ const CardPaymentForm: React.FC = ({ clientSecret, onError onChange={(e) => handleChange(e, 'cardCvc')} /> - {errors.cardCvc &&

{errors.cardCvc}

} + {errors.cardCvc &&

{errors.cardCvc}

} diff --git a/apps/user/package.json b/apps/user/package.json index 4a562e1..676025c 100644 --- a/apps/user/package.json +++ b/apps/user/package.json @@ -10,8 +10,8 @@ "start": "next start" }, "dependencies": { - "@stripe/react-stripe-js": "^3.1.1", - "@stripe/stripe-js": "^5.5.0", + "@stripe/react-stripe-js": "^3.4.0", + "@stripe/stripe-js": "^6.0.0", "@tanstack/react-query": "^5.63.0", "@tanstack/react-query-next-experimental": "^5.63.0", "@workspace/ui": "workspace:*", diff --git a/apps/user/services/common/index.ts b/apps/user/services/common/index.ts index 73b3bda..61ba129 100644 --- a/apps/user/services/common/index.ts +++ b/apps/user/services/common/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as auth from './auth'; diff --git a/apps/user/services/common/typings.d.ts b/apps/user/services/common/typings.d.ts index e91d415..9b3c09c 100644 --- a/apps/user/services/common/typings.d.ts +++ b/apps/user/services/common/typings.d.ts @@ -195,7 +195,7 @@ declare namespace API { }; type GetAvailablePaymentMethodsResponse = { - list: PaymenMethod[]; + list: PaymentMethod[]; }; type GetGlobalConfigResponse = { @@ -328,7 +328,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; - method: string; + payment: PaymentMethod; fee_amount: number; trade_no: string; status: number; @@ -350,6 +350,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; + payment: PaymentMethod; method: string; fee_amount: number; trade_no: string; @@ -360,17 +361,6 @@ declare namespace API { updated_at: number; }; - type PaymenMethod = { - id: number; - name: string; - platform: string; - description: string; - icon: string; - fee_mode: number; - fee_percent: number; - fee_amount: number; - }; - type PaymentConfig = { id: number; name: string; @@ -385,6 +375,17 @@ declare namespace API { enable: boolean; }; + type PaymentMethod = { + id: number; + name: string; + platform: string; + description: string; + icon: string; + fee_mode: number; + fee_percent: number; + fee_amount: number; + }; + type PaymentMethodDetail = { id: number; name: string; diff --git a/apps/user/services/user/index.ts b/apps/user/services/user/index.ts index f988131..12fe8d0 100644 --- a/apps/user/services/user/index.ts +++ b/apps/user/services/user/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as announcement from './announcement'; diff --git a/apps/user/services/user/typings.d.ts b/apps/user/services/user/typings.d.ts index f73f042..93a654e 100644 --- a/apps/user/services/user/typings.d.ts +++ b/apps/user/services/user/typings.d.ts @@ -204,7 +204,7 @@ declare namespace API { }; type GetAvailablePaymentMethodsResponse = { - list: PaymenMethod[]; + list: PaymentMethod[]; }; type GetLoginLogParams = { @@ -354,7 +354,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; - method: string; + payment: PaymentMethod; fee_amount: number; trade_no: string; status: number; @@ -376,6 +376,7 @@ declare namespace API { coupon: string; coupon_discount: number; commission?: number; + payment: PaymentMethod; method: string; fee_amount: number; trade_no: string; @@ -386,17 +387,6 @@ declare namespace API { updated_at: number; }; - type PaymenMethod = { - id: number; - name: string; - platform: string; - description: string; - icon: string; - fee_mode: number; - fee_percent: number; - fee_amount: number; - }; - type PaymentConfig = { id: number; name: string; @@ -411,6 +401,17 @@ declare namespace API { enable: boolean; }; + type PaymentMethod = { + id: number; + name: string; + platform: string; + description: string; + icon: string; + fee_mode: number; + fee_percent: number; + fee_amount: number; + }; + type PaymentMethodDetail = { id: number; name: string; @@ -588,7 +589,7 @@ declare namespace API { coupon: string; coupon_discount: number; fee_amount: number; - payment: string; + payment: PaymentMethod; status: number; created_at: number; token?: string; diff --git a/bun.lockb b/bun.lockb index 71fc117f8e1c47ee02e6ae1403a656dfa1011038..0037f43d3bed30318e398d7d80e14be707f3e1b5 100755 GIT binary patch delta 546 zcmbPnO7+J{)d_lvb0QDxUNsATs1(28ZRfImcl)zW@Ep6O)BbzY0ZyNv3zRZ8`Zwxv zPP@p+Aj81W;NE;wZ~IL>#_jVN*(P7iG@pLr93#)&NJFE7PWI;U<6{O?VJ~wk3={)ACGR>5x(k5ljKjo56fDdg{}VXeJ-#3 zJif2|vd70>pP;MD)mh^T--cvH^Rn@F7&3Tzw1us<=hZ!09%pRK^maP0CX0l_vs`_< zU8><(o7i_vm(~3Cgv8;q_C)M@pvwtjE&D^LndB>~M&$?#b zS^nPTfWlqIFpd&~?Wvk9)uoJ^+8@qi+5T`I>;ERMqpS=J3z!)g<}+`9rN}0KSlUF- z0LT+zWDo>;>LQz-J^yiYZY9PzGd+XtDo@$=EEY$X6kwDBh5`R{en)muR!tyNVEVdX=56p`M9}o}q$`IZ(g=$Ticm&@)i5F*2B5|A<|FS|kVi_Sp%X<&2yP zNt_HI;4xh~iPM*J0+idZy)cPWpOI@rGDP}C@^qObpe^T;IjuMiQXqmE+XYiN*%<+D Cc*Xbt delta 549 zcmexyQgy~D)d_lvGd^9+u{u;fH*4M8)iX;!9xDskJH@$PbmrWXZb5n<{C;+9^l#MT z+;)+XL56{$A-(yg-u9b%jN9ikvQD0uV?O=FIYyqzBFQFb$OUH1qoS5KQhclsai@VMrQ_l$pjG3XYVvq7Qxs50*s;RQ>l^J=n4IQ*D% zLyT2vZ@}+KT{FTrJ=2S>t-NrCnW_D4MI=LEfKlJsN`ZYZY&&N%ZeD)7s4;!@dG6c; zK~IGRS3cUnx5sYjx9zE#EY+oqm)alBW7+<29_#-mt_92t4D*5bDC_oDifr