【Stripe+PHP】Stripe Elementsでシンプルな決済フォームを作成する
※本ページのリンクにはプロモーションが含まれています。
こんにちは、Ryohei(@ityryohei)です!
本記事では、StripeとPHPでシンプルな決済フォームの作成する方法をご紹介しています。
Stripeで基本的な決済フォームの作りたいんだけど、どうすればいいんだろう?
上記の疑問にお答えします。
では、解説していきます。StripeのAPIキーを取得する
Stripeの最初の一歩ということで、アカウントを作成してAPIキーを取得します。アカウントの作成は下記から行えますので、まだアカウント作成してないよ、という方はリンク先から作成しておきましょう。
アカウントの作成が完了すると、各アカウントに紐づいたダッシュボードへアクセスすることができます。ダッシュボードのトップには本番用のAPIキーが表示されています。こちらはサイトを公開する段階で使用するもので、開発中はテスト用のAPIキーを使用します。テスト用のAPIキーは左メニュー内にあるテストデータを表示中をオンにするか、下記のページにアクセスしてテスト用のAPIキーを取得することができます。
テスト用のAPIキー(公開可能キー)は下記赤線部分のようにpk_test
となっています。シークレットキーはsk_test
からなるトークン名です。APIキーの文字列の上にマウスカーソルを合わせてクリックするとコピーすることができますので、APIキーが必要な場合はダッシュボードにアクセスして取得しましょう。
以上でStripeのAPIキーが取得できました。続いて取得したAPIキーを使って、決済フォームを作成していきます。
決済フォームを作成する
決済フォームの作成は、下記のページを参考に進めていきます。
本記事ではシンプルなフォームを作成したいので、作成するファイルは下記の2ファイルのみとします。
- 入力画面:form.php
- 完了画面:thanks.php
入力画面はクレジットカード番号等を入力してサーバーに送信するまで。完了画面はStripeに入力画面で得た情報を渡して、処理結果を受け取るまでを実装します。
作成するファイルは以上2ファイルとなりますが、途中でStripeのライブラリをインストールする手順があります。ライブラリは同じ階層に設置していただければ大丈夫です。
では、続きを解説していきます。
Stripeモジュールを読み込んでインスタンス化する
Stripeを使用するためにモジュールを読み込みます。HTMLのhead
内に下記のスクリプトタグを追加します。
//form.php <script src="https://js.stripe.com/v3/"></script>
上記を読み込むことでStripeオブジェクトにアクセスできますので、そのままStripeオブジェクトをインスタンス化します。インスタンス化する際に先程取得したAPIキーを引数に指定しましょう。本記事ではStripe Elementsを使用しますので、併せてElementsインスタンスも作成しておきます。
//form.php <script src="https://js.stripe.com/v3/"></script> <script> //公開可能キー var stripe = Stripe('pk_test_xxxxxx'); var elements = stripe.elements(); //以降のスクリプトはこちらに追加していきます </script>
以上でStripeのモジュールの読み込み~インスタンス化が完了しました。続いてHTMLでフォームのレイアウトを作成していきます。
Stripe Elementsでフォームを作成する
Stripe Elementsは事前にStripe側で用意されたUIコンポーネント(インプットやボタン等)を提供します。クレジットカードのような機密情報を自分のサーバーを介することなく扱うことができます。
詳しくは下記ページをご参照ください。
本記事ではクレジットカード情報のみを入力し、サーバーに情報を送信してStripeで決済するというフォームを作成します。入力項目にはStripeを使用するのに最低限必要なカード番号、有効期限、セキュリティコードを用意します。これらはStripe ElementsでUIコンポーネントが用意されているので、自分でinput要素を用意する必要はありませんが、マウントする場所(UIコンポーネントを表示する場所)をどこにするかを指定する必要があります。
本記事では構築例を参考に、id
を持たせた要素を設置したいと思います。
//form.php <form id="card-form" method="post" action="thanks.php"> <table> <tbody> <tr> <th>カード番号</th> <td> <label for="card-number"></label> <div id="card-number"></div> </td> </tr> <tr> <th>有効期限</th> <td> <label for="card-expiry"></label> <div id="card-expiry"></div> </td> </tr> <tr> <th>セキュリティコード</th> <td> <label for="card-cvc"></label> <div id="card-cvc"></div> </td> </tr> </tbody> </table> <div id="card-errors"></div> <button>支払いをする</button> </form>
補足
クレジットカードの有効期限とセキュリティコード(CVC)をサーバーへ送信するには下記のinput
が必要になります。公式サイトにの構築例では触れられていないですが、サンプルソースでは指定されていますので、後々のエラー解消のために必ず設置しておきましょう。
<input type="hidden" name="cardExpMonth" data-stripe="exp_month"> <input type="hidden" name="cardExpYear" data-stripe="exp_year">
input
タグはStripe Elementsにマウントすることで生成されます。それぞれのid
を指定しStripe Elementsにマウントしていきます。せっかくですので、併せて入力時のバリデーション処理も追加します。エラーメッセージは Stripe Elements がよしなにやってくれるので意識する必要はありません。
//form.php //カード番号 var cardNumber = elements.create('cardNumber'); cardNumber.mount('#card-number'); cardNumber.on('change', function (event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); //有効期限 var cardExpiry = elements.create('cardExpiry'); cardExpiry.mount('#card-expiry'); cardExpiry.on('change', function (event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); //セキュリティコード var cardCvc = elements.create('cardCvc'); cardCvc.mount('#card-cvc'); cardCvc.on('change', function (event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } });
フォームバリデーションについては下記で詳しく説明されています。Stripeでフォームを構築する際に参考にしていただければと思います。
カード情報をトークン化してサーバーへ送信する
入力したクレジットカード等の情報をサーバーへ送信する処理(PHPに渡す処理)を作成します。基本的に公式サイトの構築例の通りですが、フォーム要素のid
はご自身が指定した名称に変更してください。
//form.php var form = document.getElementById('card-form'); form.addEventListener('submit', function (event) { event.preventDefault(); var errorElement = document.getElementById('card-errors'); if (event.error) { errorElement.textContent = event.error.message; } else { errorElement.textContent = ''; } stripe.createToken(cardNumber).then(function (result) { if (result.error) { errorElement.textContent = result.error.message; } else { stripeTokenHandler(result.token); } }); }); function stripeTokenHandler(token) { var form = document.getElementById('card-form'); var hiddenInput = document.createElement('input'); hiddenInput.setAttribute('type', 'hidden'); hiddenInput.setAttribute('name', 'stripeToken'); hiddenInput.setAttribute('value', token.id); form.appendChild(hiddenInput); form.submit(); }
ここまでで入力画面(form.php
)のソースは完成です。ただ、現在は入力のみで送信した後の処理がありませんので、続いて完了画面(サーバー側のPHPの処理)を作成していきます。
PHPでサーバー側の処理を作成する
PHPでStripeを使用するためにライブラリをインストールします。
Stripeのライブラリをインストール
Composerでインストールする場合は下記のコマンドを実行してインストールします。
composer require stripe/stripe-php
Composerがない環境の場合は下記のURLからライブラリをダウンロードしてご利用ください。
以上でライブラリの準備は完了です。
POSTで取得したトークンで支払いを作成する
前項で作成した入力画面で入力したクレジットカード情報を送信すると、Stripeによって生成されたトークンがサーバーに送信されます。PHP側ではPOSTで受け取ったトークンを使用し、APIでStripeの支払いを作成します。支払いの作成に成功するとStripeのダッシュ―ボードにある支払いに新しい支払いが作成されます。エラーが発生した場合は 開発者 のメニューからエラー内容を確認することができます。
PHP側ではダッシュボードから取得することができる開発用のシークレットキーを使用します。ダッシュボードから開発用のシークレットキーを取得し、setApiKey
に指定します。
//thanks.php <?php require 'vendor/autoload.php'; //シークレットキー \Stripe\Stripe::setApiKey('sk_test_xxxxxx'); try { $stripeToken = $_POST['stripeToken']; $charge = \Stripe\Charge::create([ 'source' => $stripeToken, 'amount' => 1000, 'currency' => 'jpy', ]); } catch (Error $e) { echo $e->getMessage(); }
Stripeにはテストで使用することができるクレジットカード番号が用意されています。下記を参考にクレジットカード番号を入力して、支払いを作成してみてください。
以上でトークンを使用した支払いの作成は完了です。入力画面と完了画面が作成できましたので、テストしてエラーがあればダッシュボードのエラーメッセージを参考に修正してみてください。
本記事で掲載したソースまとめ
全体のソースを分割した説明となってしまいましたので、最後に本記事で掲載したソースをまとめておきます。Stripe構築時のテンプレート的な感じで使用していただければ幸いです。
form.php
<!doctype html> <html> <head> <script src="https://js.stripe.com/v3/"></script> </head> <body> <form id="card-form" method="post" action="thanks.php"> <table> <tbody> <tr> <th>カード番号</th> <td> <label for="card-number"></label> <div id="card-number"></div> </td> </tr> <tr> <th>有効期限</th> <td> <label for="card-expiry"></label> <div id="card-expiry"></div> <input type="hidden" name="cardExpMonth" data-stripe="exp_month"> <input type="hidden" name="cardExpYear" data-stripe="exp_year"> </td> </tr> <tr> <th>セキュリティコード</th> <td> <label for="card-cvc"></label> <div id="card-cvc"></div> </td> </tr> </tbody> </table> <div id="card-errors"></div> <button>支払いをする</button> </form> <script> var stripe = Stripe('pk_test_xxxxxx'); var elements = stripe.elements(); var cardNumber = elements.create('cardNumber'); cardNumber.mount('#card-number'); cardNumber.on('change', function (event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); var cardExpiry = elements.create('cardExpiry'); cardExpiry.mount('#card-expiry'); cardExpiry.on('change', function (event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); var cardCvc = elements.create('cardCvc'); cardCvc.mount('#card-cvc'); cardCvc.on('change', function (event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); var form = document.getElementById('card-form'); form.addEventListener('submit', function (event) { event.preventDefault(); var errorElement = document.getElementById('card-errors'); if (event.error) { errorElement.textContent = event.error.message; } else { errorElement.textContent = ''; } stripe.createToken(cardNumber).then(function (result) { if (result.error) { errorElement.textContent = result.error.message; } else { stripeTokenHandler(result.token); } }); }); function stripeTokenHandler(token) { var form = document.getElementById('card-form'); var hiddenInput = document.createElement('input'); hiddenInput.setAttribute('type', 'hidden'); hiddenInput.setAttribute('name', 'stripeToken'); hiddenInput.setAttribute('value', token.id); form.appendChild(hiddenInput); form.submit(); } </script> </body> </html>
thanks.php
<?php require 'vendor/autoload.php'; \Stripe\Stripe::setApiKey('sk_test_xxxxxx'); try { $stripeToken = $_POST['stripeToken']; $charge = \Stripe\Charge::create([ 'source' => $stripeToken, 'amount' => 1000, 'currency' => 'jpy', ]); } catch (Error $e) { echo $e->getMessage(); }
最後に
Stripeはオンラインの決済を簡単に、安全にウェブサイトやアプリに導入することができるサービスです。クレジットカードをメインの決済方法として検討しているのであればStripeで始めるのも選択の一つかなと思います。Google PayやApple Payにも対応していて、決済方法も増えてきています。今後の展開に期待ですね!
以上、Stripe+PHPとStripe Elementsでシンプルな決済フォームを作成する方法をご紹介でした!