Получить данные из Stripe Webhook JSON с помощью PHP - PullRequest
0 голосов
/ 27 октября 2019

Я работаю с Stripe Webhook и успешно получаю данные. Сейчас я пытаюсь извлечь отдельные элементы из ответа, но у меня возникают проблемы с этим. Вот пример полезной нагрузки Webhook, которая отправляется / принимается:

{
  "created": 1326853478,
  "livemode": false,
  "id": "evt_00000000000000",
  "type": "charge.captured",
  "object": "event",
  "request": null,
  "pending_webhooks": 1,
  "api_version": "2019-09-09",
  "data": {
    "object": {
      "id": "ch_00000000000000",
      "object": "charge",
      "amount": 100,
      "amount_refunded": 0,
      "application": null,
      "application_fee": null,
      "application_fee_amount": null,
      "balance_transaction": "txn_00000000000000",
      "billing_details": {
        "address": {
          "city": null,
          "country": null,
          "line1": null,
          "line2": null,
          "postal_code": null,
          "state": null
        },
        "email": null,
        "name": "Jenny Rosen",
        "phone": null
      },
      "captured": true,
      "created": 1572137813,
      "currency": "aud",
      "customer": null,
      "description": "My First Test Charge (created for API docs)",
      "dispute": null,
      "failure_code": null,
      "failure_message": null,
      "fraud_details": {
      },
      "invoice": null,
      "livemode": false,
      "metadata": {
      },
      "on_behalf_of": null,
      "order": null,
      "outcome": null,
      "paid": true,
      "payment_intent": null,
      "payment_method": "card_00000000000000",
      "payment_method_details": {
        "card": {
          "brand": "visa",
          "checks": {
            "address_line1_check": null,
            "address_postal_code_check": null,
            "cvc_check": null
          },
          "country": "US",
          "exp_month": 8,
          "exp_year": 2020,
          "fingerprint": "OZhbqnP4UGjfz2sg",
          "funding": "credit",
          "installments": null,
          "last4": "4242",
          "network": "visa",
          "three_d_secure": null,
          "wallet": null
        },
        "type": "card"
      },
      "receipt_email": null,
      "receipt_number": null,
      "receipt_url": "https://pay.stripe.com/receipts/acct_19tTXNGNdpzDd4Jh/ch_1FY03tGNdpzDd4Jhg9poqFWr/rcpt_G48KYZOYRKrGjAmC9bqOx6TkDAkQ19W",
      "refunded": false,
      "refunds": {
        "object": "list",
        "data": [
        ],
        "has_more": false,
        "url": "/v1/charges/ch_1FY03tGNdpzDd4Jhg9poqFWr/refunds"
      },
      "review": null,
      "shipping": null,
      "source_transfer": null,
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "succeeded",
      "transfer_data": null,
      "transfer_group": null
    }
  }
}

Я делаю следующее в моем PHP-файле:

$payload = @file_get_contents('php://input');
$event= json_decode( $payload, TRUE );
$status = $event->data->object->status;
echo '$status: '.$status.'<br>';

, который просто возвращает $status: <br>

Не уверен, что я делаю не так, пытаясь извлечь отдельные элементы из декодированного JSON вот такого состояния и количества?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Проблема с использованием параметра TRUE. Использование:

$event= json_decode( $payload, FALSE );

заставил его работать.

0 голосов
/ 29 октября 2019

Я только что понял это с небольшой помощью от разработчика на irc Stripe! Вы уже опубликовали свое дерево данных webhook, чтобы узнать, где находится информация, которую вам нужно получить, но ваш пример не сработает, потому что вы пытаетесь получить данные в еще неизвестном состоянии. В соответствии с примером кода на Stripe для веб-крючков условия могут быть:

payment_intent.succeeded ИЛИ payment_intent.failed

Ваш код должен быть в этих условиях, а не раньше!

Вот рабочий и проверенный пример, который дает вам руководство о том, как подойти к этому. Имейте в виду, что в соответствии с моим деревом из webhook, не вашим, а единственным отличием является одна строка кода, которая комментируется в конце.

<?php
// Payment success
if ($event->type == "payment_intent.succeeded") {
$intent = $event->data->object;
$order = $event->data->object->charges->data[0]->description; // this is my line of code
/////////////////////////////////////////////////////////
// Do your server stuff here for payment_intent.succeeded
/////////////////////////////////////////////////////////
printf("Succeeded: %s", $intent->id);
http_response_code(200);
?>

Для ваших собственных конкретных целей просто замените строку Iпрокомментировал с вашим собственным;

<?php
$status = $event->data->object->status; // this is your line of code
?>

Теперь вы можете делать все, что угодно, с этой переменной в любом состоянии.

...