Сохранение возвращаемого значения из вызова API в существующей базе данных

php sql parsing curl response

840 просмотра

1 ответ

У меня есть форма, которую мы отправляем после ввода данных. После отправки он отправляет данные в файл PHP, в котором есть вызовы API для моего поставщика услуг.

Сначала я сохраняю все данные в локальной базе данных, а также имя агента и метку времени, переданные из предыдущей формы. После сохранения данных я отправляю все соответствующие данные в сервисную службу, используя их API. Я использую curl для публикации данных.

Если все идет хорошо, я получаю следующий ответ

HTTP/1.1 100 Continue HTTP/1.1 200 OK Server: nginx/1.8.0 Date: Fri, 19 Aug 2016 16:38:16 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Access-Control-Allow-Headers: Authorization, Content-Type Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST {"success":true,"message":"1 row successfully inserted","warnings":[],"data":{"TRANSACTIONID":"SS_100526","STATUS":"Accepted, Verifying Funds"}}

Теперь вместо этого длинного сложного сообщения я хочу показать только одну строку - "

Данные успешно отправлены. Идентификатор транзакции для этой продажи: SS_100526

"на той же странице, а не в новом пустом окне. Также я хочу сохранить возвращенный идентификатор транзакции в той же локальной таблице, где я сохраняю детали продажи перед вызовом API.

Я пытался использовать различные параметры JSON, а также использовать его в качестве строки для анализа, но не могу заставить его работать. Любая идея, как я могу правильно отобразить ответ возврата, а также сохранить идентификатор возвращенной транзакции в моей существующей базе данных?

Вот код PHP, который я сейчас использую с комментариями

<?php
	ob_start();
	session_start();
	require_once '../dbconnect.php';// to connect to the database on my server 
	
	if( !isset($_SESSION['user']) ) {
		header("Location: ../index.php"); //fetching session details 
		exit;
	}
	// select loggedin users detail
	$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
	$userRow=mysql_fetch_array($res);
	$userid=$userRow['userEmail'];
	$usernam=$userRow['userName'];
	$timestamp = date('Y-m-d G:i:s');

$apikey = 'xxxxxxxxxxxxxxx'; // Your API Key
$apiEndPoint = 'https://portalDev.example.com';  // URL for API
 
$link = mysqli_connect("localhost", "root", "", "demodata");
 
// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

//collecting the user details to save in the database
	$source = 'client1';
    $last_name= mysqli_real_escape_string($link, $_POST['last_name']);//'Doe',
    $first_name= mysqli_real_escape_string($link, $_POST['first_name']);//'John',
    $address= mysqli_real_escape_string($link, $_POST['address']);//'123 Broadway',
    $city= mysqli_real_escape_string($link, $_POST['city']);//'New York',
    $state= mysqli_real_escape_string($link, $_POST['state']);//'NY',
    $zip= mysqli_real_escape_string($link, $_POST['zip']);//'10016',
    $amount= mysqli_real_escape_string($link, $_POST['amount']);//'5.99',
    $testmode = 0; // In test mode, you must use 1.
	$agentName = $usernam;
	$userMail = $userid;
	$saletimestamp = $timestamp;
 
 
 
// attempt insert query execution
$sql = "INSERT INTO users (source, last_name, first_name, address, city, state, zip, amount, testmode, agentName, userMail, saletimestamp) VALUES ('$source', '$last_name', '$first_name', '$address', '$city', '$state', '$zip','$amount', '$testmode', '$agentName','$userMail','$saletimestamp')";
if(mysqli_query($link, $sql)){
  echo "Records added successfully.";
	//header('Location: http://localhost/login/bsdev/success.html');
} else{
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
 
// close connection
mysqli_close($link);
 
 //collate data for sending to the service provider in the format they have shared with us.
$postFields = array(
    'SOURCE'=> 'client1',
    'LASTNAME'=> urlencode($_POST['last_name']),//'Doe',
    'FIRSTNAME'=> urlencode($_POST['first_name']),//'John',
    'ADDRESS'=> urlencode($_POST['address']),//'123 Broadway',
    'CITY'=> urlencode($_POST['city']),//'New York',
    'STATE'=> urlencode($_POST['state']),//'NY',
    'ZIPCODE'=> urlencode($_POST['zip']),//'10016',
    'AMOUNT'=> urlencode($_POST['amount']),//'5.99',
    'TESTMODE' => 1 // In test mode, you must use 1.
);
 
 
$process = curl_init($apiEndPoint . "/api/v1/transaction");
curl_setopt($process, CURLOPT_HEADER, 1);
curl_setopt($process, CURLOPT_USERPWD, $apikey . ":" . $apikey); // Basic Authentication using your API key
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_POST, 1);
curl_setopt($process, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, FALSE);
 
 
 
$response = (string)curl_exec($process);

echo $response;

//This is the response we get after curl_exec:
//Records added successfully.HTTP/1.1 100 Continue HTTP/1.1 200 OK Server: nginx/1.8.0 Date: Fri, 19 Aug 2016 13:58:57 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Access-Control-Allow-Headers: Authorization, Content-Type Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST {"success":true,"message":"1 row successfully inserted","warnings":[],"data":{"TRANSACTIONID":"SS_100526","STATUS":"Accepted, Verifying Funds"}}

curl_close($process);

?>

Автор: Ridge87701 Источник Размещён: 08.11.2019 11:13

Ответы (1)


0 плюса

Решение

Прежде всего, могу ли я предложить вам использовать фреймворк вместо vanilla php, так как этот код не совсем безопасен для использования в производственной среде.

$sql = "INSERT INTO users (source, last_name, first_name, address, city, state, zip, amount, testmode, agentName, userMail, saletimestamp) VALUES ('$source', '$last_name', '$first_name', '$address', '$city', '$state', '$zip','$amount', '$testmode', '$agentName','$userMail','$saletimestamp')";

Когда вы пишете такой запрос, он не защищен от SQL-инъекций. Вредоносные пользователи могут таким образом поставить под угрозу безопасность вашего веб-приложения. Используйте PDO для написания ваших запросов.

Теперь вернемся к вашему вопросу. Я ожидаю, что как только вы сделаете запрос к API, вы уже знаете идентификатор транзакции.

При использовании cURL для выполнения HTTP-запросов вы можете использовать curl_getinfo () для получения нужной информации из ответа.

curl_getinfo($process, $options)

$optionsздесь необязательный массив, который вы можете передать. Используйте curl_setopt_array (), чтобы вместо этого поместить все ваши настройки cURL в один массив. Таким образом, вам нужно использовать только одну функцию вместо curl_setopt()семи раз.

Извлеките код состояния из ответа curl_getinfo, затем напишите ifутверждение следующим образом.

if($statusCode === 200) {
   echo 'Data submitted successfully. Transaction ID for this sale is: ' . $id;
} else {
   echo 'Something went wrong.';
}

После запуска curl_exec()вам необходимо закрыть сеанс cURL, чтобы освободить ресурсы. Использование curl_close($process). Убедитесь, что $responseмассив такой $response[]. Удалить (string)до curl_exec.

После этого используйте json_decode($response)для перевода строки JSON в массив PHP, который можно использовать для получения необходимых данных.

Автор: Nico Curylo Размещён: 20.08.2016 12:08
Вопросы из категории :
32x32