69
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-08-07

はじめに

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

Stripe
https://stripe.com/jp

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

購入画面サンプル

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

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

「購入する」ボタンを押すと、クレジットカード入力画面が表示されます。
q_2.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

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

購入完了画面サンプル

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

69
77
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?