> ## Documentation Index
> Fetch the complete documentation index at: https://waffo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 一次性支付

> 一次接入，覆盖全球主流支付方式，每笔交易清晰可控。

export const CardGroup = ({children, cols = 2}) => {
  const items = Array.isArray(children) ? children.filter(Boolean) : [children];
  const layoutColumns = items.length === 3 ? 3 : cols === 1 ? 1 : 2;
  return <div className="waffo-guide-cards not-prose my-4 grid gap-4" data-columns={layoutColumns}>
      <style>{`
        .waffo-guide-cards {
          grid-template-columns: minmax(0, 1fr) !important;
        }
        .waffo-guide-cards .waffo-clickable-card {
          transition:
            transform 180ms ease,
            border-color 180ms ease,
            box-shadow 180ms ease,
            background 180ms ease !important;
        }
        html:not(.dark) .waffo-guide-cards .waffo-clickable-card:hover {
          border-color: rgba(109, 145, 245, 0.45) !important;
        }
        html.dark .waffo-guide-cards .waffo-clickable-card:hover,
        .dark .waffo-guide-cards .waffo-clickable-card:hover {
          border-color: rgba(109, 145, 245, 0.45) !important;
        }
        @media (min-width: 768px) {
          .waffo-guide-cards[data-columns="2"],
          .waffo-guide-cards[data-columns="3"] {
            grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
          }
          .waffo-guide-cards[data-columns="3"] .waffo-guide-card:nth-of-type(3) {
            grid-column: 1 / -1 !important;
          }
        }
      `}</style>
      {items}
    </div>;
};

