Payfort REST POST request using JSON

拥有回忆 提交于 2019-12-04 20:40:42

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.

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.

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);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!