PAY.JPのサブスク決済をphpでやる

PAY.jpのサブスク決済です


<!--pay2.php-->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>定期課金フォーム</title>
    <script src="https://js.pay.jp/v2/pay.js"></script>
</head>
<body>
    <h1>クレジットカード定期課金フォーム</h1>
    <form id="checkout-form" method="post" action="process_subscription.php">
        <input type="text" name="name" placeholder="名前" required><br>
        <select class="custom-select" name="plan_id" id="urlProtocol">
            <option value="pln_1be7ecb688ab9a47d66d154de911">A</option>
            <option value="pln_3e7c804038bde13e3da6eb32ecd2">B</option>
            <option value="pln_e62711b1532b1e4b2d800b7c1d6f">C</option>
        </select><br>
        <input type="text" name="email" placeholder="メール" required><br>
        <div id="card-element">
            <!-- PAY.JPのカード要素 -->
        </div><br>
        <button id="card-button">定期課金を開始する</button>
    </form>

    <script>
        const payjp = Payjp('pk_test_bedfe1946d02f78123d5f427'); 
        const elements = payjp.elements();
        const card = elements.create('card');
        card.mount('#card-element');

        const form = document.getElementById('checkout-form');
        const cardButton = document.getElementById('card-button');

        form.addEventListener('submit', async (event) => {
            event.preventDefault();
            cardButton.disabled = true;

            // トークン生成を試行
            console.log("Starting token creation...");

            const result = await payjp.createToken(card, {
                three_d_secure: true // 3Dセキュアを有効化
            });

            // エラー発生時
            if (result.error) {
                console.error("Error creating token: ", result.error.message);
                alert("エラーが発生しました: " + result.error.message);
                cardButton.disabled = false; // ボタンを再度有効化
            } else {
                console.log("Token created successfully: ", result);
                const token = result.id;
                const hiddenInput = document.createElement('input');
                hiddenInput.setAttribute('type', 'hidden');
                hiddenInput.setAttribute('name', 'payjp-token');
                hiddenInput.setAttribute('value', token);
                form.appendChild(hiddenInput);

                // トークン作成に成功したらフォーム送信
                form.submit();
            }
        });
    </script>
</body>
</html>

でprocess_subscription.php

<?php
require 'vendor/autoload.php';

\Payjp\Payjp::setApiKey(':::::::::::::::::::::::::::::'); // PAY.JPの秘密鍵を設定

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $token = $_POST['payjp-token'];
    $email = $_POST['email'];
    $plan_id= $_POST['plan_id'];

    try {
        // 1. 顧客を作成
        $customer = \Payjp\Customer::create([
            'card' => $token, // ユーザーのカードトークン
            'email' => $email, // 顧客のメールアドレス(任意)
        ]);

        // 2. 定期課金のサブスクリプションを作成
        $subscription = \Payjp\Subscription::create([
            'customer' => $customer->id,
            'plan' => $plan_id,//'plan' => 'plan_id', // PAY.JP管理画面で作成したプランIDをここに入れる
        ]);

        echo "定期課金が開始されました!";
    } catch (\Payjp\Error\Card $e) {
        // カードエラーが発生した場合の処理
        echo "定期課金に失敗しました: " . $e->getMessage();
    } catch (Exception $e) {
        echo "エラーが発生しました: " . $e->getMessage();
    }
}
?>

サンプルはhttps://gori-gori.net/contact/pay2.phpです

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です