2

私はRails、Devise、StripeをSaaSアプリケーションに使用しています。サインアップのポイント。Rails&Stripe - ストライプカードトークンは新規顧客への支払いのために新規顧客に保存されません(登録無料試用)

私は有料で情報を保存したいのは、無料トライアルのサブスクリプションプランだからです。

これまでのところ、カードトークンを作成して顧客を作成することができ、両方ともストライプダッシュボードログ(POST/v1 /トークンとPOST/v1/customer)に表示されます。

問題は、カードが顧客のために保存された状態で表示されていないことです。つまり、両方が送信されていても接続されていません。

私はそれは私が私のUserモデルで私の顧客を作成していますどのように何かを持っていると思う:

Stripe::Customer.create(description: plan_id, email: email, plan: plan_id, card: stripeToken) 

しかし、私は解決策を見つけるように見えることはできません。ここで

は私のフォームである:ここでは

<%= 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である:ここでは

#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 = ''; 
    } 
    }); 

はコントローラです:

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

Rubyの宝石を使用して 'User'で' stripeToken'の値は何ですか?それを印刷して、それが設定されていることを確認しましたか?そうでない場合は、どこから来ていますか、コードのその側で値が設定されていることを確認しましたか? – koopajah

答えて

0

ストライプトークンは、カードにないソース属性で渡す必要があります。

この方法では動作しますが、カードの属性を受け入れないAPIドキュメントも参照できます。

それはあなたが顧客を作成するとき、あなたはsourcesオブジェクトの一部としてカードトークン(複数可)を追加することができ、顧客のエンドポイント Refer

0

にソースとしてstripeToken受け付けます。

related docsを確認すると、既に保存されているトークンを顧客に渡すだけでよいことがわかります。ここで

step by stepガイドは、顧客のオブジェクトにソースを接続する方法に同様だ

関連する問題