PHP code example of doku / doku-php-library

1. Go to this page and download the library: Download doku/doku-php-library 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/ */

    

doku / doku-php-library example snippets


use Doku\Snap\Snap;

$privateKey = "YOUR_PRIVATE_KEY";
$publicKey = "YOUR_PUBLIC_KEY";
$clientId = "YOUR_CLIENT_ID";
$secretKey = "YOUR_SECRET_KEY";
$isProduction = false;
$issuer = "YOUR_ISSUER"; 
$authCode = "YOUR_AUTH_CODE"; 

$snap = new Snap($privateKey, $publicKey, $clientId, $issuer, $isProduction, $secretKey, $authCode);

$snap = new Snap($privateKey, $publicKey, $clientId, $issuer, $isProduction, $secretKey, $authCode);

      use Doku\Snap\Models\VA\Request\CreateVaRequestDto;
      use Doku\Snap\Models\TotalAmount\TotalAmount;
      use Doku\Snap\Models\VA\AdditionalInfo\CreateVaRequestAdditionalInfo;
      use Doku\Snap\Models\VA\VirtualAccountConfig\CreateVaVirtualAccountConfig;

      $createVaRequestDto = new CreateVaRequestDto(
        "8129014",  // partner
        "17223992157",  // customerno
        "812901417223992157",  // virtualAccountNo
        "T_" . time(),  // virtualAccountName
        "test.example." . time() . "@test.com",  // virtualAccountEmail
        "621722399214895",  // virtualAccountPhone
        "INV_CIMB_" . time(),  // trxId
        new TotalAmount("12500.00", "IDR"),  // totalAmount
        new CreateVaRequestAdditionalInfo(
              "VIRTUAL_ACCOUNT_BANK_CIMB", new CreateVaVirtualAccountConfig(true)
              ), // additionalInfo
        'C',  // virtualAccountTrxType
        "2024-08-31T09:54:04+07:00"  // expiredDate
      );

      $result = $snap->createVa($createVaRequestDto);
      echo json_encode($result, JSON_PRETTY_PRINT);
    

      use Doku\Snap\Models\VA\Request\UpdateVaRequestDto;
      use Doku\Snap\Models\VA\AdditionalInfo\UpdateVaRequestAdditionalInfo;
      use Doku\Snap\Models\VA\VirtualAccountConfig\UpdateVaVirtualAccountConfig;

      $updateVaRequestDto = new UpdateVaRequestDto(
          "8129014",  // partnerServiceId
          "17223992155",  // customerNo
          "812901417223992155",  // virtualAccountNo
          "T_" . time(),  // virtualAccountName
          "test.example." . time() . "@test.com",  // virtualAccountEmail
          "00000062798",  // virtualAccountPhone
          "INV_CIMB_" . time(),  // trxId
          new TotalAmount("14000.00", "IDR"),  // totalAmount
          new UpdateVaRequestAdditionalInfo("VIRTUAL_ACCOUNT_BANK_CIMB", new UpdateVaVirtualAccountConfig("ACTIVE", "10000.00", "15000.00")),  // additionalInfo
          "O",  // virtualAccountTrxType
          "2024-08-02T15:54:04+07:00"  // expiredDate
      );

      $result = $snap->updateVa($updateVaRequestDto);
      echo json_encode($result, JSON_PRETTY_PRINT);
    

    use Doku\Snap\Models\VA\Request\DeleteVaRequestDto;
    use Doku\Snap\Models\VA\Request\DeleteVaRequestDto;
    use Doku\Snap\Models\VA\AdditionalInfo\DeleteVaRequestAdditionalInfo;

    $deleteVaRequestDto = new DeleteVaRequestDto(
        "8129014",  // partnerServiceId
        "17223992155",  // customerNo
        "812901417223992155",  // virtualAccountNo
        "INV_CIMB_" . time(),  // trxId
        new DeleteVaRequestAdditionalInfo("VIRTUAL_ACCOUNT_BANK_CIMB")  // additionalInfo
    );

    $result = $snap->deletePaymentCode($deleteVaRequestDto);
    echo json_encode($result, JSON_PRETTY_PRINT);
    

        use Doku\Snap\Models\DirectInquiry\InquiryResponseBodyDto;
        use Doku\Snap\Models\DirectInquiry\InquiryResponseVirtualAccountDataDto;
        use Doku\Snap\Models\DirectInquiry\InquiryReasonDto;
        use Doku\Snap\Models\DirectInquiry\InquiryResponseAdditionalInfoDto;
        use Doku\Snap\Models\VA\VirtualAccountConfig\CreateVaVirtualAccountConfig;
        use Doku\Snap\Models\TotalAmount\TotalAmount;
        
        directInquiry(){
          $requestBody = $this->request->getJSON(true);
          $authorization = $this->request->getHeaderLine('Authorization');
          $isValid = $this->snap->validateTokenB2B($authorization);
          
          if($isValid) {
            $responseCode =2002400;
            $responseMessage = 'Successful';
            $inquiryRequestId = $requestBody['inquiryRequestId'];

            $partnerServiceId = $requestBody['partnerServiceId'];
            $customerNo = $requestBody['customerNo'];
            $virtualAccountNo = $requestBody['virtualAccountNo'];

            <!-- validate virtualAccountNo from your database before proccess it -->
            $virtualAccountName = "Nama ". time();
            $trxId =  "INV_MERCHANT_" . time();
            $virtualAccountEmail = "email." . time() . "@gmail.com";
            $virtualAccountPhone =time();
            $totalAmount = new TotalAmount(
              "25000.00",
              "IDR"
            );
            $inquiryStatus = "00";
            $additionalInfo = new InquiryResponseAdditionalInfoDto(
                $requestBody['additionalInfo']['channel'],
                $trxId,
                new CreateVaVirtualAccountConfig(
                    true,
                    "100000.00",
                    "10000.00"
                )
            );
            $inquiryReason = new InquiryReasonDto(
                "Success",
                "Sukses"
            );
            $virtualAccountTrxType = "C";
            $freeText = [
                [
                    "english" => "Free text",
                    "indonesia" => "Tulisan Bebas"
                ]
            ];
            $vaData = new InquiryResponseVirtualAccountDataDto(
                $partnerServiceId,
                $customerNo,
                $virtualAccountNo,
                $virtualAccountName,
                $virtualAccountEmail,
                $virtualAccountPhone,
                $totalAmount,
                $virtualAccountTrxType,
                $additionalInfo,
                $inquiryStatus,
                $inquiryReason,
                $inquiryRequestId,
                $freeText

            );
            $body = new InquiryResponseBodyDto(
                    $responseCode,
                    $responseMessage,
                    $vaData
            );
            return $this->respond($body);
        }
        }
    

    use Doku\Snap\Models\VA\Request\CheckStatusVaRequestDto;

    $checkStatusVaRequestDto = new CheckStatusVaRequestDto(
        "8129014",  // partnerServiceId
        "17223992155",  // customerNo
        "812901417223992155",  // virtualAccountNo
        null,
        null,
        null
    );

    $result = $snap-> ($checkStatusVaRequestDto);
    echo json_encode($result, JSON_PRETTY_PRINT);
    

    use Doku\Snap\Models\AccountBinding\AccountBindingRequestDto;
    use Doku\Snap\Models\AccountBinding\AccountBindingAdditionalInfoRequestDto;

     public function accountBinding()
    {
        $requestData = $this->request->getJSON(true);
        $partnerReferenceNo = $requestData['phoneNo'] ?? null;
        
        $additionalInfo = new AccountBindingAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel'],
            $requestData['additionalInfo']['custIdMerchant'],
            $requestData['additionalInfo']['customerName']?? null,
            $requestData['additionalInfo']['email'],
            $requestData['additionalInfo']['idCard'] ?? null,
            $requestData['additionalInfo']['country'] ?? null,
            $requestData['additionalInfo']['address'] ?? null,
            $requestData['additionalInfo']['dateOfBirth'] ?? null,
            $requestData['additionalInfo']['successRegistrationUrl'],
            $requestData['additionalInfo']['failedRegistrationUrl'],
            $requestData['additionalInfo']['deviceModel'] ?? null,
            $requestData['additionalInfo']['osType'] ?? null,
            $requestData['additionalInfo']['channelId'] ?? null
        );
        $requestBody = new AccountBindingRequestDto(
            $partnerReferenceNo,
            $additionalInfo
        );
        
        $ipAddress = $this->request->getHeaderLine('X-IP-ADDRESS');
        $deviceId = $this->request->getHeaderLine('X-DEVICE-ID');
        $response = $this->snap->doAccountBinding($requestBody, $ipAddress, $deviceId);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); 
        return $this->response->setJSON($responseObject);
        
    }
    

    public function getTokenB2B2C() {
        $requestData = $this->request->getJSON(true);

        $authCode = $requestData['authCode'];
        $tokenData = $this->snap->getTokenB2B2C($authCode);
        return $this->response->setJSON($tokenData);
   }
   

    use Doku\Snap\Models\AccountUnbinding\AccountUnbindingRequestDto;
    use Doku\Snap\Models\AccountUnbinding\AccountUnbindingAdditionalInfoRequestDto;

     public function accountUnbinding()
    {
        $requestData = $this->request->getJSON(true);
        $tokenId =  $requestData['tokenId'] ?? '';
        $additionalInfo = new AccountUnbindingAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel']
        );
        $requestBody = new AccountUnbindingRequestDto(
            $tokenId,
            $additionalInfo
        );
        $ipAddress = $this->request->getHeaderLine('X-IP-ADDRESS');

        $response = $this->snap->doAccountUnbinding($requestBody, $ipAddress);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); 
        return $this->response->setJSON($responseObject);
    }
    

    use Doku\Snap\Models\CardRegistration\CardRegistrationRequestDto;
    use Doku\Snap\Models\CardRegistration\CardRegistrationAdditionalInfoRequestDto;
    use Doku\Snap\Models\CardRegistration\CardRegistrationCardDataRequestDto;

     public function cardRegist()
    {
        $requestData = $this->request->getJSON(true);
        $cardData = new CardRegistrationCardDataRequestDto(
            $requestData['cardData']['bankCardNo'],
            $requestData['cardData']['bankCardType'],
            $requestData['cardData']['expiryDate'],
            $requestData['cardData']['identificationNo'],
            $requestData['cardData']['identificationType'],
            $requestData['cardData']['email'],
        );
        $custIdMerchant = $requestData['custIdMerchant'] ?? null;
        $phoneNo = $requestData['phoneNo'] ?? null;
        $additionalInfo = new CardRegistrationAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel'],
            $requestData['additionalInfo']['customerName']?? null,
            $requestData['additionalInfo']['email'],
            $requestData['additionalInfo']['idCard'] ?? null,
            $requestData['additionalInfo']['country'] ?? null,
            $requestData['additionalInfo']['address'] ?? null,
            $requestData['additionalInfo']['dateOfBirth'] ?? null,
            $requestData['additionalInfo']['successRegistrationUrl']?? null,
            $requestData['additionalInfo']['failedRegistrationUrl']?? null
        );
        $requestBody = new CardRegistrationRequestDto(
            $cardData,
            $custIdMerchant,
            $phoneNo,
            $additionalInfo
        );
        $response = $this->snap->doCardRegistration($requestBody);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); 
        return $this->response->setJSON($responseObject);
        
    }
    

    public function getTokenB2B2C() {
        $requestData = $this->request->getJSON(true);

        $authCode = $requestData['authCode'];
        $tokenData = $this->snap->getTokenB2B2C($authCode);
        return $this->response->setJSON($tokenData);
   }
   

      use Doku\Snap\Models\AccountUnbinding\AccountUnbindingRequestDto;
      use Doku\Snap\Models\AccountUnbinding\AccountUnbindingAdditionalInfoRequestDto;

      public function cardUnbinding()
    {
        $requestData = $this->request->getJSON(true);
        $tokenId =  $requestData['tokenId'] ?? '';
        $additionalInfo = new AccountUnbindingAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel']
        );
        $requestBody = new AccountUnbindingRequestDto(
            $tokenId,
            $additionalInfo
        );
        $ipAddress = $this->request->getHeaderLine('X-IP-ADDRESS');

        $response = $this->snap->doCardUnbinding($requestBody);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); 
        return $this->response->setJSON($responseObject);
        
    }
    

     use Doku\Snap\Models\TotalAmount\TotalAmount;
     use Doku\Snap\Models\Payment\PaymentRequestDto;
     use Doku\Snap\Models\Payment\PaymentAdditionalInfoRequestDto;

     public function payment(){
        $requestData = $this->request->getJSON(true);
        $payOptionDetails =json_decode(json_encode($requestData['payOptionDetails'] ?? null));
        $partnerReferenceNo = $requestData['partnerReferenceNo'] ?? null;
        $amount = new TotalAmount(
            $requestData['amount']['value'],
            $requestData['amount']['currency']
        );
        $additionalInfo = new PaymentAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel'],
            $requestData['additionalInfo']['remarks'],
            $requestData['additionalInfo']['successPaymentUrl'],
            $requestData['additionalInfo']['failedPaymentUrl'],
            $requestData['additionalInfo']['lineItems'],
            $requestData['additionalInfo']['paymentType'] ?? null
        );
        $feeType = $requestData['feeType'] ?? '';
        $chargeToken = $requestData['chargeToken'] ?? '';
        $request = new PaymentRequestDto(
            $partnerReferenceNo,
            $amount,
            $payOptionDetails,
            $additionalInfo,
            $feeType,
            $chargeToken
        );
        $ipAddress = $this->request->getHeaderLine('X-IP-ADDRESS');
        $authCode = $requestData['authCode'];
       
        $response = $this->snap->doPayment($request, $authCode, $ipAddress);
        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        // var_dump($responseObject);
        // Ambil responseCode
        $responseCode = $responseObject['responseCode'];

        // Atur status HTTP berdasarkan tiga angka pertama
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); // Set status HTTP
        return $this->response->setJSON($responseObject);

      }
      

     use Doku\Snap\Models\TotalAmount\TotalAmount;
     use Doku\Snap\Models\PaymentJumpApp\PaymentJumpAppRequestDto;
      use Doku\Snap\Models\PaymentJumpApp\PaymentJumpAppAdditionalInfoRequestDto;
      use Doku\Snap\Models\PaymentJumpApp\UrlParamDto;

     public function paymentJumpApp()
    {
        $requestData = $this->request->getJSON(true);
        $partnerReferenceNo =  $requestData['partnerReferenceNo'] ?? '';
        $validUpTo =  $requestData['validUpTo'] ?? '';
        $pointOfInitiation =  $requestData['pointOfInitiation'] ?? '';
        $urlParam = new UrlParamDto(
            $requestData['urlParam'][0]['url'],
            $requestData['urlParam'][0]['type'],
            $requestData['urlParam'][0]['isDeepLink']
        );
        $amount = new TotalAmount(
            $requestData['amount']['value'],
            $requestData['amount']['currency']
        );
        $metadata = isset($requestData['additionalInfo']['metadata']) ? $requestData['additionalInfo']['metadata'] : null;
        $supportDeepLinkCheckoutUrl = isset($requestData['additionalInfo']['supportDeepLinkCheckoutUrl']) ? $requestData['additionalInfo']['supportDeepLinkCheckoutUrl'] : null;
        $additionalInfo = new PaymentJumpAppAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel'],
            $requestData['additionalInfo']['orderTitle'],
            $metadata,
            $supportDeepLinkCheckoutUrl
        );
        $requestBody = new PaymentJumpAppRequestDto(
            $partnerReferenceNo,
            $validUpTo,
            $pointOfInitiation,
            $urlParam,
            $amount,
            $additionalInfo
        );
        $ipAddress = $this->request->getHeaderLine('X-IP-ADDRESS');
        $deviceId = $this->request->getHeaderLine('X-DEVICE-ID');
        $response = $this->snap->doPaymentJumpApp($requestBody,$deviceId,$ipAddress);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); 
        return $this->response->setJSON($responseObject);
        
    }

   public function debitStatus()
    {
        $requestData = $this->request->getJSON(true);
        $originalPartnerReferenceNo =  $requestData['originalPartnerReferenceNo'] ?? '';
        $originalReferenceNo =  $requestData['originalReferenceNo'] ?? '';
        $originalExternalId =  $requestData['originalExternalId'] ?? '';
        $serviceCode =  $requestData['serviceCode'] ?? '';
        $transactionDate =  $requestData['transactionDate'] ?? '';
        $amountValue = $requestData['amount']['value'] ?? '';
        $amountCurrency = $requestData['amount']['currency'] ?? '';
        $amount = new TotalAmount($amountValue, $amountCurrency);
        
        $merchantId =  $requestData['merchantId'] ?? '';
        $subMerchantId =  $requestData['subMerchantId'] ?? '';
        $externalStoreId =  $requestData['externalStoreId'] ?? '';
        $deviceId = $requestData['additionalInfo']['deviceId'] ?? '';
        $channel = $requestData['additionalInfo']['channel'] ?? '';
        $additionalInfo = new CheckStatusAdditionalInfoRequestDto($deviceId, $channel);
        $requestBody = new DirectDebitCheckStatusRequestDto(
            $originalPartnerReferenceNo,
            $originalReferenceNo,
            $originalExternalId,
            $serviceCode,
            $transactionDate,
            $amount,
            $merchantId,
            $subMerchantId,
            $externalStoreId,
            $additionalInfo
        );

        $response = $this->snap->doCheckStatus($requestBody);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode);
        return $this->response->setJSON($responseObject);
        
    }
  

  public function refund()
    {
        $requestData = $this->request->getJSON(true);
        $additionalInfo = new RefundAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel']
        );
        $originalPartnerReferenceNo =  $requestData['originalPartnerReferenceNo'] ?? '';
        $originalExternalId =  $requestData['originalExternalId'] ?? '';
        $refundAmount = new TotalAmount(
            $requestData['refundAmount']['value'],
            $requestData['refundAmount']['currency']
        );
        $reason =  $requestData['reason'] ?? '';
        $partnerRefundNo =  $requestData['partnerRefundNo'] ?? '';
        $ipAddress = $this->request->getHeaderLine('X-IP-ADDRESS');
        $authCode = $requestData['authCode'];
        $deviceId = $this->request->getHeaderLine('deviceId');
        $requestBody = new RefundRequestDto(
            $additionalInfo,
            $originalPartnerReferenceNo,
            $originalExternalId,
            $refundAmount,
            $reason,
            $partnerRefundNo
        );
        $response = $this->snap->doRefund($requestBody, $authCode, $ipAddress, $deviceId);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); 
        return $this->response->setJSON($responseObject);

    }
  

  public function checkBalance()
    {
        $requestData = $this->request->getJSON(true);

        $additionalInfo = new BalanceInquiryAdditionalInfoRequestDto(
            $requestData['additionalInfo']['channel']
        );
        $requestBody = new BalanceInquiryRequestDto(
            $additionalInfo
        );
        $ipAddress = $this->request->getHeaderLine('X-IP-ADDRESS');
        $authCode = $requestData['authCode'];
        $response = $this->snap->doBalanceInquiry($requestBody, $authCode, $ipAddress);

        if (is_array($response) || is_object($response)) {
            $responseObject = (array)$response; // Ubah objek ke array jika perlu
        } else {
            throw new \Exception('Unexpected response type');
        }
        $responseCode = $responseObject['responseCode'];
        $statusCode = substr($responseCode, 0, 3);
        $this->response->setStatusCode((int)$statusCode); 
        return $this->response->setJSON($responseObject);
    }
  

  try {
    $result = $snap->createVa($createVaRequestDto);
    // Process successful result
  } catch (Exception $e) {
      echo "Error: " . $e->getMessage() . PHP_EOL;
      // Handle the error appropriately
  }
 
bash
composer