勉強したことのメモ

webプログラマが勉強したことのメモ。

PHPとStripeでクレジットカード決済処理

   

PHPとStripeの組み合わせでWebサービスにクレジットカード決済処理を導入したかった。以下に導入方法をメモ。

 

下準備

Stripeのアカウント作成

Stripe公式サイトでアカウントを作成しておく。テスト環境を用意するだけならメールアドレスのみの登録でOK。

https://stripe.com/

登録するとテスト用の「公開可能キー」「シークレットキー」が発行される。

ライブラリのインストール

サーバにSSH接続し適当なディレクトリに移動後、以下でライブラリをインストールする。

composer require stripe/stripe-php
php composer.phar require stripe/stripe-php

以下はGithubページにバージョンの説明等が掲載されている。尚、今回検証した環境はPHP5.6となる。

https://github.com/stripe/stripe-php

テスト用クレジットカード情報

以下ページでテスト用クレジットカード情報を確認できる。

https://stripe.com/docs/testing

カード番号は記載の通り、CVCは任意の3文字、カード有効期限は未来年月を入力する。

 

ソース

購入ページ(index.php)

<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
	<form action="charge.php" method="POST">
	<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
		data-key="公開可能キー"
		data-amount="10"
		data-name="サイト名"
		data-locale="auto"
		data-allow-remember-me="false"
		data-label="購入する"
		data-currency="jpy">
		/*
		data-key:公開可能キー
		data-amount:ダイアログでユーザに表示される金額(JPY)
		data-name:会社またはウェブサイト名
		data-locale:言語設定
		data-allow-remember-me:決済情報を保存するかどうか。trueだとチェックボックスが表示
		data-label:ボタンに表示されるテキスト
		data-currency:金額の通貨
		*/
	</script>
	</form>
</body>
</html>

決済処理ページ(charge.php)

<?php
require_once('./vendor/autoload.php');
\Stripe\Stripe::setApiKey('APIのシークレットキー');

$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.php");
	exit;

} catch(Exception $e) {
	if ($chargeId !== null) {
		// 例外が発生すればオーソリを取り消す
		\Stripe\Refund::create(array(
			'charge' => $chargeId,
		));
	}

	// エラー画面にリダイレクト
	header("Location: error.php");
	exit;
}
?>

決済完了ページとエラーページは適当にHTMLでメッセージを書けば良い。また購入ページに設置するJavaScriptのパラメータは以下ページで詳細を確認できる。

https://stripe.com/docs/legacy-checkout

 

その他

決済名

今回はテスト用クレカで検証した為確認のしようがないが、本番用クレカで決済した際に明細に表示される決済名がどうなるのか気になった。

調べてみるとカード会社によって異なり「オンライン決済」または「ST* 登録したサービス名」のどちらかで表示される模様。

即時決済しない場合

例えばだけど「入荷待ちの商品で購入手続き後、商品が入荷されてから発送」みたいなケースで即時に決済はしない方がいい場合は売り上げの確定はせずに、商品発送等を行ってからStripeのダッシュボードより確定処理を行う形になる。

 

所感

クレカ決済システムを導入したことがなく、実装にあたり「工数がかかりそう」「難しそう」等々の印象を持っていたがStripeだと非常に簡単に導入できた。

あとは月額(サブスクリプション)決済についても試しておきたいところ。

 

参考サイト

https://qiita.com/p_s_m_t/items/a69dfbc75804fe86ad9c

https://techracho.bpsinc.jp/baba/2018_05_28/56914

 - PHP

  関連記事

PHPで土日祝日及び営業時間を考慮した上で翌○営業日を計算する方法

PHPで翌○営業日を計算したい。例えば本日が2021/04/15で翌5営業日を計 ...

PHP5.4系でAPCが上手く動かなかったので5.5にアップデート&Zend OPcache導入

PHP5.3系から5.4系にアップデートしてから、WordPressがちょっと重 ...

phpでhtmlをpdf化。あと無理矢理画像をpdf化

画像をphpでpdf化したかった。 検索してみるもサーバー側の設定を必要とするも ...

迷惑メール対策でフォームにreCAPTCHAを導入する方法

スパムメール対策として問い合わせフォームにreCAPTCHAを導入したいという件 ...

画像をURLから取得して異なるサーバーにアップロード

■やりたかった事 ・画像があるサーバーはaaaサーバー ・アップロード先はbbb ...

PHPからredisを利用する

もうちょっと 突っ込んで触ってみる。   【接続と終了】 $redis ...

PHPを使えないサーバから使えるサーバーに値を渡す方法

PHPが使えないサーバーから使えるサーバーに値を渡したい場合があった。ajaxと ...

短縮URL(リダイレクトページ)

<? /* 管理画面とあわせて使う。 short_url直下にこのphpを ...

PHPで指定日から曜日を割り出す

曜日ってどうやって割り出すの? となったのでメモ。 ■リファレンス http:/ ...

$_SERVER['PHP_SELF']に脆弱性あり

formのaction属性とかページングのリンクとかで、 <form ac ...