export const Card = ({title, icon, href, children}) => {
  const resolvedHref = (() => {
    if (!href || typeof href !== "string") return href;
    if (!href.startsWith("/") || href.startsWith("//")) return href;
    if (typeof window === "undefined") return href;
    const docsPrefixMatch = window.location.pathname.match(/^\/docs(?=\/|$)/);
    const docsPrefix = docsPrefixMatch ? docsPrefixMatch[0] : "";
    if (!docsPrefix) {
      return href.startsWith("/docs/") ? href.slice(5) : href;
    }
    return href.startsWith(`${docsPrefix}/`) ? href : `${docsPrefix}${href}`;
  })();
  const Wrapper = resolvedHref ? "a" : "div";
  const interactiveClass = resolvedHref ? "waffo-clickable-card" : "";
  return <Wrapper href={resolvedHref} className={`waffo-guide-card waffo-hover-card block rounded-xl border border-slate-200 dark:border-neutral-700 bg-gradient-to-b from-slate-50 to-white dark:from-neutral-900 dark:to-neutral-950 p-6 no-underline ${interactiveClass}`}>
      <div className="flex flex-col items-start gap-3">
        <span className="inline-flex h-10 w-10 items-center justify-center rounded-lg border border-slate-200 dark:border-neutral-700 bg-white dark:bg-neutral-900 text-blue-700 dark:text-[#4D7CFF]">
          <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
            {icon === "arrow-right" && <path d="M5 12h14M13 5l7 7-7 7" />}
            {icon === "bell" && <path d="M10 21h4M18 8a6 6 0 0 0-12 0c0 7-3 7-3 9h18c0-2-3-2-3-9" />}
            {icon === "code" && <>
                <path d="m16 18 6-6-6-6" />
                <path d="m8 6-6 6 6 6" />
              </>}
            {icon === "globe" && <>
                <circle cx="12" cy="12" r="10" />
                <path d="M2 12h20" />
                <path d="M12 2a15.3 15.3 0 0 1 0 20" />
                <path d="M12 2a15.3 15.3 0 0 0 0 20" />
              </>}
            {icon === "gear" && <>
                <circle cx="12" cy="12" r="3" />
                <path d="M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.6V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.6-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H9a1.7 1.7 0 0 0 1-1.6V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9v.1a1.7 1.7 0 0 0 1.6 1h.1a2 2 0 1 1 0 4H21a1.7 1.7 0 0 0-1.6 1Z" />
              </>}
            {icon === "shield-check" && <>
                <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z" />
                <path d="m9 12 2 2 4-4" />
              </>}
            {icon === "circle-check" && <>
                <circle cx="12" cy="12" r="10" />
                <path d="m9 12 2 2 4-4" />
              </>}
            {icon === "arrow-trend-up" && <path d="m3 17 6-6 4 4 8-8M14 7h7v7" />}
            {icon === "arrows-rotate" && <>
                <path d="M21 12a9 9 0 0 1-15.5 6.2" />
                <path d="M3 12A9 9 0 0 1 18.5 5.8" />
                <path d="M21 3v6h-6" />
                <path d="M3 21v-6h6" />
              </>}
            {icon === "calendar" && <>
                <rect x="3" y="4" width="18" height="17" rx="2" />
                <path d="M16 2v4M8 2v4M3 10h18" />
              </>}
            {icon === "clock" && <>
                <circle cx="12" cy="12" r="10" />
                <path d="M12 6v6l4 2" />
              </>}
            {icon === "desktop" && <>
                <rect x="3" y="4" width="18" height="12" rx="2" />
                <path d="M8 20h8M12 16v4" />
              </>}
            {icon === "calculator" && <>
                <rect x="5" y="2" width="14" height="20" rx="2" />
                <path d="M8 6h8M8 10h.01M12 10h.01M16 10h.01M8 14h.01M12 14h.01M16 14h.01M8 18h.01M12 18h.01M16 18h.01" />
              </>}
            {icon === "plug" && <>
                <path d="M12 22v-5" />
                <path d="M9 8V2" />
                <path d="M15 8V2" />
                <path d="M18 8v5a6 6 0 0 1-12 0V8Z" />
              </>}
            {icon === "gauge" && <>
                <path d="M12 14l4-4" />
                <path d="M3.3 19a10 10 0 1 1 17.4 0" />
              </>}
            {icon === "layer-group" && <>
                <path d="m12 3 9 5-9 5-9-5 9-5Z" />
                <path d="m3 12 9 5 9-5" />
                <path d="m3 16 9 5 9-5" />
              </>}
            {icon === "laptop-mobile" && <>
                <rect x="3" y="4" width="13" height="10" rx="2" />
                <path d="M2 18h12" />
                <rect x="17" y="8" width="5" height="12" rx="1" />
              </>}
            {icon === "paintbrush" && <>
                <path d="m14 5 5 5" />
                <path d="M4 20c2 0 4-1 4-3 0-1.1-.9-2-2-2-2 0-3 2-3 4 0 .6.4 1 1 1Z" />
                <path d="m6 15 9-9a2.1 2.1 0 0 1 3 3l-9 9" />
              </>}
            {icon === "key" && <>
                <circle cx="7.5" cy="14.5" r="4.5" />
                <path d="m11 11 8-8" />
                <path d="m15 7 2 2" />
              </>}
            {icon === "circle-minus" && <>
                <circle cx="12" cy="12" r="10" />
                <path d="M8 12h8" />
              </>}
            {icon === "wallet" && <>
                <path d="M3 7h15a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H3Z" />
                <path d="M3 7V5a2 2 0 0 1 2-2h11" />
                <path d="M16 14h.01" />
              </>}
            {icon === "users" && <>
                <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
                <circle cx="9" cy="7" r="4" />
                <path d="M22 21v-2a4 4 0 0 0-3-3.9" />
                <path d="M16 3.1a4 4 0 0 1 0 7.8" />
              </>}
            {icon === "link" && <>
                <path d="M10 13a5 5 0 0 0 7.1 0l2-2a5 5 0 0 0-7.1-7.1l-1.1 1.1" />
                <path d="M14 11a5 5 0 0 0-7.1 0l-2 2a5 5 0 0 0 7.1 7.1l1.1-1.1" />
              </>}
            {icon === "eye" && <>
                <path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z" />
                <circle cx="12" cy="12" r="3" />
              </>}
            {icon === "file-lines" && <>
                <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" />
                <path d="M14 2v6h6" />
                <path d="M8 13h8M8 17h6" />
              </>}
            {icon === "sliders" && <>
                <path d="M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3" />
                <path d="M2 14h4M10 8h4M18 16h4" />
              </>}
            {icon === "folder" && <path d="M3 6a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z" />}
            {icon === "dollar-sign" && <>
                <path d="M12 2v20" />
                <path d="M17 5H9.5a3.5 3.5 0 0 0 0 7H14a3.5 3.5 0 0 1 0 7H6" />
              </>}
            {icon === "toggle-on" && <>
                <rect x="2" y="7" width="20" height="10" rx="5" />
                <circle cx="16" cy="12" r="3" />
              </>}
            {icon === "infinity" && <path d="M18.2 8.2c2.1 0 3.8 1.7 3.8 3.8s-1.7 3.8-3.8 3.8c-4.2 0-8.2-7.6-12.4-7.6C3.7 8.2 2 9.9 2 12s1.7 3.8 3.8 3.8c4.2 0 8.2-7.6 12.4-7.6Z" />}
            {icon === "book-open" && <>
                <path d="M2 4h7a3 3 0 0 1 3 3v14a3 3 0 0 0-3-3H2Z" />
                <path d="M22 4h-7a3 3 0 0 0-3 3v14a3 3 0 0 1 3-3h7Z" />
              </>}
            {icon === "circle-play" && <>
                <circle cx="12" cy="12" r="10" />
                <path d="m10 8 6 4-6 4Z" />
              </>}
            {icon === "gamepad" && <>
                <rect x="3" y="8" width="18" height="10" rx="5" />
                <path d="M8 13h3M9.5 11.5v3M16 13h.01M18 11h.01" />
              </>}
            {icon === "rocket" && <>
                <path d="M4.5 16.5c-1.5 1.3-2 3.5-2 5 1.5 0 3.7-.5 5-2" />
                <path d="M9 15 4 10l6-6c4-4 9-2 10-1 1 1 3 6-1 10l-6 6-5-5Z" />
                <path d="M15 9h.01" />
              </>}
            {(icon === "flask" || icon === "flask-vial") && <>
                <path d="M9 2v6L4 20a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2L15 8V2" />
                <path d="M8 2h8" />
                <path d="M7 16h10" />
              </>}
            {icon === "credit-card" && <>
                <rect x="3" y="5" width="18" height="14" rx="2" />
                <path d="M3 10h18" />
                <path d="M7 15h4" />
              </>}
            {icon === "puzzle-piece" && <path d="M14 7V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v3H3a1 1 0 0 0-1 1v4a2 2 0 0 0 2 2h2v3a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2v-3h3a2 2 0 0 0 2-2V8a1 1 0 0 0-1-1Z" />}
            {(icon === "arrows-spin" || icon === "repeat") && <>
                <path d="M17 2l4 4-4 4" />
                <path d="M3 11V9a4 4 0 0 1 4-4h14" />
                <path d="M7 22l-4-4 4-4" />
                <path d="M21 13v2a4 4 0 0 1-4 4H3" />
              </>}
            {icon === "coins" && <>
                <ellipse cx="8" cy="7" rx="5" ry="3" />
                <path d="M3 7v6c0 1.7 2.2 3 5 3s5-1.3 5-3V7" />
                <path d="M13 10c2.8 0 5 1.3 5 3v4c0 1.7-2.2 3-5 3-1.2 0-2.3-.2-3.1-.7" />
              </>}
            {icon === "triangle-exclamation" && <>
                <path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3Z" />
                <path d="M12 9v4M12 17h.01" />
              </>}
            {icon === "list" && <>
                <path d="M8 6h13M8 12h13M8 18h13" />
                <path d="M3 6h.01M3 12h.01M3 18h.01" />
              </>}
            {icon === "star" && <path d="m12 2 3.1 6.3 6.9 1-5 4.9 1.2 6.8-6.2-3.3L5.8 21 7 14.2 2 9.3l6.9-1Z" />}
            {(icon === "rotate" || icon === "arrow-rotate-left") && <>
                <path d="M3 12a9 9 0 1 0 3-6.7" />
                <path d="M3 4v6h6" />
              </>}
            {icon === "clock-rotate-left" && <>
                <path d="M3 12a9 9 0 1 0 3-6.7" />
                <path d="M3 4v6h6" />
                <path d="M12 7v5l3 2" />
              </>}
            {icon === "circle-xmark" && <>
                <circle cx="12" cy="12" r="10" />
                <path d="m15 9-6 6M9 9l6 6" />
              </>}
            {icon === "paper-plane" && <path d="m22 2-7 20-4-9-9-4Z" />}
            {icon === "signal" && <>
                <path d="M2 20h.01M7 20v-4M12 20v-8M17 20V8M22 20V4" />
              </>}
            {icon === "circle-question" && <>
                <circle cx="12" cy="12" r="10" />
                <path d="M9.1 9a3 3 0 1 1 5.8 1c0 2-3 2-3 4" />
                <path d="M12 17h.01" />
              </>}
            {icon === "palette" && <>
                <path d="M12 22a10 10 0 1 1 7.5-3.4c-.9 1-2.4.4-2.4-.9 0-1.1-.9-2-2-2h-1.4c-1.2 0-2.2 1-2.2 2.2 0 1.1.9 2.1 2.1 2.1" />
                <circle cx="7.5" cy="10.5" r=".8" />
                <circle cx="12" cy="7.5" r=".8" />
                <circle cx="16.5" cy="10.5" r=".8" />
              </>}
            {(!icon || !["arrow-right", "bell", "code", "globe", "gear", "shield-check", "circle-check", "arrow-trend-up", "arrows-rotate", "calendar", "clock", "desktop", "calculator", "plug", "gauge", "layer-group", "laptop-mobile", "paintbrush", "key", "circle-minus", "wallet", "users", "link", "eye", "file-lines", "sliders", "folder", "dollar-sign", "toggle-on", "infinity", "book-open", "circle-play", "gamepad", "rocket", "flask", "flask-vial", "credit-card", "puzzle-piece", "arrows-spin", "repeat", "coins", "triangle-exclamation", "list", "star", "rotate", "arrow-rotate-left", "clock-rotate-left", "circle-xmark", "paper-plane", "signal", "circle-question", "palette"].includes(icon)) && <path d="M13 2 4 14h7l-1 8 9-12h-7l1-8Z" />}
          </svg>
        </span>
        <div className="flex flex-col gap-2">
          <h4 className="m-0 text-base font-semibold text-slate-900 dark:text-slate-100">
            {title}
          </h4>
          <div className="m-0 text-sm leading-6 text-slate-600 dark:text-slate-300">
            {children}
          </div>
        </div>
      </div>
    </Wrapper>;
};

