少しのPHPのコードでWebPayを導入する

本記事は少しのコードでWebPayを導入する PHP Ver. - Qiitaの再録です。 Qiitaの方はWebPay Advent Calendar 2013のものであるため当時の状態を維持し こちらの記事では最新の情報に合わせて加筆、編集を加えております。

まずはじめに。

少しのRubyのコードでWebPayを導入するはどうでしたか?WebPayの導入がこんなに簡単なのかと思われた方も多かったのではないでしょうか?

昨日はRubyを使った導入例でしたが、本日はさらにたくさんの方に使われているPHPを使ったお話をしたいと思います。しかも、WebPayのドキュメントで前提となっているComposerも不要な導入例を書いていこうと思います。ということで『さらに簡単』を目指し、より手軽で身近なPHPが動くレンタルサーバを対象としています。Herokuが多くのプログラミング言語をサポートしていてDeveloperの楽園であることは言わずもがなですが、ComposerがPHPの世界の福音であるとしても、今日はHerokuでもComposerでもない話をしたいと思います。

レンタルサーバを選ぶ

最近ではどこのレンタルサーバでもPHP使うことができるので、PHP対応のレンタルサーバをわざわざ探すことも少ないと思います。今回は、みんなが大好きなさくらインターネットのレンタルサーバを使うことにします。 ただし、WebPayのPHPライブラリはPHP5.3以降でしか動かないので注意してください。

PHPが使えるかどうかに気が取られててSSLのことを忘れているのではないでしょうか?さくらインターネットなら共用SSLに対応しているプランを選びましょう。(テストでしか使わない人はHTTPでもいいけど、決して本番環境では使わないでね。その時はもちろんテスト用のカード番号を使うのを忘れないでね。良い子のお約束ですよ。)

私が選んだのは月額500円のスタンダードプラン!キリッ

共用SSLを使うにはスタンダードプラン以上でないとダメなので注意してくださいね。レンタルサーバが用意出来てない人は爆速で申し込んでね。

レンタルサーバでWebPayを使おう

さくらインターネットのレンタルサーバを借りると初期ディレクトリの構成は、

1
2
3
4
 ├── MailBox
 ├── db
 ├── sblo_files
 └── www

みたいになっていると思います。(使っているFTPクライアントによっては.で始まる隠しファイルとかが見えていることもあります)

知っている人も多いと思いますが、レンタルサーバではメールボックスであったりデータベースであったりとたくさんの機能が提供されています。これらの機能のために必要なディレクトリが存在しています。今回は、wwwというディレクトリを使います。

以下のリンクからWebPayのPHP用のライブラリをダウンロードしましょう。 最新版はライブラリページのPHPセクションで見付けられます。試す時は最新版を使ってください。 webpay-php-full-2.1.1.zipが現時点での最新版です。 ダウンロードが完了したら解凍してwwwのフォルダにアップロードしましょう。

アップロードが完了すると以下の様なディレクトリの構成になっていると思います。

1
2
3
4
5
 ├── MailBox
 ├── db
 ├── sblo_files
 └── www
      └── webpay-php-full-2.1.1

いよいよプログラミングを始めましょう!

設定ファイルを作ります

1
2
3
4
5
<?php
// WebPayには公開して使う鍵とサーバ側に保存して外部漏らさないように秘密にする2つの鍵があります
// 公開して使う方の鍵をJavaScriptで使うことでクレジットカードをレンタルサーバに送ることなく決済ができるようになります
const PUBLIC_KEY = "test_public_19DdUs78k2lV8PO8ZCaYX3JT";
const SECRET_KEY = "test_secret_eHn4TTgsGguBcW764a2KA8Yd";

定数としてPUBLIC_KEYSECRET_KEYを定義します。

index.phpを作る。

次はいよいよindex.phpです。アクセスしてきたユーザが最初に見えるページです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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/v2/" class="webpay-button"
              data-lang="ja"
              data-key="<?php print(PUBLIC_KEY); ?>"></script>
    </form>
  </body>
</html>

