前提・実現したいこと
最終的に実現したいのは、クレジットカード登録と同時にユーザー情報を紐付けることです。
#発生している問題・エラーメッセージ
入力フォームにテストカードの情報を入れて送信をすると、以下のエラーメッセージが返ってきます。
使用したテストカード:番号「4242424242424242(16桁)」、cvc「123」、月「3」、年「33」
エラーメッセージ確認場所:検証ツールのResponseより
"error": { "code": "invalid_expiry_year", "message": "Invalid expiration year", "param": "card[exp_year]", "status": 402, "type": "card_error" }
#該当のソースコード
カード登録画面のビュー
<%= form_with url: cards_path, id: 'charge-form', class: 'card-form', local: true do |f| %> <div class="Cardpage"> <h1>カード登録</h1><br> </div> <div class="form-wrap"> <%= f.label :number, "【カード番号】" %> <%= f.text_field :number, class:"number", placeholder:"カード番号(半角英数字)", maxlength:"16" %> </div> <div class="form-wrap"> <%= f.label :cvc, "【CVC】" %> <%= f.text_field :cvc, class:"cvc", placeholder:"カード背面にある3桁の番号", maxlength:"4" %> </div> <div class="form-wrap"> <br> <p>【有効期限】</p> <div class="input-expiration-date-wrap"> <%= f.text_field :exp_month, class: "exp-month", placeholder:"例)3" %> <p>月</p> <%= f.text_field :exp_year, class: "exp-year", placeholder:"例)24" %> <p>年</p> </div> </div> <%= f.submit "登録する", class:"button", id:"button" %> <% end %>
JavaScript
app/javascript/card.js
1const pay = () => { 2 Payjp.setPublicKey(process.env.PAYJP_PUBLIC_KEY); 3 const submit = document.getElementById("button"); 4 submit.addEventListener('click', (e) => { 5 e.preventDefault(); 6 const formResult = document.getElementById("charge-form"); 7 const formData = new FormData(formResult); 8 9 const card = { 10 number: formData.get("number"), 11 cvc: formData.get("cvc"), 12 exp_month: formData.get("exp-month"), 13 exp_year: `20${formData.get("exp-year")}` 14 }; 15 Payjp.createToken(card, (status, response) => { 16 if (status === 200) { 17 const token = response.id; 18 const renderDom = document.getElementById("charge-form"); 19 const tokenObj = `<input value="${token}" name="card_token" type="hidden">`; 20 renderDom.insertAdjacentHTML("beforeend", tokenObj); 21 } 22 23 document.getElementById("number").removeAttribute("name"); 24 document.getElementById("cvc").removeAttribute("name"); 25 document.getElementById("exp_month").removeAttribute("name"); 26 document.getElementById("exp_year").removeAttribute("name"); 27 28 document.getElementById("charge-form").submit(); 29 }); 30 }); 31}; 32 33window.addEventListener('load', pay);
Cardモデル
class Card < ApplicationRecord belongs_to :user attr_accessor :card_token validates :card_token, presence: true end
cardsコントローラー
class CardsController < ApplicationController def new end def create Payjp.api_key = ENV["PAYJP_SECRET_KEY"] customer = Payjp::Customer.create( description: 'test', card: params[:card_token] ) card = Card.new( card_token: params[:card_token], customer_token: customer.id, user_id: current_user.id ) if card.save redirect_to root_path else redirect_to new_card_path end end ned
#試したこと
・以前(10日ほど前)は正常にカード登録ができていました。その間コードに触れた記憶はありませんが、JavaScript関連ではチャットの非同期処理を実装しました(関係あるかわかりませんが…)
・ターボリンクスが悪さすることがあると聞いたのでコメントアウトなどを試みましたが、変化はありませんでした。
・「Invalid expiration year」というエラー文からyear回りの記述名や要素名を確認しましたが解決に至りませんでした。
・かれこれ1日程考えましたが、自分でエラー解消することができませんでした…。どうか皆様のお力添えを頂ければと存じます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。