PHP code example of odemehub / php-sdk

1. Go to this page and download the library: Download odemehub/php-sdk library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

odemehub / php-sdk example snippets


use Gurmehub\Odemehub\Client;
use Gurmehub\Odemehub\Options;

$client = new Client(new Options(
    baseUrl: 'https://sandbox.odemehub.com',
    team: '1000000001',                                   // Çalışma Alanı Kimliği
    apiKey: getenv('ODEMEHUB_API_KEY'),
    apiSecret: getenv('ODEMEHUB_API_SECRET'),
));

use Gurmehub\Odemehub\Request\{Address, Card, PaymentCustomer, RegularPayment};

$customer = new PaymentCustomer(
    billingAddress: new Address(       // sekiz alanın hepsi zorunlu (Varsayılan Ödeyen açıksa eksik olabilir); şirket alanları üçü birlikte ya da hiç
        firstname: 'Ahmet', lastname: 'Yılmaz',
        email: '[email protected]', phone: '05551112233',
        address: 'Kızılırmak Mah. Dumlupınar Blv. No:3',
        district: 'Çankaya', province: 'Ankara', country: 'TR',
    ),
    reference: 'musteri-88',           // sizdeki müşteri anahtarı; kart saklanacaksa zorunlu, boşsa müşteri kaydedilmez
);

$card = new Card(
    holderName: 'AHMET YILMAZ',
    number: '5400360000000003',
    expiryMonth: '12', expiryYear: '2030',
    securityCode: '000',
    shouldSave: true,                  // isteğe bağlı: başarılı ödemeden sonra kartı sakla
);

$payment = $client->regularPayment(new RegularPayment(
    reference: 'SIP-10231',            // sizdeki referans; en az bir rakam içermeli
    amount: '450.00',
    installmentNumber: 1,
    ip: $_SERVER['REMOTE_ADDR'],
    customer: $customer,
    card: $card,
));

if ($payment->result->successful) {
    $payment->transaction->token;      // iade ve iptalde ödeme bununla adlandırılır
    $payment->savedCard?->token;       // shouldSave gönderildiyse ve kart saklandıysa
}

use Gurmehub\Odemehub\Request\SecurePayment;

$payment = $client->securePayment(new SecurePayment(
    reference: 'SIP-10232',
    amount: '450.00',
    installmentNumber: 1,
    ip: $_SERVER['REMOTE_ADDR'],
    customer: $customer,
    callbackUrl: 'https://magazam.com/odeme/donus',
    card: $card,
));

if ($payment->redirectUrl !== null) {
    header('Location: '.$payment->redirectUrl);           // müşteriyi bankaya gönderin
}

use Gurmehub\Odemehub\Request\RetrievePayments;

$payment = $client->retrievePayments(RetrievePayments::byToken($_POST['transaction_token']))->payments[0] ?? null;

if ($payment?->isSuccessful()) {
    // siparişi ödendi olarak işaretleyin
}

$payment?->status;          // Enum\TransactionStatus::Successful, Failed, Expired ...
$payment?->paymentStatus;   // Enum\PaymentStatus: paranın akıbeti (sonradan Refunded olabilir)
$payment?->amount;          // karttan çekilen tutar

use Gurmehub\Odemehub\Request\{CreateOrder, Item, MaxInstallments};

