Stripe 让多个客户使用相同的电子邮件地址

Posted

技术标签:

【中文标题】Stripe 让多个客户使用相同的电子邮件地址【英文标题】:Stripe making multiple customers with same email address 【发布时间】:2014-12-11 03:16:25 【问题描述】:

我使用 php 进行了条带检查。它创造客户并向他们收费。我想创建一个捐赠表格,如果同一客户回来并使用相同的电子邮件地址提供,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();
      


    

?>

【问题讨论】:

你能发布一些你的代码吗? 当然,我刚刚添加了charge.php 假设您现在可以通过电子邮件进行搜索,但 Stripe 仍然愚蠢地允许多个客户使用同一电子邮件,因此我们需要处理结果中的重复项:***.com/a/40482496/470749 【参考方案1】:

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

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

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


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

【讨论】:

您是否通过 webhook 存储客户信息并将其存储在您自己的数据库中? 你可能会使用 webhook;但是,我个人会在您创建客户对象后立即保存信息(在您的代码中,$customer = Stripe_Customer::create(array(...));)。这将返回客户对象,您可以从中检索 Stripe ID 以在您的数据库中与提交的电子邮件地址相关联。 在提交过程中将令牌 ID 从条带保存到 mysql 或任何类型的数据库是否安全?或者只是将客户 ID 保存到 mysql? 卡令牌是安全的(这就是为什么它是由 Stripe 创建的,所以“你的”服务器不需要保存/处理任何实际的信用卡数据)但它不值得保存,因为它逻辑上应该依附于客户。保存客户卡令牌毫无意义。 让我用data from Stripe 增强最后一条评论:"请注意,令牌不应该被存储或使用多次——为了存储这些详细信息以供以后使用,您应该创建 Customer或收件人对象”(不一定是“不安全的”,但不是“打算”存储的)。【参考方案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);
    );

【讨论】:

all10 的列表有默认限制,100 有一个上限。这实际上是行不通的。

以上是关于Stripe 让多个客户使用相同的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

Stripe - 向用户收费并通过电子邮件发送发票

未使用 Stripe Payment 生成电子邮件收据

Stripe 管理员付款收到 Wordpress 电子邮件内容

地址验证系统(AVS))检查电子商务

条纹结帐 - 删除或使电子邮件字段只读

使用 Mandrill 和 Rails 的多个收件人