PaymentsService class (accessed via client.payments) handles the core initialization and status verification for diverse payment providers including Stripe, PayPal, Paystack, and M-Pesa.
Sandbox test mode: When you use a
tybrite_sk_test_* key, all payment providers are automatically switched to their test/sandbox credentials — regardless of what your store’s payment settings show. Stripe uses test mode, PayPal uses its sandbox, Paystack uses test keys, and M-Pesa targets the Safaricom sandbox. No code changes are needed between sandbox and production; swap the key and the right environment follows. Every response includes a Tybrite-Environment: sandbox | production header confirming which environment resolved.🔐 Security & Signing (HMAC & Idempotency)
To prevent unauthorized payment initiation and duplicate charges,initializePayment requires both an HMAC-SHA256 signature and a mandatory Idempotency Key.
Signing & Idempotency Process
- Generate ID: Create a unique key for the transaction (e.g.,
payment-{order_id}-{timestamp}). - Generate Timestamp: Get the current Unix timestamp in seconds.
- Prepare Payload: Concatenate timestamp and JSON body:
timestamp + "." + JSON_body. - Generate Signature: Compute HMAC-SHA256 signature using your HMAC Secret.
- Base64 Encode: The signature must be Base64 encoded.
Code Implementation (TypeScript)
Methods
getPaymentMethods
Retrieve all active payment methods configured in GC Admin. This endpoint accepts both publishable (pk_*) and secret (sk_*) API keys — storefronts can safely call it client-side to discover available providers before checkout.
Response
initializePayment
Create a payment session with your chosen provider. Requires a Secret Key, a valid HMAC signature, and a mandatory Idempotency-Key. On the first successful call this returns 201 Created; subsequent calls with the same idempotency key and identical payload return 200 OK with idempotent: true and the original session.
A request refused before it reaches the payment provider — an invalid body, an unknown order, or an amount that does not match the order — does not use up its Idempotency-Key, so the corrected request can be sent with the same key. While another request with the same key is still being initialized, the call returns 409 idempotency_in_progress; sending it again shortly with the same key returns the session once it exists.
verifyPayment
Retrieve the absolute source of truth for a transaction. This is a read operation and does not require HMAC signing.
For Stripe, the reference returned by initializePayment and its session_id identify the same payment, and either may be passed; a PaymentIntent id (pi_...) or charge id (ch_...) taken from a Stripe event is accepted too. The response names the Checkout Session in session_id and the order the payment was initialized for in order_id, and returns reference exactly as it was passed.
Response
Response shape (per-provider oneOf)
The response shape depends on the provider field. The Stripe shape is shown above; the other providers return:
- Stripe —
successwhen the Checkout Session is paid, otherwise Stripe’s ownpayment_status(unpaid,no_payment_required, etc.).amountis in major currency units;order_idisnullwhen the payment was initialized without an order. - Paystack — Mirrors Paystack’s
statusfield (success,failed,abandoned). - M-Pesa — Enum:
pending | success | cancelled | failed. Result code1032(user cancelled on phone) maps tocancelled. - PayPal —
verifycaptures the buyer-approved order and returnssuccessonce the capture completes. Thereferenceyou pass is the PayPal order id returned at initialization.
Provider Support Matrix
Formatting Tip: For M-Pesa, always provide the phone number in international format without the
+ prefix (e.g., 2547...).
