У меня есть Stripe Connect, работающий в режиме тестирования, но мне любопытно узнать об «источнике» ..
Следующий код предварительно разрешает платежи в моем контроллере:
token = params[:stripeToken]
payment_form = params[:payment_form]
customer = Stripe::Customer.create({
:source => 'tok_visa',
:email => params[:stripeEmail],
})
charge = Stripe::Charge.create({
amount: @amount,
currency: 'usd',
customer: customer.id,
capture: false,
})
Я хочу перейтив режиме реального времени, но мне нужно обновить источник до чего-то другого, кроме 'tok_visa' ...
Что должно идти туда?
Пока я собираю токен клиента и чередуюмаркер, я попытался использовать как в этом месте, так и не работать.
Когда я использую
:source => @order.order_token,
в пользовательском создании или создании заряда, он говорит мне:
Stripe::InvalidRequestError (No such token: KFU8PmscYRDsXs1234560jG4sn8J-S8TMi123456BUBkWr9aOvw):
Это при использовании номера теста: 4242424242424242
Работает с тестовым токеном, а не номером?Это нормально?
ОБНОВЛЕНИЕ:
Когда я использую следующее:
token = params[:stripeToken]
payment_form = params[:payment_form]
customer = Stripe::Customer.create({
# :source => 'tok_visa',
:source => token,
:email => order_params[:email],
})
charge = Stripe::Charge.create({
amount: @amount,
currency: 'usd',
customer: customer.id,
capture: false,
})
Заряд не взимается и заказ не сохраняется (как и в случае плохой картыи т. д.)
JSON в полоску
{
"error": {
"code": "missing",
"doc_url": "https://stripe.com/docs/error-codes/missing",
"message": "Cannot charge a customer that has no active card",
"param": "card",
"type": "card_error"
}
}
JS для элементов:
var stripe = Stripe('pk_test_xxxxxxxxxxxxxxxxxxxxx');
var elements = stripe.elements();
var style = {
base: {
color: '#32325d',
lineHeight: '24px',
fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
fontSmoothing: 'antialiased',
fontSize: '16px',
'::placeholder': {
color: '#aab7c4'
}
},
invalid: {
color: '#fa755a',
iconColor: '#fa755a'
}
};
var card = elements.create('card', {style: style});
card.mount('#card-element');
card.addEventListener('change', function(event) {
var displayError = document.getElementById('card-errors');
if (event.error) {
displayError.textContent = event.error.message;
} else {
displayError.textContent = '';
}
});
var form = document.getElementById('payment_form');
form.addEventListener('submit', function(event) {
event.preventDefault();
stripe.createToken(card).then(function(result) {
if (result.error) {
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
} else {
stripeTokenHandler(result.token);
}
});
});
function stripeTokenHandler(token) {
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);
form.submit();
}
Форма:
<%= form_for(@order, url: listing_orders_path([@listing, @listing_video]), remote: true ) do |form| %>
<div class="form-group">
<%= form.label :name, "Their Name" %>
<%= form.text_field :name, class: "form-control", required: true, placeholder: "Steph" %>
</div>
...
<script src="https://js.stripe.com/v3/"></script>
<div class="form-row">
<label for="card-element">
Credit or debit card
</label>
<div id="card-element" class="form-control">
</div>
<div id="card-errors" role="alert"></div>
</div>
<br>
<div class="form-group">
<%= form.submit id:"button-element" %>
</div>
<span class="token"></span>
<% end %>