Bri*_*ian 5 php stripe-payments
我正在尝试从 Stripe Checkout 表单提交中检索各种数据,我只是使用 Stripe Dashboard 中提供的 Stripe Checkout 代码。
在我的checkout_submission_completed活动中,我有 webhook,我试图在其中检索email,name以便在成功购买后我可以采取其他行动。
这是令人惊讶的困难。
这是我如何检索电子邮件(payload我的 webhook 收到的响应在哪里):
$cust = $payload['data']['object']['customer'];
$custdata = \Stripe\Customer::retrieve($cust);
$email=$custdata->email;
Run Code Online (Sandbox Code Playgroud)
好吧,没什么大不了的。
名字呢?好吧,这就是事情变得非常有趣的地方。点击表单支付提交按钮后,Stripe 会创建一个客户,完成一次成功的收费。但是在 Customer 对象中没有名称。是的,没有名字。在今天与 Stripe 的聊天中,他们没有做出任何解释,并表示他们会进一步调查。
结果表明,表单上输入的名称出现在 Stripe 对象中的唯一地方是 Payment Intent 对象中的 Payment Details 对象。
我是认真的。所以这是我获取名称的方式(使用cust以前的代码:
$piid = $cust = $payload['data']['object']['payment_intent'];
$pi = \Stripe\PaymentIntent::retrieve($piid);
$name = $pi['charges']['data'][0]['billing_details']['name'];
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
谢谢,布赖恩
我认为这个想法是收集的名称是持卡人姓名,并且与卡 [0] 相关联,而不是客户。客户最终可能会拥有多张卡或其他付款方式,而且他们可能都有不同的持卡人姓名。因此,默认情况下该信息不会转移到客户。
您的方法总体上看起来不错——我个人会使用 API 的扩展功能 [1],这样您就可以通过从 webhook 处理程序的一次调用中检索结帐会话及其付款和客户的完整上下文来跳过一堆 API 调用。
$session = \Stripe\Checkout\Session::retrieve(
$payload['data']['object']['id'],
["expand" => ["payment_intent", "customer"]]);
$cardholderName = $session['payment_intent']['charges']['data'][0]['billing_details']['name'];
\Stripe\Customer::update($session['customer'].id,
["name" => $cardholderName]);
Run Code Online (Sandbox Code Playgroud)
[1] - https://stripe.com/docs/api/expanding_objects?lang=php