[Stripe] PHP APIの定額課金の書き方

stripのdashboardで商品を追加して、api idをメモします。

続いて、登録画面
-> これは普通の購入画面とほぼ一緒の書き方。
-> emailをpostする

<body>
	<img src="img/boat.jpg" width="300px" height="200px"><br>
	<p>サロン会員: ¥<?php echo $price; ?>(月額課金)</p>
	<form action="/subscription.php" method="post">
		<input hidden name="name" value="<?php echo $name; ?>">
		<input hidden name="email" value="<?php echo $email; ?>">
		<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
			data-key="pk_test_*"
			data-image=""
			data-amount="<?php echo $price; ?>"
			data-name="<?php echo $name; ?>"
			data-description=""
			data-email="<?php echo $email; ?>"
			data-locale="auto"
			data-allow-remember-me="false"
			data-label="クレジットカードで登録する"
			data-currency="jpy"
			>
		</script>
	</form><br>
<!-- 	<form action="/banck.php" method="post">
		<button class="bank-btn">銀行振込で支払う</button>
	</form> -->
</body>

### サーバーサイド側
-customerを作るときは、emailとsourceのみ。payment_methodを設定するとエラーになる。
-echo $e;でエラー内容を表示しながら作業する
-\Stripe\Subscription::createのpriceのところで、先ほど取得したAPI IDを設定する

require_once('vendor/autoload.php');

\Stripe\Stripe::setApiKey('sk_*');

$sub_id = null;

try {
	$token = $_POST['stripeToken'];
	$name = $_POST['name'];
	$email = $_POST['email'];

	$customer = \Stripe\Customer::create([
	  'email' => $email,
      'source'  => $token,
	]);
	
	$subscription = \Stripe\Subscription::create([
        'customer' => $customer->id,
        'items' => [
            [
              'price' => 'price_*',
            ],
        ]
    ]);
	var_dump($subscription);

	$sub_id = $subscription->id;

	// // アプリケーション側のDB更新


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

	// header("Location: /error.html");
	// exit;
}

これでOK。
定額もショッピングも両方いけます。
続いて、定額の解約を実装したい。

[Stripe] 変数を使ってクレジットカード処理のフォームを書く

商品名、商品詳細、商品価格、購入者のemailアドレスを変数と持ちます。

フォーム画面

$name = "チョコレートset";
$description = "甘さが絶妙なカカオチョコレートセット";
$price = "100";
$email = "test@gmail.com";
?>

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		.stripe-button-el {
			width: 350px;
			max-width: 100%;
		}
		.stripe-button-el span {
			font-size: 18px;
			padding: 15px;
		}
		.bank-btn {
			    padding: 0 12px;
			    height: 30px;
			    line-height: 30px;
			    background: #1275ff;
			    background-image: linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
			    font-size: 14px;
			    color: #fff;
			    font-weight: bold;
			    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
			    text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
			    box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
			    border-radius: 4px;
			    width: 350px;
				max-width: 100%;
				padding-bottom:20px;
		}

	</style>
</head>
<body>
	<img src="img/choco.jpg" width="300px" height="200px"><br>
	<p>商品: ¥<?php echo $price; ?></p>
	<form action="/charged.php" method="post">
		<input hidden name="name" value="<?php echo $name; ?>">
		<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
			data-key="pk_test_*"
			data-image=""
			data-amount="<?php echo $price; ?>"
			data-name="<?php echo $name; ?>"
			data-description="<?php echo $description; ?>"
			data-email="<?php echo $email; ?>"
			data-locale="auto"
			data-allow-remember-me="false"
			data-label="クレジットカードで購入する"
			data-currency="jpy"
			>
		</script>
	</form><br>
	<form action="/banck.php" method="post">
		<button class="bank-btn">銀行振込で支払う</button>
	</form>
</body>

商品画面

クレジット入力画面

入金管理画面

何やこれ、完全に行けるやんけ。
ヨシっ、資料作ろうwww

[Stripe] クレジットカード決済処理

### フォーム画面
index.php

	<form action="/charge.php" method="post">
		<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
			data-key="pk_test_*"
			data-amount="100"
			data-name="この商品の料金は100円です"
			data-locale="auto"
			data-allow-remember-me="false"
			data-label="購入する"
			data-currency="jpy"
			>
		</script>
	</form>

購入ボタン押下

stripeクレジットカードのテスト情報
https://stripe.com/docs/testing

stripeタグ属性
https://stripe.com/docs/legacy-checkout#integration-simple-options

### stripe-php
Github: stripe-php

$ composer require stripe/stripe-php
$ ls
composer.json composer.lock index.php vendor

### charged.php

require_once('vendor/autoload.php');

// シークレットキー
\Stripe\Stripe::setApiKey('pk_test_*');

$chargeId = null;

try {
	$token = $_POST['stripeToken'];
	$charge = \Stripe\Charge::create(array(
		'amount' => 100,
		'currency' => 'jpy',
		'description' => 'test',
		'source' => $token,
		'capture' => false,
	));
	$chargeId = $charge['id'];

	// アプリケーション側のDB更新

	// 売上確定
	$charge->capture();

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

	header("Location: /error.html");
	exit;
}

complete.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Complete</title>
</head>
<body>
	
</body>
</html>

あーこれ、上手くいきそうやな。
ちょっと実運用に近いフォームにカスタマイズしたい。