Http пост-запрос, созданный из процедуры SQL-сервера не авторизуется - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь подключиться к стороннему 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}
...