### Manual Installation Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Provides instructions for manual installation if Composer is not used. Requires including the main library file. ```php require_once dirname(__FILE__) . '/pathofproject/Midtrans.php'; ``` -------------------------------- ### Get Transaction Status Examples (PHP) Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Demonstrates how to retrieve the status of various transaction types including Direct Debit (by external ID and reference number), Virtual Accounts, and QRIS. Each example shows the necessary request body and the method call to get the status. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $directDebitStatusByExternalIdBody = array( "originalExternalId" => "uzi-order-testing66ce90ce90ee5", "originalPartnerReferenceNo" => "uzi-order-testing66ce90ce90ee5", "serviceCode" => "54", ); $directDebitStatusByReferenceBody = array( "originalReferenceNo" => "A1202408280618283vcBaAmf7RID", "serviceCode" => "54", ); $vaStatusBody = array( "partnerServiceId" => " 5818", "customerNo" => "628064192914", "virtualAccountNo" => " 5818628064192914", "inquiryRequestId" => "uzi-order-testing66dc4799e4af5", "paymentRequestId" => "uzi-order-testing66dc4799e4af5", "additionalInfo" => array( "merchantId" => $merchant_id ) ); $qrisStatusBody = array( "originalReferenceNo" => "A120240910100828anKJlXgsi6ID", "originalPartnerReferenceNo" => "uzi-order-testing66e01a9b8c6bf", "merchantId" => $merchant_id, "serviceCode" => "54" ); /** * Example code for Direct Debit getStatus using externalId */ $snapBiResponse = SnapBi::directDebit() ->withBody($statusByExternalId) ->getStatus($external_id); /** * Example code for Direct Debit getStatus using referenceNo */ $snapBiResponse = SnapBi::directDebit() ->withBody($statusByReference) ->getStatus($external_id); /** * Example code for VA (Bank Transfer) getStatus */ $snapBiResponse = SnapBi::va() ->withBody($vaStatusBody) ->getStatus($external_id); /** * * Example code for Qris getStatus */ $snapBiResponse = SnapBi::qris() ->withBody($qrisStatusBody) ->getStatus($external_id); ``` -------------------------------- ### Composer Installation Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Installs the Midtrans PHP library using Composer. This is the recommended method for managing dependencies. ```bash composer require midtrans/midtrans-php ``` ```json { "require": { "midtrans/midtrans-php": "2.*" } } ``` -------------------------------- ### Cancel Transaction Examples (PHP) Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Provides examples for cancelling various transaction types, including Direct Debit (by reference number and external ID), Virtual Accounts, and QRIS. Each snippet illustrates the required data for cancellation and the corresponding SDK method call. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $directDebitCancelByReferenceBody = array( "originalReferenceNo" => "A120240902104935GBqSQK0gtQID" ); $directDebitCancelByExternalIdBody = array( "originalExternalId" => "uzi-order-testing66d5983eabc71" ); $vaCancelBody = array( "partnerServiceId" => " 5818", "customerNo" => "628014506680", "virtualAccountNo" => " 5818628014506680", "trxId" => "uzi-order-testing66dc76754bf1c", "additionalInfo" => array( "merchantId" => $merchant_id ) ); $qrisCancelBody = array( "originalReferenceNo" => "A120240910091847fYkCqhCH1XID", "merchantId" => $merchant_id, "reason" => "cancel reason", ); /** * Basic implementation to cancel transaction using referenceNo */ $snapBiResponse = SnapBi::directDebit() ->withBody($directDebitCancelByReferenceBody) ->cancel($external_id); /** * Basic implementation to cancel transaction using externalId */ $snapBiResponse = SnapBi::directDebit() ->withBody($directDebitCancelByExternalIdBody) ->cancel($external_id); /** * Basic implementation of VA (Bank Transfer) to cancel transaction */ $snapBiResponse = SnapBi::va() ->withBody($vaCancelBody) ->cancel($external_id); /** * Basic implementation of Qris to cancel transaction */ $snapBiResponse = SnapBi::qris() ->withBody($qrisCancelBody) ->cancel($external_id); ``` -------------------------------- ### Refund Transaction - QRIS Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Provides an example of refunding a QRIS transaction. This includes setting up the refund body with merchant details, original reference, and refund amount. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $qrisRefundBody = array( "merchantId" => $merchant_id, "originalPartnerReferenceNo" => "uzi-order-testing66e01a9b8c6bf", "originalReferenceNo" => "A120240910100828anKJlXgsi6ID", "partnerRefundNo" => "partner-refund-no-" . uniqid(), "reason" => "refund reason", "refundAmount" => array( "value" => "1500.00", "currency" => "IDR" ), "additionalInfo" => array( "foo" => "bar" ) ); /** * Example code for refund using Qris */ $snapBiResponse = SnapBi::qris() ->withBody($qrisRefundBody) ->refund($external_id); ``` -------------------------------- ### Get Snap Token Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Generates a Snap token for initiating a payment transaction. Requires transaction details like order ID and gross amount. ```php $params = array( 'transaction_details' => array( 'order_id' => rand(), 'gross_amount' => 10000, ) ); $snapToken = \Midtrans\Snap::getSnapToken($params); ``` -------------------------------- ### Get Snap Redirect URL Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Retrieves the redirection URL for a Snap payment page. This involves creating transaction parameters and then calling the `createTransaction` method to get the payment URL, which is then used to redirect the user. ```php $params = array( 'transaction_details' => array( 'order_id' => rand(), 'gross_amount' => 10000, ) ); try { // Get Snap Payment Page URL $paymentUrl = \Midtrans\Snap::createTransaction($params)->redirect_url; // Redirect to Snap Payment Page header('Location: ' . $paymentUrl); } catch (Exception $e) { echo $e->getMessage(); } ``` -------------------------------- ### Get Transaction Status Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Retrieves the current status of a transaction using its order ID. ```php $status = \Midtrans\Transaction::status($orderId); var_dump($status); ``` -------------------------------- ### Get Token ID from Checkout Page Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Retrieves the token ID submitted from a checkout page, typically via a POST request. ```php // Token ID from checkout page $token_id = $_POST['token_id']; ``` -------------------------------- ### Midtrans PHP SDK - Unit and Integration Testing Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Instructions for running unit and integration tests for the Midtrans PHP SDK. It covers how to configure server and client keys, run all tests, and execute specific test files. ```APIDOC Unit Test: Integration Test (sandbox real transactions) Please change server key and client key on `phpunit.xml` to your own. All Test `vendor/bin/phpunit` Specific Test `vendor/bin/phpunit tests/integration/CoreApiIntegrationTest.php` ``` -------------------------------- ### Midtrans General Settings Configuration Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Configures the Midtrans SDK for either sandbox or production environments. Includes settings for client ID, private key, client secret, partner ID, channel ID, logging, and public key for webhook verification. ```php //These config value are based on the header stated here https://docs.midtrans.com/reference/getting-started-1 // Set to Development/Sandbox Environment (default). Set to true for Production Environment (accept real transaction). \SnapBi\Config::$isProduction = false; // Set your client id. Merchant’s client ID that will be given by Midtrans, will be used as X-CLIENT-KEY on request’s header in B2B Access Token API. \SnapBi\Config::$snapBiClientId = "YOUR CLIENT ID"; // Set your private key here, make sure to add \n on the private key, you can refer to the examples \SnapBi\Config::$snapBiPrivateKey = "YOUR PRIVATE KEY"; // Set your client secret. Merchant’s secret key that will be given by Midtrans, will be used for symmetric signature generation for Transactional API’s header. \SnapBi\Config::$snapBiClientSecret = "YOUR CLIENT SECRET"; // Set your partner id. Merchant’s partner ID that will be given by Midtrans, will be used as X-PARTNER-ID on Transactional API’s header. \SnapBi\Config::$snapBiPartnerId = "YOUR PARTNER ID"; // Set the channel id here. \SnapBi\Config::$snapBiChannelId = "CHANNEL ID"; // Enable logging to see details of the request/response make sure to disable this on production, the default is disabled. \SnapBi\Config::$enableLogging = false; // Set your public key here if you want to verify your webhook notification, make sure to add \n on the public key, you can refer to the examples \SnapBi\Config::$snapBiPublicKey = "YOUR PUBLIC KEY" ``` -------------------------------- ### General Settings Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Configures essential settings for the Midtrans API, including server key, production environment, sanitization, and 3D Secure. ```php // Set your Merchant Server Key \Midtrans\Config::$serverKey = ''; // Set to Development/Sandbox Environment (default). Set to true for Production Environment (accept real transaction). \Midtrans\Config::$isProduction = false; // Set sanitization on (default) \Midtrans\Config::$isSanitized = true; // Set 3DS transaction for credit card to true \Midtrans\Config::$is3ds = true; ``` -------------------------------- ### Create Virtual Account Payment (Bank Transfer) Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Demonstrates how to create a Virtual Account payment using the Midtrans PHP SDK. This involves setting up transaction details, customer information, and bank-specific parameters. The `SnapBi::va()->withBody($vaParams)->createPayment($external_id)` method is used to initiate the payment. ```php $external_id = "uzi-order-testing" . uniqid(); $customerVaNo = "6280123456"; $merchant_id = "M001234"; $vaParams = array( "partnerServiceId"=> " 70012", "customerNo"=> $customerVaNo, "virtualAccountNo"=> " 70012" . $customerVaNo, "virtualAccountName"=> "Jokul Doe", "virtualAccountEmail"=> "jokul@email.com", "virtualAccountPhone"=> "6281828384858", "trxId"=> $external_id, "totalAmount"=> [ "value"=> "10000.00", "currency"=> "IDR" ], "additionalInfo"=> [ "merchantId"=> $merchant_id, "bank"=> "mandiri", "flags"=> [ "shouldRandomizeVaNumber"=> false ], "mandiri"=> [ "billInfo1"=> "bank_name", "billInfo2"=> "mandiri", "billInfo3"=> "Name:", "billInfo4"=> "Budi Utomo", "billInfo5"=> "Class:", "billInfo6"=> "Computer Science", "billInfo7"=> "ID:", "billInfo8"=> "VT-12345" ], "customerDetails"=> [ "firstName"=> "Jokul", "lastName"=> "Doe", "email"=> "jokul@email.com", "phone"=> "+6281828384858", "billingAddress"=> [ "firstName"=> "Jukul", "lastName"=> "Doe", "address"=> "Kalibata", "city"=> "Jakarta", "postalCode"=> "12190", "phone"=> "+6281828384858", "countryCode"=> "IDN" ], "shippingAddress"=> [ "firstName"=> "Jukul", "lastName"=> "Doe", "address"=> "Kalibata", "city"=> "Jakarta", "postalCode"=> "12190", "phone"=> "+6281828384858", "countryCode"=> "IDN" ] ], "customField"=> [ "1"=> "custom-field-1", "2"=> "custom-field-2", "3"=> "custom-field-3" ], "items"=> [ [ "id"=> "a1", "price"=> [ "value"=> "1000.00", "currency"=> "IDR" ], "quantity"=> 3, "name"=> "Apel", "brand"=> "Fuji Apple", "category"=> "Fruit", "merchantName"=> "Fruit-store" ], [ "id"=> "a2", "price"=> [ "value"=> "1000.00", "currency"=> "IDR" ], "quantity"=> 7, "name"=> "Apel Malang", "brand"=> "Fuji Apple", "category"=> "Fruit", "merchantName"=> "Fruit-store" ] ] ] ); /** * basic implementation to create payment using va */ $snapBiResponse = SnapBi::va() ->withBody($vaParams) ->createPayment($external_id); ``` -------------------------------- ### Initialize Snap JS for Payment Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Initializes the Midtrans Snap JavaScript library to handle customer payments. This involves setting up a button click event to trigger the payment process with the obtained Snap token and defining callbacks for success, pending, and error states. ```html
JSON result will appear here after payment:
``` -------------------------------- ### Midtrans PHP SDK - Developing E-commerce Plugins Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Guidelines for developing e-commerce plugins with the Midtrans PHP SDK, focusing on handling different currencies and utilizing auto-sanitization features. ```APIDOC Developing e-commerce plug-ins There are several guides that must be taken care of when you develop new plugins. 1. __Handling currency other than IDR.__ Midtrans `v1` and `v2` currently accepts payments in Indonesian Rupiah only. As a corrolary, there is a validation on the server to check whether the item prices are in integer or not. As much as you are tempted to round-off the price, DO NOT do that! Always prepare when your system uses currencies other than IDR, convert them to IDR accordingly, and only round the price AFTER that. 2. Consider using the __auto-sanitization__ feature. ``` -------------------------------- ### Create Customer Details Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Compiles customer information, including name, email, phone, and optionally billing and shipping addresses. ```php // Populate customer's info $customer_details = array( 'first_name' => "Andri", 'last_name' => "Setiawan", 'email' => "test@test.com", 'phone' => "081322311801", 'billing_address' => $billing_address, 'shipping_address' => $shipping_address ); ``` -------------------------------- ### Adding Additional Headers - Create Payment (VA) Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Illustrates how to include custom headers when creating a payment via Virtual Account. This is useful for providing specific identifiers or debugging information in the request. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $vaParams = []; // Assume $vaParams is defined elsewhere /** * Example code for using additional header on creating payment using VA */ $snapBiResponse = SnapBi::va() ->withAccessTokenHeader([ "debug-id"=> "va debug id", "X-DEVICE-ID"=>"va device id" ]) ->withTransactionHeader([ "debug-id"=> "va debug id", "X-DEVICE-ID"=>"va device id" ]) ->withBody($vaParams) ->createPayment($external_id); ``` -------------------------------- ### Create Item Details Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Populates an array with details of the items being purchased, including their ID, price, quantity, and name. ```php // Populate items $items = array( array( 'id' => 'item1', 'price' => 100000, 'quantity' => 1, 'name' => 'Adidas f50' ), array( 'id' => 'item2', 'price' => 50000, 'quantity' => 2, 'name' => 'Nike N90' ) ); ``` -------------------------------- ### Create QRIS Payment Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Illustrates how to create a QRIS payment using the Midtrans PHP SDK. This includes specifying transaction details, merchant information, and validity periods. The `SnapBi::qris()->withBody($qrisBody)->createPayment($external_id)` method is used for this purpose. ```php $external_id = "uzi-order-testing" . uniqid(); $merchant_id = "M001234"; $qrisBody = array( "partnerReferenceNo" => $external_id, "amount" => array( "value" => "1500.00", "currency" => "IDR" ), "merchantId" => $merchant_id, "validityPeriod" => "2030-07-03T12:08:56-07:00", "additionalInfo" => array( "acquirer" => "gopay", "items" => array( array( "id" => "8143fc4f-ec05-4c55-92fb-620c212f401e", "price" => array( "value" => "1500.00", "currency" => "IDR" ), "quantity" => 1, "name" => "test item name", "brand" => "test item brand", "category" => "test item category", "merchantName" => "Merchant Operation" ) ), "customerDetails" => array( "email" => "merchant-ops@midtrans.com", "firstName" => "Merchant", "lastName" => "Operation", "phone" => "+6281932358123" ), "countryCode" => "ID", "locale" => "id_ID" ) ); /** * basic implementation to create payment using Qris */ $snapBiResponse = SnapBi::qris() ->withBody($qrisBody) ->createPayment($external_id); ``` -------------------------------- ### Reusing Access Token - Create Payment (VA) Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Shows how to reuse a previously obtained access token when creating a Virtual Account payment. This method avoids the need to fetch a new token for subsequent requests. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $vaParams = []; // Assume $vaParams is defined elsewhere /** * Example reusing your existing accessToken by using ->withAccessToken */ $snapBiResponse = SnapBi::va() ->withAccessToken("your-access-token") ->withBody($vaParams) ->createPayment($external_id); ``` -------------------------------- ### Create Direct Debit Payment Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Creates a direct debit payment request for various providers like Gopay, Dana, and Shopeepay. It includes setting the transaction validity period, merchant ID, return URL, and detailed customer and item information. The payment method can be changed within the `payOptionDetails` array. ```php date_default_timezone_set('Asia/Jakarta'); $time_stamp = date("c"); $date = new DateTime($time_stamp); $external_id = "uzi-order-testing" . uniqid(); // Add 10 minutes validity time $date->modify('+10 minutes'); // Format the new date $valid_until = $date->format('c'); $merchant_id = "M001234"; //create direct debit request body/ payload //you can change the payment method on the `payOptionDetails` $debitParams = array( "partnerReferenceNo" => $external_id, "chargeToken" => "", "merchantId" => $merchant_id, "urlParam" => array( array( "url" => "https://www.google.com", "type" => "PAY_RETURN", "isDeeplink" => "Y" ) ), "validUpTo" => $valid_until, "payOptionDetails" => array( array( "payMethod" => "DANA", "payOption" => "DANA", "transAmount" => array( "value" => "100.0", "currency" => "IDR" //currently we only support `IDR` ) ) ), "additionalInfo" => array( "customerDetails" => array( "phone" => "081122334455", "firstName" => "Andri", "lastName" => "Litani", "email" => "andri@litani.com", "billingAddress" => array( "firstName" => "Andri", "lastName" => "Litani", "phone" => "081122334455", "address" => "billingAddress", "city" => "billingCity", "postalCode" => "12790", "countryCode" => "CZH" ), "shippingAddress" => array( "firstName" => "Andri", "lastName" => "Litani", "phone" => "081122334455", "address" => "shippingAddress", "city" => "shippingCity", "postalCode" => "12790", "countryCode" => "CZH" ) ), "items" => array( array( "id" => "1", "price" => array( "value" => "100.00", "currency" => "IDR" ), "quantity" => 1, "name" => "Apple", "brand" => "Apple", "category" => "Subscription", "merchantName" => "amazon prime", "url" => "itemUrl" ) ), "metadata" => array() ) ); /** * Basic example * to change the payment method, you can change the value of the request body on the `payOptionDetails` * the `currency` value that we support for now is only `IDR` */ $snapBiResponse = SnapBi::directDebit() ->withBody($debitParams) ->createPayment($external_id); ``` -------------------------------- ### Refund Transaction - Direct Debit by External ID Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Demonstrates how to initiate a refund for a Direct Debit transaction using its external ID. This involves preparing the refund body with transaction details and calling the refund method. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $directDebitRefundByExternalIdBody = array( "originalExternalId" => "uzi-order-testing66cec41c7f905", "partnerRefundNo" => "uzi-order-testing66cec41c7f905" . "refund-0001".rand(), "reason" => "some-reason", "additionalInfo" => array(), "refundAmount" => array( "value" => "100.00", "currency" => "IDR" )); /** * Example code for refund using externalId */ $snapBiResponse = SnapBi::directDebit() ->withBody($directDebitRefundByExternalIdBody) ->refund($external_id); ``` -------------------------------- ### Adding Additional Headers - Direct Debit Refund Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Demonstrates how to add custom headers, such as access token and transaction headers, to a Direct Debit refund request. This allows for passing specific debugging or device information. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $directDebitRefundByExternalIdBody = array( "originalExternalId" => "uzi-order-testing66cec41c7f905", "partnerRefundNo" => "uzi-order-testing66cec41c7f905" . "refund-0001".rand(), "reason" => "some-reason", "additionalInfo" => array(), "refundAmount" => array( "value" => "100.00", "currency" => "IDR" )); /** * Example code for Direct Debit refund using additional header */ $snapBiResponse = SnapBi::directDebit() ->withAccessTokenHeader([ "debug-id"=> "va debug id", "X-DEVICE-ID"=>"va device id" ]) ->withTransactionHeader([ "debug-id"=> "va debug id", "X-DEVICE-ID"=>"va device id" ]) ->withBody($directDebitRefundByExternalIdBody) ->refund($external_id); ``` -------------------------------- ### Create Billing Address Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Defines the customer's billing address, including name, address details, city, postal code, phone number, and country code. ```php // Populate customer's billing address $billing_address = array( 'first_name' => "Andri", 'last_name' => "Setiawan", 'address' => "Karet Belakang 15A, Setiabudi.", 'city' => "Jakarta", 'postal_code' => "51161", 'phone' => "081322311801", 'country_code' => 'IDN' ); ``` -------------------------------- ### Charge Transaction Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Initiates a payment charge using the Midtrans Core API with the prepared transaction data. This method handles the actual processing of the payment. ```php $response = \Midtrans\CoreApi::charge($transaction_data); ``` -------------------------------- ### Verify Midtrans Payment Notification Source: https://github.com/midtrans/midtrans-php/blob/master/README.md This snippet demonstrates how to verify an incoming Midtrans payment notification webhook. It shows how to decode the payload, retrieve the signature and timestamp from headers, specify the notification URL path, and use the `SnapBi::notification()` method to perform the verification. ```php //the request body/ payload sent by the webhook $payload = json_decode( json_encode([ "originalPartnerReferenceNo": "uzi-order-testing67039fa9da813", "originalReferenceNo": "A120241007084530GSXji4Q5OdID", "merchantId": "G653420184", "amount": { "value": "10000.00", "currency": "IDR" }, "latestTransactionStatus": "03", "transactionStatusDesc": "PENDING", "additionalInfo": { "refundHistory": [], "userPaymentDetails": [] } ])); // to get the signature value, you need to retrieve it from the webhook header called X-Signature $xSignature = "CgjmAyC9OZ3pB2JhBRDihL939kS86LjP1VLD1R7LgI4JkvYvskUQrPXgjhrZqU2SFkfPmLtSbcEUw21pg2nItQ0KoX582Y6Tqg4Mn45BQbxo4LTPzkZwclD4WI+aCYePQtUrXpJSTM8D32lSJQQndlloJfzoD6Rh24lNb+zjUpc+YEi4vMM6MBmS26PpCm/7FZ7/OgsVh9rlSNUsuQ/1QFpldA0F8bBNWSW4trwv9bE1NFDzliHrRAnQXrT/J3chOg5qqH0+s3E6v/W21hIrBYZVDTppyJPtTOoCWeuT1Tk9XI2HhSDiSuI3pevzLL8FLEWY/G4M5zkjm/9056LTDw=="; // to get the timeStamp value, you need to retrieve it from the webhook header called X-Timestamp $xTimeStamp = "2024-10-07T15:45:22+07:00"; // the url path is based on the webhook url of the payment method for example for direct debit is `/v1.0/debit/notify` $notificationUrlPath = "/v1.0/debit/notify" /** * Example verifying the webhook notification */ $isVerified = SnapBi::notification() ->withBody($payload) ->withSignature($xSignature) ->withTimeStamp($xTimeStamp) ->withNotificationUrlPath($notificationUrlPath) ->isWebhookNotificationVerified() ``` -------------------------------- ### Create Shipping Address Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Defines the customer's shipping address, including name, address details, city, postal code, phone number, and country code. ```php // Populate customer's shipping address $shipping_address = array( 'first_name' => "John", 'last_name' => "Watson", 'address' => "Bakerstreet 221B.", 'city' => "Jakarta", 'postal_code' => "51162", 'phone' => "081322311801", 'country_code' => 'IDN' ); ``` -------------------------------- ### Set Midtrans Client Key Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Sets the client key for Midtrans 3D Secure operations. This is a crucial step before initiating any 3D Secure related transactions. ```javascript MidtransNew3ds.clientKey = ""; ``` -------------------------------- ### Handle Credit Card Transaction Status Source: https://github.com/midtrans/midtrans-php/blob/master/README.md This snippet demonstrates how to process the response from a credit card transaction, checking for different statuses like 'capture', 'deny', 'challenge', and general errors. It logs the transaction details for debugging. ```php if($response->transaction_status == 'capture') { echo "

