pay.jpの決済フォームをphpでやる
php composer.phar
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Pay.jp 3Dセキュア対応決済フォーム</title>
<script src="https://js.pay.jp/v2/pay.js"></script>
</head>
<body><!--Pay.jpです -->
<h1>クレジットカード決済フォーム(3Dセキュア対応)</h1>
<form id="checkout-form" method="post" action="process_payment.php">
<input type="text" name="name" placeholder="名前" required><br>
<!-- 支払い金額の入力 -->
<input type="number" name="amount" placeholder="金額を入力" required><br>
<div id="card-element">
<!-- PAY.JPのカード要素 -->
</div><br>
<button id="card-button">支払う</button>
</form>
<script>
// PAY.JPの公開鍵をセットします。
const payjp = Payjp('pk_test_bedfe1946d02f78123d5f427');
const elements = payjp.elements();
const card = elements.create('card', {
threeDSecure: true // 3Dセキュアを有効にするオプション
});
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;
// 3Dセキュアを使用してトークンを生成
const result = await payjp.createToken(card);
if (result.error) {
console.error(result.error.message);
cardButton.disabled = false;
} else {
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>
そして
?php
require 'vendor/autoload.php';
// PAY.JPの秘密鍵を設定
\Payjp\Payjp::setApiKey('::::::::::::::::::::');//自分のね
// POSTリクエストからトークンを取得
$token = $_POST['payjp-token'];
$amount = $_POST['amount'];
try {
// 決済を作成
$charge = \Payjp\Charge::create([
'amount' => $amount,
'currency' => 'jpy',
'card' => $token,
'capture' => true, // 事前にオーソリを取るならfalse(仮決済)、そのまま請求ならtrue
'description' => '商品購入'
]);
// 決済成功
echo "決済が成功しました!";
} catch (\Payjp\Error\Card $e) {
// カードエラーが発生した場合
echo "決済に失敗しました: " . $e->getMessage();
} catch (Exception $e) {
// 汎用的なエラー
echo "エラーが発生しました: " . $e->getMessage();
}
?>