web-dev-qa-db-ja.com

既存のカードのストライプAPIチェック

ここで明らかな何かが欠けていることは確かですが、顧客に対して既存のカードをチェックする方法について頭を悩ませることはできません。

laravelアプリ内でストライプ接続APIを使用して、他のユーザーに代わって支払いを管理しています。基本的なプロセスは次のとおりです。

  • ストライプtokenstripe.jsを介して作成され、支払いフォームとともに送信されます
  • 顧客がローカルデータベースに存在する場合は、stripe_idを取得します。存在しない場合は、トークンをソース/カードとして使用して新しい顧客が作成されます。
  • 次に、取得した顧客または新規顧客stripe_idを使用してchargeが作成されます。

現在、顧客が戻って別のカードを使用した場合、請求にはソースではなく顧客のみが含まれるため、デフォルトのカードに対して請求されます。

私がしたいのは:

  • ストライプを作成するtoken
  • ローカルデータベースなどに対してcustomerを確認します
  • card指紋を顧客のカードと照合します
  • 必要に応じて、顧客の記録に新しいcardを作成します
  • customercardの両方のIDを使用して料金を作成します

簡単に言えば:プロセスのどこで永続的なcard_idが生成されるのかわかりません。 stripe.js応答で使用されるものと、ストライプダッシュボードで作成されるものの両方が一意であるように見えます。つまり、すべての請求で新しいカードオブジェクトがストライプで作成されます。

顧客のアカウントに対して保存されているカードのリストを取得できることは知っていますが、検索対象の最初のcard_idはどこから取得できますか?

ここでこれに触れる質問を見ました--- 新しいカードを作成する前に、ストライプカードがすでに存在するかどうかを確認できますか? -しかし、Rubyを知らないので、作成できませんそれの頭も尾も。

編集:

より単純なバージョン-ここのストライプドキュメントで説明されているようにfingerprintを取得する方法はあります- https://stripe.com/docs/api/php#card_object -する必要はありません最初にカードオブジェクトを作成しますか?

13
taekni

したがって、ここでのアイデアは、 Card オブジェクトまたは Token オブジェクトでfingerprintを使用することであり、追加するとID自体が異なるためです。同じカードを複数回。

新しいカードトークンを取得したら、 Retrieve Token APIを介して取得し、fingerprintハッシュでcardを探します。

重複するカードを検出できるように、特定の顧客やカードに関連付けられた既知の指紋のリストをデータベースに保持します。

注:これらの情報を取得するために秘密鍵を使用していることを確認してください。そうしないと、公開可能なキーを使用している場合、フィンガープリント値を取得できない可能性があります。

20
koopajah

これを行う関数を作成しました:

  • $customerはストライプカスタマーオブジェクトです
  • $stripe_accountは、アカウントのストライプIDまたは接続されたアカウントのストライプIDのいずれかです
  • $tokenはstripe.js要素から来ています
  • $check_expカードの番号が同じでも指紋は変わらないため、カードの有効期限も確認するかどうかを決定できます
  • ストライプ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;
    }
    
0
xinthose