fix: PC 端易支付优先显示二维码;订单页移除 user_id 依赖改用 token
- PaymentQRCode: PC 端有 qrCode 时不跳转,优先展示二维码 - /pay/orders: 移除 user_id 参数,统一通过 token 认证 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -20,7 +20,6 @@ interface Summary {
|
|||||||
|
|
||||||
function OrdersContent() {
|
function OrdersContent() {
|
||||||
const searchParams = useSearchParams();
|
const searchParams = useSearchParams();
|
||||||
const userId = Number(searchParams.get('user_id'));
|
|
||||||
const token = (searchParams.get('token') || '').trim();
|
const token = (searchParams.get('token') || '').trim();
|
||||||
const theme = searchParams.get('theme') === 'dark' ? 'dark' : 'light';
|
const theme = searchParams.get('theme') === 'dark' ? 'dark' : 'light';
|
||||||
const uiMode = searchParams.get('ui_mode') || 'standalone';
|
const uiMode = searchParams.get('ui_mode') || 'standalone';
|
||||||
@@ -43,7 +42,6 @@ function OrdersContent() {
|
|||||||
|
|
||||||
const isEmbedded = uiMode === 'embedded' && isIframeContext;
|
const isEmbedded = uiMode === 'embedded' && isIframeContext;
|
||||||
const hasToken = token.length > 0;
|
const hasToken = token.length > 0;
|
||||||
const effectiveUserId = resolvedUserId || userId;
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (typeof window === 'undefined') return;
|
if (typeof window === 'undefined') return;
|
||||||
@@ -54,7 +52,6 @@ function OrdersContent() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isMobile || isEmbedded || typeof window === 'undefined') return;
|
if (!isMobile || isEmbedded || typeof window === 'undefined') return;
|
||||||
const params = new URLSearchParams();
|
const params = new URLSearchParams();
|
||||||
if (userId && !Number.isNaN(userId)) params.set('user_id', String(userId));
|
|
||||||
if (token) params.set('token', token);
|
if (token) params.set('token', token);
|
||||||
params.set('theme', theme);
|
params.set('theme', theme);
|
||||||
params.set('ui_mode', uiMode);
|
params.set('ui_mode', uiMode);
|
||||||
@@ -67,15 +64,9 @@ function OrdersContent() {
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
setError('');
|
setError('');
|
||||||
try {
|
try {
|
||||||
if (!userId || Number.isNaN(userId) || userId <= 0) {
|
|
||||||
setError('无效的用户 ID');
|
|
||||||
setOrders([]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!hasToken) {
|
if (!hasToken) {
|
||||||
setUserInfo({ id: userId, username: `用户 #${userId}` });
|
|
||||||
setOrders([]);
|
setOrders([]);
|
||||||
setError('当前链接未携带登录 token,无法查询"我的订单"。');
|
setError('缺少认证信息,请从 Sub2API 平台正确访问订单页面。');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,11 +88,11 @@ function OrdersContent() {
|
|||||||
if (Number.isInteger(meId) && meId > 0) setResolvedUserId(meId);
|
if (Number.isInteger(meId) && meId > 0) setResolvedUserId(meId);
|
||||||
|
|
||||||
setUserInfo({
|
setUserInfo({
|
||||||
id: Number.isInteger(meId) && meId > 0 ? meId : userId,
|
id: Number.isInteger(meId) && meId > 0 ? meId : undefined,
|
||||||
username:
|
username:
|
||||||
(typeof meUser.displayName === 'string' && meUser.displayName.trim()) ||
|
(typeof meUser.displayName === 'string' && meUser.displayName.trim()) ||
|
||||||
(typeof meUser.username === 'string' && meUser.username.trim()) ||
|
(typeof meUser.username === 'string' && meUser.username.trim()) ||
|
||||||
`用户 #${userId}`,
|
`用户 #${meId}`,
|
||||||
balance: typeof meUser.balance === 'number' ? meUser.balance : 0,
|
balance: typeof meUser.balance === 'number' ? meUser.balance : 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -121,7 +112,7 @@ function OrdersContent() {
|
|||||||
if (isMobile && !isEmbedded) return;
|
if (isMobile && !isEmbedded) return;
|
||||||
loadOrders(1, pageSize);
|
loadOrders(1, pageSize);
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [userId, token, isMobile, isEmbedded]);
|
}, [token, isMobile, isEmbedded]);
|
||||||
|
|
||||||
const handlePageChange = (newPage: number) => {
|
const handlePageChange = (newPage: number) => {
|
||||||
setPage(newPage);
|
setPage(newPage);
|
||||||
@@ -153,11 +144,11 @@ function OrdersContent() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!effectiveUserId || Number.isNaN(effectiveUserId) || effectiveUserId <= 0) {
|
if (!hasToken && !resolvedUserId) {
|
||||||
return (
|
return (
|
||||||
<div className={`flex min-h-screen items-center justify-center p-4 ${isDark ? 'bg-slate-950' : 'bg-slate-50'}`}>
|
<div className={`flex min-h-screen items-center justify-center p-4 ${isDark ? 'bg-slate-950' : 'bg-slate-50'}`}>
|
||||||
<div className="text-center text-red-500">
|
<div className="text-center text-red-500">
|
||||||
<p className="text-lg font-medium">无效的用户 ID</p>
|
<p className="text-lg font-medium">缺少认证信息</p>
|
||||||
<p className="mt-2 text-sm text-gray-500">请从 Sub2API 平台正确访问订单页面</p>
|
<p className="mt-2 text-sm text-gray-500">请从 Sub2API 平台正确访问订单页面</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -166,7 +157,6 @@ function OrdersContent() {
|
|||||||
|
|
||||||
const buildScopedUrl = (path: string) => {
|
const buildScopedUrl = (path: string) => {
|
||||||
const params = new URLSearchParams();
|
const params = new URLSearchParams();
|
||||||
if (effectiveUserId) params.set('user_id', String(effectiveUserId));
|
|
||||||
if (token) params.set('token', token);
|
if (token) params.set('token', token);
|
||||||
params.set('theme', theme);
|
params.set('theme', theme);
|
||||||
params.set('ui_mode', uiMode);
|
params.set('ui_mode', uiMode);
|
||||||
@@ -178,7 +168,7 @@ function OrdersContent() {
|
|||||||
isDark={isDark}
|
isDark={isDark}
|
||||||
isEmbedded={isEmbedded}
|
isEmbedded={isEmbedded}
|
||||||
title="我的订单"
|
title="我的订单"
|
||||||
subtitle={userInfo?.username || `用户 #${effectiveUserId}`}
|
subtitle={userInfo?.username || '我的订单'}
|
||||||
actions={
|
actions={
|
||||||
<>
|
<>
|
||||||
<button type="button" onClick={() => loadOrders(page, pageSize)} className={btnClass}>
|
<button type="button" onClick={() => loadOrders(page, pageSize)} className={btnClass}>
|
||||||
|
|||||||
@@ -77,8 +77,8 @@ export default function PaymentQRCode({
|
|||||||
const [popupBlocked, setPopupBlocked] = useState(false);
|
const [popupBlocked, setPopupBlocked] = useState(false);
|
||||||
const paymentMethodListenerAdded = useRef(false);
|
const paymentMethodListenerAdded = useRef(false);
|
||||||
|
|
||||||
// 有 payUrl 就直接跳转,不需要确认
|
// PC 端有二维码时优先展示二维码;仅移动端或无二维码时才跳转
|
||||||
const shouldAutoRedirect = !expired && !isStripeType(paymentType) && !!payUrl;
|
const shouldAutoRedirect = !expired && !isStripeType(paymentType) && !!payUrl && (isMobile || !qrCode);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!shouldAutoRedirect || redirected) return;
|
if (!shouldAutoRedirect || redirected) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user