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

WebPayアドベントカレンダー初登場のsowawaです。はじめまして〜♪
たぶんアドベントカレンダー界でも初登場だと思います。よろしくね！

# 更新のおしらせ

本記事はPHP向けWebPayライブラリのバージョン1系に即して記述しています。
その後、メジャーバージョンアップを行いました。

基本的な仕組みは同等ですが、メソッド名やエラー名などが変更されました。
最新の情報は[WebPay公式サイトのPHP APIドキュメント](https://webpay.jp/docs/api/php)を参照してください。

あたらしいライブラリは[ライブラリドキュメント](https://webpay.jp/docs/libraries#php)で公開しています。
また[webpay/single_page_php](https://github.com/webpay/single_page_php)でこの記事に対応する内容の2系に準拠したソースコードも見られます。

## まずはじめに。

昨日の@hmskの記事はどうでしたか？WebPayの導入がこんなに簡単なのかと思われた方も多かったのではないでしょうか？今日は『さらに簡単になる記事を！』ということで私@sowawaが担当させていただきます。

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

# レンタルサーバを選ぶ

最近ではどこのレンタルサーバでもPHP使うことができるので、PHP対応のレンタルサーバをわざわざ探すことも少ないと思います。今回は、みんなが大好きな[さくらインターネット](http://www.sakura.ne.jp/)のレンタルサーバを使うことにします。

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

私が選んだのは月額500円のスタンダードプラン！ｷﾘｯ

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

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

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

```ファイルの構成
 ├── MailBox
 ├── db
 ├── sblo_files
 └── www
```

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

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

以下のリンクからWebPayのPHP用のライブラリをダウンロードしましょう。
[webpay-php-1.1.2-full.zip](http://downloads.webpay.io/php/webpay-php-1.1.2-full.zip)
ダウンロードが完了したらunzipして`www`のフォルダにアップロードしましょう。

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

```ファイルの構成
 ├── MailBox
 ├── db
 ├── sblo_files
 └── www
      └── webpay-php-1.1.2-full
```

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

## 設定ファイルを作ります

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

定数として`PUBLIC_KEY `と`SECRET_KEY `を定義します。

## `index.php`を作る。

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

``` www/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](https://webpay.jp/docs/checkout)を使っているところです。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 `を読み込みます。続きは、コード中にコメントで解説しています。

```www/charge.php
<?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`などのような拡張子を使っている場合は注意が必要です。）

```www/.htaccess
<Files ~ "^(\.htaccess|config\.php)$">
deny from all
</Files>
```

```www/webpay-php-1.1.2-full/.htaccess
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](https://webpay.jp/docs/api/php#authentication)