2013-04-14 9 views
5

Pracuję nad integracją Stripe i jestem zaskoczony faktycznymi odpowiedziami uzyskanymi z PHP API. Zacząłem od przekonania, że ​​referencja API była dokładna i że odpowiedź byłaby ciągiem JSON, jak pokazano dla każdej metody. Szybko odkryłem istotne różnice. Najczęściej w polu JSON brakuje pola id. Ponadto, odpowiedź wydaje się być ciągiem znaków, obiektem i może niektórymi innymi strukturami, wszystko w tym samym czasie.Jaka jest struktura odpowiedzi metody Stripe PHP API?

Oto mój kod debugowania. Używam najnowszej biblioteki Stripe PHP w wersji 1.7.15.

function var_dump_ret($mixed=null) 
{ 
    ob_start(); 
    var_dump($mixed); 
    $content=ob_get_contents(); 
    ob_end_clean(); 
    return($content); 
} 

$token=$_POST['stripeToken']; 
$customer=Stripe_Customer::create(array(
    "card"=>$token, 
    "plan"=>"agency") 
); 

$custVarDump=var_dump_ret($customer); 
$cDecoded=json_decode($customer); 
$Debug="Invidual attributes of JSON decoded customer object:"._EOL; 
$Debug.="object:".$cDecoded->object._EOL; 
$Debug.="created:".$cDecoded->created._EOL; 
$Debug.="id:".$cDecoded->id._EOL; 
$Debug.="livemode:".$cDecoded->livemode._EOL; 
$Debug.="description:".$cDecoded->description._EOL; 
$Debug.="active_card.object:".$cDecoded->active_card->object._EOL; 
$Debug.="active_card.last4:".$cDecoded->active_card->last4._EOL; 
$Debug.="active_card.type:".$cDecoded->active_card->type._EOL; 
$Debug.="active_card.exp_month:".$cDecoded->active_card->exp_month._EOL; 
$Debug.="active_card.exp_year:".$cDecoded->active_card->exp_year._EOL; 
$Debug.="active_card.fingerprint:".$cDecoded->active_card->fingerprint._EOL; 
$Debug.="active_card.country:".$cDecoded->active_card->country._EOL; 
$Debug.="active_card.name:".$cDecoded->active_card->name._EOL; 
$Debug.="active_card.address_line1:".$cDecoded->active_card->address_line1._EOL; 
$Debug.="active_card.address_line2:".$cDecoded->active_card->address_line2._EOL; 
$Debug.="active_card.address_city:".$cDecoded->active_card->address_city._EOL; 
$Debug.="active_card.address_state:".$cDecoded->active_card->address_state._EOL; 
$Debug.="active_card.address_zip:".$cDecoded->active_card->address_zip._EOL; 
$Debug.="active_card.address_country:".$cDecoded->active_card->address_country._EOL; 
$Debug.="active_card.cvc_check:".$cDecoded->active_card->cvc_check._EOL; 
$Debug.="active_card.address_line1_check:".$cDecoded->active_card->address_line1_check._EOL; 
$Debug.="active_card.address_zip_check:".$cDecoded->active_card->address_zip_check._EOL; 
$Debug.="email:".$cDecoded->email._EOL; 
$Debug.="delinquent:".$cDecoded->delinquent._EOL; 
//$Debug.="subscription:".$cDecoded->subscription._EOL; 
$Debug.="discount:".$cDecoded->discount._EOL; 
$Debug.="account_balance:".$cDecoded->account_balance._EOL; 
$Debug.="unaltered response from Stripe_Customer::create:"._EOL.$customer._EOL. 
    "var dump of response:"._EOL.$custVarDump._EOL. 
    "print_r of json_decode of response:"._EOL.print_r($cDecoded,true)._EOL; 

file_put_contents(_LOGFILE,$Debug,FILE_APPEND); 

