ここで明らかな何かが欠けていることは確かですが、顧客に対して既存のカードをチェックする方法について頭を悩ませることはできません。
laravelアプリ内でストライプ接続APIを使用して、他のユーザーに代わって支払いを管理しています。基本的なプロセスは次のとおりです。
token
はstripe.js
を介して作成され、支払いフォームとともに送信されますstripe_id
を取得します。存在しない場合は、トークンをソース/カードとして使用して新しい顧客が作成されます。stripe_id
を使用してcharge
が作成されます。現在、顧客が戻って別のカードを使用した場合、請求にはソースではなく顧客のみが含まれるため、デフォルトのカードに対して請求されます。
私がしたいのは:
token
customer
を確認しますcard
指紋を顧客のカードと照合しますcard
を作成しますcustomer
とcard
の両方のIDを使用して料金を作成します簡単に言えば:プロセスのどこで永続的なcard_id
が生成されるのかわかりません。 stripe.js
応答で使用されるものと、ストライプダッシュボードで作成されるものの両方が一意であるように見えます。つまり、すべての請求で新しいカードオブジェクトがストライプで作成されます。
顧客のアカウントに対して保存されているカードのリストを取得できることは知っていますが、検索対象の最初のcard_id
はどこから取得できますか?
ここでこれに触れる質問を見ました--- 新しいカードを作成する前に、ストライプカードがすでに存在するかどうかを確認できますか? -しかし、Rubyを知らないので、作成できませんそれの頭も尾も。
編集:
より単純なバージョン-ここのストライプドキュメントで説明されているようにfingerprint
を取得する方法はあります- https://stripe.com/docs/api/php#card_object -する必要はありません最初にカードオブジェクトを作成しますか?
したがって、ここでのアイデアは、 Card オブジェクトまたは Token オブジェクトでfingerprint
を使用することであり、追加するとID自体が異なるためです。同じカードを複数回。
新しいカードトークンを取得したら、 Retrieve Token APIを介して取得し、fingerprint
ハッシュでcard
を探します。
重複するカードを検出できるように、特定の顧客やカードに関連付けられた既知の指紋のリストをデータベースに保持します。
注:これらの情報を取得するために秘密鍵を使用していることを確認してください。そうしないと、公開可能なキーを使用している場合、フィンガープリント値を取得できない可能性があります。
これを行う関数を作成しました:
$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;
}