TrieOH
Payssage

Overview

Payments for TrieOH — wallets, sellers, payment intents, provider OAuth, webhooks, test mode.

Payssage is TrieOH's payments service: wallets (ownership units with fees and sandbox flags), sellers/collectors (provider accounts such as Mercado Pago, connected via OAuth), intents (payment attempts), and the webhook pipeline that fans provider events out to tenant endpoints with HMAC-signed deliveries.

Call it

EnvironmentBase URL
Localhttp://localhost:8082
Prodhttps://api.trieoh.com/payssage (or https://api.payssage.trieoh.com)

Authentication

CallerSchemeTypical routes
End userBearer JWT (IdentityX payssage project)wallet/intent/org operations
Platform / serviceX-API-Key (payssage svc key)wallet create/get/fee, sandbox, webhook endpoints, testmode

Only POST /webhooks/{provider} (the provider calls it) and GET /providers/{provider}/callback (browser redirect) are unauthenticated.

Key concepts

ConceptMeaning
Walletownership unit: owner_id, optional organization_id, sandbox, fee_bps (500 = 5%)
Seller / Collectorprovider account bound to a wallet; created only via the provider OAuth callback — there is no create-seller API
Intentone payment attempt: pending | processing | succeeded | cancelled | failed | rejected | refunded
Webhook endpointper-wallet {name, url}; returns a secret used to verify X-Payssage-Signature on deliveries
Webhook deliverynormalized envelope (below), HMAC-SHA256 of the raw body, retried up to 5× on non-2xx

Endpoint groups

Browse each group in the sidebar:

GroupCovers
walletscreate, get, sandbox (PATCH), fee, webhook endpoints
sellers / collectorsprovider accounts after OAuth
intentscheckout, get, cancel
oauthMercado Pago connect/callback
webhooksprovider webhook receiver, tenant endpoint management
testmodesimulate intents without a real provider
orgs / systemorg-scoped wallets, health, spec

Webhook contract

Payssage delivers a normalized envelope — not the raw provider payload:

{
  "intent_id": "...",
  "wallet_id": "...",
  "provider": "mercadopago",
  "external_id": "<provider_payment_id>",
  "event_type": "payment.succeeded",
  "payload": { "...": "raw provider payload" }
}

Verify X-Payssage-Signature = hex(HMAC-SHA256(raw body, endpoint secret)) against the exact bytes POSTed. Return 200 to stop retries.

Gotchas

  • setWalletSandbox is PATCH, not POST (405 otherwise).
  • A seller only exists after a real provider OAuth flow; for local e2e, seed the sellers table directly.
  • Test mode requires TEST_MODE=true in the payssage env — otherwise /testmode/* 503s. POST /testmode/intents/create hard-creates an intent with a chosen status (e.g. succeeded) so downstream flows observe the webhook without a real provider.
  • The platform wallet is owned by the payssage svc actor — create it with the service API key, not a user JWT.

Payment providers

Providers plug in as adapters on the shared provider layer — see the per-provider guides:

On this page