はじめに
サイトにクレジットカード決済を導入する必要があったので、クレジットカード決済代行サービスの「Stripe」を試してみました。
Stripe
https://stripe.com/jp
まずはStripeにアカウント登録して、テストモードのAPIキーを発行します。
公開用のAPIキーと、シークレットのAPIキーをサンプルで使います。
購入画面サンプル
購入画面では「購入する」ボタンを押して、Stripeのポップアップ画面を表示します。
Stripeのポップアップ画面にクレジットカード情報を入力して支払いをします。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>購入画面</title>
<!-- 購入ボタンのCSS -->
<style type="text/css">
.stripe-button-el {
width: 350px;
max-width: 100%;
}
.stripe-button-el span {
font-size: 18px;
padding-top: 15px;
min-height: 60px!important;
}
</style>
</head>
<body>
<form action="/charge.php" method="POST">
<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="-- ここに公開用のAPIキーを記載する (pk_test_xxxxxx) --"
data-amount="100"
data-name="この商品の料金は100円です"
data-locale="auto"
data-allow-remember-me="false"
data-label="購入する"
data-currency="jpy">
</script>
</form>
</body>
</html>
「購入する」ボタンを押すと、クレジットカード入力画面が表示されます。
Stripeにテストで使えるカードがあるので、その情報を使って決済をします。
https://stripe.com/docs/testing
scriptタグのdata属性についてはこちらのページで確認できます。
https://stripe.com/docs/legacy-checkout#integration-simple-options
「¥100を支払う」ボタンを押したあと、Stripeの非同期通信によってカード情報が検証されます。
カード番号の間違いや期限切れなどの問題が無ければ、Stripeから発行されるトークン(stripeToken)をパラメータにフォームのactionに指定しているcharge.phpにPOSTされます。
PHPの決済処理サンプル
購入画面からPOSTされるphpファイルです。パラメータのstripeTokenを使って決済をします。
処理の流れとしては、
(1) オーソリ(与信枠の確保)
(2) 注文データベースの更新などStripeとは関係ない処理
(3) 売上の確定
となります。
StripeのPHPライブラリをダウンロードしておきます。
https://github.com/stripe/stripe-php
<?php
// ダウンロードしたStripeのPHPライブラリのinit.phpを読み込む
require_once('/home/hoge/stripe-php/init.php');
// APIのシークレットキー
\Stripe\Stripe::setApiKey('sk_test_xxxxxx');
$chargeId = null;
try {
// (1) オーソリ(与信枠の確保)
$token = $_POST['stripeToken'];
$charge = \Stripe\Charge::create(array(
'amount' => 100,
'currency' => 'jpy',
'description' => 'test',
'source' => $token,
'capture' => false,
));
$chargeId = $charge['id'];
// (2) 注文データベースの更新などStripeとは関係ない処理
// :
// :
// :
// (3) 売上の確定
$charge->capture();
// 購入完了画面にリダイレクト
header("Location: /complete.html");
exit;
} catch(Exception $e) {
if ($chargeId !== null) {
// 例外が発生すればオーソリを取り消す
\Stripe\Refund::create(array(
'charge' => $chargeId,
));
}
// エラー画面にリダイレクト
header("Location: /error.html");
exit;
}
?>
売上の確定はダウンロードコンテンツの販売であれば、このように即時でいいかと思いますが、商品の発送がある物販の場合はオーソリだけしておいて商品確保後や発送後にStripeのダッシュボードから売上を確定するなどします。
購入完了画面サンプル
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>購入完了画面</title>
</head>
<body>
<p>購入が完了しました。</p>
</body>
</html>
終わり
このように簡単にクレジットカード決済ができました。完了した決済はStripeのダッシュボードから確認できます。
まだ本番運用はしていないのですが、スムーズに導入することができそうです。
StripeはデフォルトではVISA、Master Card、AMEXのカードに対応しています。
審査請求して審査が通れば、JCB、Diners Club、Discoverのカードも使えるようになります。(2018年8月調べ)
サンプルは
php 5.4
stripe-php 6.10.4
のバージョンを使っています。
追記
この記事で紹介しているのはCheckoutのレガシーバージョンです。新しいバージョンのサンプルは下の記事に書きました。
「PHPでStripe Checkout (new version)を使ったクレジットカード決済サンプル」
https://qiita.com/p_s_m_t/items/e665a3492b80ea7fc7df