API-Referenz
Webhooks
Zustellungsheader, Ereignisnutzlasten, Wiederholungsversuche und Zustellungsprotokolle.
Rückruf-URL
Konfigurieren Sie die Team-Rückruf-URL in den Entwicklerintegrationseinstellungen. MakePay überprüft zuerst die Produkteinstellungen MakePay und dann die gemeinsamen Entwickler-Callback-Einstellungen, sodass bestehende MakeSwap-Webhook-Einstellungen MakePay-Zahlungsereignisse empfangen können, während die produktspezifische Einstellung eingeführt wird.
Wenn Sie eine MakePay-Rückruf-URL speichern, generiert MakeCrypto ein Webhook-Geheimnis. Speichern Sie es in Ihrem Backend-Secret-Manager. Sie können es jederzeit über denselben Einstellungsbildschirm neu generieren. Aktualisieren Sie nach der Regeneration Ihr Backend, bevor Sie Signaturen mit dem neuen Geheimnis erzwingen.
Lieferverhalten
MakePay sendet Zahlungs- und Abonnement-Webhooks als POST-Anfragen mit einem JSON-Body. Fehlgeschlagene Zustellungen werden bis zu zehn Mal im Abstand von fünf Minuten wiederholt. Manuelles erneutes Senden ist in den MakeCrypto-Webhook-Anforderungsprotokollen verfügbar.
Überschriften
content-type: application/json
user-agent: MakePay-Webhooks/1.0
x-makepay-delivery-id: 9f1c6cf4-8514-4ee5-80fd-8e8fe2b5e313
x-makepay-delivery-group-id: 9f1c6cf4-8514-4ee5-80fd-8e8fe2b5e313
x-makepay-delivery-origin: event
x-makepay-event: status_changed
x-makepay-attempt: 1
x-makepay-signature: t=1776556800,v1=7d4b3f...
Signaturen überprüfen
MakePay signiert den genauen rohen JSON-Anfragetext mit HMAC-SHA256. Die Signaturnutzlast ist:
{timestamp}.{raw_request_body}
Der x-makepay-signature-Header enthält den Unix-Zeitstempel und den versionierten Digest:
t=1776556800,v1=<hex_hmac_sha256>
Beispielverifizierung in Node.js:
import crypto from "node:crypto";
const WEBHOOK_SECRET = process.env.MAKEPAY_WEBHOOK_SECRET!;
const TOLERANCE_SECONDS = 300;
export function verifyMakePayWebhook(input: {
rawBody: string;
signatureHeader: string | null;
}) {
if (!input.signatureHeader) {
return false;
}
const parts = Object.fromEntries(
input.signatureHeader.split(",").map((part) => {
const [key, value] = part.trim().split("=");
return [key, value];
}),
);
const timestamp = Number(parts.t);
const signature = parts.v1;
if (!Number.isFinite(timestamp) || !signature) {
return false;
}
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - timestamp) > TOLERANCE_SECONDS) {
return false;
}
const expected = crypto
.createHmac("sha256", WEBHOOK_SECRET)
.update(`${timestamp}.${input.rawBody}`, "utf8")
.digest("hex");
const actualBuffer = Buffer.from(signature, "hex");
const expectedBuffer = Buffer.from(expected, "hex");
return (
actualBuffer.length === expectedBuffer.length &&
crypto.timingSafeEqual(actualBuffer, expectedBuffer)
);
}
Lesen Sie den Rohtext, bevor Sie JSON analysieren. Wenn Ihr Framework zuerst den Text analysiert, konfigurieren Sie die Webhook-Route so, dass die rohen Anforderungsbytes verfügbar gemacht werden, und überprüfen Sie diese Bytes, bevor Sie der Nutzlast vertrauen.
Zahlungsnutzlast
{
"deliveryId": "9f1c6cf4-8514-4ee5-80fd-8e8fe2b5e313",
"type": "makepay.payment.status_changed",
"createdAt": "2026-04-19T00:00:00.000Z",
"event": {
"type": "status_changed",
"trigger": "payment_status_reconcile"
},
"paymentLink": {
"id": "8d15bb78-d0f8-45ef-88d7-2a1f1f79644b",
"uid": "01hzy4k6p4w9y2x7e2z7n8a2xm",
"status": "active",
"publicUrl": "https://makepay.io/payment/01hzy4k6p4w9y2x7e2z7n8a2xm",
"expiresAt": "2026-04-19T12:00:00.000Z",
"amount": "129.99",
"currency": "USDT",
"asset": "ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
"label": "Website order #1042",
"description": "Checkout for order #1042",
"merchantOrderId": "order_1042",
"clientEmail": "buyer@example.com",
"clientId": null
},
"session": {
"id": "5b55f0bb-0ac4-4f7c-a1d1-0d9af19c3bbd",
"status": "complete",
"previousStatus": "pending",
"invoiceAsset": "USDT",
"invoiceAmount": "129.99",
"selectedSellAsset": "ETH",
"requiredSellAmount": "0.04",
"expectedBuyAmount": "129.99",
"destinationAddress": "0xmerchant...",
"depositAddress": "0xdeposit...",
"channelId": "channel_123",
"compositeChannelId": "ETH:channel_123",
"sourceChain": "ETH",
"expiresAt": "2026-04-19T00:30:00.000Z",
"settlement": {},
"errorMessage": null
}
}
Veranstaltungstypen
status_changedfür Statusänderungen der Zahlungssitzung.settlement_updated, wenn sich die Abrechnungsdaten nach dem Statusabgleich ändern.payment_request_expired,quote_expiredundpayment_cancelled_by_payerfür endgültige Nichtzahlungsergebnisse.channel_created, wenn der Zahler ein Angebot annimmt und MakePay den Einzahlungskanal erstellt.subscription_status_changed, wenn ein MakePay-Abonnement zwischenactive,paused,overdueodercancelledverschoben wird.
quote_created und quote_refreshed sind interne Zahlungszeitleistenereignisse und werden nicht an Rückruf-URLs gesendet.
Nutzlast für den Abonnementstatus
MakePay sendet auch einen Rückruf, wenn sich ein Abonnementstatus ändert. Der Planer
markiert ein Abonnement mit overdue, wenn der älteste unbezahlte Abrechnungszeitraum mindestens beträgt
24 Stunden nach dueAt; Sobald kein unbezahlter Zyklus mehr als 24 Stunden überfällig ist, wird der
Der Planer verschiebt das Abonnement zurück auf active. Händler- und Kundenportal
Statusänderungen verwenden denselben Rückruf.
{
"deliveryId": "78c35c42-61fb-4dd3-94b7-2a7df998bb6f",
"type": "makepay.subscription.status_changed",
"createdAt": "2026-04-20T00:00:00.000Z",
"event": {
"type": "subscription_status_changed",
"trigger": "subscription_scheduler"
},
"subscription": {
"id": "f6b76460-a437-4a81-a59f-8fcbb18c0f0f",
"uid": "sub_premium_001",
"status": "overdue",
"previousStatus": "active",
"customerEmail": "buyer@example.com",
"label": "Premium plan",
"description": "Monthly subscription",
"amountUsd": "49.99",
"settlementAsset": "ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
"cadence": "monthly",
"billingIntervalUnit": "month",
"billingIntervalCount": 1,
"startAt": "2026-04-18T00:00:00.000Z",
"timezone": "Asia/Dubai",
"metadata": {
"clientId": "client_1042"
},
"createdAt": "2026-04-18T00:00:00.000Z",
"updatedAt": "2026-04-20T00:00:00.000Z"
},
"cycle": {
"id": "f303b3b3-26d8-42bc-8c10-91fa1445f507",
"subscriptionId": "f6b76460-a437-4a81-a59f-8fcbb18c0f0f",
"sequence": 0,
"dueAt": "2026-04-18T00:00:00.000Z",
"amountUsd": "49.99",
"paymentLinkId": "8d15bb78-d0f8-45ef-88d7-2a1f1f79644b",
"paymentLinkUid": "01hzy4k6p4w9y2x7e2z7n8a2xm",
"paymentUrl": "https://makepay.io/payment/01hzy4k6p4w9y2x7e2z7n8a2xm",
"status": "overdue"
},
"data": {
"previousStatus": "active",
"nextStatus": "overdue",
"reason": "cycle_one_day_overdue"
}
}
Lieferprotokoll-API
Verwenden Sie die Webhook-Anfrageroute, um Zustellungen und Wiederholungsversuche zu überprüfen.
GET /api/partner/v1/makepay/webhook-requests?limit=100
Zu den optionalen Filtern gehören paymentLinkUid, deliveryStatus und search.