미드트랜스 ❤️ PHP!
이는 Composer와 호환되는 Midtrans Payment API용 공식 PHP 래퍼/라이브러리입니다. 제품에 대한 자세한 내용을 보려면 https://midtrans.com을 방문하고, 기술적인 세부 사항을 보려면 http://docs.midtrans.com의 설명서를 참조하십시오. 버전 2.6부터 이 라이브러리는 이제 Snap-bi를 지원합니다. Snap-bi에 대해 자세히 알아보려면 이 문서로 이동하세요.
Composer를 사용하는 경우 Composer CLI를 통해 설치할 수 있습니다.
composer require midtrans/midtrans-php
또는
이 필수 라인을 composer.json
파일에 추가하세요:
{
"require" : {
"midtrans/midtrans-php" : " 2.* "
}
}
터미널에서 composer install
실행하세요.
참고: Laravel 프레임워크를 사용하는 경우 경우에 따라
composer dumpautoload
도 실행해야 합니다.
/Midtrans
Laravel 프로젝트에서 객체로 사용할 수 있습니다(자동 로드).
Composer를 사용하지 않는 경우 이 저장소를 복제하거나 다운로드할 수 있습니다.
그런 다음 코드에 Midtrans.php
파일을 요구/자동 로드해야 합니다.
require_once dirname ( __FILE__ ) . ' /pathofproject/Midtrans.php ' ;
// 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 ;
모든 거래에서 맞춤 알림 URL을 변경하거나 추가하도록 선택할 수 있습니다. 이는 청구 요청에 추가 HTTP 헤더를 추가하여 달성할 수 있습니다.
// 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 " ;
자세한 내용
참고:
appendNotifUrl
과overrideNotifUrl
함께 사용하는 경우overrideNotifUrl
만 사용됩니다.
두 헤더 모두 최대 3개의 URL 만 수신할 수 있습니다.
청구 거래에 멱등성 키를 추가하도록 선택할 수 있습니다. 이는 청구 요청에 추가 HTTP 헤더를 추가하여 달성할 수 있습니다. API 요청 시 헤더에 입력되는 고유한 값입니다. Midtrans API는 동일한 작업을 두 번 수행하지 않고도 재시도 요청을 안전하게 처리하기 위해 헤더에 Idempotency-Key를 허용합니다. 이는 네트워크 문제나 기타 예상치 못한 오류로 인해 판매자가 응답을 받지 못한 경우에 유용합니다.
Config:: $ paymentIdempotencyKey = " Unique-ID " ;
자세한 내용
귀하가 사용할 수 있는 3가지 결제 제품이 있습니다:
귀하의 고유한 요구 사항에 가장 적합하다고 생각되는 것을 선택하십시오.
여기에서 스냅 예시를 볼 수 있습니다.
$ params = array (
' transaction_details ' => array (
' order_id ' => rand (),
' gross_amount ' => 10000 ,
)
);
$ snapToken = Midtrans Snap:: getSnapToken ( $ params );
< html >
< body >
< button id =" pay-button " > Pay! </ button >
< pre > < div id =" result-json " > JSON result will appear here after payment: < br > </ div > </ pre >
<!-- TODO: Remove ".sandbox" from script src URL for production environment. Also input your client key in "data-client-key" -->
< script src =" https://app.sandbox.midtrans.com/snap/snap.js " data-client-key =" <Set your ClientKey here> " > </ script >
< script type =" text/javascript " >
document . getElementById ( 'pay-button' ) . onclick = function ( ) {
// SnapToken acquired from previous step
snap . pay ( '<?=$snapToken?>' , {
// 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 >
이 섹션을 참조하세요.
여기에서 Snap Redirect의 몇 가지 예를 볼 수 있습니다.
$ 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 ();
}
이 섹션을 참조하세요.
여기에서 몇 가지 핵심 API 예제를 볼 수 있습니다.
MidtransNew3ds . clientKey = "<your client key>" ;
이 파일을 참고해주세요
$ transaction_details = array (
' order_id ' => time (),
' gross_amount ' => 200000
);
// 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 ' => " [email protected] " ,
' phone ' => " 081322311801 " ,
' billing_address ' => $ billing_address ,
' shipping_address ' => $ shipping_address
);
// Token ID from checkout page
$ token_id = $ _POST [ ' token_id ' ];
// 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
);
$ response = Midtrans CoreApi:: charge ( $ transaction_data );
신용카드 청구 결과에는 3DS 인증을 위한 redirect_url
포함될 수 있습니다. 3DS 인증은 프런트엔드에서 처리되어야 합니다. API 문서를 참조하세요.
신용카드 3DS 거래에 대한 전체 예는 다음을 참조하세요.
// 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> " ;
}
이 섹션을 참조하세요.
HTTP POST 알림 콜백/웹훅을 수신하기 위해 별도의 웹 엔드포인트(알림 URL)를 생성합니다. 거래 상태가 변경될 때마다 HTTP 알림이 전송됩니다. 여기서도 예시를 볼 수 있습니다
$ 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'
}
$ status = Midtrans Transaction:: status ( $ orderId );
var_dump ( $ status );
transactionfraud_status == CHALLENGE인 경우 판매자 대시보드 또는 API에서 거래를 승인할 수 있습니다.
$ approve = Midtrans Transaction:: approve ( $ orderId );
var_dump ( $ approve );
fraud_status == CHALLENGE
로 거래를 취소하거나 transaction_status == CAPTURE
로 신용카드 거래를 취소할 수 있습니다(SETTLEMENT가 되기 전).
$ cancel = Midtrans Transaction:: cancel ( $ orderId );
var_dump ( $ cancel );
transaction_status == PENDING
으로 거래를 만료할 수 있습니다(SETTLEMENT 또는 EXPIRE가 되기 전).
$ 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 );
Direct 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 );
Standard Nasional Open API Pembayaran, 즉 줄여서 SNAP은 Bank Indonesia가 발행한 국가 결제 개방형 API 표준입니다. 더 자세히 알아보려면 이 문서를 읽어보세요.
//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 );
VA/은행 송금에 대한 자세한 내용은 이 문서를 참조하세요.
$ external_id = " uzi-order-testing " . uniqid ();
$ customerVaNo = " 6280123456 " ;
$ merchant_id = " M001234 " ;
$ vaParams = array (
" partnerServiceId " => " 70012 " ,
" customerNo " => $ customerVaNo ,
" virtualAccountNo " => " 70012 " . $ customerVaNo ,
" virtualAccountName " => " Jokul Doe " ,
" virtualAccountEmail " => " [email protected] " ,
" 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 " => " [email protected] " ,
" 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 );
Qris에 대한 자세한 내용은 이 문서를 참조하세요.
$ 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 " => " [email protected] " ,
" 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 );
거래 상태를 가져오는 방법에 대한 자세한 내용은 이 문서를 참조하세요.
$ 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 );
결제 취소에 대한 자세한 내용은 이 문서를 참조하세요.
$ 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 );
결제 환불에 대한 자세한 내용은 이 문서를 참조하세요.
$ 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 "
));
$ directDebitRefundByReferenceBody = array (
" originalReferenceNo " => " A120240828062651Y0NQMbJkDOID " ,
" reason " => " some-reason " ,
" additionalInfo " => array (),
" refundAmount " => array (
" value " => " 100.00 " ,
" currency " => " IDR "
));
$ 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 externalId
*/
$ snapBiResponse = SnapBi:: directDebit ()
-> withBody ( $ directDebitRefundByExternalIdBody )
-> refund ( $ external_id );
/**
* Example code for refund using reference no
*/
$ snapBiResponse = SnapBi:: directDebit ()
-> withBody ( $ directDebitRefundByReferenceBody )
-> refund ( $ external_id );
/**
* Example code for refund using Qris
*/
$ snapBiResponse = SnapBi:: qris ()
-> withBody ( $ qrisRefundBody )
-> refund ( $ external_id );
->withAccessTokenHeader
또는 ->withTransactionHeader
메서드 체인을 활용하여 헤더 값을 추가하거나 재정의할 수 있습니다. Snap-Bi에서 요구하는 헤더 값과 각 결제 수단의 기본 헤더를 확인하려면 이 문서를 참조하세요.
/**
* 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 );
이전 액세스 토큰을 저장했고 이를 다시 사용하고 싶다면 ->withAccessToken
활용하면 됩니다.
/**
* Example reusing your existing accessToken by using ->withAccessToken
*/
$ snapBiResponse = SnapBi:: va ()
-> withAccessToken ( " your-access-token " )
-> withBody ( $ vaParams )
-> createPayment ( $ external_id );
Snap-Bi 결제 알림을 구현하려면 이 문서를 참조하세요. 수신한 웹훅 알림을 확인하려면 아래 방법을 사용할 수 있습니다.
//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 ()
phpunit.xml
의 서버 키와 클라이언트 키를 원하는 대로 변경하세요.
vendor/bin/phpunit
vendor/bin/phpunit tests/integration/CoreApiIntegrationTest.php
새로운 플러그인을 개발할 때 주의해야 할 몇 가지 가이드가 있습니다.
IDR 이외의 통화를 취급합니다. Midtrans v1
및 v2
현재 인도네시아 루피아로만 결제를 허용합니다. 결과적으로 항목 가격이 정수인지 여부를 확인하기 위해 서버에서 유효성 검사가 수행됩니다. 가격을 반올림하고 싶은 유혹을 느끼더라도 그렇게 하지 마십시오! 시스템에서 IDR 이외의 통화를 사용할 경우 항상 준비하고 그에 따라 IDR로 변환한 후 가격을 반올림하세요.
자동 삭제 기능을 사용해 보세요.