Fiat Currency Payout

# Request URL

POST https://test2-openapi.91fafafa.com/api/payout/indonesia/order/create/v1

# Request parameters

Parameters Type Required Description Example
appId string Y Merchant appId B2iwKFIM4tvo
merchantId string Y Merchant id CH10001165
mchOrderNo string Y Merchant order number (Length is limited to 32 digits) 20240506180450
paymentMethod string Y Payment method:BANK_ID BANK_ID
amount string Y Amount
Do not support decimal points, please do not pass the decimal
10000
name string Y User name
It is best to be real data
Need to be pure English
CheezeePayTest
phone String N phone
10-13 digit mobile phone number starting with 08
081234567890
email String Y email
Can be uploaded to a fixed value
[email protected]
notifyUrl string Y Notification callback address https://host:port/notifyUrl
payeeAccountInfos string Y Payment information json string {"bankCode":"116",
"bankCardNumber":"12312431241"}
timestamp long Y Submit time (timestamp: milliseconds) 1714989890250
sign string Y Sign MJK+SZR1YOPaJar67nYtAHJXGBKugk+WK2qH
tIuif0Aqplk+2xrZk0q4RkPfRgViD2AFAGRyZTc
Wr49OL3v5GJJojkppo3HGAZQ+CuA10BdEaVd
85GoOJXZzE+pJbxgI5YJA9tzYV1a88vomrbTo
bs8829of4Wsop7srXMXCb1FQqRYf8VwLCFW
umkpPs3Ra5O2IswjEeiwulLA8GPy7PKRS7c7o
5/3aplr20SYIbaqQpqwBlyrjkEuMq1sxc9tuOexD
UZK+oRRkq0+1Kk1iHucFEkBkComk1Wowil5NN
fW48OyZmM0B4kLUpEv7YZFSBIv6EkMLC86j
93D2aefcWg==

# payeeAccountInfosParameter Description

Parameters Type Required Description Example
bankCode string Y bankCode
(Reference to the Code Code Code of France -Payment Bank)
116
bankCardNumber string Y Bank card number 32562523890

# Request Message Example

{
  "appId": "B2iwKFIM4tvo",
  "merchantId": "CH10001165",
  "mchOrderNo": "20240506180450",
  "paymentMethod": "BANK_ID",
  "amount": "10000",
  "name": "CheezeePayTest",
  "phone":"0823456789",
  "email":"[email protected]",
  "notifyUrl": "https://yourdomain/notifyUrl",
  "payeeAccountInfos":"{\"bankCode\":\"116\",\"bankCardNumber\":\"1708099097\"}",
  "timestamp": 1714989890250,
  "sign": "MJK+SZR1YOPaJar67nYtAHJXGBKugk+WK2qHtIuif0Aqplk+2xrZk0q4RkPfRgViD2AFAGRyZTcWr49OL3v5GJJojkppo3HGAZQ+CuA10BdEaVd85GoOJXZzE+pJbxgI5YJA9tzYV1a88vomrbTobs8829of4Wsop7srXMXCb1FQqRYf8VwLCFWumkpPs3Ra5O2IswjEeiwulLA8GPy7PKRS7c7o5/3aplr20SYIbaqQpqwBlyrjkEuMq1sxc9tuOexDUZK+oRRkq0+1Kk1iHucFEkBkComk1Wowil5NNfW48OyZmM0B4kLUpEv7YZFSBIv6EkMLC86j93D2aefcWg=="
}

# Response parameters

Parameter Type Required Description Example
code String Y Response Code
000000 indicates success, others indicate failure.
000000
msg String Y Response Description
success: Successful
success
tradeNo String Y Platform Order Number 1746108644859187200
sign String Y Signature HcMyGbT+yHStKP/axYRPmWtYku2TPr1zyxA2Uv+i
Vt+5LPgIARTJuZ/DbndC9wUEaFZT0cm7OV8yfHFi
pniN2dSwnTc3TI93tnrtXGkZ9I6WYhNpZh6H2dwp
aaKSzUul/8BB4Q441ZS9Nk9Kz8oIg8ztOvWzzoML
dOqnDOlG8Hb6iIudDZWi4t5Ut5SzUIX+LcEGe7lI
N3i1WFflgRw2Zm1CfZ+N7Xw5/Ox/JxGjaBqW1CZI
naN66uGWd3qlKxPen5GkTY2zRqm0PbzoaXuouOKO
yAvrkOcgp07sxfVWukZ9H7Gcs9iyK8vtz4ICIXGl
zUVNwjalC8rPEXr8J3U7FQ==

