# Accept payments and fulfill an order once

Install a hosted payment path or compose a trusted card session, then match the actual receiving result to your order.

Canonical: https://docs.bankeiz.com/merchant-checkout/
Reviewed: 2026-10-25; coordinated packages 129.0.0; ruleset 127.0.0.

## Choose the integration depth

**Start with the payment path your application needs**

| Path | Use | Authority boundary |
| --- | --- | --- |
| Hosted link/button/QR | Share or install a simple payment entry. | Amount is an editable request; payer reviews. |
| Widget | Embed the supported public merchant widget on a script-compatible website. | No supported fixed-price attribute; public HTML is not a trusted order. |
| Trusted card session | Bind server order, stable merchant UID and exact integer cents. | Retained session plus accepted matching credit controls fulfillment. |
| Fixed Counter sale | Match the incoming original and public sale reference to exact recipient/cents. | The URL alone is not a signed invoice. |

## Install the public payment entry

1. **Open Receive in the merchant account** — Choose Checkout link or Accept payments anywhere.
2. **Copy the supported code** — Use a normal link for URL-only platforms, an HTML button for custom-code blocks, or a widget where scripts/framing are permitted.
3. **Verify the destination** — Open as a customer and inspect the public receiving identity before sharing.
4. **Confirm receipt in your account** — Match the actual recorded payment before handing over goods.

```html
<a href="https://bankeiz.com/pay/yourname/?amount=12.30"
   target="_blank" rel="noopener noreferrer">Pay @yourname</a>

<div class="receiz-pay-embed" data-username="yourname"></div>
<script src="https://receiz.com/receiz-pay-embed.js" async></script>
```

Replace yourname with the intended public merchant. The widget has no supported fixed-price attribute.

## Prepare a trusted card session

```ts
import { createReceizClient } from '@receiz/sdk';
import { prepareMerchantCardCheckout, readMerchantCardCheckout }
  from './merchant-checkout';

const receiz = createReceizClient({ baseUrl: 'https://receiz.com' });
const pending = await prepareMerchantCardCheckout(receiz, {
  referenceId: order.id,
  merchantUsername: merchant.username,
  merchantUserId: merchant.userId,
  amountUsdCents: order.amountUsdCents,
});
// Persist pending against the trusted order before exposing frameUrl.
const result = await readMerchantCardCheckout(receiz, pending);
if (result.status === 'paid') {
  // Atomically fulfill this exact order once in your order system.
}
```

Copy the linked institution/examples/merchant-checkout.ts helper. order and merchant are trusted server inputs; this is integration composition, not a credential-free demo.

The helper calls payments.embeddedCheckout and reads the existing retained session-status route. It matches session, currency, integer cents, reference, stable merchant UID and accepted positive credit. Keep frameUrl and its short-lived secret out of logs, analytics, public links and model context.

## Confirm, do not infer, payment

**One order through the trusted result**

1. Order: Server recipient, cents and reference.
2. Session: Create once and persist before display.
3. Check: Read the retained exact outcome.
4. Fulfill: Atomically deliver the order once.

A success URL, iframe message or customer screenshot is only a signal to inspect the trusted result. Paid requires the accepted terminal paid state and matching connect_payment_checkout credit. Pending means the session remains open; closed means a terminal unpaid result. Trusted host observations are distinct from a self-contained cryptographic receipt; retain actual original proof when independent offline verification is required.

## Retries, unknown creation and later services

Serialize session creation per order. referenceId is correlation, not documented idempotency. A lost creation response is uncertain and cannot authorize another session. Reopen the same retained result on return or explicit recovery; this integration requires no recurring polling. Refunds, subscriptions, tax, shipping, inventory, payouts and fulfillment automation require their own admitted contracts, scopes, configured host and qualification. A checkout snippet grants none of them automatically.

- [Recover unknown operations](https://docs.bankeiz.com/recovery/)
- [Qualify your actual deployment](https://docs.bankeiz.com/conformance/)

## Implementation sources

- [Complete payment installation and confirmation guide](https://github.com/kojibai/reality-grade-banking/blob/6c5d582/institution/accept-payments.md)
- [Type-checked exact merchant-session helper](https://github.com/kojibai/reality-grade-banking/blob/6c5d582/institution/examples/merchant-checkout.ts)
- [Fixed Counter sale reference](https://github.com/kojibai/reality-grade-banking/blob/6c5d582/institution/examples/fixed-checkout.ts)
- [Exact original receiving match](https://github.com/kojibai/reality-grade-banking/blob/6c5d582/src/receiz/merchant-receive.ts)

## Related documentation

- [Receive by link, button or QR](https://docs.bankeiz.com/receiving/)
- [Build an implementation of the standard](https://docs.bankeiz.com/integrations/)
- [Recover the established operation](https://docs.bankeiz.com/recovery/)
- [Assess an implementation independently](https://docs.bankeiz.com/conformance/)
