midtrans php

其他类别 2025-08-23

中期php

中期trans❤️php!

这是与作曲家兼容的Mid Trans付款API的官方PHP包装器/图书馆。有关该产品的更多信息,请访问https://*midtra*ns.c*om,并在http://docs.midtrans.com上查看文档,以获取更多技术详细信息。启动版2.6,该库现在支持Snap-bi。您可以转到此文档以了解有关Snap-Bi的更多信息。

1。安装

1.作曲家安装

如果您使用的是作曲家,则可以通过Composer CLI安装:

 composer require midtrans/midtrans-php

或者

将此要求行添加到您的composer.json文件:

{
    "require" : {
        "midtrans/midtrans-php" : " 2.* "
    }
}

并在终端上运行composer install

注意:如果您使用的是Laravel框架,在某些情况下,您还需要运行composer dumpautoload

然后, /Midtrans将作为您的Laravel项目中的对象可用(自动加载)。

1.B手动安装

如果您不使用作曲家,则可以克隆或下载此存储库。

然后,您应该在代码上需要/autoLoad Midtrans.php文件。

 require_once dirname ( __FILE__ ) . ' /pathofproject/Midtrans.php ' ;

// my code goes here 

2。如何使用

2.1一般设置

 // 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 ;

覆盖通知URL

您可以选择更改或添加每个事务上的自定义通知URL。可以通过将其他HTTP标头添加到负责请求中来实现。

 // Add new notification url(s) alongside the settings on Midtrans Dashboard Portal (MAP)
Config:: $ appendNotifUrl = " https://ex**am*ple.com/test1,https://example.com/test2 " ;
// Use new notification url(s) disregarding the settings on Midtrans Dashboard Portal (MAP)
Config:: $ overrideNotifUrl = " https://ex*am*ple.c*om/test1 " ;

更多细节

注意:当一起使用appendNotifUrloverrideNotifUrl时,仅将使用过度overrideNotifUrl

两个标头只能收到最多3个URL

智力 - 键

您可以选择在充电事务上添加divempotency键。可以通过将其他HTTP标头添加到负责请求中来实现。是一个独特的值,它在API请求上放在标题上。 Midtrans API接受标头上的IDEMPOTENCY-KEY,可以安全处理重试请求,而无需两次执行相同的操作。对于由于网络问题或其他意外错误而未收到响应的情况,这很有帮助。

Config:: $ paymentIdempotencyKey = " Unique-ID " ;

更多细节

2.2选择产品/方法

我们有3种不同的付款产品,您可以使用:

  • SNAP-可自定义的付款弹出窗口将出现在您的Web/App上(无重定向)。 Doc Ref
  • SNAP重定向 - 需要将客户重定向到由中型托管托管的付款URL。 Doc Ref
  • Core API(VT -Direct) - 基本的后端实现,您可以根据自己的意愿自定义嵌入在Web/应用程序上的前端(无重定向)。 Doc Ref

选择最适合自己独特需求的一种。

2.2

您可以在此处看到快照示例。

获得快照令牌

 $ params = array (
    ' transaction_details ' => array (
        ' order_id ' => rand (),
        ' gross_amount ' => 10000 ,
    )
);

$ snapToken =  Midtrans Snap:: getSnapToken ( $ params );

当客户点击付款按钮时,初始化snap js

Pay!
JSON result will appear here after payment:
">
 < html >
  < body >
    < button id =" pay-button " > Pay!  button >
    < pre > < div id =" result-json " > JSON result will appear here after payment: < br >  div >  pre > 


    < script src =" https://app.sand*box.m*idtr*ans.com/snap/snap.js " data-client-key ="  " >  script >
    < script type =" text/javascript " >
      document . getElementById ( 'pay-button' ) . onclick = function ( ) {
        // SnapToken acquired from previous step
        snap . pay ( '' , {
          // Optional
          onSuccess : function ( result ) {
            /* You may add your own js here, this is just example */ document . getElementById ( 'result-json' ) . innerHTML += JSON . stringify ( result , null , 2 ) ;
          } ,
          // Optional
          onPending : function ( result ) {
            /* You may add your own js here, this is just example */ document . getElementById ( 'result-json' ) . innerHTML += JSON . stringify ( result , null , 2 ) ;
          } ,
          // Optional
          onError : function ( result ) {
            /* You may add your own js here, this is just example */ document . getElementById ( 'result-json' ) . innerHTML += JSON . stringify ( result , null , 2 ) ;
          }
        } ) ;
      } ;
     script >
   body >
 html > 