# Payout Response Message Example

  • Successful Order Submission Response Message Example
{
  "code": "000000",
  "msg": "success",
  "tradeNo": "1746108644859187200",
  "sign": "HcMyGbT+yHStKP/axYRPmWtYku2TPr1zyxA2Uv+iVt+5LPgIARTJuZ/DbndC9wUEaFZT0cm7OV8yfHFipniN2dSwnTc3TI93tnrtXGkZ9I6WYhNpZh6H2dwpaaKSzUul/8BB4Q441ZS9Nk9Kz8oIg8ztOvWzzoMLdOqnDOlG8Hb6iIudDZWi4t5Ut5SzUIX+LcEGe7lIN3i1WFflgRw2Zm1CfZ+N7Xw5/Ox/JxGjaBqW1CZInaN66uGWd3qlKxPen5GkTY2zRqm0PbzoaXuouOKOyAvrkOcgp07sxfVWukZ9H7Gcs9iyK8vtz4ICIXGlzUVNwjalC8rPEXr8J3U7FQ=="
}
  • Failed Order Submission Response Message Example
{
  "code": "A0497",
  "msg": "Unable to trade, contact customer service  (A0497)",
  "sign": "QujGMEBgK5g+ne8drbKu74rpYC99gU/8noDZ/1o/7gTFpx5xNmppclbpw6aGy97nLxDSsJq1m0ZHYz4TU24XgtnTLZwdgf8ievl1Tmj61dts2rR2hcsYFc63lub+V2p3AhJ6H2dmfaqY9deWZeSl6DD5zb2xYcp8QitVqAze/j0g7EDAPHG/ShC+r8FyqFYy0KQddP/s+kzusKrFyCTilRNQXSLUT5Ompy82IkpghDLPLRxEJbCRmnUZ/sD8KENsdmqhcJrmAq+WbCz5tWnxbvAsFTMI/dgnm91ZhelfoKceErJaePxzZrsHvgkmPehAgyb/CKb1345r1ckG7gnPKg=="
}

# Code Implementation Demo

  • The code example is for reference only, please refer to the request parameter description for specific parameter explanations.
package com.cheesepay;