$order = $client->createOrder(new CreateOrder(
    reference: 'SIP-10233',
    successUrl: 'https://magazam.com/odeme/donus',
    items: [
        new Item(name: 'Kulaklık', unitAmount: '1200.00', quantity: 1, taxRate: '20', reference: 'SKU-1', saveAsProduct: true),
    ],
    customer: $customer,               // bilinen kadarı; kalanı sayfada sorulur. Hiç verilmeyebilir.
           // müşteriyi buraya gönderin
$order->order->amount;             // geçidin hesapladığı toplam

use Gurmehub\Odemehub\Request\{RetrieveOrders, UpdateOrder};

$order = $client->retrieveOrders(RetrieveOrders::byToken($token))->orders[0];
$order->isPaid();
$order->transaction?->token;
$order->customer?->reference;          // her siparişte müşterisi gelir

// Açık siparişte yalnızca gönderilen alanlar değişir; kalemler gönderilirse tamamı yenilenir.
$client->updateOrder(new UpdateOrder(token: $token, description: 'Hediye paketi', clear: ['cancel_url']));

use Gurmehub\Odemehub\Enum\Currency;
use Gurmehub\Odemehub\Request\{CreatePaymentLink, RetrievePaymentLinks, UpdatePaymentLink};

$link = $client->createPaymentLink(new CreatePaymentLink(
    currency: Currency::TRY,
    items: [new Item(name: 'Bağış', unitAmount: '100.00', quantity: 1, taxRate: '0')],
    reference: 'LNK-1',                 // boş bırakılırsa geçit LINK{n} üretir
    expiresAt: '2026-12-31',            // çalışma alanının saat dilimine göre gün
    emailsCustomer: true,               // ödeme tamamlanınca ödeyene, sayfada verdiği adrese e-posta gider; boş: gitmez
));

$link->paymentLink->token;              // saklayın: linki bununla güncellersiniz ve sorgularsınız
$link->paymentLink->checkoutUrl;        // linkin kendisi; ödenemezken (kapalı, süresi geçmiş) null
$link->paymentLink->expiresAt;          // verilen günün sonu (çalışma alanı saatiyle), ISO 8601 UTC
$link->paymentLink->isTest;             // ödemeleri şu an test ortamında mı alınıyor

$detail = $client->retrievePaymentLinks(RetrievePaymentLinks::byToken($link->paymentLink->token))->paymentLinks[0];
$detail->transactions;                  // son 50 deneme, yeniden eskiye
$detail->transactionsCount;             // linkteki denemelerin tamamının sayısı
$detail->successful();                  // listelenenlerden başarılı olanlar

$client->updatePaymentLink(new UpdatePaymentLink(token: $link->paymentLink->token, isActive: false));

use Gurmehub\Odemehub\Enum\{AmountType, Currency, CurrencyType, TaxMode};

$donation = $client->createPaymentLink(new CreatePaymentLink(
    currency: Currency::TRY,
    amountType: AmountType::PredefinedAndCustom,
    itemName: 'Bağış',
    predefinedAmounts: ['100', '250', '500'],
    taxRate: '0',
    taxMode: TaxMode::Inclusive,
    currencyType: CurrencyType::Selectable,
    currencies: [Currency::USD, Currency::EUR],
));

$donation->paymentLink->amount;             // null: tutarı ödeyen seçer (subtotal ve taxAmount da null)
$donation->paymentLink->predefinedAmounts;  // ['100.00', '250.00', '500.00']
$donation->paymentLink->currencies;         // [Currency::TRY, Currency::USD, Currency::EUR]

use Gurmehub\Odemehub\Request\RetrieveLinkPayments;

$payments = $client->retrieveLinkPayments(RetrieveLinkPayments::between('2026-09-26', '2026-10-02'));
foreach ($payments->linkPayments as $linkPayment) {
    $linkPayment->paymentLink->token;                   // ödendiği link
    $linkPayment->status;                               // Enum\LinkPaymentStatus: Open, Paid
    $linkPayment->isPaid();
    $linkPayment->amount;                               // çekilen tutar, kupon düşülmüş
    $linkPayment->discount?->code;                      // ödeyen kupon girdiyse
    $linkPayment->customer?->billingAddress->email;     // ödeyenin fatura bilgileri
    $linkPayment->transaction?->token;                  // ödeyen işlem; iade ve iptal bununla
}

use Gurmehub\Odemehub\Enum\{Period, SubscriptionStatus};
use Gurmehub\Odemehub\Request\{CreateSubscription, RetrieveSubscriptions, UpdateSubscription};

$subscription = $client->createSubscription(new CreateSubscription(
    reference: 'ABO-1',
    period: Period::Monthly,
    successUrl: 'https://magazam.com/abonelik/donus',
    items: [new Item(name: 'Premium', unitAmount: '99.90', quantity: 1, taxRate: '20')],
    customer: $customer,
    renewalLimit: 12,                   // boş: iptale kadar
    emailsCustomer: true,               // her durum değişiminde fatura adresindeki e-postaya bilgilendirme gider
));

$subscription->subscription->checkoutUrl;

$current = $client->retrieveSubscriptions(RetrieveSubscriptions::byToken($token))->subscriptions[0];
$current->status;                        // Enum\SubscriptionStatus: Pending, Active, PastDue, Cancelled, Completed
$current->renewal->paidAt;               // içinde bulunulan yenileme
$current->nextPaymentAt;
$current->customer?->reference;

// Dönem, kalemler, ödeme sayısı değişir; iptal de buradan:
$client->updateSubscription(new UpdateSubscription(token: $token, status: SubscriptionStatus::Cancelled));

use Gurmehub\Odemehub\Request\{CreateSavedCard, DeleteSavedCard, RetrieveSavedCards, UpdateSavedCard};

$saved = $client->createSavedCard(new CreateSavedCard(customer: $customer, card: $card));
$saved->savedCard?->token;              // sağlayıcı saklamadıysa null, nedeni result->message

$cards = $client->retrieveSavedCards(RetrieveSavedCards::byReference('musteri-88'));
$cards->default();                      // varsayılan kart, varsa

$client->updateSavedCard(new UpdateSavedCard($cardToken));     // varsayılan yap
$client->deleteSavedCard(new DeleteSavedCard($cardToken));     // delete-saved-card/{token}

use Gurmehub\Odemehub\Request\{CancelPayment, RefundPayment};

$refund = $client->refundPayment(new RefundPayment(token: $transactionToken, amount: '50.00'));   // tutar boş: kalanın tamamı
$refund->refund->amount;                // gerçekten geri giden tutar

$cancel = $client->cancelPayment(new CancelPayment(token: $transactionToken));

use Gurmehub\Odemehub\Request\RetrieveBin;

$bin = $client->retrieveBin(new RetrieveBin(bin: '415565', amount: '1200.00'));

$bin->issuerName;                       // Yapı Kredi
$bin->scheme;                           // Enum\CardScheme::Visa
foreach ($bin->installments as $installment) {
    $installment->number;               // 3
    $installment->total;                // 1236.00
}

use Gurmehub\Odemehub\Request\{CreateBankAccount, DeleteBankAccount, RetrieveBankAccounts, RetrieveBanks, RetrieveBankTransactions, UpdateBankAccount};

$client->retrieveBanks(new RetrieveBanks)->banks;   // her bankada id, title ve fields (key, t_secret' => '…', 'access_token' => '…', 'refresh_token' => '…'],
));
$added->bankAccount?->token;            // saklayın; banka reddettiyse null, nedeni result->message

