SaaS 응용 프로그램에 Rails, Devise 및 Stripe를 사용하고 있으며 고객 카드 정보를 저장하는 데 문제가 있습니다. 가입 시점.Rails & Stripe - 스트라이프 카드 토큰이 나중에 새로운 고객에게 저장되지 않음 (무료 가입 시험 사용)
정보를 무료로 저장하려는 이유는 무료 평가판이 포함 된 가입 계획이기 때문입니다.
지금까지 카드 토큰을 생성하고 고객을 생성 할 수 있으며 둘 다 스트라이프 대시 보드 로그 (POST/v1/토큰 및 POST/v1/고객)에 표시됩니다.
문제는 카드가 고객을 위해 저장된 상태로 표시되지 않는 것입니다. 즉, 둘 다 제출되었지만 연결되지 않았습니다.
나는 그것이 내가 내 사용자 모델에서 내 고객을 만드는거야 어떻게 함께 할 수있는 뭔가가 생각 :
Stripe::Customer.create(description: plan_id, email: email, plan: plan_id, card: stripeToken)
을하지만 나는 해결책을 찾을 수 없습니다. 컨트롤러 여기
#In <head> <script src="https://js.stripe.com/v3/"></script>
var stripe = Stripe('pk_test_sadnasd2n3krekl3k434kla');
var elements = stripe.elements();
var card = elements.create('card', { style:
{
base: {
lineHeight: '2'
}
}
});
// Add an instance of the card UI component into the `card-element` <div>
card.mount('#card-element');
function stripeTokenHandler(token) {
// Insert the token ID into the form so it gets submitted to the server
var form = document.getElementById('payment-form');
var hiddenInput = document.createElement('input');
hiddenInput.setAttribute('type', 'hidden');
hiddenInput.setAttribute('name', 'stripeToken');
hiddenInput.setAttribute('value', token.id);
form.appendChild(hiddenInput);
// Submit the form
form.submit();
}
function createToken() {
stripe.createToken(card).then(function(result) {
if (result.error) {
// Inform the user if there was an error
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
} else {
// Send the token to your server
stripeTokenHandler(result.token);
}
});
};
// Create a token when the form is submitted.
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(e) {
e.preventDefault();
createToken();
});
card.addEventListener('change', function(event) {
var displayError = document.getElementById('card-errors');
if (event.error) {
displayError.textContent = event.error.message;
} else {
displayError.textContent = '';
}
});
됩니다 :
여기<%= form_for(resource, as: resource_name, url: registration_path(resource_name), :html => {:id => "payment-form"}) do |f| %>
<%= devise_error_messages! %>
<%= hidden_field_tag 'plan', params[:plan] %>
<div class="field form-group">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, class: 'form-control' %>
</div>
<div class="field form-group">
<%= f.label :password %>
<% if @validatable %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off", class: 'form-control' %>
</div>
<div class="field form-group">
<%= f.label :password_confirmation, "Password Confirmation" %><br />
<%= f.password_field :password_confirmation, autocomplete: "off", class: 'form-control' %>
</div>
<!-- CC -->
<div class="form-row">
<label for="card-element">
Credit or Debit Card
</label>
<div id="card-element" class="form-control"></div>
<!-- Used to display form errors -->
<div id="card-errors" role="alert"></div>
</div>
<!--/CC -->
<div class="actions form-group text-center" style="margin-top: 40px;">
<input type="submit" class="btn btn-success btn-block" value="Create Account">
</div>
<% end %>
는 JS입니다 : 여기
은 내 양식이다class Users::RegistrationsController < Devise::RegistrationsController
def create
super do |resource|
if params[:plan]
resource.plan_id = params[:plan]
if resource.plan_id == "1"
resource.save_with_payment
else
resource.save
end
end
end
end
end
그리고 여기 모델 :
class User < ApplicationRecord
attr_accessor :stripeToken
def save_with_payment
if valid?
customer = Stripe::Customer.create(description: plan_id, email: email, plan: plan_id, card: stripeToken)
self.stripe_customer_token = customer.id
save!
end
end
end
고객이 카드를 만들 때 고객과 연결되어 있지 않은 이유에 대한 도움을받을 수 있습니까?
User''에서'stripeToken'의 값이 무엇을 사용하여 고객 객체에 대한 소스를 연결하는 방법에 대한뿐만 아니라입니까? 인쇄 했습니까? 그것이 아니라면, 그것은 어디에서오고 당신은 코드의 측면에서 값이 설정되었다는 것을 확인 했습니까? – koopajah