export const PM = {
  VISA: {
    alt: "Visa",
    src: "https://cdn.waffo.com/payment-method/PMI_CC001.png"
  },
  MASTERCARD: {
    alt: "Mastercard",
    src: "https://cdn.waffo.com/payment-method/PMI_CC008.png"
  },
  JCB: {
    alt: "JCB",
    src: "https://cdn.waffo.com/payment-method/PMI_CC068.png"
  },
  UNIONPAY: {
    alt: "UnionPay",
    src: "https://cdn.waffo.com/payment-method/PMI_CC762.png"
  },
  AMEX: {
    alt: "American Express",
    src: "https://cdn.waffo.com/payment-method/PMI_CC015.png"
  },
  BANCONTACT: {
    alt: "Bancontact",
    src: "/images/essentials/one-time-payment/bancontact-logo.svg"
  },
  APPLE_PAY: {
    alt: "Apple Pay",
    src: "https://cdn-dev.waffo.com/payment-method/PMI_155.png"
  },
  GOOGLE_PAY: {
    alt: "Google Pay",
    src: "https://cdn-dev.waffo.com/payment-method/PMI_161.png"
  },
  WECHAT_PAY: {
    alt: "WeChat Pay",
    src: "https://cdn.waffo.com/payment-method/PMI_170.png"
  },
  ALIPAY: {
    alt: "Alipay",
    src: "https://cdn.waffo.com/payment-method/PMI_168.png"
  },
  DANA: {
    alt: "DANA",
    src: "https://cdn.waffo.com/payment-method/PMI_001.png"
  },
  PAYPAY: {
    alt: "PayPay",
    src: "https://cdn.waffo.com/payment-method/PMI_247.png"
  },
  ZALOPAY: {
    alt: "ZaloPay",
    src: "https://cdn.waffo.com/payment-method/PMI_084.png"
  },
  PIX: {
    alt: "PIX",
    src: "https://cdn.waffo.com/payment-method/PMI_040.png"
  },
  BANK_LOCAL_SEPA: {
    alt: "SEPA",
    src: "/images/essentials/one-time-payment/SEPA.png"
  },
  BANK_LOCAL_IDEAL: {
    alt: "iDEAL",
    src: "/images/essentials/one-time-payment/ideal.png"
  },
  BANK_LOCAL_BANCONTACT: {
    alt: "Bancontact",
    src: "/images/essentials/one-time-payment/Bancontact.png"
  },
  BANK_LOCAL_MORE: {
    alt: "More payment methods",
    src: "/images/essentials/one-time-payment/Payment%20logo.png"
  },
  LOCAL_PAYMENT: {
    alt: "Local Payment",
    src: "/images/essentials/one-time-payment/bank-transfer-2.svg"
  }
};

