2017-12-12 22 views
2

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 

고객이 카드를 만들 때 고객과 ​​연결되어 있지 않은 이유에 대한 도움을받을 수 있습니까?

+0

User''에서'stripeToken'의 값이 무엇을 사용하여 고객 객체에 대한 소스를 연결하는 방법에 대한뿐만 아니라입니까? 인쇄 했습니까? 그것이 아니라면, 그것은 어디에서오고 당신은 코드의 측면에서 값이 설정되었다는 것을 확인 했습니까? – koopajah

답변

0

스트라이프 토큰은 카드가 아닌 소스 속성으로 전달되어야합니다.

우리는이 방법으로 작동하며 카드 속성을 허용하지 않는 API 설명서를 참조 할 수도 있습니다.

당신이 고객을 만들 때, 당신은 sources 객체의 일환으로 카드 토큰 (들)을 추가 할 수 있습니다 고객의 엔드 포인트 Refer

0

에 소스로 stripeToken 받아들입니다.

related docs을 확인하면 이미 저장된 토큰을 고객에게 전달하는 것이 필요하다는 것을 알게됩니다.

여기 step by step 가이드는 루비 보석