index.phpは、ほとんどHTMLみたいなものですが、ポイントはCheckoutHelperを使っているところです。CheckoutHelperは、『クレジットカードの番号をレンタルサーバを介さずに直接WebPayにおくる機能』と『ちょっとかっこいいクレジットカードの番号の入力画面』を提供するJavaScriptです。

charge.phpを作る

次はcharge.phpを作りましょう。最初にrequire 'webpay-php-full-2.1.1/autoload.php';でパッケージをロードしておきます。これでWebPayを使うために必要なライブラリは全部読み込まれます。use WebPay\WebPay;で名前空間を宣言して、index.phpと同様にrequire 'config.php';PUBLIC_KEYSECRET_KEYを読み込みます。続きは、コード中にコメントで解説しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
require 'webpay-php-full-2.1.1/autoload.php';
use WebPay\WebPay;
require 'config.php';

// 支払金額。実際には商品番号などを送信し、それに対応する金額をデータベースから引きます
$amount = $_POST['amount'];
// トークン
$token = $_POST['webpay-token'];

// WebPayインスタンスを非公開
$webpay = new WebPay(SECRET_KEY);

try {
    // 決済を実行
    $result = $webpay->charge->create(array(
       "amount" => intval($amount, 10),
       "currency"=>"jpy",
       "card" => $token,
       "description" => "PHP からのアイテムの購入"
    ));
    // 以下エラーハンドリング
} catch (\WebPay\ErrorResponse\CardException $e) {
    $data = $e->getData()->error;
    // カードが拒否された場合
    print('Status is:' . $e->getStatus() . "\n");
    print('Type is:' . $data->type . "\n");
    print('Code is:' . $data->code . "\n");
    print('Param is:' . $data->param . "\n");
    print('Message is:' . $data->message . "\n");
    exit('Error');
} catch (\WebPay\ErrorResponse\InvalidRequestException $e) {
    // リクエストで指定したパラメータが不正な場合
    print("InvalidRequestException\n");
    print('Param is:' . $e->getParam() . "\n");
    print('Message is:' . $e->getMessage() . "\n");
    exit('Error');
} catch (\WebPay\ErrorResponse\AuthenticationException $e) {
    // 認証に失敗した場合
    print("AuthenticationException\n");
    print('Param is:' . $e->getParam() . "\n");
    print('Message is:' . $e->getMessage() . "\n");
    exit('Error');
} catch (\WebPay\ErrorResponse\ApiException $e) {
    // WebPayのサーバでエラーが起きた場合
    print("ApiException\n");
    print('Message is:' . $e->getMessage() . "\n");
    exit('Error');
} catch (\WebPay\ApiConnectionException $e) {
    // APIへの接続エラーが起きた場合
    print("ApiConnectionException\n");
    print('Message is:' . $e->getMessage() . "\n");
    exit('Error');
} catch (\WebPay\InvalidRequestException $e) {
    // リクエストで指定したパラメータが不正で、リクエストがおこなえなかった場合
    print("InvalidRequestException");
    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やライブラリファイルなどは、httpで取得できる必要はないので次のような.htaccessファイルを設置しましょう。

(通常であれば、phpファイルなどがWebブラウザにそのまま表示されることはありません。config.incなどのような拡張子を使っている場合は注意が必要です。)

www直下には次のような.htaccessファイルを設置します。

1
2
3
<Files ~ "^(\.htaccess|config\.php)$">
deny from all
</Files>

webpay-php-full-2.1.1の下には次のような.htaccessファイルを設置します。

1
deny from all

レンタルサーバの最終的なフォルダ構成は以下の様になっているはずです。

1
2
3
4
5
6
7
8
9
10
11
12
 ├── MailBox
 ├── db
 ├── sblo_files
 └── www
      ├── .htaccess
      ├── config.php
      ├── charge.php
      ├── index.php
      └── webpay-php-full-2.1.1
          ├── .htaccess
          ├── ...
          ...

みなさんいかがでしたか?最後まで辿りつけたでしょうか?

サンプルコードの一部はGitHubのリポジトリでも見ることができます。