PHPとStripeを使ったクレジットカード決済サンプル

# はじめに

サイトにクレジットカード決済を導入する必要があったので、クレジットカード決済代行サービスの「Stripe」を試してみました。

Stripe
https://stripe.com/jp

まずはStripeにアカウント登録して、テストモードのAPIキーを発行します。
公開用のAPIキーと、シークレットのAPIキーをサンプルで使います。

# 購入画面サンプル
購入画面では「購入する」ボタンを押して、Stripeのポップアップ画面を表示します。
Stripeのポップアップ画面にクレジットカード情報を入力して支払いをします。

```html:order.html
<!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>
```
購入画面のページを開くと「購入する」ボタンが表示されます。
![q_3.png](https://qiita-image-store.s3.amazonaws.com/0/278715/b1d3b64b-4880-c9e1-c96c-175f235bfc45.png)

「購入する」ボタンを押すと、クレジットカード入力画面が表示されます。
![q_2.png](https://qiita-image-store.s3.amazonaws.com/0/278715/dd7b2d5d-1fd5-d324-021d-e7682179e94d.png)

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:charge.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のダッシュボードから売上を確定するなどします。

# 購入完了画面サンプル
```html:complete.html
<!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