Stripe PHP API 方法响应的结构是啥? [关闭]

Posted

技术标签:

【中文标题】Stripe PHP API 方法响应的结构是啥? [关闭]【英文标题】:What is the structure of Stripe PHP API method response? [closed]Stripe PHP API 方法响应的结构是什么? [关闭] 【发布时间】:2013-04-06 17:31:17 【问题描述】:

我正在研究 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 解码客户对象的个人属性的调试文件的内容。执行时,代码贴出通知。

注意:未定义的属性:stdClass::$id in stripe/subscription.php on line 51

另外请注意,由于有关 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::upcoming 响应中的任何地方都找不到发票 ID。

问题

1) Stripe_Customer::create 返回的值怎么可能同时是字符串和对象?

2) 我在哪里可以找到描述 API 方法返回值的文档,包括如何访问每个属性?

【问题讨论】:

我投票决定将此问题作为离题结束,因为它同时提出了几个问题,而且它正在寻求帮助以查找场外资源。 @KDavis。我只是在做等待通知告诉我做的事情。我仍然认为关于 API 和 Stripe 的问题很热门,而且非常与编程有关。如果 SO 不支持讨论场外资源相关的问题,那为什么还有标签 API 和 Stripe? 【参考方案1】:

虽然 Stripe 的 API 在 HTTP 级别返回 JSON(即实际通过网络发送的内容),但 Stripe PHP 库已经处理了对 JSON 响应的解码并将其转换为 PHP 对象。

应该没有必要将返回值从Stripe_Customer::create 传递给json_decode - 事实上,鉴于它已经是一个对象,我不太了解json_decode,无法理解为什么这不仅仅是出错了。

在任何情况下,您都应该直接与返回的客户对象进行交互,例如$customer->description$customer->active_card->cvc_check。例如,您可以在Stripe tutorial 中看到这一点。

【讨论】:

谢谢埃文。这有助于解决我的一些难题。我仍然不明白为什么我可以回显对象并获取有效文本。通常,PHP 只报告“对象”并拒绝回显其他任何内容。我还在努力弄清楚响应的结构。反复试验需要很长时间。如果每个方法都有一个返回结构的文档,那肯定会很有帮助。 对象的所有属性都受到保护,这就是您看不到它们的原因。 PHP SDK 实际上实现了ArrayAccess PHP 接口,它允许您通过$response['some_key'] 访问所需的数据,其中的键是stripe.com/docs/api?lang=php#charges 中列出的所有选项。这样很容易。【参考方案2】:

在埃文的帮助下,我想出了第二个问题的完整答案。正如 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 日更新

查看各种 cmets,在我看来,这里有几个隐藏的上下文在起作用。大多数都在我的脑海里,所以要清楚我知道什么和不知道什么,这是我解释 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。所以我查看了上面的响应,我看到了与 HTTP 兼容的 JSON。文档页面实际上并未将响应标识为 JSON 或其他任何内容。如果这不是 JSON,请识别它并告诉我你是如何知道的。称它为 StdClass 并没有帮助,因为 PHP 手册在该主题上相当迟钝,并且没有定义类的结构。

这确实是我最初问题的本质。 Stripe 所记录的响应的性质是什么?当然看起来像通过 HTTP 传递的 JSON。我想接受教育。

是的,通过将 Stripe 库返回的内容视为对象,我得到了我想要的结果。但是食谱解决方案不会进一步加深任何人的知识。关于 SO 最有价值的答案是解释性的。

【讨论】:

您根本不应该查看 JSON - Stripe 的 PHP SDK 保证您使用 PHP stdClass 对象,简单明了。我建议接受@EvanBroder 发布的答案。 基本上,我正在查看 JSON,因为这是 Stripe API 参考中可用于记录返回参数的内容。如果您 (@Madbreaks) 知道更好的参考,请发布指向它的链接。 @Madbreaks 这不是真的。 Stripe PHP SDK 不使用 StdClass 对象,它有自己的 Stripe_Customer 类。尝试向 Stripe_Customer 对象添加一个新属性,你会得到致命错误,这不是 StdClass 对象所做的。 @DavidMeister Stripe 可以很好地将 JSON 重构为自己的类,但这无关紧要。这些类提供对操作尝试获取的数据的访问,没有理由直接检查 JSON。

以上是关于Stripe PHP API 方法响应的结构是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从 Stripe API webhooks 获得响应?

条纹 PHP 收费::创建响应

我需要将 json STRIPE API 数据转换成 php

将 API 响应返回到 web/Android/iOS 时最好的方法是啥?

尝试连接到 Stripe API 有人可以带我逐步了解这个 webhook 正在做啥(php)

从 PHP 脚本获取和解释 XML 文件响应的最简单方法是啥? [复制]