实施通知处理程序

请参阅本节

2.2.b快速重定向

您可以在此处看到一些快照重定向示例。

获取付款页面的重定向URL

 $ 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 ();
}

实施通知处理程序

请参阅本节

2.2.c核心API(VT-Direct)

您可以在此处看到一些核心API示例。

设置客户端密钥

 MidtransNew3ds . clientKey = "" ; 

结帐页面

请参考此文件

结帐过程

1。创建交易详细信息
 $ transaction_details = array (
  ' order_id '    => time (),
  ' gross_amount '  => 200000
);
2。创建项目详细信息,计费地址,运输地址和客户详细信息(可选)
"Setiawan", 'address' => "Karet Belakang 15A, Setiabudi.", 'city' => "Jakarta", 'postal_code' => "51161", 'phone' => "081322311801", 'country_code' => 'IDN' ); // 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' ); // 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 );">
 // Populate items
$ items = array (
    array (
        ' id '       => ' item1 ' ,
        ' price '    => 100000 ,
        ' quantity ' => 1 ,
        ' name '     => ' Adidas f50 '
    ),
    array (
        ' id '       => ' item2 ' ,
        ' price '    => 50000 ,
        ' quantity ' => 2 ,
        ' name '     => ' Nike N90 '
    )
);

// 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 '
);

// 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 '
);

// 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
);
3。从结帐页面获取令牌ID
 // Token ID from checkout page
$ token_id = $ _POST [ ' token_id ' ];
4。创建交易数据
 // 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
);
5。充电
 $ response =  Midtrans CoreApi:: charge ( $ transaction_data );
6。信用卡3DS身份验证

信用卡收费结果可能包含3DS身份验证的redirect_url 。 3DS身份验证应在前端处理,请参阅API文档

有关信用卡3DS交易的完整示例,请参阅:

  • 核心API示例
7。处理交易状态
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 "
"; }">
 // Success
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 " 
"
; }

8。实施通知处理程序

请参阅本节

2.3处理HTTP通知

创建分离的Web端点(通知URL)以接收HTTP Post Notification Callback/Webhook。每当更改事务状态时,HTTP通知将发送。示例也可以在这里提供

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' }">
 $ 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'
}

2.4过程交易

获取交易状态

 $ status =  Midtrans Transaction:: status ( $ orderId );
var_dump ( $ status );

批准交易

如果交易fraud_status ==挑战,则可以批准商家仪表板或API的交易:

 $ approve =  Midtrans Transaction:: approve ( $ orderId );
var_dump ( $ approve );

取消交易

您可以通过fraud_status == CHALLENGE取消交易,或使用transaction_status == CAPTURE信用卡事务(在结算之前)

 $ cancel =  Midtrans Transaction:: cancel ( $ orderId );
var_dump ( $ cancel );

到期交易

您可以使用transaction_status == PENDING处理(在结算或到期之前)到期

 $ cancel =  Midtrans Transaction:: cancel ( $ orderId );
var_dump ( $ cancel );

退款交易

退款交易(并非所有付款渠道都允许通过API退款)您可以通过transaction_status == settlement退还交易

 $ params = array (
    ' refund_key ' => ' order1-ref1 ' ,
    ' amount ' => 10000 ,
    ' reason ' => ' Item out of stock '
);
$ refund =  Midtrans Transaction:: refund ( $ orderId , $ params );
var_dump ( $ refund );

直接退款交易

退款通过直接退款API退款您可以通过transaction_status == settlement退款交易

 $ params = array (
    ' refund_key ' => ' order1-ref1 ' ,
    ' amount ' => 10000 ,
    ' reason ' => ' Item out of stock '
);
$ direct_refund =  Midtrans Transaction:: refundDirect ( $ orderId , $ params );
var_dump ( $ direct_refund );

3。snap-bi(*新功能启动v2.6.0)

STARAR NASIANT OPEN API PEMBAYARAN,即简短的SNAP,是印度尼西亚银行出版的全国付款API标准。要了解更多信息,您可以阅读此文档

3.1一般设置

 //These config value are based on the header stated here https://docs.*mid**trans.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 "

3.2创建付款

3.2.1直接借方(Gopay,Dana,Shopeepay)

有关使用直接借方创建付款的更多详细信息,请参阅此文档。

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.*g*oog*le.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); ">
   
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.go**ogl*e.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 " => "					
下载源码

通过命令行克隆项目:

git clone https://github.com/Midtrans/midtrans-php.git