Poniżej znajduje się zawartość mojego pliku debugowania dla atrybutów indywidualnych obiektu klienta dekodowanego przez JSON. Po uruchomieniu kod wysłał powiadomienie.

Wskazówka: niezdefiniowany nieruchomości: stdClass :: $ id w prążki/subscription.php na linii 51

Należy również pamiętać, że musiałem wypowiedzieć się wiersz dodaną „subskrypcja” do napisu debugowania ze względu na krytyczny błąd dotyczący stdClass.

object:customer 
created:1365951909 
id: 
livemode: 
description: 
active_card.object:card 
active_card.last4:4242 
active_card.type:Visa 
active_card.exp_month:7 
active_card.exp_year:2013 
active_card.fingerprint:WTXPLgKDCXyp9xpD 
active_card.country:US 
active_card.name:charlie 
active_card.address_line1: 
active_card.address_line2: 
active_card.address_city: 
active_card.address_state: 
active_card.address_zip: 
active_card.address_country: 
active_card.cvc_check:pass 
active_card.address_line1_check: 
active_card.address_zip_check: 
email: 
delinquent: 
discount: 
account_balance:0 

W szczególności brak jest identyfikatora klienta. Nie istnieje w odpowiedzi JSON. Jednak, jak widać w niektórych przykładach Stripe, można uzyskać do niego dostęp za pomocą $ customer-> id. Co więcej, wyjście var_dump wskazuje na jeszcze więcej atrybutów obecnych w strukturze, której nie mogę zrozumieć. Cały plik debugowania ma numer http://www.helioza.com/stripe/debug.txt. Pokazałem tylko metodę tworzenia klienta, ale mam podobne problemy z fakturami i nie mogę znaleźć identyfikatora faktury nigdzie w odpowiedziach na Stripe_Invoice :: all lub Stripe_Invoice :: nadchodzących.

Pytania

1) W jaki sposób wartość zwracana przez Stripe_Customer :: utworzyć być zarówno ciągiem i obiekt w tym samym czasie?

2) Gdzie mogę znaleźć dokumentację opisującą metody zwracania wartości metody API, w tym sposób dostępu do każdego atrybutu?

Odpowiedz

6

Chociaż API Stripe'a zwraca JSON na poziomie HTTP (tj. Co faktycznie jest wysyłane przez kabel), biblioteka Stripe PHP już obsługuje dekodowanie odpowiedzi JSON i przekształcanie jej w obiekt PHP.

Nie ma potrzeby, aby przekazać wartości zwracanej z Stripe_Customer::create do json_decode - w rzeczywistości, biorąc pod uwagę, że jest to już przedmiot, nie rozumiem json_decode tyle dobrze, by zrozumieć, dlaczego to nie jest po prostu erroring zewnątrz.

W każdym przypadku wystarczy bezpośrednio interakcję z zwróconym obiektem klienta, np. $customer->description lub $customer->active_card->cvc_check. Możesz to zobaczyć, na przykład, w Stripe tutorial.

+0

Dzięki Evan. To pomaga w niektórych zagadkach. Nadal nie rozumiem, dlaczego mogę echo obiektu i uzyskać prawidłowy tekst. Zwykle PHP po prostu zgłasza "obiekt" i odmawia echa czegokolwiek innego. Nadal staram się rozgryźć strukturę odpowiedzi. Trial i błąd zajmuje dużo czasu. Na pewno byłoby pomocne, gdyby istniał dokument struktury zwrotu dla każdej metody. – Helioza

+3

Wszystkie właściwości obiektu są chronione, dlatego ich nie widzisz. PHP SDK faktycznie implementuje interfejs PHP 'ArrayAccess', który pozwala na dostęp do potrzebnych danych poprzez' $ response ['some_key'] ', gdzie klucze są wszystkimi opcjami wymienionymi na https://stripe.com/docs/ api? lang = php # ładunki. To całkiem łatwe w ten sposób. –

