openreceive 0.4.24 → 0.4.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/lib/openreceive/version.rb +1 -1
- data/skills/integrate-openreceive/SKILL.md +7 -3
- data/skills/integrate-openreceive/references/btcpay.md +1 -1
- data/skills/integrate-openreceive/references/django.md +18 -4
- data/skills/integrate-openreceive/references/fastapi.md +20 -5
- data/skills/integrate-openreceive/references/fastify.md +18 -3
- data/skills/integrate-openreceive/references/flask.md +835 -0
- data/skills/integrate-openreceive/references/laravel.md +20 -4
- data/skills/integrate-openreceive/references/lovable.md +8 -2
- data/skills/integrate-openreceive/references/nestjs.md +763 -0
- data/skills/integrate-openreceive/references/next.md +18 -3
- data/skills/integrate-openreceive/references/node.md +19 -3
- data/skills/integrate-openreceive/references/php.md +34 -8
- data/skills/integrate-openreceive/references/rails.md +17 -3
- data/skills/integrate-openreceive/references/woocommerce.md +5 -5
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 66faa619377624dd7e90952d52d7ef0210a0d0ce4726647b34534caef7225e11
|
|
4
|
+
data.tar.gz: 320f45f340b8e2138f7ae6a7ee0fb7c5e9703e3a42bd0c94692622afbd9bee41
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a048e3a24ef863bfcc34d2277db739631dd529f701d44d7d310b33eec681649ef6942bb8169ff3e6b820591338027ab4b599d04070708249c1567b280b4dca0d
|
|
7
|
+
data.tar.gz: 67476c05c9dff09b48f41fed17e26ce81150e26089a81658b2e03023ab505e53fbf444f5487d2721ab0def24e3c91fbc352c56a4abd69e469cf8b7371694ad5e
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.26 - 2026-10-14
|
|
4
|
+
|
|
5
|
+
Release with the complete 0.4.26 package family. The bundled agent skill's
|
|
6
|
+
directions say that a paid order's page shows that it is paid and no
|
|
7
|
+
checkout, and that a Docker Compose app recreates its container after
|
|
8
|
+
writing `.env`. The plain PHP directions describe the engine's new default
|
|
9
|
+
cache. No Ruby runtime changes from 0.4.25.
|
|
10
|
+
|
|
11
|
+
## 0.4.25 - 2026-10-13
|
|
12
|
+
|
|
13
|
+
Release with the complete 0.4.25 package family. The bundled agent skill
|
|
14
|
+
adds directions for Flask and NestJS, and every server stack's directions
|
|
15
|
+
link the new guide for mobile apps. No Ruby runtime changes from 0.4.24.
|
|
16
|
+
|
|
3
17
|
## 0.4.24 - 2026-10-12
|
|
4
18
|
|
|
5
19
|
Release with the complete 0.4.24 package family. The gem's registry page
|
data/lib/openreceive/version.rb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: integrate-openreceive
|
|
3
3
|
description: >
|
|
4
4
|
Integrate OpenReceive Bitcoin Lightning checkout and optional USDT, USDC,
|
|
5
|
-
SOL, and ETH swaps. Use for Node.js, Express, Fastify, Next.js, Rails,
|
|
5
|
+
SOL, and ETH swaps. Use for Node.js, Express, Fastify, Next.js, NestJS, Rails,
|
|
6
6
|
Python, Django, FastAPI, Laravel, plain PHP, WordPress/WooCommerce,
|
|
7
7
|
React, Vue, Svelte, Angular, or plain HTML applications, or connecting
|
|
8
8
|
BTCPay Server to a receive-only NWC wallet. A configured swap provider
|
|
@@ -32,10 +32,13 @@ connected wallet; asset and network availability depends on the provider.
|
|
|
32
32
|
- Node, Express: [references/node.md](references/node.md)
|
|
33
33
|
- Node, Fastify: [references/fastify.md](references/fastify.md)
|
|
34
34
|
- Node, Next.js App Router: [references/next.md](references/next.md)
|
|
35
|
+
- Node, NestJS (Express platform): [references/nestjs.md](references/nestjs.md)
|
|
35
36
|
- Rails: [references/rails.md](references/rails.md)
|
|
36
37
|
- Python, FastAPI: [references/fastapi.md](references/fastapi.md)
|
|
37
38
|
- Plain PHP: [references/php.md](references/php.md)
|
|
38
39
|
- Django: [references/django.md](references/django.md)
|
|
40
|
+
- Flask: [references/flask.md](references/flask.md) — a one-file Blueprint
|
|
41
|
+
copied from the quickstart; there is no `openreceive.flask` package.
|
|
39
42
|
- Laravel: [references/laravel.md](references/laravel.md)
|
|
40
43
|
- WordPress + WooCommerce: [references/woocommerce.md](references/woocommerce.md) — the packaged gateway and merchant settings.
|
|
41
44
|
- Lovable (TanStack Start on Cloudflare Workers, with Supabase):
|
|
@@ -51,11 +54,12 @@ connected wallet; asset and network availability depends on the provider.
|
|
|
51
54
|
|
|
52
55
|
Install, per adapter — Express: `npm install @openreceive/express @openreceive/react`;
|
|
53
56
|
Fastify: `npm install @openreceive/fastify @openreceive/react`; Next.js:
|
|
54
|
-
`npm install @openreceive/next @openreceive/react
|
|
57
|
+
`npm install @openreceive/next @openreceive/react`; NestJS:
|
|
58
|
+
`npm install @openreceive/express @openreceive/http @openreceive/react`. Swap the UI package (`vue`,
|
|
55
59
|
`svelte`, `angular`, `elements`) for the frontend the app already has. Install
|
|
56
60
|
(Rails): `bundle add openreceive-rails`.
|
|
57
61
|
Django: `pip install "openreceive[django]"`; FastAPI:
|
|
58
|
-
`pip install "openreceive[fastapi]"`; Laravel: `composer require openreceive/laravel`;
|
|
62
|
+
`pip install "openreceive[fastapi]"`; Flask: `pip install "openreceive[sqlalchemy]"`; Laravel: `composer require openreceive/laravel`;
|
|
59
63
|
plain PHP: `composer require openreceive/openreceive nyholm/psr7 nyholm/psr7-server`.
|
|
60
64
|
|
|
61
65
|
## The three server objects
|
|
@@ -17,7 +17,7 @@ curl -fsSL https://openreceive.org/agent-directions/btcpay/full.md
|
|
|
17
17
|
- Never tick the spend-capable override to make a save succeed.
|
|
18
18
|
- Do not suggest rotating or revoking a code because it was pasted here.
|
|
19
19
|
|
|
20
|
-
These directions describe OpenReceive 0.4.
|
|
20
|
+
These directions describe OpenReceive 0.4.26.
|
|
21
21
|
|
|
22
22
|
Connect a BTCPay Server store to a receive-only NWC wallet with the OpenReceive
|
|
23
23
|
plugin, and optionally let payers pay BTCPay invoices with USDT, USDC, ETH or
|
|
@@ -3,7 +3,7 @@ This is the full file; follow it from Step 0.
|
|
|
3
3
|
# OpenReceive agent directions (Django)
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
# READ THIS FIRST: this file is
|
|
6
|
+
# READ THIS FIRST: this file is 47 KB and a summary drops required steps. Download it whole:
|
|
7
7
|
curl -fsSL https://openreceive.org/agent-directions/django/full.md
|
|
8
8
|
# Skip the download only if you already have all of it: pasted, read from disk or fetched raw.
|
|
9
9
|
```
|
|
@@ -17,7 +17,7 @@ curl -fsSL https://openreceive.org/agent-directions/django/full.md
|
|
|
17
17
|
- Do not suggest rotating or revoking a code because it was pasted here.
|
|
18
18
|
- Start the quickstart only once the NWC code is saved, and the LSC code is saved or the user said "Bitcoin only".
|
|
19
19
|
|
|
20
|
-
These directions describe OpenReceive 0.4.
|
|
20
|
+
These directions describe OpenReceive 0.4.26.
|
|
21
21
|
|
|
22
22
|
Add OpenReceive to a Django project — the app you are already working in. You
|
|
23
23
|
do not need a copy of the OpenReceive source: the Python package is on PyPI
|
|
@@ -127,6 +127,8 @@ you store it. Ask one question per message.
|
|
|
127
127
|
`settings.py` before anything reads the environment. When the app is started
|
|
128
128
|
with Docker Compose, give the service `env_file: .env`. Restart the server
|
|
129
129
|
after writing the file.
|
|
130
|
+
Under Compose, recreate the container with `docker compose up -d`:
|
|
131
|
+
`docker compose restart` keeps its old environment.
|
|
130
132
|
|
|
131
133
|
Do not invent placeholder URIs. Start the quickstart only once `NWC_URI` is
|
|
132
134
|
saved and `LSC_URI_PRIMARY` is saved or explicitly declined. The first boot
|
|
@@ -255,7 +257,12 @@ itself, and they hold for every integration.
|
|
|
255
257
|
such window. On the drop-ins: `resumePaymentHash`, fed from `onState`, on
|
|
256
258
|
`<Checkout>`; the `resume-payment-hash` attribute, fed from the
|
|
257
259
|
`openreceive-state` event (`event.detail.state.payment_hash`), on
|
|
258
|
-
`<openreceive-checkout>`.
|
|
260
|
+
`<openreceive-checkout>`.
|
|
261
|
+
That visit can come hours later, and `authorize` must still know the payer:
|
|
262
|
+
a session that expired in between answers 403 and strands the deposit. On a
|
|
263
|
+
guest shop, tie the order to a long-lived signed cookie, or put a secret
|
|
264
|
+
per-order token in its URL that your page trades for that cookie.
|
|
265
|
+
https://openreceive.org/guides/swap-refunds.md
|
|
259
266
|
- Show the payer WHAT THEY ARE BUYING. Return an optional `description` beside
|
|
260
267
|
the price from `amount_for` and both drop-ins render it above the
|
|
261
268
|
amount. Without it the checkout is a QR and "$1.00" with no sign of what the
|
|
@@ -303,6 +310,12 @@ products, and you do not join them.
|
|
|
303
310
|
expired invoice does not cancel the order; a later checkout may mint another
|
|
304
311
|
attempt. The engine refuses a new checkout under a reference that already
|
|
305
312
|
settled (409).
|
|
313
|
+
- **A paid order's page says it is paid and shows no checkout.** Nothing is left
|
|
314
|
+
to pay, and a checkout cannot start a new payment for a paid order. Mount the
|
|
315
|
+
checkout only while the order is unpaid. When it settles on the page, update
|
|
316
|
+
the page's status line from the `openreceive-settled` event on
|
|
317
|
+
`<openreceive-checkout>`: `on_paid` has already marked the order paid. Keep
|
|
318
|
+
that checkout mounted, because it is the payer's receipt.
|
|
306
319
|
- **Do not relate to `OpenReceivePayment`.** No `ForeignKey`, no `OneToOne`, no
|
|
307
320
|
`ManyToMany` either direction, and no admin `inline` on it. `reference` is not
|
|
308
321
|
unique (many attempts per order). Fulfillment is a guarded transition on YOUR
|
|
@@ -391,6 +404,7 @@ enough; drop the `.md` for the same page a person would read.
|
|
|
391
404
|
- https://openreceive.org/guides/supabase.md — when the database is Supabase: its pooler, its certificate, and locking the tables away from its Data API
|
|
392
405
|
- https://openreceive.org/guides/serverless.md — when the app runs serverless (Netlify, AWS Lambda, Cloud Run, Google AI Studio): pooled database URLs, timeouts, and why it needs no cron or worker
|
|
393
406
|
- https://openreceive.org/guides/frontend-checkout.md — the drop-in's props, attributes and slots
|
|
407
|
+
- https://openreceive.org/guides/mobile-apps.md — when a mobile app takes the payment: the checkout page it opens, and what the App Store and Google Play allow
|
|
394
408
|
- https://openreceive.org/guides/checkout-ux.md — read before building any custom UI
|
|
395
409
|
- https://openreceive.org/guides/headless-checkout.md — the controller, the display models, refunds
|
|
396
410
|
- https://openreceive.org/guides/provider-registry.md — where the wallet logos and pay
|
|
@@ -406,7 +420,7 @@ enough; drop the `.md` for the same page a person would read.
|
|
|
406
420
|
- https://openreceive.org/guides/api-reference.md — every route, option and error code
|
|
407
421
|
- https://openreceive.org/guides/custom-checkout-route.md — advanced: replacing the mounted engine's routes with your own
|
|
408
422
|
- https://openreceive.org/guides/react-material-ui-recipe.md — a worked custom UI on a component library
|
|
409
|
-
- https://openreceive.org/
|
|
423
|
+
- https://openreceive.org/agent-directions/flask.md — the same engine as a Flask Blueprint: follow those directions instead if this app is Flask after all
|
|
410
424
|
- https://openreceive.org/guides.md — the index, if what you need is not above
|
|
411
425
|
|
|
412
426
|
Questions, or a problem with the library itself:
|
|
@@ -3,7 +3,7 @@ This is the full file; follow it from Step 0.
|
|
|
3
3
|
# OpenReceive agent directions (FastAPI)
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
# READ THIS FIRST: this file is
|
|
6
|
+
# READ THIS FIRST: this file is 42 KB and a summary drops required steps. Download it whole:
|
|
7
7
|
curl -fsSL https://openreceive.org/agent-directions/fastapi/full.md
|
|
8
8
|
# Skip the download only if you already have all of it: pasted, read from disk or fetched raw.
|
|
9
9
|
```
|
|
@@ -17,7 +17,7 @@ curl -fsSL https://openreceive.org/agent-directions/fastapi/full.md
|
|
|
17
17
|
- Do not suggest rotating or revoking a code because it was pasted here.
|
|
18
18
|
- Start the quickstart only once the NWC code is saved, and the LSC code is saved or the user said "Bitcoin only".
|
|
19
19
|
|
|
20
|
-
These directions describe OpenReceive 0.4.
|
|
20
|
+
These directions describe OpenReceive 0.4.26.
|
|
21
21
|
|
|
22
22
|
Add OpenReceive to a FastAPI application — the app you are already working in.
|
|
23
23
|
You do not need a copy of the OpenReceive source: the engine is on PyPI
|
|
@@ -126,6 +126,8 @@ you store it. Ask one question per message.
|
|
|
126
126
|
with `uvicorn --env-file .env` (update the app's run script or Procfile, not
|
|
127
127
|
just your own command). When it is started with Docker Compose, give the
|
|
128
128
|
service `env_file: .env`. Restart the server after writing the file.
|
|
129
|
+
Under Compose, recreate the container with `docker compose up -d`:
|
|
130
|
+
`docker compose restart` keeps its old environment.
|
|
129
131
|
Doctor needs the file too: run it as
|
|
130
132
|
`dotenv -f .env run -- openreceive doctor …`. The `dotenv` command comes
|
|
131
133
|
with python-dotenv, which `uvicorn --env-file` already needs; if it is
|
|
@@ -248,7 +250,12 @@ itself, and they hold for every integration.
|
|
|
248
250
|
such window. On the drop-ins: `resumePaymentHash`, fed from `onState`, on
|
|
249
251
|
`<Checkout>`; the `resume-payment-hash` attribute, fed from the
|
|
250
252
|
`openreceive-state` event (`event.detail.state.payment_hash`), on
|
|
251
|
-
`<openreceive-checkout>`.
|
|
253
|
+
`<openreceive-checkout>`.
|
|
254
|
+
That visit can come hours later, and `authorize` must still know the payer:
|
|
255
|
+
a session that expired in between answers 403 and strands the deposit. On a
|
|
256
|
+
guest shop, tie the order to a long-lived signed cookie, or put a secret
|
|
257
|
+
per-order token in its URL that your page trades for that cookie.
|
|
258
|
+
https://openreceive.org/guides/swap-refunds.md
|
|
252
259
|
- Show the payer WHAT THEY ARE BUYING. Return an optional `description` beside
|
|
253
260
|
the price from `amount_for` and both drop-ins render it above the amount.
|
|
254
261
|
Without it the checkout is a QR and "$1.00" with no sign of what the dollar
|
|
@@ -308,6 +315,13 @@ orders, users, or products, and you do not join them.
|
|
|
308
315
|
expired invoice does not cancel the order; a later checkout may mint another
|
|
309
316
|
attempt. The library refuses a new checkout under a reference that already
|
|
310
317
|
settled (409).
|
|
318
|
+
- **A paid order's page says it is paid and shows no checkout.** Nothing is left
|
|
319
|
+
to pay, and a checkout cannot start a new payment for a paid order. Mount the
|
|
320
|
+
checkout only while the order is unpaid. When it settles on the page, update
|
|
321
|
+
the page's status line from `onSettled` on `<Checkout>`, or the
|
|
322
|
+
`openreceive-settled` event on `<openreceive-checkout>`: `on_paid` has already
|
|
323
|
+
marked the order paid. Keep that checkout mounted, because it is the payer's
|
|
324
|
+
receipt.
|
|
311
325
|
- **Pass a sync SQLAlchemy `Engine` for this app's database.** Do not add an
|
|
312
326
|
ORM relationship from Order to `openreceive_payments`, and do not implement
|
|
313
327
|
`PaymentRepository` unless no SQLAlchemy engine can reach this database.
|
|
@@ -392,6 +406,7 @@ enough; drop the `.md` for the same page a person would read.
|
|
|
392
406
|
- https://openreceive.org/guides/supabase.md — when the database is Supabase: its pooler, its certificate, and locking the tables away from its Data API
|
|
393
407
|
- https://openreceive.org/guides/serverless.md — when the app runs serverless (Netlify, AWS Lambda, Cloud Run, Google AI Studio): pooled database URLs, timeouts, and why it needs no cron or worker
|
|
394
408
|
- https://openreceive.org/guides/frontend-checkout.md — the drop-in's props, attributes and slots
|
|
409
|
+
- https://openreceive.org/guides/mobile-apps.md — when a mobile app takes the payment: the checkout page it opens, and what the App Store and Google Play allow
|
|
395
410
|
- https://openreceive.org/guides/checkout-ux.md — read before building any custom UI
|
|
396
411
|
- https://openreceive.org/guides/headless-checkout.md — the controller, the display models, refunds
|
|
397
412
|
- https://openreceive.org/guides/provider-registry.md — where the wallet logos and pay
|
|
@@ -407,7 +422,7 @@ enough; drop the `.md` for the same page a person would read.
|
|
|
407
422
|
- https://openreceive.org/guides/api-reference.md — every route, option and error code
|
|
408
423
|
- https://openreceive.org/guides/custom-checkout-route.md — advanced: replacing the shipped adapter's routes with your own
|
|
409
424
|
- https://openreceive.org/guides/react-material-ui-recipe.md — a worked custom UI on a component library
|
|
410
|
-
- https://openreceive.org/
|
|
425
|
+
- https://openreceive.org/agent-directions/flask.md — the same engine as a Flask Blueprint: follow those directions instead if this app is Flask after all
|
|
411
426
|
- https://openreceive.org/guides.md — the index, if what you need is not above
|
|
412
427
|
|
|
413
428
|
Questions, or a problem with the library itself:
|
|
@@ -444,7 +459,7 @@ with the Django quickstart. A page without a bundler uses
|
|
|
444
459
|
|
|
445
460
|
| | Packages |
|
|
446
461
|
| -------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
447
|
-
| Server | `openreceive[fastapi]`, `openreceive[django]`, `openreceive[sqlalchemy]` (Flask and plain WSGI/ASGI: the Flask
|
|
462
|
+
| Server | `openreceive[fastapi]`, `openreceive[django]`, `openreceive[sqlalchemy]` (Flask and plain WSGI/ASGI: [the Flask quickstart](https://openreceive.org/guides/quickstart-flask.md)) |
|
|
448
463
|
| Frontend | `@openreceive/react`, `@openreceive/vue`, `@openreceive/svelte`, `@openreceive/angular`, `@openreceive/elements` (plain HTML) |
|
|
449
464
|
|
|
450
465
|
Use `uv` or a virtualenv on Python 3.10 or newer. A system Python 3.9 cannot
|
|
@@ -3,7 +3,7 @@ This is the full file; follow it from Step 0.
|
|
|
3
3
|
# OpenReceive agent directions (Fastify)
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
# READ THIS FIRST: this file is
|
|
6
|
+
# READ THIS FIRST: this file is 40 KB and a summary drops required steps. Download it whole:
|
|
7
7
|
curl -fsSL https://openreceive.org/agent-directions/fastify/full.md
|
|
8
8
|
# Skip the download only if you already have all of it: pasted, read from disk or fetched raw.
|
|
9
9
|
```
|
|
@@ -17,7 +17,7 @@ curl -fsSL https://openreceive.org/agent-directions/fastify/full.md
|
|
|
17
17
|
- Do not suggest rotating or revoking a code because it was pasted here.
|
|
18
18
|
- Start the quickstart only once the NWC code is saved, and the LSC code is saved or the user said "Bitcoin only".
|
|
19
19
|
|
|
20
|
-
These directions describe OpenReceive 0.4.
|
|
20
|
+
These directions describe OpenReceive 0.4.26.
|
|
21
21
|
|
|
22
22
|
Add OpenReceive to a Fastify application — the app you are already working in.
|
|
23
23
|
You do not need a copy of the OpenReceive source: the packages are on npm, and
|
|
@@ -123,6 +123,8 @@ you store it. Ask one question per message.
|
|
|
123
123
|
`import "dotenv/config";` at the top of the server entry, as the quickstart
|
|
124
124
|
does. When the app is started with Docker Compose, give the service
|
|
125
125
|
`env_file: .env`. Restart the server after writing the file.
|
|
126
|
+
Under Compose, recreate the container with `docker compose up -d`:
|
|
127
|
+
`docker compose restart` keeps its old environment.
|
|
126
128
|
|
|
127
129
|
Do not invent placeholder URIs. Start the quickstart only once `NWC_URI` is
|
|
128
130
|
saved and `LSC_URI_PRIMARY` is saved or explicitly declined. The first boot
|
|
@@ -235,7 +237,12 @@ itself, and they hold for every integration.
|
|
|
235
237
|
such window. On the drop-ins: `resumePaymentHash`, fed from `onState`, on
|
|
236
238
|
`<Checkout>`; the `resume-payment-hash` attribute, fed from the
|
|
237
239
|
`openreceive-state` event (`event.detail.state.payment_hash`), on
|
|
238
|
-
`<openreceive-checkout>`.
|
|
240
|
+
`<openreceive-checkout>`.
|
|
241
|
+
That visit can come hours later, and `authorize` must still know the payer:
|
|
242
|
+
a session that expired in between answers 403 and strands the deposit. On a
|
|
243
|
+
guest shop, tie the order to a long-lived signed cookie, or put a secret
|
|
244
|
+
per-order token in its URL that your page trades for that cookie.
|
|
245
|
+
https://openreceive.org/guides/swap-refunds.md
|
|
239
246
|
- Show the payer WHAT THEY ARE BUYING. Return an optional `description` beside
|
|
240
247
|
the price from `amountFor` and both drop-ins render it above the amount.
|
|
241
248
|
Without it the checkout is a QR and "$1.00" with no sign of what the dollar
|
|
@@ -290,6 +297,13 @@ products, and you do not join them.
|
|
|
290
297
|
expired invoice does not cancel the order; a later checkout may mint another
|
|
291
298
|
attempt. The library refuses a new checkout under a reference that already
|
|
292
299
|
settled (409).
|
|
300
|
+
- **A paid order's page says it is paid and shows no checkout.** Nothing is left
|
|
301
|
+
to pay, and a checkout cannot start a new payment for a paid order. Mount the
|
|
302
|
+
checkout only while the order is unpaid. When it settles on the page, update
|
|
303
|
+
the page's status line from `onSettled` on `<Checkout>`, or the
|
|
304
|
+
`openreceive-settled` event on `<openreceive-checkout>`: `onPaid` has already
|
|
305
|
+
marked the order paid. Keep that checkout mounted, because it is the payer's
|
|
306
|
+
receipt.
|
|
293
307
|
- **Pass this app's `db` handle.** Do not add a Prisma/Drizzle relation from
|
|
294
308
|
Order to `openreceive_payments`, and do not implement `PaymentRepository`
|
|
295
309
|
unless no supported handle can reach this database. `reference` is not unique
|
|
@@ -375,6 +389,7 @@ enough; drop the `.md` for the same page a person would read.
|
|
|
375
389
|
- https://openreceive.org/guides/serverless.md — when the app runs serverless (Netlify, AWS Lambda, Cloud Run, Google AI Studio): pooled database URLs, timeouts, and why it needs no cron or worker
|
|
376
390
|
- https://openreceive.org/guides/node-orms.md — recipes for Prisma, Drizzle, Knex, TypeORM, Sequelize
|
|
377
391
|
- https://openreceive.org/guides/frontend-checkout.md — the drop-in's props, attributes and slots
|
|
392
|
+
- https://openreceive.org/guides/mobile-apps.md — when a mobile app takes the payment: the checkout page it opens, and what the App Store and Google Play allow
|
|
378
393
|
- https://openreceive.org/guides/checkout-ux.md — read before building any custom UI
|
|
379
394
|
- https://openreceive.org/guides/headless-checkout.md — the controller, the display models, refunds
|
|
380
395
|
- https://openreceive.org/guides/provider-registry.md — where the wallet logos and pay
|