APIで顧客にカード情報の紐付け方について

soundBoxにて実装を行なっております。

その中で購入時に

クレジットカード情報を入力しトークンを発行(3Dセキュアも含む)したのちに

APIで顧客情報を作成しクレジットカードを保存しその後決済をしようと考えています。

その上でまずは保存のみの実装を下記のように行いました。

$card = new Card();
$card->setCustomerId($customerId);
$createCardRequest = new CreateCardRequest(
    uniqid('pk_', true) . bin2hex(random_bytes(4)),
    $squareToken,
    $card
);
$createCardRequest->setVerificationToken($square3DToken);
$api_response = $this->_client->getCardsApi()->createCard($createCardRequest);
if ($api_response->isSuccess()) {
    $result = $api_response->getResult();
    $cardId = $result->getCard()->getId();
} else {
    $errors = $api_response->getErrors();
    errorCommon::sendError('カードが紐づけられませんでした。' . $errors[0]->getDetail() , __FILE__);
}

ですが保存を試みると

The verification token provided is invalid.

とエラーが発生します。

なのでトークンの発行時に何か失敗しているのではないかと思い、

一旦保存は後回しにし決済実行のみ行おうと試みると問題なく決済は実行ができました。

保存時は発行するトークンがまた別なのでしょうか?

それとも実装方法に問題があるのでしょうか?

わかる方いらっしゃいましたらお願いいたします。

念の為決済時の実装も記載いたします。

$money = new Money();
$money->setAmount($amount);
$money->setCurrency('JPY');

$createPaymentRequest = new CreatePaymentRequest(
    $cardId ? null : $squareToken,
    uniqid('pu_', true) . bin2hex(random_bytes(4)),
);

$createPaymentRequest->setAmountMoney($money);
$createPaymentRequest->setDelayDuration('P7D');
$createPaymentRequest->setCustomerId($customerId);
$createPaymentRequest->setVerificationToken($square3DToken);
$api_response = $this->_client->getPaymentsApi()->createPayment($createPaymentRequest);

if ($api_response->isSuccess()) {
    $result = $api_response->getResult();
    $paymentId = $result->getPayment()->getId();
} else {
    $errors = $api_response->getErrors();
    errorCommon::sendError('決済が作れませんでした。' . $errors[0]->getDetail() , __FILE__);
}
 
よろしくお願いいたします。
  • API
1,129件の閲覧回数
メッセージ1/5
不適切なコンテンツを報告
4 返信

JSでトークンを作る際に

intent: 'CHARGE',をSTOREに変更したらカードの登録は出来ました。
ですが、その際に3Dセキュアを実行し、その後カード登録は出来ました。ですが、そうすると再度決済実行分を3Dセキュア認証が必要になり
再度tokenを発行し直さないといけなくなってしまったので、その点で困っています。
 
1,089件の閲覧回数
メッセージ2/5
不適切なコンテンツを報告
Square Community Moderator

@思考中_user さん

 

確認させていただきましたところ、3Dセキュアは日本では現時点では本番環境内では利用できないため、intent: STOREの方法で保存するのではなく、Cards APIとCustomers APIをご利用いただくことになるとのことです。詳細はCards APIからご確認ください。

 

もし解決できない場合は、お手数ですが英語で開発者サポートまでお問い合わせ下さい。
他のAPI利用者から回答が得られやすい、開発者用コミュニティもご活用ください:Square Developer Forum

開発者向けリソース・サポート

間宮 −Mamiya
Square コミュニティ管理者
解決策や有用な回答には、ログイン して ベストアンサーとしてマークをクリックしましょう!
1,055件の閲覧回数
メッセージ3/5
不適切なコンテンツを報告

本番環境で上記のように3Dセキュアを実装した場合はエラーになってしまうのでしょうか?

また、Sandboxではテストカードで利用できるが本番では利用できないといったことでしょうか?

また、2025年より3Dセキュアは義務化されるかと思いますが、今後API利用時に3Dセキュアは実装されないのでしょうか?

 

よろしくお願いいたします。

1,048件の閲覧回数
メッセージ4/5
不適切なコンテンツを報告
Square Community Moderator

@思考中_user さん

 

はい、現時点では日本において本番環境ではご利用いただけません。また、今後3Dセキュアをご利用いただけるよう、対応中でございます。

よろしくお願いいたします。

 

間宮 −Mamiya
Square コミュニティ管理者
解決策や有用な回答には、ログイン して ベストアンサーとしてマークをクリックしましょう!
1,044件の閲覧回数
メッセージ5/5
不適切なコンテンツを報告