我正在进行Stripe集成,我对从PHP API获得的实际响应感到困惑。我开始相信API参考是准确的,并且响应将是每个方法所示的JSON字符串。我很快发现了显着的差异。大多数情况下,JSON响应中缺少id字段。此外,响应似乎是一个字符串,一个对象,也许还有其他一些结构,都在同一时间。
这是我的调试代码。我使用的是最新的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解码客户对象的invidual属性。执行时,代码发布了通知。
注意:未定义的属性:第51行的stripe / subscription.php中的stdClass :: $ id
另请注意,由于stdClass的致命错误,我必须注释掉添加'subscription'到调试字符串的行。
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。
问题
1)Stripe_Customer :: create返回的值如何同时是一个字符串和一个对象?
2)我在哪里可以找到描述API方法返回值的文档,包括如何访问每个属性?
答案 0 :(得分:6)
虽然Stripe的API在HTTP级别返回JSON(即通过线路实际发送的内容),但Stripe PHP库已经处理了JSON响应的解码并将其转换为PHP对象。
不应该将返回值从Stripe_Customer::create
传递给json_decode
- 事实上,鉴于它已经是一个对象,我不明白{{1很好地理解为什么这不是错误的。
在任何情况下,您都应该直接与返回的客户对象进行交互,例如json_decode
或$customer->description
。例如,您可以在Stripe tutorial。
答案 1 :(得分:2)
在Evan的帮助下,我找到了对第二个问题的完整答案。正如Evan所说,关键是将Stripe PHP库返回的结构视为对象。根据原始方法响应的JSON结构中隐含的规则引用元素。
由于我无法读取复杂的JSON,特别是当缩进深度增加时,我编写了一个脚本,将JSON结构的每个元素转换为完整的PHP引用,如$ obj-> arr [index] - > obj2 , 等等。在www.helioza.com/decoders/explain-json.php,您可以粘贴JSON字符串,如Stripe API参考中的示例,并获取引用每个元素的完整PHP代码列表。
2014年5月27日更新
看看各种评论,我觉得这里有几个隐藏的背景。大多数都是我的头脑,所以要清楚我做什么和不知道,这是我如何解释Stripe API文档。
查看创建新客户PHP代码选项的示例。以下是API调用响应的一部分。
EXAMPLE RESPONSE
{
"object": "customer",
"created": 1401219085,
"id": "cus_474RjipEtz2ff7",
"livemode": false,
"description": "payinguser@example.com",
"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文档说它是POST。所以我看看上面的响应,我看到JSON,它与HTTP兼容。 doc页面实际上并不将响应标识为JSON或其他任何内容。如果这不是JSON,那么请找出它并告诉我你是怎么知道的。调用它StdClass没有帮助,因为PHP手册对该主题非常迟钝,并没有定义类的结构。
这真的是我原来问题的本质。 Stripe记录的响应的性质是什么?当然看起来像JSON通过HTTP传递。我想接受教育。
是的,我通过处理Stripe库作为对象返回的内容来获得我想要的结果。但是食谱解决方案并没有让任何人知道。关于SO的最有价值的答案是解释性的。