条纹使多个客户使用相同的电子邮件地址

2022-08-30 14:20:01

我有带子检查与php。它创建客户并向他们收费。我想创建一个捐赠表单,如果同一客户回来并使用相同的电子邮件地址提供,Stripe不会创建另一个客户,而是向现有客户收取额外的付款。这可能吗?或者结账是否总是使用新客户 ID 创建新客户?

这是我的收费.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();
      }


    }

?>

答案 1

您需要将电子邮件地址和 Stripe 客户 ID 之间的关系存储在数据库中。我通过查看 Stripe 在客户上的 API 来确定这一点

首先,创建新客户时,每个字段都是可选的。这让我相信,每次你去,它都会“[创造]一个新的客户对象”。POST/v1/customers

此外,在检索客户时,唯一可用的字段是 。这使我相信您无法根据电子邮件地址或其他字段检索客户。id


如果无法在数据库中存储此信息,则始终可以使用 列出所有客户。这将要求您分页并检查所有客户对象,直到找到具有匹配电子邮件地址的对象。您可以看到,如果每次尝试创建客户时都这样做,这将是多么低效。GET /v1/customers


答案 2

您可以列出给定电子邮件地址的所有用户。https://stripe.com/docs/api#list_customers

JavaScript 中,你可以这样做:

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);
    });
}

推荐