Transaksi berhasil.

"; echo "

Status transaksi untuk order id $response->order_id: " . "$response->transaction_status

"; echo "

Detail transaksi:

"; echo "
";
    var_dump($response);
    echo "
"; } // Deny else if($response->transaction_status == 'deny') { echo "

Transaksi ditolak.

"; echo "

Status transaksi untuk order id .$response->order_id: " . "$response->transaction_status

"; echo "

Detail transaksi:

"; echo "
";
    var_dump($response);
    echo "
"; } // Challenge else if($response->transaction_status == 'challenge') { echo "

Transaksi challenge.

"; echo "

Status transaksi untuk order id $response->order_id: " . "$response->transaction_status

"; echo "

Detail transaksi:

"; echo "
";
    var_dump($response);
    echo "
"; } // Error else { echo "

Terjadi kesalahan pada data transaksi yang dikirim.

"; echo "

Status message: "."[$response->status_code] " . "$response->status_message

"; echo "
";
    var_dump($response);
    echo "
"; } ``` -------------------------------- ### Create Transaction Data for Charge Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Constructs the complete transaction data array required for charging a payment. This includes payment type, credit card details (like token ID), transaction details, item details, and customer details. ```php // Transaction data to be sent $transaction_data = array( 'payment_type' => 'credit_card', 'credit_card' => array( 'token_id' => $token_id, 'authentication'=> true, // 'bank' => 'bni', // optional to set acquiring bank // 'save_token_id' => true // optional for one/two clicks feature ), 'transaction_details' => $transaction_details, 'item_details' => $items, 'customer_details' => $customer_details ); ``` -------------------------------- ### Create Transaction Details Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Defines the core transaction details, including a unique order ID and the total gross amount for the transaction. ```php $transaction_details = array( 'order_id' => time(), 'gross_amount' => 200000 ); ``` -------------------------------- ### Idempotency Key Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Enables the use of an idempotency key for charge transactions, ensuring safe retries and preventing duplicate operations in case of network issues. ```php Config::$paymentIdempotencyKey = "Unique-ID"; ``` -------------------------------- ### Direct Refund Transaction Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Initiates a refund for a transaction with 'settlement' status using the Direct Refund API. ```php $params = array( 'refund_key' => 'order1-ref1', 'amount' => 10000, 'reason' => 'Item out of stock' ); $direct_refund = \Midtrans\Transaction::refundDirect($orderId, $params); var_dump($direct_refund); ``` -------------------------------- ### Refund Transaction - Direct Debit by Reference No Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Shows how to refund a Direct Debit transaction using its original reference number. The refund body is constructed with the reference number and refund amount. ```php $merchant_id = "M001234"; $external_id = "uzi-order-testing" . uniqid(); $directDebitRefundByReferenceBody = array( "originalReferenceNo" => "A120240828062651Y0NQMbJkDOID", "reason" => "some-reason", "additionalInfo" => array(), "refundAmount" => array( "value" => "100.00", "currency" => "IDR" )); /** * Example code for refund using reference no */ $snapBiResponse = SnapBi::directDebit() ->withBody($directDebitRefundByReferenceBody) ->refund($external_id); ``` -------------------------------- ### Handle Midtrans HTTP Notification Callback Source: https://github.com/midtrans/midtrans-php/blob/master/README.md This snippet shows how to create a webhook endpoint to receive transaction status updates from Midtrans. It parses the notification payload, checks the transaction and fraud status, and logs the information. It includes placeholders for updating the payment status in the merchant's database. ```php $notif = new \Midtrans\Notification(); $transaction = $notif->transaction_status; $fraud = $notif->fraud_status; error_log("Order ID $notif->order_id: "."transaction status = $transaction, fraud staus = $fraud"); if ($transaction == 'capture') { if ($fraud == 'challenge') { // TODO Set payment status in merchant's database to 'challenge' } else if ($fraud == 'accept') { // TODO Set payment status in merchant's database to 'success' } } else if ($transaction == 'cancel') { if ($fraud == 'challenge') { // TODO Set payment status in merchant's database to 'failure' } else if ($fraud == 'accept') { // TODO Set payment status in merchant's database to 'failure' } } else if ($transaction == 'deny') { // TODO Set payment status in merchant's database to 'failure' } ``` -------------------------------- ### Midtrans Transaction API Operations Source: https://github.com/midtrans/midtrans-php/blob/master/README.md This section details various operations available through the Midtrans Transaction API for managing the lifecycle of a transaction. It includes methods for retrieving status, approving, canceling, expiring, and refunding transactions. ```APIDOC Midtrans\Transaction: status(orderId: string): object Retrieves the current status of a transaction. Parameters: orderId: The unique identifier for the order. Returns: An object containing the transaction status details. approve(orderId: string): object Approves a transaction that has a 'CHALLENGE' fraud status. Parameters: orderId: The unique identifier for the order. Returns: An object confirming the approval. cancel(orderId: string): object Cancels a transaction. Applicable for 'CHALLENGE' fraud status or 'CAPTURE' credit card transactions before settlement. Parameters: orderId: The unique identifier for the order. Returns: An object confirming the cancellation. expire(orderId: string): object Expires a transaction with 'PENDING' status before it settles or expires naturally. Parameters: orderId: The unique identifier for the order. Returns: An object confirming the expiration. refund(orderId: string, params: array): object Initiates a refund for a transaction with 'settlement' status. Not all payment channels support refunds via API. Parameters: orderId: The unique identifier for the order. params: An array containing refund details: refund_key: A unique identifier for the refund. amount: The amount to refund. reason: The reason for the refund. Returns: An object confirming the refund initiation. refundDirect(orderId: string, params: array): object Initiates a direct refund for a transaction with 'settlement' status using the Direct Refund API. Parameters: orderId: The unique identifier for the order. params: An array containing refund details: refund_key: A unique identifier for the refund. amount: The amount to refund. reason: The reason for the refund. Returns: An object confirming the direct refund initiation. ``` -------------------------------- ### Refund Transaction Source: https://github.com/midtrans/midtrans-php/blob/master/README.md Initiates a refund for a transaction that has a 'settlement' status. Note that not all payment channels support refunds via the API. ```php $params = array( 'refund_key' => 'order1-ref1', 'amount' => 10000, 'reason' => 'Item out of stock' ); $refund = \Midtrans\Transaction::refund($orderId, $params); var_dump($refund); ```