Преобразование ответа API-интерфейса Stripe для JSON с использованием библиотеки stripe-php

Я обращаюсь к данным клиента из Stripe API, который хотел бы преобразовать в JSON. Обычно я конвертирую объект в массив и использую json_encode(), но в этом случае я не вижу возможности даже при попытке получить доступ к вложенным массивам.

Это ответ, который я пытаюсь преобразовать в json:

Stripe_Customer Object
(
    [_apiKey:protected] => MY_KEY_IS_HERE
    [_values:protected] => Array
        (
            [id] => cus_2dVcTSc6ZtHQcv
            [object] => customer
            [created] => 1380101320
            [livemode] => 
            [description] => Bristol : John Doe
            [email] => [email protected]
            [delinquent] => 
            [metadata] => Array
                (
                )

            [subscription] => 
            [discount] => 
            [account_balance] => 0
            [cards] => Stripe_List Object
                (
                    [_apiKey:protected] => MY_KEY_IS_HERE
                    [_values:protected] => Array
                        (
                            [object] => list
                            [count] => 1
                            [url] => /v1/customers/cus_2dVcTSc6ZtHQcv/cards
                            [data] => Array
                                (
                                    [0] => Stripe_Object Object
                                        (
                                            [_apiKey:protected] => MY_KEY_IS_HERE
                                            [_values:protected] => Array
                                                (
                                                    [id] => card_2dVcLabLlKkOys
                                                    [object] => card
                                                    [last4] => 4242
                                                    [type] => Visa
                                                    [exp_month] => 5
                                                    [exp_year] => 2014
                                                    [fingerprint] => NzDd6OkHnfElGUif
                                                    [customer] => cus_2dVcTSc6ZtHQcv
                                                    [country] => US
                                                    [name] => John Doe
                                                    [address_line1] => 
                                                    [address_line2] => 
                                                    [address_city] => 
                                                    [address_state] => 
                                                    [address_zip] => 
                                                    [address_country] => 
                                                    [cvc_check] => pass
                                                    [address_line1_check] => 
                                                    [address_zip_check] => 
                                                )

                                            [_unsavedValues:protected] => Stripe_Util_Set Object
                                                (
                                                    [_elts:Stripe_Util_Set:private] => Array
                                                        (
                                                        )

                                                )

                                            [_transientValues:protected] => Stripe_Util_Set Object
                                                (
                                                    [_elts:Stripe_Util_Set:private] => Array
                                                        (
                                                        )

                                                )

                                            [_retrieveOptions:protected] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [_unsavedValues:protected] => Stripe_Util_Set Object
                        (
                            [_elts:Stripe_Util_Set:private] => Array
                                (
                                )

                        )

                    [_transientValues:protected] => Stripe_Util_Set Object
                        (
                            [_elts:Stripe_Util_Set:private] => Array
                                (
                                )

                        )

                    [_retrieveOptions:protected] => Array
                        (
                        )

                )

            [default_card] => card_2dVcLabLlKkOys
        )

    [_unsavedValues:protected] => Stripe_Util_Set Object
        (
            [_elts:Stripe_Util_Set:private] => Array
                (
                )

        )

    [_transientValues:protected] => Stripe_Util_Set Object
        (
            [_elts:Stripe_Util_Set:private] => Array
                (
                )

        )

    [_retrieveOptions:protected] => Array
        (
        )

)

Любая помощь очень ценится!

Ответ 1

PHP зарезервировал все имена методов с префиксом с двойным подчеркиванием для будущего использования. Смотрите https://www.php.net/manual/en/language.oop5.magic.php

В настоящее время в последней библиотеке php-stripe вы можете преобразовать объект Stripe в JSON, просто вызвав ** → toJSON().

[РАНЕЕ]

Все объекты, созданные библиотекой API Stripe PHP, можно преобразовать в JSON с помощью методов __toJSON().

Stripe::setApiKey("sk_xxxxxxxxxxxxxxxxxxxxxxxxx");

$customer = Stripe_Customer::create(array(
    "card" => $token, 
    "plan" => $plan,  
));

$customer_json = $customer->__toJSON();

Существует также метод __toArray ($ recursive = false). Не забудьте установить в качестве аргумента значение true, иначе вы получите массив, заполненный объектами полосы.

Stripe::setApiKey("sk_xxxxxxxxxxxxxxxxxxxxxxxxx");

$customer = Stripe_Customer::create(array(
    "card" => $token, 
    "plan" => $plan,  
));

$customer_array = $customer->__toArray(true);

Ответ 2

Доступ к атрибутам Stripe_Object можно получить следующим образом:

$customer->attribute;

Итак, чтобы получить карточку клиента last4, вы можете сделать это:

$customer->default_card->last4;

Однако вам нужно убедиться, что у вас есть атрибут default_card. Вы можете получить объект default_card в то же время, что и остальная часть клиента, передав аргумент expand:

$customer = Stripe_Customer::retrieve(array(
    "id" => "cus_2dVcTSc6ZtHQcv", 
    "expand" => array("default_card")
));

Ответ 3

Если, как и я, вы пришли сюда в поисках решения python 2.7, просто stripe_object к str(). Это запускает внутреннюю __str__() объекта, которая преобразует объект в строку JSON.

Например

charge = stripe.Charge....
print str(charge)

Ответ 4

Объект верхнего уровня содержит другие экземпляры объекта - метод cast to (array) влияет только на элемент верхнего уровня. Возможно, вам придется рекурсивно спуститься - но я бы сделал это по-другому здесь, учитывая, что классы сериализуемы:

$transfer = serialize($myobject);

Что вы собираетесь делать с другими данными JSONified?

Если вы собираетесь передать объект без информации о классе, вы можете попытаться использовать Reflection:

abstract class Object {

    /**
     * initialize an object from matching properties of another object
     */
    protected function cloneInstance($obj) {
        if (is_object($obj)) {
            $srfl = new ReflectionObject($obj);
            $drfl = new ReflectionObject($this);
            $sprops = $srfl->getProperties();
            foreach ($sprops as $sprop) {
                $sprop->setAccessible(true);
                $name = $sprop->getName();
                if ($drfl->hasProperty($name)) {
                    $value = $sprop->getValue($obj);
                    $propDest = $drfl->getProperty($name);
                    $propDest->setAccessible(true);
                    $propDest->setValue($this,$value);
                }
            }
        }
        else
            Log::error('Request to clone instance %s failed - parameter is not an object', array(get_class($this)));
        return $this;
    }

    public function stdClass() {
        $trg = (object)array();
        $srfl = new ReflectionObject($this);
        $sprops = $srfl->getProperties();
        foreach ($sprops as $sprop) {
            if (!$sprop->isStatic()) {
                $sprop->setAccessible(true);
                $name = $sprop->getName();
                $value = $sprop->getValue($this);
                $trg->$name = $value;
            }
        }
        return $trg;
    }

}

Это базовый класс большинства моих переносимых классов. Он создает объект stdClass из класса или инициализирует класс из объекта stdClass. Вы можете легко принять это для своих нужд (например, создать массив).

Ответ 5

Это уже в формате JSON, поэтому вам нужно снова преобразовать его в json_encode() просто передайте его в свой script