问题
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);
来源:https://stackoverflow.com/questions/38652892/payfort-rest-post-request-using-json