2

Z pomocą Evan znalazłem kompletną odpowiedź na drugie pytanie. Jak stwierdził Evan, kluczem jest traktowanie struktury zwróconej przez bibliotekę Stripe PHP jako obiekt. Elementy są przywoływane zgodnie z regułami zawartymi w strukturze JSON odpowiedzi metody raw.

Ponieważ mam problem z odczytywaniem złożonego JSON-a, szczególnie w miarę zwiększania wcięcia, napisałem skrypt, który zamienia każdy element struktury JSON w kompletne odniesienie do PHP, takie jak $ obj-> arr [index] -> obj2, i tak dalej. Pod numerem www.helioza.com/decoders/explain-json.php możesz wkleić ciąg JSON, na przykład w opisie Stripe API, i uzyskać pełną listę kodu PHP, który odwołuje się do każdego elementu.

Aktualizacja 27.05.2014

Patrząc na różnych uwag wydaje mi się, że istnieje kilka ukrytych kontekstów w pracy tutaj. Większość z nich jest ponad moją głową, więc aby jasno zrozumieć, co robię i czego nie wiem, oto jak interpretuję dokumentację API Stripe.

Zobacz przykład tworzenia nowego klienta, opcja kodu PHP. Poniżej znajduje się część odpowiedzi wywołania interfejsu API.

EXAMPLE RESPONSE 
{ 
    "object": "customer", 
    "created": 1401219085, 
    "id": "cus_474RjipEtz2ff7", 
    "livemode": false, 
    "description": "[email protected]", 
    "email": null, 
    "delinquent": false, 
    "metadata": { 
    }, 
    "subscriptions": { 
    "object": "list", 
    "total_count": 0, 
    "has_more": false, 
    "url": "/v1/customers/cus_474RjipEtz2ff7/subscriptions", 
    "data": [ 

    ] 
    }, 

Z mojego doświadczenia wynika, że ​​każda odpowiedź interfejsu API w sieci Web jest odpowiedzią HTTP. Gdzieś doktorzy Stripe mówią, że to jest POST. Patrzę więc na powyższą odpowiedź i widzę JSON, który jest kompatybilny z HTTP. Strona doc nie identyfikuje odpowiedzi jako JSON lub cokolwiek innego. Jeśli to nie jest JSON, proszę go zidentyfikować i powiedzieć, skąd to wiesz. Nazywanie go StdClass nie pomaga, ponieważ podręcznik PHP jest dość rozwlekły na ten temat i nie definiuje struktury klasy.

To jest naprawdę esencja mojego pierwotnego pytania. Jaka jest natura reakcji, jak to udokumentował Stripe? Wygląda na to, że JSON został dostarczony przez HTTP. Chcę być wykształcony.

Tak, otrzymuję wyniki, które chcę, traktując to, co biblioteka Stripe zwraca jako obiekt. Ale rozwiązania książek kucharskich nie dostarczają nikomu wiedzy. Najbardziej wartościowe odpowiedzi na SO są objaśniające.

+0

Nie powinieneś patrzeć na JSON * * - Stripe's PHP SDK gwarantuje, że pracujesz z obiektami PHP 'stdClass', proste i proste. Sugerowałbym zaakceptowanie odpowiedzi wysłanej przez @EvanBroder. – Madbreaks

+0

Zasadniczo szukam JSON, ponieważ jest to, co jest dostępne w odwołaniu do API Stripe do dokumentowania parametrów zwracanych. Jeśli (@Madbreaks) znasz lepszy odnośnik, opublikuj link do niego. – Helioza

+3

@Madbreaks To nie jest prawda. Stripe PHP SDK nie używa obiektów StdClass, ma własną klasę Stripe_Customer. Spróbuj dodać nową właściwość do obiektu Stripe_Customer, a otrzymasz fatalne błędy, co nie jest czymś, co robią obiekty StdClass. –