$client->retrieveBankAccounts(new RetrieveBankAccounts);                              // bütün hesaplar; ya da en çok 50 token
$client->updateBankAccount(new UpdateBankAccount(token: $token, name: 'Ana hesap'));   // settings: yalnızca değişecek bilgiler
$client->deleteBankAccount(new DeleteBankAccount($token));                            // delete-bank-account/{token}

$page = $client->retrieveBankTransactions(new RetrieveBankTransactions(
    bankAccountTokens: [$token],        // 1–50 hesap
    createdFrom: '2026-10-20',          // boş: son 7 gün
    createdTo: '2026-10-26',
    page: 1,                            // perPage: page verilince varsayılan 50, en çok 250; ikisi de boşsa 250
));
foreach ($page->bankTransactions as $movement) {
    $movement->amount;                  // işaretli: '22164.96' giren, '-40.00' çıkan
    $movement->bookedAt;                // bankanın kaydettiği an, ISO 8601 UTC
    $movement->counterpartyIban;
}
$page->pagination->hasMorePages();

use Gurmehub\Odemehub\{PartnerClient, PartnerOptions};
use Gurmehub\Odemehub\Enum\WebhookEvent;
use Gurmehub\Odemehub\Request\{CreateLogo, CreatePaymentProvider, CreateTeam, CreateWebhookEndpoint, DeleteTeam, RetrieveTeams, UpdateCheckoutDesign, UpdateTeamModules};

$partner = new PartnerClient(new PartnerOptions(
    baseUrl: 'https://sandbox.odemehub.com',
    apiKey: getenv('ODEMEHUB_PARTNER_API_KEY'),
    apiSecret: getenv('ODEMEHUB_PARTNER_API_SECRET'),
));

$team = $partner->createTeam(new CreateTeam(
    name: 'Müşterim A.Ş.',                  // hepsi isteğe bağlı
    timezone: 'Europe/Istanbul',
    modules: ['orders', 'bank_transactions'],
))->team;
$team->slug;                                // Çalışma Alanı Kimliği; apiKey, apiSecret, gatewayUrl, isTest, modules ile saklayın

$client = $partner->teamClient($team);      // çalışma alanının kendi anahtarıyla Client

