ino-akiのブログ

ITエンジニアを目指して学習したことをアウトプットするブログ

サーバーサイドへのトークン送付

決済機能のクライアントサイド実装(サーバーサイドへのトークン送付)

サーバーサイドへのトークン送付
1. トークンの情報をフォームに追加する
2. クレジットカードの情報をフォームから取り除く
3. サーバーサイドにフォームの情報を送る


トークンの情報をフォームに追加
app/javascript/card.js
中略
form.addEventListener("submit", (e) => {
    payjp.createToken(numberElement).then(function (response) {
      if (response.error) {
      } else {
        const token = response.id;
        const renderDom = document.getElementById("charge-form");
        const tokenObj = `<input value=${token} name='token'>`;
        renderDom.insertAdjacentHTML("beforeend", tokenObj);
        debugger;
      }
    });
    e.preventDefault();
  });
中略
HTMLのinput要素にトークンの値を埋め込み、フォームに追加
valueは実際に送られる値、nameはその値を示すプロパティ名
insertAdjacentHTMLメソッドで、フォームの中に作成したinput要素を追加
debuggerで処理が停止するようにして、どのようにトークンの値が追加されるのか確かめる
購入ボタンを押すと、ブラウザ上にトークンの値が現れ、フォームの中に追加されていることがわかる
確認できたら、このトークンの値をブラウザ上で非表示にする
トークンの値はユーザーに見せる必要のない情報なので、type属性の値にhiddenを指定


トークンの値を非表示
app/javascript/card.js
中略
      if (response.error) {
      } else {
        const token = response.id;
        const renderDom = document.getElementById("charge-form");
        const tokenObj = `<input value=${token} name='token' type="hidden">`; #追加
        renderDom.insertAdjacentHTML("beforeend", tokenObj);
      }
中略
debugger;は削除
ブラウザをリロードし、もう一度購入ボタンを押す
ブラウザには表示されないもののフォームには追加されていることを確認


クレジットカードの情報を取り除く
クレジットカードの情報は、すでにトークン生成が完了しているため以降は不要
この段階でフォームにあるクレジットカード情報は削除
app/javascript/card.js
中略
  form.addEventListener("submit", (e) => {
    payjp.createToken(numberElement).then(function (response) {
      if (response.error) {
      } else {
        const token = response.id;
        const renderDom = document.getElementById("charge-form");
        const tokenObj = `<input value=${token} name='token' type="hidden">`;
        renderDom.insertAdjacentHTML("beforeend", tokenObj);
      }
      numberElement.clear();
      expiryElement.clear();
      cvcElement.clear();
    });
    e.preventDefault();
  });
中略


フォームの情報をサーバーサイドに送信
app/javascript/card.js
中略
  form.addEventListener("submit", (e) => {
    payjp.createToken(numberElement).then(function (response) {
      if (response.error) {
      } else {
        const token = response.id;
        const renderDom = document.getElementById("charge-form");
        const tokenObj = `<input value=${token} name='token' type="hidden">`;
        renderDom.insertAdjacentHTML("beforeend", tokenObj);
      }
      numberElement.clear();
      expiryElement.clear();
      cvcElement.clear();
   document.getElementById("charge-form").submit(); #追加
    });
    e.preventDefault();
  });
中略
e.preventDefault();で通常のRuby on Railsにおけるフォーム送信処理はキャンセルしている
代わり、追加のコードによってJavaScriptでフォームの送信処理を行う必要がある