export const PaymentMethodCards = ({groups = [], lastFull = false}) => {
  return <div className={`grid grid-cols-1 gap-3 my-4 not-prose ${lastFull ? "sm:grid-cols-2" : "sm:grid-cols-3"}`}>
      {groups.map(({title, logos}, i) => <div key={title} className={`waffo-hover-card flex flex-col rounded-xl border border-slate-200 dark:border-neutral-700 overflow-hidden bg-gradient-to-t from-slate-50 to-white dark:from-neutral-900 dark:to-neutral-800${lastFull && i === groups.length - 1 ? " sm:col-span-2" : ""}`}>
          <div className="px-4 pt-4 pb-3">
            <p className="font-semibold text-slate-900 dark:text-slate-100 text-base leading-6 m-0">{title}</p>
          </div>
          <div className="px-4 pb-4">
            <div className="bg-white dark:bg-neutral-900 border border-slate-200 dark:border-neutral-700 rounded-xl p-4">
              <div className="flex flex-wrap gap-2">
                {logos.map(({src, alt, wide}, idx) => <span key={`${src}-${idx}`} className={`inline-flex items-center border border-slate-200 dark:border-neutral-300 rounded-sm bg-white dark:bg-white overflow-hidden p-1 ${wide ? "justify-start h-[36px] px-2" : "justify-center w-[42px] h-[28px]"}`}>
                    <img src={src} alt={alt} style={{
    width: "auto",
    height: wide ? "100%" : "100%",
    objectFit: "contain",
    maxWidth: wide ? "none" : "100%"
  }} />
                  </span>)}
              </div>
            </div>
          </div>
        </div>)}
    </div>;
};

