Stripe如何处理同一电子邮件地址的多个客户?

38

我用PHP实现了Stripe支付功能,它可以创建客户并对他们进行付款。我希望创建一个捐赠表单,在这个表单中,如果同一个客户使用相同的电子邮件地址再次捐赠,Stripe不会创建新的客户,而是使用现有客户信息进行附加付款。这种操作是否可行?或者说Stripe付款系统总是会为每个新客户创建新的客户ID?

这是我的charge.php代码:

<?php
    require_once('config.php');

    $token  = $_POST['stripeToken'];

    if($_POST) {
      $error = NULL;

      try{
        if(!isset($_POST['stripeToken']))
          throw new Exception("The Stripe Token was not generated correctly");
            $customer = Stripe_Customer::create(array(
              'card'  => $token,
              'email' =>  $_POST['stripeEmail'],
              'description' => 'Thrive General Donor'
            ));

            $charge = Stripe_Charge::create(array(
              'customer' => $customer->id,
              'amount'   => $_POST['donationAmount'] * 100,
              'currency' => 'usd'
            ));
      }
      catch(Exception $e) {
        $eror = $e->getMessage();
      }


    }

?>

你可以贴出一些你的代码吗? - Alex
当然,我刚刚添加了charge.php。 - Thrive Ministry
3
据说现在可以通过电子邮件进行搜索,但 Stripe 仍然愚蠢地允许具有相同电子邮件的多个客户端,因此我们需要处理结果中的重复项:https://dev59.com/tIDba4cB1Zd3GeqPHKgG#40482496 - Ryan
在这里,您可以找到关于此行为的解释:https://stripe.com/docs/api/checkout/sessions/create#create_checkout_session-customer_creation - Lenor
2个回答

28
您需要在数据库中存储电子邮件地址和Stripe客户ID之间的关系。我是通过查看Stripe的客户API确定的。
首先,创建新客户时每个字段都是可选的。这让我相信,每次您向/v1/customers POST时,它都会“[创建]一个新的客户对象”。
此外,在检索客户时,唯一可用的字段是id。这使我相信您无法根据电子邮件地址或其他字段检索客户。
如果您无法将此信息存储在数据库中,您可以始终使用GET /v1/customers列出所有客户。这将要求您通过分页并检查所有客户对象,直到找到具有匹配电子邮件地址的客户为止。您可以看到,如果每次尝试创建客户时都这样做,那么这将非常低效。

你是否通过 Webhook 存储客户信息,并将其存储在自己的数据库中? - Thrive Ministry
2
你可以潜在地使用一个Webhook;然而,我个人会在创建客户对象时立即保存信息(在你的代码中,$customer = Stripe_Customer::create(array(...));)。这将返回客户对象,从中你可以检索Stripe ID以与提交的电子邮件地址相关联。 - Sam
卡片令牌是安全的(这就是为什么Stripe创建它的原因,所以“您”的服务器不需要保存/处理任何实际的信用卡数据),但它不值得保存,因为逻辑上应该将其附加到客户端。保存客户端和卡片令牌没有意义。 - Sam
2
让我用来自Stripe的数据增强上一个评论:“请注意,令牌不应被存储或多次使用 - 要为以后使用存储这些详细信息,您应该创建客户或收件人对象”(不一定是“不安全”的,但不是“意味着”要存储)。 - Sam
1
现在可以使用这里的列出所有客户API https://stripe.com/docs/api/customers/list,并使用“电子邮件”参数来完成此操作。但是,Stripe仍允许重复。 - Rob
显示剩余6条评论

7
您可以列出给定电子邮件地址的所有用户。https://stripe.com/docs/api#list_customersJavaScript 中,您可以这样做:
const customerAlreadyExists = (email)=>{
    return  doGet(email)
                .then(response => response.data.length > 0);
}

const doGet = (url: string)=>{
    return fetch('https://api.stripe.com/v1/customers' + '?email=' + email, {
        method: 'GET',
        headers: {
            Accept: 'application/json',
            Authorization: 'Bearer ' + STRIPE_API_KEY
        }
    }).then(function (response) {
        return response.json();
    }).catch(function (error) {
        console.error('Error:', error);
    });
}

默认情况下,列出“全部”限制为“10”,上限为“100”。这实际上并不能正常工作。 - amarinediary
这不会返回Connect子账户中任何客户的值。 - Kemal Ahmed
@amarinediary 这应该适用于大多数情况。文档中说email是一个“过滤器”,但实际上它是应用于整个结果而不是返回记录的查询。很可能单个电子邮件地址分配给少于10个客户ID。 - Ford Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接