我正在使用带有Python的Stripe。我跟随this guide创建了sepa_debit源对象。
据我了解,我需要先创建源对象,然后才能创建费用,因为费用需要源对象ID。
我现在不在乎客户,因为所有费用都应该一次性支付,并且源对象不可重用。
简而言之,在客户端上,我从stripe和src_id得到了肯定的答复:
这是一个成功的答复,或者我错了吗?它发生在这一部分:
// Call `stripe.createSource` with the iban Element and additional options.
stripe.createSource(iban, sourceData).then(function(result) {
if (result.error) {
// Inform the customer that there was an error.
errorMessage.textContent = result.error.message;
$('#error-message').removeClass('display-none');
$('#book-room-container #book-room-form button[type="submit"]').text("Unterkunft kostenpflichtig buchen");
$('#book-room-container #book-room-form button[type="submit"]').attr("disabled", false);
//stopLoading();
} else {
// Send the Source to your server to create a charge.
$('#error-message').addClass('display-none');
console.log(result.source); // <-- THIS IS THE LOG OF THE IMAGE ABOVE
console.log(result.source.id);
console.log(result.source.type);
$('#book-room-container #stripe_source_id').val(result.source.id);
$('#book-room-container #stripe_source_type').val(result.source.type);
// create charge and return charge id
$.ajax({
url : '/process-stripe-payment',
type : "post",
contentType: 'application/json;charset=UTF-8',
data : JSON.stringify({'total_price': total_room_price, 'user_email': $.trim($('#book-room-container #sepa_email').val()),
'room_id': $('#book-room-container').data('roomid'), 'sepa_owner': $.trim($('#book-room-container #sepa_owner').val()),
'stripe_source_id': $.trim($('#book-room-container #stripe_source_id').val()), 'stripe_source_type': $.trim($('#book-room-container #stripe_source_type').val())}),
success : function(response) {
console.log("process-stripe-payment", response);
},
error : function(xhr) {
console.log("failed process-stripe-payment", xhr);
}
});
}
我有点怀疑,因为创建此源对象的公钥就足够了,但这就是文档所要说明的。他们的提示还告诉我,现在我应该可以使用src_id并创建费用了:
///将源发送到您的服务器以创建费用。
现在,我要获取src_id和一些必需品数据,然后转到要在其中创建费用的服务器:
// create charge and return charge id
$.ajax({
url : '/process-stripe-payment',
type : "post",
contentType: 'application/json;charset=UTF-8',
data : JSON.stringify({'total_price': total_room_price, 'user_email': $.trim($('#book-room-container #sepa_email').val()),
'room_id': $('#book-room-container').data('roomid'), 'sepa_owner': $.trim($('#book-room-container #sepa_owner').val()),
'stripe_source_id': $.trim($('#book-room-container #stripe_source_id').val()), 'stripe_source_type': $.trim($('#book-room-container #stripe_source_type').val())}),
success : function(response) {
console.log("process-stripe-payment", response);
},
error : function(xhr) {
console.log("failed process-stripe-payment", xhr);
}
});
这是服务器代码:
@app.route('/process-stripe-payment', methods=["POST"])
def process_stripe_payment():
if request.method == "POST":
data_received = json.loads(request.data)
print (data_received, data_received['stripe_source_id'])
# FIRST TRY STRIPE
stripe_charge = stripe.Charge.create(
amount=int(float(data_received['total_price']) * 100),
currency="eur",
source=data_received['stripe_source_id'],
description=None,
#customer=user_id, # None if guest
capture=False, # if False the charge needs to be captured, otherwise it will expire in 7 days and is refunded
#receipt_email='email für den typer, der die rechnung kriegt, funktioniert nur im livemode',
metadata={
'user_email': data_received['user_email'],
'room_id': data_received['room_id']
}
)
print (stripe_charge)
return json.dumps({'status' : 'success'})
return redirect(url_for('index'))
问题是它不起作用。在条带日志中,我看到一个请求已发出但失败了(400
)。错误:
{
"error": {
"code": "resource_missing",
"doc_url": "https://stripe.com/docs/error-codes/resource-missing",
"message": "No such token: src_1DCRd12eZvKYlo2ClWoO3vFj",
"param": "source",
"type": "invalid_request_error"
}
}
答案 0 :(得分:0)
您是否检查过您使用的可发布密钥和秘密密钥是否匹配?该错误通常意味着您使用一个帐户的可发布密钥创建了源,然后尝试使用另一个帐户的秘密密钥进行收费。
特别是,如果您从Stripe网站复制示例,这很容易发生-这些示例具有有效的示例密钥,但它们不是您自己帐户的密钥,因此这就是为什么您获得错误。确保您使用的是https://dashboard.stripe.com/account/apikeys中的可发布密钥。