export const IntegrationModeTable = ({language = "en"}) => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const t = {
    bg: isDark ? "#18181b" : "#ffffff",
    bgAlt: isDark ? "#1f1f23" : "#f8fafc",
    border: isDark ? "#3f3f46" : "#e2e8f0",
    headerText: isDark ? "#f4f4f5" : "#0f172a",
    labelText: isDark ? "#e4e4e7" : "#0f172a",
    cellText: isDark ? "#a1a1aa" : "#475569",
    wrapBorder: isDark ? "#3f3f46" : "#e2e8f0",
    wrapBg: isDark ? "#18181b" : undefined
  };
  const badgeStyles = [{
    light: {
      border: "#e5e5e5",
      color: "#262626",
      bg: "#fafafa"
    },
    dark: {
      border: "#52525b",
      color: "#d4d4d8",
      bg: "#27272a"
    }
  }, {
    light: {
      border: "#bfdbfe",
      color: "#1e40af",
      bg: "#eff6ff"
    },
    dark: {
      border: "#1d4ed8",
      color: "#93c5fd",
      bg: "#1e3a5f"
    }
  }, {
    light: {
      border: "#fef08a",
      color: "#85490e",
      bg: "#fff9e9"
    },
    dark: {
      border: "#a16207",
      color: "#fde047",
      bg: "#3b2a00"
    }
  }];
  const copyByLanguage = {
    en: {
      colHeaders: ["Hosted Checkout", "Embedded Checkout", "API Integration"],
      rows: [{
        label: "Introduction",
        alt: true,
        cells: ["Merchants simply call the API to create a payment session. Users are redirected to a secure checkout page hosted by Waffo to select their payment method and confirm the transaction.", "Merchants integrate the Waffo SDK to embed the checkout component directly into their own website. Users select payment methods and complete the process without leaving the merchant's site.", "Merchants build their own checkout UI entirely and directly call Waffo APIs to process payments."]
      }, {
        label: "Key features",
        alt: false,
        cells: [["No need to build a checkout UI", "Adaptive to multiple devices", "No PCI-DSS certification required for merchants", "Page maintained and updated by Waffo"], ["No page redirection; payment completes on-site", "Maintains brand consistency", "No PCI-DSS certification required for merchants"], ["Full control over the payment flow", "Maximum flexibility for customization", "Requires merchant PCI-DSS certification", "Must handle sensitive card data"]]
      }, {
        label: "Integration cost",
        alt: true,
        badges: ["Low", "Medium", "High"]
      }, {
        label: "Brand customization",
        alt: false,
        cells: ["Supported (Logo, colors, styles, etc.)", "Supported (Logo, colors, styles, etc.)", "Fully custom development"]
      }, {
        label: "Detailed info",
        alt: true,
        links: [{
          text: "Hosted Checkout overview",
          href: "/en/essentials/checkout#hosted-checkout"
        }, {
          text: "Embedded Checkout overview",
          href: "/en/essentials/checkout#embedded-checkout"
        }, {
          text: "-",
          href: null
        }]
      }, {
        label: "Demo",
        alt: false,
        links: [{
          text: "Hosted Checkout demo",
          href: "/en/essentials/checkout#payment-flow-experience"
        }, {
          text: "Embedded Checkout demo",
          href: "/en/essentials/checkout#payment-flow-experience"
        }, {
          text: "-",
          href: null
        }]
      }, {
        label: "Documentation",
        alt: true,
        links: [{
          text: "Hosted Checkout integration guide",
          href: "/en/developer-docs/integration/checkout/steps"
        }, {
          text: "Embedded Checkout integration guide",
          href: "/en/developer-docs/integration/elements/usage"
        }, {
          text: "API integration guide",
          href: "/en/developer-docs/integration/api/overview"
        }]
      }]
    },
    zh: {
      colHeaders: ["收银台模式", "内嵌式模式", "纯API模式"],
      rows: [{
        label: "简介",
        alt: true,
        cells: ["商户侧只需调用API创建支付会话，用户点击后跳转进入 Waffo 托管的收银台页面进行支付方式的选择及支付确认。", "商户侧通过集成 Waffo SDK，将收银台组件直接嵌入商户页面中。用户可在商户页面内完成支付方式选择，进入支付流程。", "商户自行构建收银台页面，直接调用 Waffo API 进行支付。"]
      }, {
        label: "特点",
        alt: false,
        cells: [["无需构造收银台页面", "支持多设备适配", "商户无需PCI-DSS 认证资质", "页面由 Waffo 维护和更新"], ["用户无需页面跳转，站内完成支付", "保持品牌一致性", "商户无需PCI-DSS 认证资质"], ["商户完全自主控制支付流程", "可自行定制，有更高灵活性", "商户具备PCI-DSS 认证资质", "需处理敏感卡信息"]]
      }, {
        label: "集成成本",
        alt: true,
        badges: ["低", "中等", "高"]
      }, {
        label: "品牌客制化",
        alt: false,
        cells: ["支持（Logo、颜色、样式等）", "支持（Logo、颜色、样式等）", "完全自主开发"]
      }, {
        label: "详细介绍",
        alt: true,
        links: [{
          text: "收银台模式介绍",
          href: "/zh/essentials/checkout#%E6%89%98%E7%AE%A1%E7%BB%93%E8%B4%A6"
        }, {
          text: "内嵌式模式介绍",
          href: "/zh/essentials/checkout#%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%BB%93%E8%B4%A6"
        }, {
          text: "-",
          href: null
        }]
      }, {
        label: "Demo示例",
        alt: false,
        links: [{
          text: "收银台模式Demo",
          href: "/zh/essentials/checkout#%E6%94%AF%E4%BB%98%E6%B5%81%E7%A8%8B%E4%BD%93%E9%AA%8C"
        }, {
          text: "内嵌式模式Demo",
          href: "/zh/essentials/checkout#%E6%94%AF%E4%BB%98%E6%B5%81%E7%A8%8B%E4%BD%93%E9%AA%8C"
        }, {
          text: "-",
          href: null
        }]
      }, {
        label: "集成文档",
        alt: true,
        links: [{
          text: "收银台模式集成",
          href: "/zh/developer-docs/integration/checkout/steps"
        }, {
          text: "内嵌式模式集成",
          href: "/zh/developer-docs/integration/elements/usage"
        }, {
          text: "纯API模式集成",
          href: "/zh/developer-docs/integration/api/overview"
        }]
      }]
    },
    ja: {
      colHeaders: ["ホスト型チェックアウト", "埋め込み型チェックアウト", "API連携"],
      rows: [{
        label: "概要",
        alt: true,
        cells: ["加盟店はAPIを呼び出して決済セッションを作成するだけです。ユーザーはWaffoがホストする安全なチェックアウトページにリダイレクトされ、決済手段を選択して決済を確認します。", "加盟店はWaffo SDKを連携し、チェックアウトコンポーネントを自社サイトに直接埋め込みます。ユーザーは加盟店サイト内で決済手段を選択し、決済フローを完了できます。", "加盟店が独自のチェックアウト画面を構築し、Waffo APIを直接呼び出して決済を処理します。"]
      }, {
        label: "特徴",
        alt: false,
        cells: [["チェックアウトUIの構築が不要", "複数デバイスに対応", "加盟店側のPCI-DSS認証は不要", "ページはWaffoが保守・更新"], ["ページ遷移なしでサイト内決済が完了", "ブランドの一貫性を維持", "加盟店側のPCI-DSS認証は不要"], ["決済フローを完全に制御可能", "高い柔軟性でカスタマイズ可能", "加盟店側でPCI-DSS認証が必要", "機密性の高いカード情報の取り扱いが必要"]]
      }, {
        label: "連携コスト",
        alt: true,
        badges: ["低", "中", "高"]
      }, {
        label: "ブランドカスタマイズ",
        alt: false,
        cells: ["対応（ロゴ、色、スタイルなど）", "対応（ロゴ、色、スタイルなど）", "完全な自社開発"]
      }, {
        label: "詳細情報",
        alt: true,
        links: [{
          text: "ホスト型チェックアウト概要",
          href: "/ja/essentials/checkout#%E3%83%9B%E3%82%B9%E3%83%88%E5%9E%8BCheckout"
        }, {
          text: "埋め込み型チェックアウト概要",
          href: "/ja/essentials/checkout#%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E5%9E%8BCheckout"
        }, {
          text: "-",
          href: null
        }]
      }, {
        label: "Demo",
        alt: false,
        links: [{
          text: "ホスト型チェックアウトDemo",
          href: "/ja/essentials/checkout#%E6%B1%BA%E6%B8%88%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E4%BD%93%E9%A8%93"
        }, {
          text: "埋め込み型チェックアウトDemo",
          href: "/ja/essentials/checkout#%E6%B1%BA%E6%B8%88%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E4%BD%93%E9%A8%93"
        }, {
          text: "-",
          href: null
        }]
      }, {
        label: "ドキュメント",
        alt: true,
        links: [{
          text: "ホスト型チェックアウト連携ガイド",
          href: "/ja/developer-docs/integration/checkout/steps"
        }, {
          text: "埋め込み型チェックアウト連携ガイド",
          href: "/ja/developer-docs/integration/elements/usage"
        }, {
          text: "API連携ガイド",
          href: "/ja/developer-docs/integration/api/overview"
        }]
      }]
    }
  };
  const copy = copyByLanguage[language] || copyByLanguage.en;
  const rows = copy.rows.map(row => ({
    ...row,
    badges: row.badges && row.badges.map((text, index) => ({
      text,
      ...badgeStyles[index]
    }))
  }));
  const colHeaders = copy.colHeaders;
  const linkColor = isDark ? "#60a5fa" : "#2563eb";
  const linkHoverColor = isDark ? "#93c5fd" : "#1d4ed8";
  const mutedColor = isDark ? "#71717a" : "#94a3b8";
  const cell = (rowBg, borderBottom, extra = {}) => ({
    padding: "16px",
    background: rowBg,
    borderBottom,
    ...extra
  });
  return <div className="not-prose" style={{
    width: "100%",
    overflowX: "auto",
    margin: "24px 0",
    background: t.wrapBg
  }}>
      {}
      <div style={{
    display: "grid",
    gridTemplateColumns: "180px 1fr 1fr 1fr",
    minWidth: "1240px",
    fontSize: "14px",
    textAlign: "left"
  }}>
        {}
        <div style={{
    padding: "16px",
    borderBottom: `1px solid ${t.border}`,
    background: t.bg
  }} />
        {colHeaders.map(h => <div key={h} style={{
    padding: "16px",
    borderBottom: `1px solid ${t.border}`,
    background: t.bg,
    fontWeight: 600,
    fontSize: "15px",
    color: t.headerText,
    whiteSpace: "pre-line"
  }}>
            {h}
          </div>)}

        {}
        {rows.map((row, rowIndex) => {
    const rowBg = row.alt ? t.bgAlt : t.bg;
    const isLast = rowIndex === rows.length - 1;
    const borderBottom = isLast ? undefined : `1px solid ${t.border}`;
    return <div key={row.label} style={{
      display: "contents"
    }}>
              {}
              <div style={cell(rowBg, borderBottom, {
      fontWeight: 500,
      color: t.labelText
    })}>
                {row.label}
              </div>

              {}
              {row.cells && row.cells.map((c, i) => <div key={i} style={cell(rowBg, borderBottom, {
      color: t.cellText,
      lineHeight: "1.6"
    })}>
                  {Array.isArray(c) ? <ul style={{
      margin: 0,
      padding: 0,
      listStyle: "none",
      display: "flex",
      flexDirection: "column",
      gap: "8px"
    }}>
                      {c.map(item => <li key={item}>{item}</li>)}
                    </ul> : c}
                </div>)}

              {}
              {row.badges && row.badges.map((b, i) => {
      const bs = isDark ? b.dark : b.light;
      return <div key={i} style={cell(rowBg, borderBottom)}>
                    <span style={{
        display: "inline-block",
        border: `1px solid ${bs.border}`,
        borderRadius: "4px",
        padding: "2px 10px",
        fontSize: "13px",
        fontWeight: 500,
        color: bs.color,
        background: bs.bg
      }}>
                      {b.text}
                    </span>
                  </div>;
    })}

              {}
              {row.links && row.links.map((l, i) => <div key={i} style={cell(rowBg, borderBottom)}>
                  {l.href ? <a href={l.href} style={{
      color: linkColor,
      textDecoration: "underline",
      textUnderlineOffset: "2px",
      textDecorationThickness: "1px",
      fontWeight: 500,
      whiteSpace: "nowrap"
    }} onMouseEnter={e => e.target.style.color = linkHoverColor} onMouseLeave={e => e.target.style.color = linkColor}>
                      {l.text}
                    </a> : <span style={{
      color: mutedColor
    }}>{l.text}</span>}
                </div>)}
            </div>;
  })}
      </div>
    </div>;
};

