Как я могу извлечь строку из ответа с несколькими объектами в PHP?

#php #arrays #json #object

#php #массивы #json #объект

Вопрос:

У меня есть $response переменная, которая извлекает ответ из вызова Square API. var_dump($response) предоставляет следующий вывод:

 object(SquareHttpApiResponse)#26 (8) {
  ["request":"SquareHttpApiResponse":private]=>
  object(SquareHttpHttpRequest)#15 (4) {
    ["httpMethod":"SquareHttpHttpRequest":private]=>
    string(4) "Post"
    ["headers":"SquareHttpHttpRequest":private]=>
    array(5) {
      ["user-agent"]=>
      string(29) "Square-PHP-SDK/6.1.0.20200722"
      ["Accept"]=>
      string(16) "application/json"
      ["content-type"]=>
      string(16) "application/json"
      ["Square-Version"]=>
      string(10) "2020-07-22"
      ["Authorization"]=>
      string(71) "Bearer EAAAEKqGJAcxq33I1vRGDoSdHuOjM1e0mD_yuMQwFpHnyPpuH-vqy3FCQSojC6Cv"
    }
    ["queryUrl":"SquareHttpHttpRequest":private]=>
    string(47) "https://connect.squareupsandbox.com/v2/payments"
    ["parameters":"SquareHttpHttpRequest":private]=>
    NULL
  }
  ["statusCode":"SquareHttpApiResponse":private]=>
  int(200)
  ["reasonPhrase":"SquareHttpApiResponse":private]=>
  NULL
  ["headers":"SquareHttpApiResponse":private]=>
  array(13) {
    [0]=>
    string(15) "HTTP/1.1 200 OK"
    ["Date"]=>
    string(29) "Sun, 30 Aug 2020 19:36:47 GMT"
    ["Frame-Options"]=>
    string(4) "DENY"
    ["X-Frame-Options"]=>
    string(4) "DENY"
    ["X-Content-Type-Options"]=>
    string(7) "nosniff"
    ["X-Xss-Protection"]=>
    string(13) "1; mode=block"
    ["Content-Type"]=>
    string(16) "application/json"
    ["Square-Version"]=>
    string(10) "2020-07-22"
    ["Squareup--Connect--V2--Common--Versionmetadata-Bin"]=>
    string(16) "CgoyMDIwLTA3LTIy"
    ["Vary"]=>
    string(27) "Accept-Encoding, User-Agent"
    ["Content-Encoding"]=>
    string(4) "gzip"
    ["Content-Length"]=>
    string(3) "568"
    ["Strict-Transport-Security"]=>
    string(45) "max-age=631152000; includeSubDomains; preload"
  }
  ["result":"SquareHttpApiResponse":private]=>
  object(SquareModelsCreatePaymentResponse)#28 (2) {
    ["errors":"SquareModelsCreatePaymentResponse":private]=>
    NULL
    ["payment":"SquareModelsCreatePaymentResponse":private]=>
    object(SquareModelsPayment)#30 (28) {
      ["id":"SquareModelsPayment":private]=>
      string(29) "7PVOoMjV8mUoSaGWKrX1F8VDyHDZY"
      ["createdAt":"SquareModelsPayment":private]=>
      string(24) "2020-08-30T19:36:47.584Z"
      ["updatedAt":"SquareModelsPayment":private]=>
      string(24) "2020-08-30T19:36:47.771Z"
      ["amountMoney":"SquareModelsPayment":private]=>
      object(SquareModelsMoney)#29 (2) {
        ["amount":"SquareModelsMoney":private]=>
        int(100)
        ["currency":"SquareModelsMoney":private]=>
        string(3) "USD"
      }
      ["tipMoney":"SquareModelsPayment":private]=>
      NULL
      ["totalMoney":"SquareModelsPayment":private]=>
      object(SquareModelsMoney)#114 (2) {
        ["amount":"SquareModelsMoney":private]=>
        int(100)
        ["currency":"SquareModelsMoney":private]=>
        string(3) "USD"
      }
      ["appFeeMoney":"SquareModelsPayment":private]=>
      NULL
      ["processingFee":"SquareModelsPayment":private]=>
      NULL
      ["refundedMoney":"SquareModelsPayment":private]=>
      NULL
      ["status":"SquareModelsPayment":private]=>
      string(9) "COMPLETED"
      ["delayDuration":"SquareModelsPayment":private]=>
      string(6) "PT168H"
      ["delayAction":"SquareModelsPayment":private]=>
      string(6) "CANCEL"
      ["delayedUntil":"SquareModelsPayment":private]=>
      string(24) "2020-09-06T19:36:47.584Z"
      ["sourceType":"SquareModelsPayment":private]=>
      string(4) "CARD"
      ["cardDetails":"SquareModelsPayment":private]=>
      object(SquareModelsCardPaymentDetails)#92 (15) {
        ["status":"SquareModelsCardPaymentDetails":private]=>
        string(8) "CAPTURED"
        ["card":"SquareModelsCardPaymentDetails":private]=>
        object(SquareModelsCard)#37 (11) {
          ["id":"SquareModelsCard":private]=>
          NULL
          ["cardBrand":"SquareModelsCard":private]=>
          string(4) "VISA"
          ["last4":"SquareModelsCard":private]=>
          string(4) "1111"
          ["expMonth":"SquareModelsCard":private]=>
          int(12)
          ["expYear":"SquareModelsCard":private]=>
          int(2021)
          ["cardholderName":"SquareModelsCard":private]=>
          NULL
          ["billingAddress":"SquareModelsCard":private]=>
          NULL
          ["fingerprint":"SquareModelsCard":private]=>
          string(71) "sq-1-hkTPgBOAraVIsVGaBBcvVA8l9BNMGNv2Vz2BGjYytjR1YCLqMLS8S2MKrea0ZsrIdw"
          ["cardType":"SquareModelsCard":private]=>
          string(6) "CREDIT"
          ["prepaidType":"SquareModelsCard":private]=>
          NULL
          ["bin":"SquareModelsCard":private]=>
          string(6) "411111"
        }
        ["entryMethod":"SquareModelsCardPaymentDetails":private]=>
        string(5) "KEYED"
        ["cvvStatus":"SquareModelsCardPaymentDetails":private]=>
        string(12) "CVV_ACCEPTED"
        ["avsStatus":"SquareModelsCardPaymentDetails":private]=>
        string(12) "AVS_ACCEPTED"
        ["authResultCode":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["applicationIdentifier":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["applicationName":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["applicationCryptogram":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["verificationMethod":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["verificationResults":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["statementDescription":"SquareModelsCardPaymentDetails":private]=>
        string(24) "SQ *DEFAULT TEST ACCOUNT"
        ["deviceDetails":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["refundRequiresCardPresence":"SquareModelsCardPaymentDetails":private]=>
        NULL
        ["errors":"SquareModelsCardPaymentDetails":private]=>
        NULL
      }
      ["locationId":"SquareModelsPayment":private]=>
      string(13) "LH0MT7DEW5C1P"
      ["orderId":"SquareModelsPayment":private]=>
      string(27) "bJshmQ0AozoB1zVEH4iif0XpuaB"
      ["referenceId":"SquareModelsPayment":private]=>
      NULL
      ["customerId":"SquareModelsPayment":private]=>
      NULL
      ["employeeId":"SquareModelsPayment":private]=>
      NULL
      ["refundIds":"SquareModelsPayment":private]=>
      NULL
      ["buyerEmailAddress":"SquareModelsPayment":private]=>
      NULL
      ["billingAddress":"SquareModelsPayment":private]=>
      NULL
      ["shippingAddress":"SquareModelsPayment":private]=>
      NULL
      ["note":"SquareModelsPayment":private]=>
      NULL
      ["statementDescriptionIdentifier":"SquareModelsPayment":private]=>
      NULL
      ["receiptNumber":"SquareModelsPayment":private]=>
      string(4) "7PVO"
      ["receiptUrl":"SquareModelsPayment":private]=>
      string(73) "https://squareupsandbox.com/receipt/preview/7PVOoMjV8mUoSaGWKrX1F8VDyHDZY"
    }
  }
  ["body":"SquareHttpApiResponse":private]=>
  string(944) "{"payment": {"id": "7PVOoMjV8mUoSaGWKrX1F8VDyHDZY","created_at": "2020-08-30T19:36:47.584Z","updated_at": "2020-08-30T19:36:47.771Z","amount_money": {"amount": 100,"currency": "USD"},"status": "COMPLETED","delay_duration": "PT168H","source_type": "CARD","card_details": {"status": "CAPTURED","card": {"card_brand": "VISA","last_4": "1111","exp_month": 12,"exp_year": 2021,"fingerprint": "sq-1-hkTPgBOAraVIsVGaBBcvVA8l9BNMGNv2Vz2BGjYytjR1YCLqMLS8S2MKrea0ZsrIdw","card_type": "CREDIT","bin": "411111"},"entry_method": "KEYED","cvv_status": "CVV_ACCEPTED","avs_status": "AVS_ACCEPTED","statement_description": "SQ *DEFAULT TEST ACCOUNT"},"location_id": "LH0MT7DEW5C1P","order_id": "bJshmQ0AozoB1zVEH4iif0XpuaB","total_money": {"amount": 100,"currency": "USD"},"receipt_number": "7PVO","receipt_url": "https://squareupsandbox.com/receipt/preview/7PVOoMjV8mUoSaGWKrX1F8VDyHDZY","delay_action": "CANCEL","delayed_until": "2020-09-06T19:36:47.584Z"}}
"
  ["errors":"SquareHttpApiResponse":private]=>
  array(0) {
  }
  ["cursor":"SquareHttpApiResponse":private]=>
  NULL
}
  

Однако меня интересует только одна строка в этом объекте:

   object(SquareModelsCreatePaymentResponse)#28 (2) {
    ["errors":"SquareModelsCreatePaymentResponse":private]=>
    NULL
    ["payment":"SquareModelsCreatePaymentResponse":private]=>
    object(SquareModelsPayment)#30 (28) {
      ["id":"SquareModelsPayment":private]=>
      string(29) "7PVOoMjV8mUoSaGWKrX1F8VDyHDZY"
  

У меня нет большого опыта работы с objects amp; JSON, и все чтение и исследования, которые я проводил, не касаются ничего подобного, поэтому я обращаюсь к экспертам здесь. Как мне извлечь id строку из всего этого ответа?

Редактировать:

Согласно комментариям и ответам, вот ссылка на документацию:

https://developer.squareup.com/reference/square/payments-api/create-payment

и раздел кода, с которым я работаю:

 // Initialize the Square client.
$client = new SquareSquareClient([
  'accessToken' => $access_token,
  'environment' => getenv('ENVIRONMENT')
]);

$payments_api = $client->getPaymentsApi();

$create_payment_request = new CreatePaymentRequest($nonce, uniqid(), $money);

// The SDK throws an exception if a Connect endpoint responds with anything besides
// a 200-level HTTP code. This block catches any exceptions that occur from the request.
try {
  $response = $payments_api->createPayment($create_payment_request);
  // If there was an error with the request we will
  // print them to the browser screen here
  if ($response->isError()) {
    echo 'Api response has Errors';
    $errors = $response->getErrors();
    echo '<ul>';
    foreach ($errors as $error) {
        echo '<li>❌ ' . $error->getDetail() . '</li>';
    }
    echo '</ul>';
    exit();
  }
  echo '<pre>';
  $resp_arr = (array)json_decode($response, true);
  var_dump($response);
  var_dump($resp_arr);
  echo '<br>';
  echo 'Payment ID:';
  echo $response->result->errors->payment->id;
  echo '</pre>';
} catch (SquareExceptionsApiException $e) {
  echo 'Caught exception!<br/>';
  echo('<strong>Response body:</strong><br/>');
  echo '<pre>'; var_dump($e->getResponseBody()); echo '</pre>';
  echo '<br/><strong>Context:</strong><br/>';
  echo '<pre>'; var_dump($e->getContext()); echo '</pre>';
  exit();
}
  

Заранее спасибо за вашу помощь!

Z

Комментарии:

1. Должен быть метод для извлечения того, что вам нужно, например getPayments() или что-то в этом роде. Проверьте документы.

Ответ №1:

Получил помощь от square dev forum. Я смог использовать getBody() вызов для извлечения ответа json и декодирования его в массив:

 $resp_arr = $response->getBody() ;
$resp_dec = json_decode($resp_arr, true) ;
$pmtid = $resp_dec["payment"] ["id"] ;
  

Ответ №2:

Вы уже пробовали это?

 echo $response->result->errors->payment->id;
  

Кроме того, если вы более знакомы с работой с массивом вместо объекта, вы можете использовать true аргумент для json_decode() подобного:

 $response = (array)json_decode($response, true);
  

Таким образом, вы получите массив вместо объекта

Редактировать

Не заметил, что они были частными. С частными свойствами объекта у вас все еще есть несколько способов получить его.

  • Используйте класс, упомянутый в документах, чтобы получить свойство

  • Вы можете попробовать приведение массива, а затем поиск в массиве.

Код:

 class Visibility {
    public $public = 'public';
    protected $protected = 'protected';
    private $private = 'private';
}

var_dump((array) new Visibility());
  

Комментарии:

1. Они все private .