payment info updates

This commit is contained in:
Gerhard Scheikl
2026-05-09 21:05:09 +02:00
parent 35dea965f6
commit 8bc86ef985
2 changed files with 32 additions and 7 deletions
+19 -3
View File
@@ -43,16 +43,28 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
return cors(Response.json({ showPaymentInstructions: false, reason: "no-iban-or-disabled" })); return cors(Response.json({ showPaymentInstructions: false, reason: "no-iban-or-disabled" }));
} }
const { admin } = await unauthenticated.admin(shop);
let orderInfo: OrderInfo | null = null; let orderInfo: OrderInfo | null = null;
try { try {
const { admin } = await unauthenticated.admin(shop);
orderInfo = await fetchOrderInfo(admin, orderGid); orderInfo = await fetchOrderInfo(admin, orderGid);
} catch (err) { } catch (err) {
const msg = (err as Error)?.message ?? String(err);
console.warn(`payment-info: failed to load order ${orderGid} for ${shop}:`, err); console.warn(`payment-info: failed to load order ${orderGid} for ${shop}:`, err);
return cors(Response.json({ showPaymentInstructions: false, error: "order-load-failed" }, { status: 502 })); return cors(
Response.json(
{ showPaymentInstructions: false, error: "order-load-failed", detail: msg.slice(0, 500) },
{ status: 502 },
),
);
} }
if (!orderInfo || !orderInfo.isManual) { if (!orderInfo || !orderInfo.isManual) {
return cors(Response.json({ showPaymentInstructions: false, reason: "not-manual-payment" })); return cors(
Response.json({
showPaymentInstructions: false,
reason: "not-manual-payment",
debug: { shop, orderGid, hasOrder: !!orderInfo, txCount: orderInfo?.txCount ?? 0, manualFlags: orderInfo?.manualFlags ?? [] },
}),
);
} }
const language = pickLanguage(orderInfo.customerLocale ?? settings.defaultLanguage); const language = pickLanguage(orderInfo.customerLocale ?? settings.defaultLanguage);
@@ -113,6 +125,8 @@ interface OrderInfo {
currency: string; currency: string;
orderName: string; orderName: string;
customerLocale?: string; customerLocale?: string;
txCount: number;
manualFlags: Array<{ status?: string; manual?: boolean }>;
} }
async function fetchOrderInfo( async function fetchOrderInfo(
@@ -161,5 +175,7 @@ async function fetchOrderInfo(
currency: o.currencyCode ?? "EUR", currency: o.currencyCode ?? "EUR",
orderName: o.name ?? "", orderName: o.name ?? "",
customerLocale: o.customerLocale ?? undefined, customerLocale: o.customerLocale ?? undefined,
txCount: txs.length,
manualFlags: txs.map((t) => ({ status: t.status, manual: t.manualPaymentGateway })),
}; };
} }
@@ -42,6 +42,7 @@ export default async () => {
function Extension() { function Extension() {
const shopify = (globalThis as any).shopify; const shopify = (globalThis as any).shopify;
const [data, setData] = useState<PaymentInstructions | null>(null); const [data, setData] = useState<PaymentInstructions | null>(null);
const [debug, setDebug] = useState<string>("init");
const [done, setDone] = useState(false); const [done, setDone] = useState(false);
useEffect(() => { useEffect(() => {
@@ -49,21 +50,25 @@ function Extension() {
async function load() { async function load() {
try { try {
const orderId: string | undefined = shopify?.orderConfirmation?.value?.order?.id; const orderId: string | undefined = shopify?.orderConfirmation?.value?.order?.id;
setDebug(`orderId=${orderId ?? "(none)"}`);
if (!orderId) { if (!orderId) {
setDone(true); setDone(true);
return; return;
} }
const token: string = await shopify.sessionToken.get(); const token: string = await shopify.sessionToken.get();
const appUrl = resolveAppUrl(shopify); const appUrl = resolveAppUrl(shopify);
setDebug(`fetch ${appUrl} orderId=${orderId} tokenLen=${token?.length ?? 0}`);
const res = await fetch( const res = await fetch(
`${appUrl}/api/public/payment-info?orderId=${encodeURIComponent(orderId)}`, `${appUrl}/api/public/payment-info?orderId=${encodeURIComponent(orderId)}`,
{ headers: { Authorization: `Bearer ${token}` } }, { headers: { Authorization: `Bearer ${token}` } },
); );
const text = await res.text();
setDebug(`status=${res.status} body=${text.slice(0, 300)}`);
if (!res.ok) { if (!res.ok) {
setDone(true); setDone(true);
return; return;
} }
const json = (await res.json()) as { const json = JSON.parse(text) as {
showPaymentInstructions: boolean; showPaymentInstructions: boolean;
payload?: PaymentInstructions; payload?: PaymentInstructions;
}; };
@@ -71,8 +76,8 @@ function Extension() {
if (json.showPaymentInstructions && json.payload) { if (json.showPaymentInstructions && json.payload) {
setData(json.payload); setData(json.payload);
} }
} catch { } catch (err) {
// ignore — render nothing on error setDebug(`error: ${(err as Error)?.message ?? String(err)}`);
} finally { } finally {
if (!cancelled) setDone(true); if (!cancelled) setDone(true);
} }
@@ -87,7 +92,11 @@ function Extension() {
return <s-skeleton-paragraph />; return <s-skeleton-paragraph />;
} }
if (!data) { if (!data) {
return null; return (
<s-section heading="Invoice payment debug">
<s-paragraph>{debug}</s-paragraph>
</s-section>
);
} }
return ( return (