## 概览

为单笔交易提供清晰、稳定的支付能力。通过统一的 API 接口，我们支持广泛的全球支付方式，帮助商户高效完成每一笔交易。

<div className="flex gap-4 mt-2 mb-2">
  <a href="/docs/docs/zh/developer-docs/getting-started/overview" className="inline-flex items-center gap-2 px-6 py-2 rounded-lg text-white text-base font-medium no-underline bg-primary hover:opacity-90">
    开始集成 →
  </a>

  <a href="mailto:support@waffo.com" className="waffo-secondary-cta inline-flex items-center px-4 py-2 rounded-lg border border-slate-200 bg-white text-slate-600 text-base font-medium no-underline hover:bg-slate-50 dark:border-neutral-700 dark:bg-neutral-800 dark:text-slate-300 dark:hover:bg-neutral-700">
    联系我们
  </a>
</div>

***

## 什么是一次性支付？

一次性支付是指针对单笔、独立交易收取费用的支付模式。在该模式下，每次支付都是独立的，不涉及周期性扣款或自动续费。由于其结构清晰、流程直接，这是最基础且最常见的支付形式，适用于广泛的业务场景。

## 核心能力

<CardGroup cols={2}>
  <Card title="统一集成" icon="plug">
    一套接口集成多种支付方式，包括信用卡和电子钱包，降低系统复杂度。
  </Card>

  <Card title="清晰反馈" icon="bell">
    支付状态端到端可见，在关键节点提供实时反馈，便于商户跟踪与处理。
  </Card>

  <Card title="集中管理" icon="gauge">
    统一的交易管理 Dashboard，支持对账、查询与报表导出。
  </Card>

  <Card title="灵活的收银台集成" icon="gear">
    通过统一的 API 接入，商户可在托管页面（Hosted Page）与嵌入式组件（Embedded Components）之间自由选择，灵活适配各类业务场景。
  </Card>