import com.google.gson.Gson;
import com.cheesepay.CheeseTradeRSAUtil;
import okhttp3.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class PayoutDemo {
    // Platform public key
    private static final String PLAT_PUBLIC_KEY ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1dad35S74jfLPbHJh8P0jDHiTvkxwrtITK97ovVu19B24UdiHyHoEZgtNlS6alFQj1ULQ71d6EPh2rWCNkS2b5HGQXwDYBtwvesVQ8h4Sf3eVPTTLGw3BS7Os4vtDEN6BezMdv3sUG2N5i6JF+5H4CQTq3MD2Cx6u/Cv7oFOdFqeDT0AH+TR7uyZxn69OtkJaHHr834EUcdShJKKMQtbC11WCcut7ilDUgdvZnThiVTq7cfl8mcC9FDKcQ9bMWamScWIB5cJQdUW23Kr0c1NvZlpgPS8U5VODM4Uc4muHJPD2cJmquuJ+4AGP36rEk27lUB3h7B6JI1QGiuh1yyPDwIDAQAB";
    // Merchant's private key
    private static final String MCH_PRIVATE_KEY  ="MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/wgJqa2WHUTrJwdrtOig8lwuKPaL462/1rF45p+xi25uoGUEyiOtB0OC6HLePUfkGYzPULPH/O0yF5GmWkhSuz3lKK/XtXSeRdQIwAQ7lYlhfdJjTLVC7mwkDRZeFePwbnAX5pC0h6Yxf0ibjAglkW2d45AscouZt91xIxgf0VLNZ9dHe8R7j8hPKOGpNi+709ThmRZQVHQLN+6w+mrID7JyWBSbbf2bVWc7UBlHCkudwjEiW/r96CefTukb0SigaS0XpqWEKYHeNWS0DP/a5OUDzXMi6fqHEzMPa6uNYbLpOW1rxMhMhU97W8pLYBba0T9BI7F/xusozxVDVeQbDAgMBAAECggEAdZ4EaU3yemuCiZoUNIoFgBSNiX+A5PlUNPZC3U54mbJl6VeEPADre/Uowj82//uhqR9T/QKMdKbkqwONGEQF16t+k9YfBDatPHTuoI8lmeEWn4Ye7vjOmiPgBVe8NqwcxrqOl67x1+kupt955qerJxlBgE8v2aK5gB3HRwPggSYZgSZJ3X2zQMJ+XN4qe49Un+utqFuGtVRwPQvs/Kazp5GL7WlR0OnpQ2KZ+ur9T58VfTKmIeqBckey7nIrb/fdodJ7IqcykWjSLmy8p84W78iiRDfPn81Ujb231EWW+AbuV399aXBZ4oaR4q8wwkhe9xHUADWLvcfCnMrB40LkEQKBgQD2TEeBEB5Gwj/zpriq23xKJyzfo0hOxzGY/Ol2EykGeEYhny/YiTlMYtOMy37RiGKr4lN7G/pKl2fI5kRjgQM1QXgx6dxd11D0rORXj+SAy6+zAq3NVY4c3zDKmrQQ8x3f2QFffo+TmLtw/BH0Frp+a2lzKzIcXtZ4/akJdVIihwKBgQDHT7xvOaNyAPnnYwpROMI9eUVgFc9pMRAmQ18at8ggZ8M+Ww1nhr00loufzkovCb9MvGR4HSedWHfgmtDu1hUFtl7PItNItsB347yWPxR/lVLs44NVXt7jkFisoBoEBXaNVVt6uOSvBiqINmX3gm4FoisI2SRZsH7nMr07OXO85QKBgCkXdN6Nh9+aTP0jla+7yrK8cnolTc0G4rl5iKHQdInFyz2Ux3DDBDJAUrcsxE3FCWFP80mY01tag1A7SrGnNpfOAnWhZMirQbBwn/AT67WpRfkBu2mEmp8qhYNn6B7j0Nol5FrATMf9NViWVZB5skehOAik7klZcULiXy9ayYdFAoGAA+0bLim5gYZpZdh6nIz8ro9UAYeMdWsFAWv0VKdoJtNEclcC1ZY+5elNSNGcfn63qQBRDlisrhnPCrqiAQJwmZM1HOl3tgf7lKEE1wTZF4ZOguIcdTMQOvVd+dCRkqC07CXRToKT5qq9bb98lLqaBjxikqMMZ0PlzBIgzijckc0CgYAH16CziStEZVvKbiR8b0ftF9mf6V8I0KHianMgV8X6Y51aE0Ig1eQhIvqSjqtBac7gEppiu3OQVrp39uLdgyvDSVta1Hq9QYYTDNt8crt69aD/Th1h5esYvApYyZIhHbFDR5meE4Y3nHpfY7J8zhmfyaVW/6cuwPaToTtrEjQmWQ==";
    // Payment interface URL
    private static final String apiUrl = "https://test2-openapi.91fafafa.com/api/payout/indonesia/order/create/v1";
    // Callback URL
    private static final String cashNotify = "https://yourdomain/notifyUrl";

    public static void main(String[] args) throws Exception {
        payout();
    }

    private static String getCurrentTime(){
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        return now.format(formatter);
    }

    private static void payout() throws Exception {
        Map<String, Object> requestParams = new HashMap<>();
        requestParams.put("appId", "B2iwKFIM4tvo");
        requestParams.put("merchantId", "CH10001165");
        // Order number cannot be duplicated
        String currentTime = getCurrentTime();
        requestParams.put("mchOrderNo", currentTime);
        requestParams.put("paymentMethod", "BANK_ID");
        requestParams.put("amount", "10000");
        requestParams.put("name", "CheezeePayTest");
        requestParams.put("phone", "08123456789");
        requestParams.put("email", "[email protected]");
        requestParams.put("notifyUrl", cashNotify);
        requestParams.put("payeeAccountInfos", "{\"bankCode\":\"116\",\"bankCardNumber\":\"32562523890\"}");
        Long timestamp = System.currentTimeMillis();
        requestParams.put("timestamp", timestamp);

        // Private key encryption
        String platSign = CheeseTradeRSAUtil.getSign(requestParams, MCH_PRIVATE_KEY);
        requestParams.put("sign", platSign);
        System.out.println("requestParams Msg:" + requestParams);

        // Interface request
        Gson gson = new Gson();
        String requestBody = gson.toJson(requestParams);
        System.out.println("Post Json Params:" + requestBody);

        // Send a request and get a response
        OkHttpClient client = new OkHttpClient();
        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(mediaType, requestBody);
        Request request = new Request.Builder()
                .url(apiUrl)
                .post(body)                
                .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36")
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            // Failure handling...
            System.out.println("Request failed: " + response.code() + " - " + response.message());
        }

        // Signature verification processing
        String responseBody = response.body().string();
        System.out.println("Response: " + responseBody);
        Type type = new com.google.gson.reflect.TypeToken<Map<String, Object>>() {}.getType();
        Map<String, Object> map = gson.fromJson(responseBody, type);
        boolean verifyResult = CheeseTradeRSAUtil.verifySign(map, PLAT_PUBLIC_KEY);
        if (verifyResult) {
            // ... If signature verification is successful, process normal business logic.
        } else {
            // ... Signature verification error
        }
        response.close();
    }
}

