Payfort REST POST request using JSON

2020-08-02 20:15发布

问题:

Working on the payfort payment api https://testfort.payfort.com/api/?#merchant-page I have got a problem with REST POST request using JSON after tokinization is performed. my code is

$requestParams=json_encode($requestParams);
$service_url = 'https://sbpaymentservices.payfort.com/FortAPI/paymentApi';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $requestParams);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($requestParams))); 
$curl_response = curl_exec($curl);

$curl_response is always false

回答1:

I was facing the same problem. You can use the below code. Its working fine.

    $merchant_reference = str_random(30);
    $redirectUrl = 'https://sbpaymentservices.payfort.com/FortAPI/paymentApi';
    $return_url = 'enter_your_return_url_here';

    $requestParams = array(
        'command' => 'PURCHASE',
        'access_code' => 'enter_your_acccess_code_here',
        'merchant_identifier' => 'enter_your_merchant_identifier_here',
        'merchant_reference' => enter_your_merchant_reference_here,
        'amount' => enter_your_amount_here,
        'currency' => 'AED',
        'language' => enter_your_language_here,
        'customer_email' => 'customer@gmail.com',
        'token_name' => enter_your_token_name_here,
        'return_url' => return_url,
        'card_security_code' => enter_your_cvv_here,
    );

    // calculating signature
    $shaString = '';
    ksort($arrData);
    $SHARequestPhrase   = 'GLAM';
    $SHAResponsePhrase   = 'GLAM';
    $SHAType       = 'sha256';
    foreach ($arrData as $k => $v) {
        $shaString .= "$k=$v";
    }

    if ($signType == 'request') 
        $shaString = $SHARequestPhrase . $shaString . $SHARequestPhrase;
    else 
        $shaString = $SHAResponsePhrase . $shaString . $SHAResponsePhrase;

    $signature = hash($SHAType, $shaString);

    $requestParams['signature'] = hash($SHAType, $shaString);

    // calling payfort api using curl
    //open connection
    $ch = curl_init();

    //set the url, number of POST vars, POST data
    $useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0";
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;charset=UTF-8',
            //'Accept: application/json, application/*+json',
            //'Connection:keep-alive'
    ));
    curl_setopt($ch, CURLOPT_URL, $redirectUrl);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects     
    //curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); // The number of seconds to wait while trying to connect
    //curl_setopt($ch, CURLOPT_TIMEOUT, Yii::app()->params['apiCallTimeout']); // timeout in seconds
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestParams));

    $response = curl_exec($ch);

    curl_close($ch);

    return $response;

This is return you the complete payfort response.



回答2:

I don't have specific information about payfort but, you're sending JSON data in a wrong way (maybe).

$requestParams = json_encode($requestParams);
/*other codes*/
curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.urlencode($requestParams));

You shuld try to add "json=" prefix and filter/encode some special characters using urlencode.



回答3:

This one give the result

        $requestParams['signature'] = $signature;
        $requestParams=json_encode($requestParams);

        $result = file_get_contents('https://sbpaymentservices.payfort.com/FortAPI/paymentApi', null, stream_context_create(array(
                'http' => array(
                'method' => 'POST',
                'header' => 'Content-Type: application/json' . "\r\n"
                . 'Content-Length: ' . strlen($requestParams) . "\r\n",
                'content' => $requestParams,
                ),
            )
        ));

        $result=json_decode($result);