</CardGroup>

***

## 支持的支付方式

使用 Waffo，只需集成一次即可支持多种主流支付方式——无需为每一种单独开发。

<PaymentMethodCards
  lastFull
  groups={[
{
title: "信用卡",
logos: [PM.JCB, PM.VISA, PM.MASTERCARD, PM.UNIONPAY, PM.AMEX],
},
{
title: "电子钱包",
logos: [PM.WECHAT_PAY, PM.ALIPAY, PM.APPLE_PAY, PM.GOOGLE_PAY],
},
{
title: "银行转账与本地支付方式",
logos: [PM.BANK_LOCAL_SEPA, PM.BANK_LOCAL_IDEAL, PM.BANK_LOCAL_BANCONTACT, PM.BANK_LOCAL_MORE],
},
]}
/>

[查看支持的支付方式完整列表 →](/docs/zh/essentials/payment-methods)

***

## 集成模式

Waffo 提供三种灵活的集成模式，以满足不同的业务场景和技术要求。这些模式之间的差异如下：

<IntegrationModeTable language="zh" />

***

## 安全与合规

Waffo 遵循最严格的全球金融数据安全标准，确保每笔交易的安全。

<Note>
  Waffo 通过 Token 化、加密传输和严格的访问控制保护支付数据，适用于符合 PCI DSS 要求的支付流程。
</Note>

[联系支持获取安全与合规详情 →](mailto:support@waffo.com)

***

## 常见问题

<AccordionGroup>
  <Accordion title="一次性支付支持退款吗？" defaultOpen>
    支持（取决于具体支付方式的能力）。大多数主流支付方式都支持退款。但是否支持全额或部分退款，严格取决于底层支付方式的规则与能力。
  </Accordion>

  <Accordion title="如何查询交易记录？">
    所有交易数据均实时同步至 Waffo Dashboard，支持按时间、金额、状态进行筛选，并可导出 CSV 格式的报表。
  </Accordion>

  <Accordion title="应如何处理支付失败？">
    Waffo 会返回具体的失败原因码（如"余额不足"、"发卡行拒绝"）。建议商户在前端提示用户切换支付方式后重试。
  </Accordion>
</AccordionGroup>

***

需要帮助？[联系支持](mailto:support@waffo.com)
