WebPayアドベントカレンダー初登場のsowawaです。はじめまして〜♪
たぶんアドベントカレンダー界でも初登場だと思います。よろしくね!
更新のおしらせ
本記事はPHP向けWebPayライブラリのバージョン1系に即して記述しています。
その後、メジャーバージョンアップを行いました。
基本的な仕組みは同等ですが、メソッド名やエラー名などが変更されました。
最新の情報はWebPay公式サイトのPHP APIドキュメントを参照してください。
あたらしいライブラリはライブラリドキュメントで公開しています。
またwebpay/single_page_phpでこの記事に対応する内容の2系に準拠したソースコードも見られます。
まずはじめに。
昨日の@hmskの記事はどうでしたか?WebPayの導入がこんなに簡単なのかと思われた方も多かったのではないでしょうか?今日は『さらに簡単になる記事を!』ということで私@sowawaが担当させていただきます。
昨日はRubyを使った導入例でしたが、本日はさらにたくさんの方に使われているPHPを使ったお話をしたいと思います。しかも、WebPayのドキュメントで前提となっているComposerも不要な導入例を書いていこうと思います。ということで『さらに簡単』というのは、より手軽で身近なPHPが動くレンタルサーバを前提にしたという意味です。Herokuが多くのプログラミング言語をサポートしていてDeveloperの楽園であることは言わずもがなですが、ComposerがPHPの世界の福音であるとしても、今日はHerokuでもComposerでもない話をしたいと思います。
レンタルサーバを選ぶ
最近ではどこのレンタルサーバでもPHP使うことができるので、PHP対応のレンタルサーバをわざわざ探すことも少ないと思います。今回は、みんなが大好きなさくらインターネットのレンタルサーバを使うことにします。
PHPが使えるかどうかに気が取られててSSLのことを忘れているのではないでしょうか?さくらインターネットなら共用SSLに対応しているプランを選びましょう。(テストでしか使わない人はHTTPでもいいけど、決して本番環境では使わないでね。その時はもちろんテスト用のカード番号を使うのを忘れないでね。良い子のお約束ですよ。)
私が選んだのは月額500円のスタンダードプラン!キリッ
共用SSLを使うにはスタンダードプラン以上でないとダメなので注意してくださいね。レンタルサーバが用意出来てない人は爆速で申し込んでね。
レンタルサーバでWebPayを使おう
さくらインターネットのレンタルサーバを借りると初期ディレクトリの構成は、
├── MailBox
├── db
├── sblo_files
└── www
みたいになっていると思います。(使っているFTPクライアントによっては.
で始まる隠しファイルとかが見えていることもあります)
知っている人も多いと思いますが、レンタルサーバではメールボックスであったりデータベースであったりとたくさんの機能が提供されています。これらの機能のために必要なディレクトリが存在しています。今回は、www
というディレクトリを使います。
以下のリンクからWebPayのPHP用のライブラリをダウンロードしましょう。
webpay-php-1.1.2-full.zip
ダウンロードが完了したらunzipしてwww
のフォルダにアップロードしましょう。
アップロードが完了すると以下の様なディレクトリの構成になっていると思います。
├── MailBox
├── db
├── sblo_files
└── www
└── webpay-php-1.1.2-full
いよいよプログラミングを始めましょう!
設定ファイルを作ります
<?php
// WebPayには公開して使う鍵とサーバ側に保存して外部漏らさないように秘密にする2つの鍵があります
// 公開して使う方の鍵をJavaScriptで使うことでクレジットカードをレンタルサーバに送ることなく決済ができるようになります
const PUBLIC_KEY = "test_public_19DdUs78k2lV8PO8ZCaYX3JT";
const SECRET_KEY = "test_secret_eHn4TTgsGguBcW764a2KA8Yd";
定数としてPUBLIC_KEY
とSECRET_KEY
を定義します。
index.php
を作る。
次はいよいよindex.php
です。アクセスしてきたユーザが最初に見えるページです。
<?php
require 'config.php';
?>
<html>
<head>
<meta charset="utf-8">
<title>WebPay PHP sample</title>
</head>
<body>
<h1>WebPay PHP sample</h1>
<form action="/charge.php" method="post">
<input type="number" name="amount" value="300" /> 円を支払います。<br />
<!-- 御自身のサーバにクレジットカード情報を送信すると、クレジットカード情報を適切に扱う義務が生じます。
JavaScript を利用して webpay token を生成することで、クレジットカード情報を直接あつかわずに済みます。
webpay-token という name を持つ input が自動的に追加されます。 -->
<script src="https://checkout.webpay.jp/v1/" class="webpay-button"
data-text="カード情報を入力して支払う"
data-key="<?php print(PUBLIC_KEY); ?>"></script>
</form>
</body>
</html>
index.php
は、ほとんどHTMLみたいなものですが、ポイントはCheckoutHelperを使っているところです。CheckoutHelperは、『クレジットカードの番号をレンタルサーバを介さずに直接WebPayにおくる機能』と『ちょっとかっこいいクレジットカードの番号の入力画面』を提供するJavaScriptです。
charge.php
を作る
次はcharge.phpを作りましょう。最初にrequire 'webpay-php-1.1.2-full/autoload.php';
でパッケージをロードしておきます。これでWebPayを使うために必要なライブラリは全部読み込まれます。use WebPay\WebPay;
で名前空間を宣言して、index.php
と同様にrequire 'config.php';
でPUBLIC_KEY
とSECRET_KEY
を読み込みます。続きは、コード中にコメントで解説しています。
<?php
require 'webpay-php-1.1.2-full/autoload.php';
use WebPay\WebPay;
require 'config.php';
// 支払金額。実際には商品番号などを送信し、それに対応する金額をデータベースから引きます
$amount = $_POST['amount'];
// トークン
$token = $_POST['webpay-token'];
// WebPayインスタンスを非公開
$webpay = new WebPay(SECRET_KEY);
try {
// 決済を実行
$result = $webpay->charges->create(array(
"amount" => intval($amount, 10),
"currency" => "jpy",
"card" => $token,
"description" => "PHP からのアイテムの購入"
));
// 以下エラーハンドリング
} catch (\WebPay\Exception\CardException $e) {
// カードが拒否された場合
print("CardException\n");
print('Status is:' . $e->getStatus() . "\n");
print('Type is:' . $e->getType() . "\n");
print('Code is:' . $e->getCardErrorCode() . "\n");
print('Param is:' . $e->getParam() . "\n");
print('Message is:' . $e->getMessage() . "\n");
exit('Error');
} catch (\WebPay\Exception\InvalidRequestException $e) {
// リクエストで指定したパラメータが不正な場合
print("InvalidRequestException\n");
print('Param is:' . $e->getParam() . "\n");
print('Message is:' . $e->getMessage() . "\n");
exit('Error');
} catch (\WebPay\Exception\AuthenticationException $e) {
// 認証に失敗した場合
print("AuthenticationException\n");
print('Param is:' . $e->getParam() . "\n");
print('Message is:' . $e->getMessage() . "\n");
exit('Error');
} catch (\WebPay\Exception\APIConnectionException $e) {
// APIへの接続エラーが起きた場合
print("APIConnectionException\n");
print('Param is:' . $e->getParam() . "\n");
print('Message is:' . $e->getMessage() . "\n");
exit('Error');
} catch (\WebPay\Exception\APIException $e) {
// WebPayのサーバでエラーが起きた場合
print("APIException\n");
print('Message is:' . $e->getMessage() . "\n");
exit('Error');
} catch (Exception $e) {
// WebPayとは関係ない例外の場合
print("Unexpected exception\n");
print('Message is:' . $e->getMessage() . "\n");
exit('Error');
}
// 処理終了後、 https://webpay.jp/test/charges で課金が発生したことが分かります。
?>
<html>
<head>
<meta charset="utf-8">
<title>WebPay PHP sample</title>
</head>
<body>
<h1>お支払いありがとうございました</h1>
<ul>
<li>お支払い金額: <?php print($result->amount); ?></li>
<li>カード名義: <?php print($result->card->name); ?></li>
<li>カード番号: ****-****-****-<?php print($result->card->last4); ?></li>
</ul>
</body>
</html>
charge.php
の最後は、実行結果を表示するためのHTMLです。
ここまでで決済に関係するプログラミングは完了ですが、セキュリティのための one more thing があります。
Apache(httpd)の.htaccess
を作っておきましょう
クレジットカードを扱うときはセキュリティに気をつけないといけません。apacheを通してアクセスする必要のないファイルは読み込めないようにしておきましょう。具体的にはconfig.php
やwebpay-php-1.1.2-full
などは、httpで取得できる必要はないので次のような.htaccess
ファイルを設置しましょう。
(通常であれば、phpファイルなどがWebブラウザにそのまま表示されることはありません。config.inc
などのような拡張子を使っている場合は注意が必要です。)
<Files ~ "^(\.htaccess|config\.php)$">
deny from all
</Files>
deny from all
レンタルサーバの最終的なフォルダ構成は以下の様になっているはずです。
├── MailBox
├── db
├── sblo_files
└── www
├── .htaccess
├── config.php
├── charge.php
├── index.php
└── webpay-php-1.1.2-full
├── .htaccess
├── ...
...
みなさんいかがでしたか?最後まで辿りつけたでしょうか?
完成すると
https://sowawa.sakura.ne.jp/
のようなサイトが見えるようになります。
2014/01/17 追記
WebPayの公式ページでパッケージ化されたPHPに関する記述が追加されました
WebPay PHP