Official Composer SDK for MakePay server-side integrations. Use it to create crypto payment links, donation pages, anonymous public links, customer portals, subscriptions, POS terminals, products, Simple Shop storefronts, invoices, bookkeeping records, branded domains, operational settings, and signed webhook handlers from PHP backends.
- Package:
makepay/makepay-php - Packagist:
https://packagist.org/packages/makepay/makepay-php - Source:
https://github.com/makecryptoio/makepay-php-sdk
composer require makepay/makepay-phpThe SDK supports PHP 7.4 or newer and requires ext-json. ext-curl is used
when available; otherwise JSON requests fall back to PHP streams.
Create a MakePay API key in MakeCrypto and keep the secret on your server only.
use MakePay\Client;
$makepay = new Client([
'keyId' => getenv('MAKEPAY_KEY_ID'),
'keySecret' => getenv('MAKEPAY_KEY_SECRET'),
]);The client sends X-MakeCrypto-Key-Id and X-MakeCrypto-Key-Secret headers to
the MakePay partner API. You can pass baseUrl for a non-production MakeCrypto
API origin, and checkoutBaseUrl for a custom MakePay checkout origin.
$response = $makepay->createPaymentLink([
'title' => 'Order #1042',
'description' => 'Checkout for order #1042',
'amount' => '129.99',
'currency' => 'USDT',
'orderId' => 'order_1042',
'customerEmail' => 'buyer@example.com',
'returnUrl' => 'https://merchant.example/orders/1042',
'successUrl' => 'https://merchant.example/orders/1042/success',
'failureUrl' => 'https://merchant.example/orders/1042/pay',
'expirationTime' => '12h',
]);
header('Location: ' . $response['paymentLink']['publicUrl']);Read, update, and email existing links:
$makepay->listPaymentLinks();
$makepay->getPaymentLink('PAYMENT_LINK_UID');
$makepay->updatePaymentLink('PAYMENT_LINK_UID', ['status' => 'paused']);
$makepay->sendPaymentRequestEmail('PAYMENT_LINK_UID', 'buyer@example.com');$donation = $makepay->createDonationLink([
'title' => 'Spring campaign',
'description' => 'Support the 2026 spring fundraiser.',
'defaultAmountUsd' => '25',
'minimumAmountUsd' => '5',
'donationSlug' => 'spring-campaign',
]);
$makepay->listDonationLinks();
$makepay->getDonationLink('DONATION_UID');
$makepay->updateDonationLink('DONATION_UID', ['status' => 'paused']);Anonymous links do not use a MakePay API key. They require an explicit settlement route because MakePay cannot read merchant wallet settings.
$response = Client::createAnonymousPaymentLink([
'amount' => '25',
'settlement' => [
'currency' => 'USDT',
'priorities' => [
[
'chain' => 'ETH',
'address' => '0xYourSettlementWallet',
'asset' => 'ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7',
],
],
],
'title' => 'Invoice #1042',
'customerEmail' => 'buyer@example.com',
'webhookUrl' => 'https://merchant.example/webhooks/makepay',
]);$paymentUid = $response['paymentLink']['uid'];
$hostedUrl = $makepay->hostedCheckoutUrl($paymentUid);
$embedUrl = $makepay->embeddedCheckoutUrl($paymentUid, [
'parentOrigin' => 'https://merchant.example',
]);
echo $makepay->embedButtonHtml($paymentUid, [
'buttonLabel' => 'Pay with crypto',
]);
echo $makepay->iframeHtml($paymentUid, [
'iframeTitle' => 'Secure MakePay checkout',
]);Donation pages have URL helpers too:
$makepay->hostedDonationUrl('spring-campaign');
$makepay->embeddedDonationUrl('spring-campaign', [
'parentOrigin' => 'https://merchant.example',
]);$makepay->upsertCustomer([
'email' => 'buyer@example.com',
'name' => 'Buyer Example',
'clientId' => 'crm_123',
'metadata' => ['plan' => 'pro'],
]);
$makepay->listCustomers();
$makepay->createCustomerPortal('CUSTOMER_ID', [
'returnUrl' => 'https://merchant.example/account',
]);
$makepay->createSubscription([
'amountUsd' => '29',
'customerEmail' => 'buyer@example.com',
'label' => 'Monthly plan',
'billingIntervalUnit' => 'month',
'billingIntervalCount' => 1,
'sendPaymentRequestEmail' => true,
]);
$makepay->listSubscriptions();$terminal = $makepay->createPosTerminal([
'name' => 'Front counter',
'pin' => '1234',
'allowedAssets' => ['ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7'],
'emailCollectionMode' => 'optional_after_deposit',
'catalogEnabled' => true,
]);
$makepay->listPosTerminals();
$makepay->updatePosTerminal('POS_UID', ['name' => 'Front counter', 'pin' => '5678']);$makepay->createProduct([
'name' => 'Digital guide',
'productType' => 'digital',
'basePriceUsd' => '19',
'shopSlug' => 'digital-guide',
'images' => [
['url' => 'https://merchant.example/guide.png', 'alt' => 'Guide cover'],
],
]);
$makepay->createProductDownload('PRODUCT_UID', [
'fileName' => 'guide.pdf',
'contentType' => 'application/pdf',
'url' => 'https://merchant.example/downloads/guide.pdf',
]);
$makepay->updateShop([
'slug' => 'merchant-shop',
'displayCurrency' => 'USD',
'checkoutMode' => 'hosted',
'branding' => ['accentColor' => '#14b8a6'],
]);
$makepay->updateShopDomain('shop.merchant.example');
$makepay->refreshShopDomain();
$makepay->createShopCoupon([
'code' => 'SPRING10',
'discountType' => 'percent',
'value' => '10',
]);
$makepay->listShopOrders(['status' => 'paid', 'limit' => 25]);$makepay->createBookkeepingInvoice([
'title' => 'Invoice #1042',
'currency' => 'USD',
'issueDate' => '2026-05-15',
'dueDate' => '2026-05-30',
'counterparty' => [
'name' => 'Buyer Example',
'email' => 'buyer@example.com',
'clientId' => 'crm_123',
],
'lineItems' => [
[
'description' => 'Implementation services',
'quantity' => '1',
'unitAmount' => '500',
'taxAmount' => '0',
],
],
]);
$makepay->createBookkeepingInvoicePaymentLink('INVOICE_UID', [
'sendPaymentRequestEmail' => true,
]);
$makepay->listBookkeepingInvoices();
$makepay->getBookkeepingInvoice('INVOICE_UID');
$makepay->updateBookkeepingInvoice('INVOICE_UID', ['status' => 'open']);Expenses can be created manually or from wallet activity:
$makepay->createBookkeepingExpense([
'title' => 'Hosting',
'amount' => '49',
'currency' => 'USD',
'incurredOn' => '2026-05-15',
'category' => 'Infrastructure',
'counterparty' => ['name' => 'Vendor Example', 'type' => 'vendor'],
]);
$makepay->createBookkeepingExpenseFromActivity([
'walletActivityEventKey' => 'CHAIN_EVENT_KEY',
'category' => 'Settlement',
]);
$makepay->createBookkeepingReconciliation([
'invoiceId' => 'INVOICE_UID',
'paymentSessionId' => 'PAYMENT_SESSION_ID',
'linkType' => 'payment',
]);Document uploads accept a local path string or CURLFile:
$makepay->uploadBookkeepingDocument([
'file' => __DIR__ . '/receipt.pdf',
'fileName' => 'receipt.pdf',
'contentType' => 'application/pdf',
'documentType' => 'receipt',
'expenseId' => 'EXPENSE_UID',
]);
$makepay->listBookkeepingDocuments();
$makepay->getBookkeepingDocumentDownloadUrl('DOCUMENT_UID');
$makepay->runBookkeepingDocumentOcr('DOCUMENT_UID');
$makepay->getBookkeepingSummary();$makepay->updateBranding([
'brandName' => 'Merchant',
'supportEmail' => 'support@merchant.example',
'brandingBrandColor' => '#111827',
'brandingAccentColor' => '#14b8a6',
'paymentLinkTheme' => 'system',
'paymentLinkDomain' => 'pay.merchant.example',
'emailSendingDomain' => 'mail.merchant.example',
]);
$makepay->getBranding();
$makepay->refreshBrandingDomains('all');
$makepay->getSettings();
$makepay->updateSettings([
'callbackUrl' => 'https://merchant.example/webhooks/makepay',
]);
$makepay->listDestinationAssets();
$makepay->listWebhookRequests(['limit' => 25]);Read the exact raw request body before parsing JSON.
use MakePay\Webhook;
$rawBody = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_MAKEPAY_SIGNATURE'] ?? null;
$event = Webhook::parse($rawBody, $signature, getenv('MAKEPAY_WEBHOOK_SECRET'));
if (($event['event']['type'] ?? '') === 'status_changed') {
// Update your local order status.
}
http_response_code(200);
echo 'ok';Use Webhook::verify() when you only need a boolean result.
| Area | SDK methods |
|---|---|
| Payment links | createPaymentLink, listPaymentLinks, getPaymentLink, updatePaymentLink, sendPaymentRequestEmail |
| Donations | createDonationLink, listDonationLinks, getDonationLink, updateDonationLink |
| Anonymous links | Client::createAnonymousPaymentLink |
| Checkout | hosted, embedded, modal, button, iframe, and donation URL helpers |
| Customers | listCustomers, upsertCustomer, createCustomerPortal |
| Subscriptions | listSubscriptions, createSubscription |
| POS terminals | listPosTerminals, createPosTerminal, getPosTerminal, updatePosTerminal |
| Products | listProducts, createProduct, getProduct, updateProduct, listProductDownloads, createProductDownload |
| Simple Shop | getShop, updateShop, getShopBuilder, updateShopBuilder, getShopDomain, updateShopDomain, refreshShopDomain, coupon and order methods |
| Bookkeeping | summary, invoice, expense, document upload/OCR, and reconciliation methods |
| Branding | getBranding, updateBranding, refreshBrandingDomains |
| Operations | getSettings, updateSettings, listDestinationAssets, listWebhookRequests |
| Webhooks | Webhook::verify, Webhook::parse, plus client proxy methods |
Payload arrays use the same camelCase field names as the MakePay API and npm
SDK. Use strings for decimal money values when precision matters, and ISO date
strings for date fields such as issueDate.
API errors throw MakePay\MakePayException with the HTTP status code and
decoded response body.
use MakePay\MakePayException;
try {
$makepay->getPaymentLink('PAYMENT_LINK_UID');
} catch (MakePayException $error) {
error_log($error->getMessage());
error_log((string) $error->getStatusCode());
}