现有卡的条带 API 检查

我确信我在这里错过了一些明显的东西,但我无法弄清楚如何针对客户检查现有卡。

我在 laravel 应用程序中使用 stripe connect api 代表他人管理付款,基本流程如下:

  • 条带是通过付款表单创建并随付款表单一起提交的tokenstripe.js
  • 如果客户存在于本地数据库中,我抓取他们的,否则使用令牌作为源/卡创建新客户stripe_id
  • 然后使用检索到的客户或新客户创建 achargestripe_id

目前,如果客户退回并使用其他卡,由于费用仅包括客户,不包括来源,因此无论如何都会从其默认卡中收取费用。

我想做的是:

  • 创建条带token
  • 对照本地数据库等进行检查customer
  • 检查客户卡上的指纹card
  • 如有必要,在客户记录上创建新的记录card
  • 使用和 ID 创建费用customercard

简单地说:我看不出在流程中的哪个位置生成了持久性;响应中使用的那些以及在条带仪表板中创建的那些似乎都是唯一的,这意味着每次充电都会在条带中创建一个全新的卡对象。card_idstripe.js

我知道我可以检索存储在客户帐户中的卡列表 - 但是我从哪里获得要搜索的首字母?card_id

我在这里看到了一个涉及这个问题的问题 - 在创建新卡之前,我可以检查条纹卡是否已经存在吗? - 但是我不了解Ruby,所以不能制作它的头或尾。

编辑:

更简单的版本 - 有没有办法获得此处的条纹文档中所述 - https://stripe.com/docs/api/php#card_object - 而无需首先创建卡片对象?fingerprint


答案 1

因此,这里的想法是使用 on the Card 对象或 Token 对象,而不是 id 本身,因为如果您多次添加同一张卡,它们会有所不同。fingerprint

当您获得新的卡令牌时,可以通过检索令牌API检索它,并在哈希中查找。fingerprintcard

您将在数据库中保留与特定客户和/或卡关联的已知指纹列表,以便可以检测重复的卡。

注意:请确保您使用密钥来获取这些信息。否则,如果您使用的是可发布密钥,则可能无法获取指纹值。


答案 2

我创建了一个函数来执行此操作:

  • $customer是条带化客户对象
  • $stripe_account是您帐户的条带 ID 或已连接帐户的条带 ID
  • $token来自条纹.js元素
  • $check_exp允许您决定是否也要检查卡的到期日期,因为如果卡的号码相同,指纹不会更改
  • stripe PHP API 7.0.0

    function check_duplicate_card($customer, $stripe_account, $token, $check_exp) {
    $loc = "check_duplicate_card >> ";
    $debug = true;
    
    if ($debug) {
        // see here for an explanation for logging: http://php.net/set_error_handler >> Examples
        trigger_error("$loc started", E_USER_NOTICE);
    }
    
    try
    {
        // get token data
        $response = \Stripe\Token::retrieve(
            $token,
            ["stripe_account" => $stripe_account]
        );
        $token_fingerprint = $response->card->fingerprint;
        $token_exp_month = $response->card->exp_month;
        $token_exp_year = $response->card->exp_year;
        if ($debug) {
            trigger_error("$loc token_fingerprint = $token_fingerprint; token_exp_month = $token_exp_month; token_exp_year = $token_exp_year", E_USER_NOTICE);
        }
    
        // check for duplicate source
        if ($debug) {
            trigger_error("$loc customer sources = " . json_encode($customer->sources), E_USER_NOTICE);
        }
        $duplicate_found = false;
        foreach ($customer->sources->data as &$value) {
            // get data
            $fingerprint = $value->fingerprint;
            $exp_month = $value->exp_month;
            $exp_year = $value->exp_year;
    
            if ($fingerprint == $token_fingerprint) {
                if ($check_exp) {
                    if (($exp_month == $token_exp_month) && ($exp_year == $token_exp_year)) {
                        $duplicate_found = true;
                        break;
                    }
                } else {
                    $duplicate_found = true;
                    break;    
                }
            }
        }
        if ($debug) {
            trigger_error("$loc duplicate_found = " . json_encode($duplicate_found), E_USER_NOTICE);
        }
    } catch (Exception $e) {
        if ($e instanceof \Stripe\Exception\ApiErrorException) {
            $return_array = [
                "status" => $e->getHttpStatus(),
                "type" => $e->getError()->type,
                "code" => $e->getError()->code,
                "param" => $e->getError()->param,
                "message" => $e->getError()->message,
            ];
            $return_str = json_encode($return_array);
            trigger_error("$loc $return_str", E_USER_WARNING);
            http_response_code($e->getHttpStatus());
            echo $return_str;
        } else {
            $return_array = [
                "message" => $e->getMessage(),
            ];
            $return_str = json_encode($return_array);
            trigger_error("$loc $return_str", E_USER_ERROR);
            http_response_code(500); // Internal Server Error
            echo $return_str;
        }
    }
    
    if ($debug) {
        trigger_error("$loc ended", E_USER_NOTICE);
    }
    
    return $duplicate_found;
    }
    

推荐