stripe決裁機能の実装

stripeの決済機能(checkout)を実装したやり方を紹介します。
調べた結果のメモです。

ファイル構成
- index.php
- charge.php
- composer.json
- composer.lock
- .env

composer.jsonとcomposer.lockはライブラリをインストールすると自動で作成されます。

```index.php

 require '../../vendor/autoload.php';  //サーバー用
// require_once 'vendor/autoload.php';     //ローカル用            

    $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
    $dotenv->load();
    $data_key = getenv('data_key');
    
?>

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>PHP Stripe Sample</title>
<body>
    <form action="./charge.php" method="post">
        <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
            data-key="<?php echo $_ENV['data_key'] ?>"
            data-amount="100"
            data-locale="ja"
            data-currency="jpy"
        >
        </script>
    </form>
</body>
</html>
```



```charge.php
require '../../vendor/autoload.php';     //サーバー動作用
//require 'vendor/autoload.php';              //ローカル動作用

  //API keyの読み込み
    $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
    $dotenv->load();
    $API_KEY = getenv('API_KEY');
    

\Stripe\Stripe::setApiKey($_ENV['API_KEY'] );     

    $token = filter_input(INPUT_POST, 'stripeToken');
    $email = $_POST['stripeEmail'];


try {
    if(!is_string($token)){
        throw new Exception('文字列以外のトークンが指定されました');
    }
    
    // 顧客情報をstripeダッシュボードへ保存
        $customer = \Stripe\Customer::create(array(
        'email' => $email,
        'description' => "サンプルの課金処理"
        ));

    $charge = \Stripe\Charge::create(array(
        "amount" => 100,
        "currency" => "jpy",
        "source" => $token,
        "description" => "サンプルの課金処理"
    ));

} catch(\Stripe\Error\Card $e) {
    echo "ERORR:" . $e->getMessage();
    exit;
}

header("Content-type: text/html; charset=utf-8");
echo "決済が完了しました<br>";
echo "ID:" . $charge->id . "<br>";
```

<br>


.envファイル

```
#index.phpで使用
    data_key = "pk_xxxxxxxxxxxxxxxxxxxxxx"  //stripeのアカウントで取得して下さい

    #charge.phpで使用
    API_KEY = "sk_xxxxxxxxxxxxxxx"  //stripeのアカウントで取得して下さい
```


1.サーバー環境でのcomposerのインストール
ターミナル（コマンドプロンプト）を起動してssh接続でサーバーにします。
※私はさくらレンタルサーバーを使用していました	

```
ssh  アカウント名＠ドメイン名　
```
を入力してログインします。
2.composerをインストール

```	
curl -sS https://getcomposer.org/installer | php
```
stripeをサーバー上でインストールします。いろいろ試しましたが、下記が正解でした。

```
php composer.phar require stripe/stripe-php
```
つづいて.envファイルを読み込むためのライブラリを追加します。

```
php composer.phar require vlucas/phpdotenv
```

これで準備は完了です。
ここから解説します。

charge.phpのファイルの以下の部分でstripeライブラリを読み出します。	
require '../../vendor/autoload.php';
ローカル環境と違って、サーバー上ではcomposerがインストールされた階層が分かりにくいのでいろいろ試した結果、このようになりました。
<br>
.envファイルはAPI keyを保護するためのファイルです。API keyを直接コードに記載するのではなく、外部ファイルに保存して読み込むというやり方を利用します。以下の部分が.envファイルの読み込み動作です。

```
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
    $dotenv->load();
    $API_KEY = getenv('API_KEY');
```
<br>ところが、最初はうまく.envファイルのkeyが読み込めませんでした。$_ENV[ ]を利用すれば、読めるようになって次のように記載しています。

```
\Stripe\Stripe::setApiKey($_ENV['API_KEY'] );
```

<br>
最初に作ったコードで決裁自体は可能でしたが、誰が決済したのかわからないという問題があったので、コードを少し見直しました。それが以下の部分です。

```
  $email = $_POST['stripeEmail'];	
	 $customer = \Stripe\Customer::create(array(
	        'email' => $email,
	        'description' => "サンプルの課金処理"
	        ));
```	
これでstripeダッシュボードに決裁者のメールアドレスと購入商品が記載されます。



ちなみに実装したページはコチラです。
https://estacionsuzuki.com/code/code.php