<?php
   // Platform public key, obtained from key configuration
    $platPublicKey = '-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1dad35S74jfLPbHJh8P0jDHiTvkxwrtITK97ovVu19B24UdiHyHoEZgtNlS6alFQj1ULQ71d6EPh2rWCNkS2b5HGQXwDYBtwvesVQ8h4Sf3eVPTTLGw3BS7Os4vtDEN6BezMdv3sUG2N5i6JF+5H4CQTq3MD2Cx6u/Cv7oFOdFqeDT0AH+TR7uyZxn69OtkJaHHr834EUcdShJKKMQtbC11WCcut7ilDUgdvZnThiVTq7cfl8mcC9FDKcQ9bMWamScWIB5cJQdUW23Kr0c1NvZlpgPS8U5VODM4Uc4muHJPD2cJmquuJ+4AGP36rEk27lUB3h7B6JI1QGiuh1yyPDwIDAQAB
-----END RSA PUBLIC KEY-----';
    // Merchant private key, generated by the merchant himself
    $mchPrivateKey = '-----BEGIN RSA PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/wgJqa2WHUTrJwdrtOig8lwuKPaL462/1rF45p+xi25uoGUEyiOtB0OC6HLePUfkGYzPULPH/O0yF5GmWkhSuz3lKK/XtXSeRdQIwAQ7lYlhfdJjTLVC7mwkDRZeFePwbnAX5pC0h6Yxf0ibjAglkW2d45AscouZt91xIxgf0VLNZ9dHe8R7j8hPKOGpNi+709ThmRZQVHQLN+6w+mrID7JyWBSbbf2bVWc7UBlHCkudwjEiW/r96CefTukb0SigaS0XpqWEKYHeNWS0DP/a5OUDzXMi6fqHEzMPa6uNYbLpOW1rxMhMhU97W8pLYBba0T9BI7F/xusozxVDVeQbDAgMBAAECggEAdZ4EaU3yemuCiZoUNIoFgBSNiX+A5PlUNPZC3U54mbJl6VeEPADre/Uowj82//uhqR9T/QKMdKbkqwONGEQF16t+k9YfBDatPHTuoI8lmeEWn4Ye7vjOmiPgBVe8NqwcxrqOl67x1+kupt955qerJxlBgE8v2aK5gB3HRwPggSYZgSZJ3X2zQMJ+XN4qe49Un+utqFuGtVRwPQvs/Kazp5GL7WlR0OnpQ2KZ+ur9T58VfTKmIeqBckey7nIrb/fdodJ7IqcykWjSLmy8p84W78iiRDfPn81Ujb231EWW+AbuV399aXBZ4oaR4q8wwkhe9xHUADWLvcfCnMrB40LkEQKBgQD2TEeBEB5Gwj/zpriq23xKJyzfo0hOxzGY/Ol2EykGeEYhny/YiTlMYtOMy37RiGKr4lN7G/pKl2fI5kRjgQM1QXgx6dxd11D0rORXj+SAy6+zAq3NVY4c3zDKmrQQ8x3f2QFffo+TmLtw/BH0Frp+a2lzKzIcXtZ4/akJdVIihwKBgQDHT7xvOaNyAPnnYwpROMI9eUVgFc9pMRAmQ18at8ggZ8M+Ww1nhr00loufzkovCb9MvGR4HSedWHfgmtDu1hUFtl7PItNItsB347yWPxR/lVLs44NVXt7jkFisoBoEBXaNVVt6uOSvBiqINmX3gm4FoisI2SRZsH7nMr07OXO85QKBgCkXdN6Nh9+aTP0jla+7yrK8cnolTc0G4rl5iKHQdInFyz2Ux3DDBDJAUrcsxE3FCWFP80mY01tag1A7SrGnNpfOAnWhZMirQbBwn/AT67WpRfkBu2mEmp8qhYNn6B7j0Nol5FrATMf9NViWVZB5skehOAik7klZcULiXy9ayYdFAoGAA+0bLim5gYZpZdh6nIz8ro9UAYeMdWsFAWv0VKdoJtNEclcC1ZY+5elNSNGcfn63qQBRDlisrhnPCrqiAQJwmZM1HOl3tgf7lKEE1wTZF4ZOguIcdTMQOvVd+dCRkqC07CXRToKT5qq9bb98lLqaBjxikqMMZ0PlzBIgzijckc0CgYAH16CziStEZVvKbiR8b0ftF9mf6V8I0KHianMgV8X6Y51aE0Ig1eQhIvqSjqtBac7gEppiu3OQVrp39uLdgyvDSVta1Hq9QYYTDNt8crt69aD/Th1h5esYvApYyZIhHbFDR5meE4Y3nHpfY7J8zhmfyaVW/6cuwPaToTtrEjQmWQ==
