StripeでのSubscriptionをPHPで実装してみた

どうもふうやです!

最近は案件を処理するのがとても楽しいです。

案件の中でも自分が成長できる部分はあるのだなと学ぶことが出来ているからです。

そしてあと一ヶ月で20歳になるので、「後悔の無い10代だった」と言えるよう日々限界突破して自身の技術を向上させていきます。

今回StripeでSubscriptionをPHPで実装するにあたって参考にした記事はこちらになります。

参考 Stripe Subscription (定期支払い)101 - Part 1Qiita

こちらの記事はRuby製になりますが、手順は詳しく書かれています。

PHPでStripeのSubscriptionを実装する

Stripeライブラリのダウンロードをする

Terminal
composer require stripe/stripe-php

ターミナルを開き、cdコマンドでカレントディレクトリを実装するフォルダにして、上記コードを実行します。

または、直接ソースコードをダウンロードできるページもあるのでターミナルが苦手な方はこちらを利用するといいかもです。

参考 StripeライブラリのダウンロードGithub

APIキーをメモする

Stripeにログインして、左メニューの「開発者→APIキー」ページに移動します。

Stripe APIキー

そこで、公開可能キーとシークレットキーをメモしておきます。

フロント側での処理

フロント面ではformタグの中にscriptタグを埋め込んだソースコードでボタンとモーダルウインドウの実装が可能です。

HTML

<form action="POST先のphpファイル" method="POST">
<script 
src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="公開可能APIキーを挿入" 
data-amount="料金を挿入" 
data-name="何について支払うのかを書く" 
data-description="その説明を書く" 
data-image="https://stripe.com/img/documentation/checkout/marketplace.png" 
data-locale="auto" 
data-currency="jpy" 
data-label="ボタンのラベル">
</script>
</form>

上記コードに必要事項を入力の上フロントに貼り付けます。

バックエンド側での処理

プランを作成する

まずはSubscriptionのプランを作成します。

PHP

<?php 
//composerでライブラリをダウンロードした場合 
require_once('vendor/autoload.php'); 
//直接ライブラリをダウンロードした場合 
require_once('stripe-php-6.7.4/init.php'); 

\Stripe\Stripe::setApiKey("シークレットキーを挿入");

$product = \Stripe\Product::create([
   	'name' => 'プロダクトの名称',//日本語可
   	'type' => 'service',
]);

$customer = \Stripe\Plan::create(array(
   	'product' => $product->id,
	'id' => "sample-monthly",
	'interval' => "month",
	'currency' => "jpy",
	'amount' => 980,//料金
));

?>

こちらのコードを記述したphpファイルを作成し、アクセスします。

これでプランの作成が完了です。

決済側の処理

PHP

<?php 
//composerでライブラリをダウンロードした場合 
require_once('vendor/autoload.php'); 
//直接ライブラリをダウンロードした場合 
require_once('stripe-php-6.7.4/init.php');

\Stripe\Stripe::setApiKey("シークレットキーを挿入");

$customer = \Stripe\Customer::create(array(
	'email' => $_POST['stripeEmail'],
	'source'  => $_POST['stripeToken'],
));

$subscription = \Stripe\Subscription::create(array(
	'customer' => $customer->id,
	'items' => array(array('plan' => 'sumple-monthly')),//\Stripe\Plan::createのidと同じにして紐付ける
));

?>

$subscriptionのitemsのplanにはコメントにも記述しているようにプランを作成した際のid(ここではsample-monthly)と同じにして、紐づけを行います。

またsubscriptionのキャンセルを行えるように、顧客情報である”$subscription -> id”(sub_乱数)をデータベースに保存しておく必要があります。

このファイルをフロント側のPOST先にしましょう。

Subscriptionのキャンセル処理

Subscriptionのキャンセル処理は至って簡単です。

PHP

<?php 
//composerでライブラリをダウンロードした場合 
require_once('vendor/autoload.php'); 
//直接ライブラリをダウンロードした場合 
require_once('stripe-php-6.7.4/init.php');

\Stripe\Stripe::setApiKey("シークレットキーを挿入");

$subscription = \Stripe\Subscription::retrieve("ここにDBに保存した顧客情報のsub_乱数を挿入する");
$subscription->cancel();

?>

決済時にデータベースに保存した顧客情報(sub_乱数であるもの)を括弧内に挿入しcancelさせるだけです。

メモ

自分は決済が完了したら、データーベース側で”paid”(支払いを行ったか)列でyesにし、

ページロード時に”paid”がyesであればキャンセル処理ボタンを表示させます。

もちろんキャンセル処理が完了すれば、”paid”をnoにして顧客情報(sub_乱数)の列を空にします。

それで簡易決済はなんとかできるはずです!

またプラン作成と決済処理を同じPHPで行わないのは、同じプランを二度作成すると”すでにこのプランは存在しています”とエラーを吐くからです。

まとめ

ググってみれば決済処理(stripeの場合ですが笑)は意外と簡単に出来るものなんだなと感じました。

今の御時世書籍なんて買わなくてもニッチな情報であっても公式のリファレンスを読んだり、有志の方が書いた記事(言語が違えども)を読めばなんとかなります。

今回の技術向上によってまた新たにググる力が向上したと感じました。

ありがとうございました\(^o^)/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です