1. Go to this page and download the library: Download midtrans/midtrans-php 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/ */
midtrans / midtrans-php example snippets
// my code goes here
// Set your Merchant Server Key
\Midtrans\Config::$serverKey = '<your server key>';
// 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;
// Add new notification url(s) alongside the settings on Midtrans Dashboard Portal (MAP)
Config::$appendNotifUrl = "https://example.com/test1,https://example.com/test2";
// Use new notification url(s) disregarding the settings on Midtrans Dashboard Portal (MAP)
Config::$overrideNotifUrl = "https://example.com/test1";
// Success
if($response->transaction_status == 'capture') {
echo "<p>Transaksi berhasil.</p>";
echo "<p>Status transaksi untuk order id $response->order_id: " .
"$response->transaction_status</p>";
echo "<h3>Detail transaksi:</h3>";
echo "<pre>";
var_dump($response);
echo "</pre>";
}
// Deny
else if($response->transaction_status == 'deny') {
echo "<p>Transaksi ditolak.</p>";
echo "<p>Status transaksi untuk order id .$response->order_id: " .
"$response->transaction_status</p>";
echo "<h3>Detail transaksi:</h3>";
echo "<pre>";
var_dump($response);
echo "</pre>";
}
// Challenge
else if($response->transaction_status == 'challenge') {
echo "<p>Transaksi challenge.</p>";
echo "<p>Status transaksi untuk order id $response->order_id: " .
"$response->transaction_status</p>";
echo "<h3>Detail transaksi:</h3>";
echo "<pre>";
var_dump($response);
echo "</pre>";
}
// Error
else {
echo "<p>Terjadi kesalahan pada data transaksi yang dikirim.</p>";
echo "<p>Status message: [$response->status_code] " .
"$response->status_message</p>";
echo "<pre>";
var_dump($response);
echo "</pre>";
}
$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'
}
//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"
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" => "[email protected]",
"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);
/**
* 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);
/**
* 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);
/**
* Example reusing your existing accessToken by using ->withAccessToken
*/
$snapBiResponse = SnapBi::va()
->withAccessToken("your-access-token")
->withBody($vaParams)
->createPayment($external_id);
//the request body/ payload sent by the webhook
$payload = json_decode(
{
"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()