Я пытаюсь подключиться к стороннему API, который может выполнять платежные транзакции.у нас есть код на PHP, который делает это правильно.Но наше текущее приложение работает исключительно на MS ACCESS и SQL-сервере.Поэтому я пытаюсь создать ту же функциональность для хранимых процедур SQL-сервера.
Ниже приведен код PHP, который выполняется без каких-либо ошибок:
<?php
date_default_timezone_set('Asia/Calcutta');
//sandbox source key
$sourcekey = "_xxxxxxxxxxxxxxxxxx";
$pin = "xxxxxx";
// generate random seed value
$seed=time().rand();
// setting hash value using sha256
$clear= $sourcekey.$seed.$pin;
$hash="s2/".$seed."/".hash('sha256',$clear);
//sandbox endpoint
$service_url = "https://example.com/transactions";
//$encoded=base64_encode("$sourcekey:$hash");
$headers = ['Content-type: application/json' ];
$request = [
'command' => 'cc:sale',
'amount' => '5.00',
'amount_detail' => array(
'tax' => '1.00',
'tip' => '0.50'
),
'creditcard' => array(
'cardholder' => 'John doe',
'number' => '4000100011112224',
'expiration' => '0919',
'cvc' => '123',
'avs_street' => '1234 Main',
'avs_zip' => '12345'
),
'invoice' => '123456789'
];
$curl_post_data = json_encode($request);
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_URL, $service_url);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
print_r("$sourcekey:$hash");
curl_setopt($curl, CURLOPT_USERPWD, "$sourcekey:$hash");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$curl_response = curl_exec($curl);
print_r($curl_response);
$response = json_decode($curl_response);
print_r($response);
?>
По некоторым причинам нижепроцедура отправки запроса из SQL не авторизуется, даже если используется тот же ключ API.
код SQL
DECLARE @authHeader NVARCHAR(64);
DECLARE @contentType NVARCHAR(64);
DECLARE @postData NVARCHAR(2000);
DECLARE @responseText NVARCHAR(2000);
DECLARE @responseXML NVARCHAR(2000);
DECLARE @ret INT;
DECLARE @status NVARCHAR(32);
DECLARE @statusText NVARCHAR(32);
DECLARE @token INT;
DECLARE @url NVARCHAR(256);
SET @authHeader = 'BASIC _xxxxxxxxxxxxxxxx';
SET @contentType = 'application/x-www-form-urlencoded';
SET @postData = '';
SET @url = 'https://example.com//transactions';
-- Open the connection.
EXEC @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @token OUT;
IF @ret <> 0 RAISERROR('Unable to open HTTP connection.', 10, 1);
-- Send the request.
EXEC @ret = sp_OAMethod @token, 'open', NULL, 'POST', @url, 'false';
EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Authentication', @authHeader;
EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Content-type', @contentType;
EXEC @ret = sp_OAMethod @token, 'send', NULL, @postData;
-- Handle the response.
EXEC @ret = sp_OAGetProperty @token, 'status', @status OUT;
EXEC @ret = sp_OAGetProperty @token, 'statusText', @statusText OUT;
EXEC @ret = sp_OAGetProperty @token, 'responseText', @responseText OUT;
-- Show the response.
PRINT 'Status: ' + @status + ' (' + @statusText + ')';
PRINT 'Response text: ' + @responseText;
-- Close the connection.
EXEC @ret = sp_OADestroy @token;
IF @ret <> 0 RAISERROR('Unable to close HTTP connection.', 10, 1);
Сообщение об ошибке
{"error":"Valid authentication required","errorcode":0}