-----END RSA PRIVATE KEY-----';

    // parameter
    $appId = 'B2iwKFIM4tvo';
    $merchantId = 'CH10001165';
    // The order number cannot be repeated
    $mchOrderNo = 'T'.date("YmdHis",time());
    $paymentMethod = 'BANK_ID';
    $amount = '10000';
    $name = 'CheezeePayTest';
    $phone = '08123456789';
    $email = '[email protected]';
    $notifyUrl = 'https://yourdomain/notifyUrl';
    $payeeAccountInfos = '{"bankCode":"116","bankCardNumber":"32562523890"}';
    $timestamp = floor(microtime(true) * 1000);
   
    $params = array(
        'appId' => $appId,
        'merchantId' => $merchantId,
        'mchOrderNo' => $mchOrderNo,
        'paymentMethod' => $paymentMethod,
        'amount' => $amount,
        'name' => $name,
        'phone' => $phone,
        'email' => $email,
        'notifyUrl' => $notifyUrl,
        'payeeAccountInfos' => $payeeAccountInfos,
        'timestamp' => $timestamp
    );

    // Splicing parameters
    $str = ConnectStrings($params);
    echo $str;

     // Generate signature
    $sign = genSign($str, $mchPrivateKey);
    echo $sign;
    $params['sign'] = $sign;

    $params_string = json_encode($params);
    $url = 'https://test2-openapi.91fafafa.com/api/payout/indonesia/order/create/v1';
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
		'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
        'Content-Type: application/json',
        'Content-Length: ' . strlen($params_string))
    );
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    //execute post
    $request = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if($httpCode == 200)
    {
        $result = json_decode($request, true);
        echo "code :". $result['code'] . "\n";
        echo "msg :". $result['msg'] . "\n";
        echo "tradeNo :". $result['tradeNo'] . "\n";
        echo "sign :". $result['sign'] . "\n";
       
        $sign = $result['sign'];
        unset($result['sign']);
        $string = ConnectStrings($result);
        //Visa Signature
        $decryptStr = verifySign($string, $sign, $platPublicKey);
        echo "decryptStr :". $sign, $platPublicKey . "\n";
    }
    else {
        echo $httpCode;
    }
    
