> ## 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/ja/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">
    1セットのインターフェースで、クレジットカードや電子ウォレットを含む複数の決済手段を統合し、システムの複雑さを軽減します。
  </Card>

  <Card title="明確なフィードバック" icon="bell">
    決済ステータスのエンドツーエンドの可視性と、重要ノードでのリアルタイムフィードバックにより、加盟店による追跡と処理が容易になります。
  </Card>

  <Card title="一元管理" icon="gauge">
    照合、照会、レポートエクスポートをサポートする統一された取引管理ダッシュボード。
  </Card>

  <Card title="柔軟なチェックアウト連携" icon="gear">
    統合APIアクセスにより、加盟店はホスト型ページまたは埋め込みコンポーネントを自由に選択でき、さまざまなビジネスシナリオに柔軟に適応できます。
  </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/ja/essentials/payment-methods)

***

## 連携モード

Waffoは、多様なビジネスシナリオと技術要件に応える3つの柔軟な連携モードを提供します。これらのモードの違いは以下のとおりです。

<IntegrationModeTable language="ja" />

***

## セキュリティとコンプライアンス

Waffoは最も厳格なグローバル金融データセキュリティ基準に従い、すべての取引の安全を確保します。

<Note>
  Waffoはトークン化、暗号化された通信、厳格なアクセス制御により、PCI DSSに沿った決済フローで決済データを保護します。
</Note>

[セキュリティとコンプライアンスの詳細を問い合わせる →](mailto:support@waffo.com)

***

## よくあるご質問

<AccordionGroup>
  <Accordion title="ワンタイム決済は返金をサポートしていますか？" defaultOpen>
    はい（特定の決済手段の機能によります）。ほとんどの主流決済手段は返金をサポートしています。ただし、全額返金または部分返金がサポートされるかどうかは、基盤となる決済手段のルールと機能に厳密に依存します。
  </Accordion>

  <Accordion title="取引記録はどのように照会できますか？">
    すべての取引データはWaffoダッシュボードにリアルタイムで同期されます。時間、金額、ステータスでのフィルタリングや、CSV形式でのレポートエクスポートをサポートしています。
  </Accordion>

  <Accordion title="決済失敗はどのように処理すればよいですか？">
    Waffoは特定の失敗理由コード（例: 「残高不足」、「発行元による拒否」）を返します。加盟店はフロントエンドでユーザーに決済手段を切り替えて再試行するよう促すことをお勧めします。
  </Accordion>
</AccordionGroup>

***

ヘルプが必要ですか？[サポートに連絡する](mailto:support@waffo.com)
