9
13

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 5 years have passed since last update.

PHP(WordPress)でStripeを使ってみたのでまとめてみました。

Last updated at Posted at 2017-12-14

背景

とある業務にて、WordPressのプラグイン上にStripeの決済を実装することになったので、その時のメモを共有しておきます。
なおこの記事は、Stripe Advent Calendar 2017 の12月14日としても投稿しています。

テスト環境

Stripeのダッシュボードにログインすると、テストデータと本番データをいい感じで切り替えるボタンが出てきます。
image.png

APIの公開キーと、シークレットキーもこのダッシュボードから取得可能です。

準備

PHPもしっかりとSDKが用意されているため、まずはそれをダウンロードします。

今回Wordpressのプラグインに組み込むので、wp-content/plugins/myPlugin/vendor/stripe-php として配置してみました。

呼び出し

SDKのrequireは非常に簡単です。

myPlugin.php
        require_once(dirname(__FILE__) . '/'. 'vendor/stripe-php/init.php');
        \Stripe\Stripe::setApiKey(get_option('stripe_api_key'));

Stripeのキー情報は、WordPressの設定として保存しておきます。こうすることで、APIキーを切り替えるだけで運用環境とテスト環境を切り替えることができます。get_optionの使い方は、WordPressのドキュメントをご参照ください。

カード登録

カスタマーカードの登録も、超簡単です。基本的には、公式のドキュメントにあるソースをコピペするだけでOKです。

ですが、ここでもAPI公開キーをテスト用と本番用で切り分ける必要があるため少しだけ修正を加えてます。
PHP側でWordPressの設定値として保存した公開キーを取得して、inputタグのattributeとして設定しておきます。

create_card.php
<script src="https://js.stripe.com/v3/"></script>
<div class="form-row">
    <div id="card-element"></div>
    <div id="card-errors" role="alert"></div>
</div>
<input type="submit" name="update" id="stripe_payment_button" data-stripe-public-key="<?= get_option('stripe_api_public') ?>" value="作成">

設定しておいたattributeからキーを取得する動作にしています。その他はサンプルコードのままで動きます。

create_card.js
// Create a Stripe client
const b = document.getElementById('stripe_payment_button'); 
const pk = b.getAttribute('data-stripe-public-key');
const stripe = Stripe(pk);

POSTで受け取ったカードを使って更新

さて、ここからが少しサンプルと違うところです。StripeのSDKはカードエラーを例外として投げてきます。なので、サンプルコードをそのまま使った場合、不正なカードが来た時に500エラーになります。カードの作成、サブスクリプション、決済、などいくつか必要な処理があるので、実際には、エラーをハンドリングするクラスを作ってラップするのが良いと思います。

※ ちなみに不正なカードのテストデータはこちら。
https://stripe.com/docs/testing

create_card.php
        $response = array(
            'body' => null,
            'message' => ''
        );
        try {
            $token = $_POST['stripeToken'];
            $body = array('source' => $token);
            if (isset($email)) {
                $body['email'] = $email;
            }
            $response['body'] = \Stripe\Customer::create($body);
            $response['message'] = 'カード処理に成功しました。';
        } catch(\Stripe\Error\Card $e) {
            $body = $e->getJsonBody();
            $err  = $body['error'];
            switch ($err['code']) {
                case 'invalid_number':
                    // エラーごとの処理
                    break;
                case 'incorrect_number':
                    // エラーごとの処理
                    break;
                case 'invalid_expiry_month':
                    // エラーごとの処理
                    break;
                case 'invalid_expiry_year':
                    // エラーごとの処理
                    break;
                case 'expired_card':
                    // エラーごとの処理
                    break;
                case 'invalid_cvc':
                    // エラーごとの処理
                    break;
                case 'incorrect_cvc':
                    // エラーごとの処理
                    break;
                case 'invalid_swipe_data':
                    // エラーごとの処理
                    break;
                case 'incorrect_zip':
                    // エラーごとの処理
                    break;
                case 'card_declined':
                    // エラーごとの処理
                    break;
                default:
                    break;
            }
        } catch(Exception $e) {
            $response['message'] = 'カード処理の実行中にプログラムエラーが発生しました。';
        }
        return $response;

エラーの内容は、ドキュメントを参照してください。
https://stripe.com/docs/api#errors

まとめ

すごく簡単に実装できます。
実際のカードに関するところは、たったこれだけですからね!

cool.php
\Stripe\Customer::create($body)
9
13
0

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
9
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?