//Concatenating strings
 function ConnectStrings($params)
{
    // Get all the keys of the map and sort them
    $keys = array_keys($params);
    sort($keys);

    // Traverse the key list, get the corresponding value, and concatenate it into a string
    $str = '';

    foreach ($keys as $key) {
        $str .=  $key . '=' . $params[$key] . '&';
    }
    $str = rtrim($str, '&');
    return $str;
}     

 // Generate signature
function genSign($toSign, $privateKey){
    $key = openssl_get_privatekey($privateKey);
    openssl_sign($toSign, $signature, $key, OPENSSL_ALGO_SHA256);
    openssl_free_key($key);
    $sign = base64_encode($signature);
    return $sign;
}

//Verify signature
function verifySign($data, $sign, $pubKey){
    $sign = base64_decode($sign);
    $key = openssl_pkey_get_public($pubKey);
    $result = openssl_verify($data, $sign, $key, OPENSSL_ALGO_SHA256) === 1;
    return $result;
}
?>
const AXIOS= require('axios');
//The functions of the introduced signature tool class (CheeseTradeRSAUtil). 
//The signature tool class can refer to the DEMO in "Signature & Verification Algorithm"
const  { getSign, verifySign }= require('./CheeseTradeRSAUtil');

// Platform public key
const platPublicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1dad35S74jfLPbHJh8P0jDHiTvkxwrtITK97ovVu19B24UdiHyHoEZgtNlS6alFQj1ULQ71d6EPh2rWCNkS2b5HGQXwDYBtwvesVQ8h4Sf3eVPTTLGw3BS7Os4vtDEN6BezMdv3sUG2N5i6JF+5H4CQTq3MD2Cx6u/Cv7oFOdFqeDT0AH+TR7uyZxn69OtkJaHHr834EUcdShJKKMQtbC11WCcut7ilDUgdvZnThiVTq7cfl8mcC9FDKcQ9bMWamScWIB5cJQdUW23Kr0c1NvZlpgPS8U5VODM4Uc4muHJPD2cJmquuJ+4AGP36rEk27lUB3h7B6JI1QGiuh1yyPDwIDAQAB
-----END PUBLIC KEY-----`;

// Merchant private key
const mchPrivateKey = `-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/wgJqa2WHUTrJwdrtOig8lwuKPaL462/1rF45p+xi25uoGUEyiOtB0OC6HLePUfkGYzPULPH/O0yF5GmWkhSuz3lKK/XtXSeRdQIwAQ7lYlhfdJjTLVC7mwkDRZeFePwbnAX5pC0h6Yxf0ibjAglkW2d45AscouZt91xIxgf0VLNZ9dHe8R7j8hPKOGpNi+709ThmRZQVHQLN+6w+mrID7JyWBSbbf2bVWc7UBlHCkudwjEiW/r96CefTukb0SigaS0XpqWEKYHeNWS0DP/a5OUDzXMi6fqHEzMPa6uNYbLpOW1rxMhMhU97W8pLYBba0T9BI7F/xusozxVDVeQbDAgMBAAECggEAdZ4EaU3yemuCiZoUNIoFgBSNiX+A5PlUNPZC3U54mbJl6VeEPADre/Uowj82//uhqR9T/QKMdKbkqwONGEQF16t+k9YfBDatPHTuoI8lmeEWn4Ye7vjOmiPgBVe8NqwcxrqOl67x1+kupt955qerJxlBgE8v2aK5gB3HRwPggSYZgSZJ3X2zQMJ+XN4qe49Un+utqFuGtVRwPQvs/Kazp5GL7WlR0OnpQ2KZ+ur9T58VfTKmIeqBckey7nIrb/fdodJ7IqcykWjSLmy8p84W78iiRDfPn81Ujb231EWW+AbuV399aXBZ4oaR4q8wwkhe9xHUADWLvcfCnMrB40LkEQKBgQD2TEeBEB5Gwj/zpriq23xKJyzfo0hOxzGY/Ol2EykGeEYhny/YiTlMYtOMy37RiGKr4lN7G/pKl2fI5kRjgQM1QXgx6dxd11D0rORXj+SAy6+zAq3NVY4c3zDKmrQQ8x3f2QFffo+TmLtw/BH0Frp+a2lzKzIcXtZ4/akJdVIihwKBgQDHT7xvOaNyAPnnYwpROMI9eUVgFc9pMRAmQ18at8ggZ8M+Ww1nhr00loufzkovCb9MvGR4HSedWHfgmtDu1hUFtl7PItNItsB347yWPxR/lVLs44NVXt7jkFisoBoEBXaNVVt6uOSvBiqINmX3gm4FoisI2SRZsH7nMr07OXO85QKBgCkXdN6Nh9+aTP0jla+7yrK8cnolTc0G4rl5iKHQdInFyz2Ux3DDBDJAUrcsxE3FCWFP80mY01tag1A7SrGnNpfOAnWhZMirQbBwn/AT67WpRfkBu2mEmp8qhYNn6B7j0Nol5FrATMf9NViWVZB5skehOAik7klZcULiXy9ayYdFAoGAA+0bLim5gYZpZdh6nIz8ro9UAYeMdWsFAWv0VKdoJtNEclcC1ZY+5elNSNGcfn63qQBRDlisrhnPCrqiAQJwmZM1HOl3tgf7lKEE1wTZF4ZOguIcdTMQOvVd+dCRkqC07CXRToKT5qq9bb98lLqaBjxikqMMZ0PlzBIgzijckc0CgYAH16CziStEZVvKbiR8b0ftF9mf6V8I0KHianMgV8X6Y51aE0Ig1eQhIvqSjqtBac7gEppiu3OQVrp39uLdgyvDSVta1Hq9QYYTDNt8crt69aD/Th1h5esYvApYyZIhHbFDR5meE4Y3nHpfY7J8zhmfyaVW/6cuwPaToTtrEjQmWQ==
-----END PRIVATE KEY-----`;


// Request Parameters
const params =
    {
        appId:'B2iwKFIM4tvo',
        merchantId : 'CH10001165',
        mchOrderNo : parseInt(Math.random()*99999999999),
        paymentMethod : 'BANK_ID',
        amount : '10000',
        name : 'CheezeePayTest',
        phone : '081234567890',
        email : '[email protected]',
        payeeAccountInfos : '{\"bankCode\":\"116\",\"bankCardNumber\":\"1708099097\"}',
        language : 'en',
        notifyUrl : 'https://yourdomain/notifyUrl',
        timestamp : Date.now()
    };

//------------- MAIN -------
// Request payout order interface URL
const url = 'https://test2-openapi.91fafafa.com/api/payout/indonesia/order/create/v1';

const sign = getSign(params, mchPrivateKey);
console.log('Generated signature:', sign);
params.sign = sign;
sendRequestAndVerify(url,params);

//POST Request
async function sendRequestAndVerify(apiUrl, requestBody) {
    try {
        // send POST Request
        const response = await AXIOS.post(apiUrl, requestBody, {
            headers: {
                'Content-Type': 'application/json; charset=utf-8',
                'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
            },
        });

        // Check if the request was successful
        if (response.status !== 200) {
            console.error(`Request failed: ${response.status} - ${response.statusText}`);
            return;
        }

        // Get the response body
        const responseBody = response.data;
        console.log('Response:', responseBody);

        // Signature verification
        const verifyResult = verifySign(responseBody,platPublicKey);
        if (verifyResult) {
            console.log('Successful signature verification');
            // Signature verification passed, processing normal business logic
        } else {
            console.error('Signature verification error');
        }
    } catch (error) {
        console.error('Request failed:', error.message);
    }
}