$client->createPaymentProvider(new CreatePaymentProvider(
    provider: 'iyzico',                     // retrieveProviders(): türler ve istedikleri ayarlar (fields)
    name: 'iyzico',
    settings: ['test_api_key' => '…', 'test_api_secret' => '…'],   // sandbox çalışma alanı test'tir: test_ önekli ayarlar zorunlu
));
$client->createWebhookEndpoint(new CreateWebhookEndpoint(
    url: 'https://ornek.com/odemehub/webhook',
    events: [WebhookEvent::OrderPaid, 'transaction.successful'],
));
$logo = $client->createLogo(CreateLogo::fromBytes(file_get_contents('logo.png')));
$client->updateCheckoutDesign(new UpdateCheckoutDesign(logo: $logo->url, accentColor: '#0f766e'));

$partner->retrieveTeams(new RetrieveTeams(page: 1));                                // ya da slugs: [...]; pagination döner
$partner->updateTeamModules(new UpdateTeamModules($team->slug, ['orders']));       // gönderilenler açık kalır; [] hepsini kapatır
$partner->deleteTeam(new DeleteTeam($team->slug));                                  // çalışma alanı ve içindeki her şey silinir

use Gurmehub\Odemehub\Request\RetrievePayments;

// Yanıtı alınamayan bir ödemenin akıbeti: referanstaki bütün denemeler
$client->retrievePayments(RetrievePayments::byReference('SIP-10231'));

// Belli günlerdeki bütün denemeler, reddedilenler dahil, durumu ve tutarıyla
$list = $client->retrievePayments(RetrievePayments::between('2026-09-26', '2026-10-02'));
foreach ($list->payments as $transaction) {
    $transaction->status;               // Enum\TransactionStatus; Timeout: sağlayıcı yanıt vermedi
    $transaction->paymentStatus;        // Enum\PaymentStatus: Paid, Refunded, PartiallyRefunded...
}

$client->retrievePayments(RetrievePayments::latest());   // son 7 gün

$page = 1;

do {
    $list = $client->retrievePayments(RetrievePayments::between('2026-09-26', '2026-10-02')->withPage($page++, 250));

    foreach ($list->payments as $transaction) {
        // ...
    }
} while ($list->pagination?->hasMorePages());

use Gurmehub\Odemehub\Exception\SignatureException;
use Gurmehub\Odemehub\Request\{RetrieveLinkPayments, RetrieveOrders, RetrievePayments, RetrieveSubscriptions};

try {
    $webhook = $client->webhook(
        $_SERVER['REQUEST_METHOD'],
        parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH),
        file_get_contents('php://input'),
        $_SERVER['HTTP_X_TIMESTAMP'] ?? null,
        $_SERVER['HTTP_X_SIGNATURE'] ?? null,
    );
} catch (SignatureException $e) {
    http_response_code(401);
    exit;
}

$webhook->id;      // aynı bildirim tekrar gelebilir; bununla ayıklayın
$webhook->event;   // order.paid, subscription.active ...

if ($webhook->orderToken !== null) {
    $order = $client->retrieveOrders(RetrieveOrders::byToken($webhook->orderToken))->orders[0];
    $order->status;                         // Enum\OrderStatus::Paid
    $order->transaction?->paymentStatus;    // Enum\PaymentStatus: Refunded, PartiallyRefunded ...
} elseif ($webhook->linkPaymentToken !== null) {   // payment_link.*
    $linkPayment = $client->retrieveLinkPayments(RetrieveLinkPayments::byToken($webhook->linkPaymentToken))->linkPayments[0];
    $linkPayment->paymentLink->token;       // $webhook->paymentLinkToken ile aynı
    $linkPayment->isPaid();
    $linkPayment->transaction?->paymentStatus;
} elseif ($webhook->subscriptionToken !== null) {
    $subscription = $client->retrieveSubscriptions(RetrieveSubscriptions::byToken($webhook->subscriptionToken))->subscriptions[0];
} elseif ($webhook->transactionToken !== null) {   // transaction.*
    $transaction = $client->retrievePayments(RetrievePayments::byToken($webhook->transactionToken))->payments[0];
}

http_response_code(204);

use Gurmehub\Odemehub\Exception\{OdemehubException, ValidationException};

try {
    $payment = $client->regularPayment($request);
} catch (ValidationException $e) {
    $e->errors['transaction.amount'][0] ?? null;
} catch (OdemehubException $e) {
    $e->getMessage();                   // Türkçe
}
bash
composer