2013-04-14 4 views
5

私はStripeの統合に取り組んでいます。私はPHP APIから得た実際の応答に困惑しています。私は、APIリファレンスが正確であり、応答が各メソッドに示されているJSON文字列であると信じて始めました。私はすぐに大きな違いを発見した。ほとんどの場合、idフィールドはJSONレスポンスにはありません。また、応答は文字列、オブジェクト、およびおそらくいくつかの他の構造であるように見えます。Stripe PHP APIメソッドレスポンスの構造は何ですか?

ここに私のデバッグコードがあります。私は最新のStripe PHPライブラリ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); 

以下は、JSONデコードされた顧客オブジェクトの無効属性のための私のデバッグファイルの内容です。コードが実行されると、通知がポストされました。

お知らせ:未定義のプロパティ:はstdClass ::ライン上のストライプ/ subscription.php 51

で$ idがまた、私は致命的なのためにデバッグ文字列に「サブスクリプション」を追加した行をコメントアウトしなければならなかったことに注意してください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 

最も顕著に欠けているのが顧客IDです。 JSONレスポンスには存在しません。ただし、Stripeのサンプルプログラムの一部に見られるように、$ customer-> idを使用してアクセスできます。さらに、var_dumpの出力は、私が理解できない構造内にさらに多くの属性が存在することを示しています。デバッグファイル全体はhttp://www.helioza.com/stripe/debug.txtです。私は顧客作成メソッドしか示していませんが、請求書と同様の問題が発生しており、Stripe_Invoice :: allまたはStripe_Invoice ::の今後の回答のどこにでも請求書IDを見つけることができません。値がStripe_Customerで返されることができますどのように

質問

1)::作成と同時に文字列とオブジェクトの両方であること?

2)各属性にアクセスする方法を含め、APIメソッドの戻り値を説明するドキュメントはどこにありますか?

答えて

6

ストライプのAPIはHTTPレベルでJSONを返します(実際にワイヤで送信されるもの)が、JSONレスポンスのデコードとPHPオブジェクトへの変換を処理しています。

Stripe_Customer::createからjson_decodeに戻り値を渡す必要があってはならない - 実際には、それはすでにオブジェクトのことを考えると、私はそれがちょうどerroringされていない理由を理解するのに十分にjson_decode理解していません。

いずれの場合でも、返された顧客オブジェクトと直接対話するだけで済みます。 $customer->descriptionまたは$customer->active_card->cvc_check。これは、たとえばStripe tutorialにあります。

+0

ありがとうエバン。それは私のパズルのいくつかに役立ちます。なぜ私はオブジェクトをエコーし​​て有効なテキストを出力できるのかまだ分かりません。通常、PHPは単に 'オブジェクト'を報告し、他のものをエコーすることを拒否します。私はまだレスポンスの構造を理解するのに苦労しています。試行錯誤には長い時間がかかります。それぞれの方法について返品構造の文書があれば、確かに役立つでしょう。 – Helioza

+3

オブジェクトのすべてのプロパティが保護されているため、オブジェクトが表示されません。 PHP SDKは実際に '$ response ['some_key']'を介して必要なデータにアクセスするための 'ArrayAccess' PHPインターフェイスを実装しています。ここで、キーはhttps://stripe.com/docs/にリストされているすべてのオプションですapi?lang = php#charges。それはかなり簡単です。 –

2

エバンの助けを借りて、私は2番目の質問に対する完全な答えを見つけました。 Evan氏が述べたように、キーはStripe PHPライブラリによって返された構造をオブジェクトとして扱うことです。要素は、生のメソッド・レスポンスのJSON構造に暗黙のルールに従って参照されます。

特にインデントの深さが増すにつれて複雑なJSONを読み込むのに問題があるため、JSON構造の各要素を$ obj-> arr [index] - > obj2のような完全なPHPリファレンスに変換するスクリプトを作成しました。等々。 www.helioza.com/decoders/explain-json.phpでは、Stripe APIリファレンスの例のようにJSON文字列を貼り付けて、各要素を参照するPHPコードの完全なリストを取得できます。

アップデート2014年5月27日

様々なコメントを見てみると、仕事でいくつかの隠されたコンテキストがここにありますように私には思えます。ほとんどが私の頭の上にあるので、わたしが知っているか分からないことを明確にするために、ここで私がStripe APIのドキュメントをどのように解釈するかを説明します。

新しい顧客を作成する例のPHPコードオプションを見てください。以下は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": [ 

    ] 
    }, 

私の経験では、すべてのWeb APIレスポンスはHTTPレスポンスです。 Stripe docsのどこかでPOSTと言われています。だから私は上記の応答を見て、私はHTTPと互換性のあるJSONを参照してください。ドキュメントページでは、JSONなどのレスポンスは実際には識別されません。これがJSONでない場合は、それを特定し、そのことをどのように知っているか教えてください。それをStdClassと呼ぶことは、PHPマニュアルがその話題にはまったく鈍感で、クラスの構造を定義していないので役に立ちません。

これは本当に私の元の質問の本質です。ストライプがそれを文書化したときの応答の性質は何ですか? JSONがHTTP経由で配信されているようです。私は教育を受けたい。

はい、ストライプライブラリがオブジェクトとして返すものを処理することで、結果が得られました。しかし、クックブックのソリューションは誰の知識も分かりません。 SOに関する最も貴重な答えは説明的です。

+0

JSON *を一切見ないでください* * StripeのPHP SDKは、PHPの 'stdClass'オブジェクトをプレーンでシンプルに扱うことを保証します。 @EvanBroderが投稿した回答を受け入れることをお勧めします。 – Madbreaks

+0

基本的には、リターンパラメータを文書化するためにStripe APIリファレンスで使用できるJSONがあるためです。あなた(@Madbreaks)がより良いリファレンスを知っているなら、それへのリンクを投稿してください。 – Helioza

+3

@Madbreaksこれは当てはまりません。 Stripe PHP SDKはStdClassオブジェクトを使用せず、Stripe_Customerクラスも持っています。 Stripe_Customerオブジェクトに新しいプロパティを追加しようとすると、StdClassオブジェクトとは違う致命的なエラーが発生します。 –

関連する問題