如何为Stripe/PHP指定MOTO(邮购电话订单)



我很难弄清楚如何使用Stripe API和PHP指定MOTO付款。我相信我在confirm(javascript(的payment_method_options中指定了MOTO,并且我必须在create(PHP(中指定confirm=true。我正在努力从这里获得与MOTO合作的例子,尽管没有MOTO也能很好地工作。

script.js(我将payment_method_options: { card: {moto:true} }添加到confirmCardPayment。。。

var pay = function(stripe, card, clientSecret) {
changeLoadingState(true);
// Initiate the payment.
// If authentication is required, confirmCardPayment will automatically display a modal
stripe
.confirmCardPayment(clientSecret, { payment_method: { card: card }, payment_method_options: { card: {moto:true} } })
.then(function(result) {
if (result.error) {
// Show error to your customer
showError(result.error.message);
} else {
// The payment has been processed!
orderComplete(clientSecret);
}
});
};

confirm-intent.php我指定confirm=true并在输出中包含payment_method。。。

use StripePaymentIntent;
use StripeStripe;
require '../vendor/autoload.php';
header('Content-Type: application/json');
Stripe::setApiKey('sk_test_xxxxxxxxxxxxx');
$paymentIntent = PaymentIntent::create([
'amount' => 2000,
'currency' => 'gbp',
'payment_method_types' => ['card'],
'confirm' => true
]);
$output = [
'publishableKey' => 'pk_test_xxxxxxxxxxxxx',
'clientSecret' => $paymentIntent->client_secret,
'payment_method' => $paymentIntent->id,
];
echo json_encode($output);

我目前得到的错误是…

PHP消息:PHP致命错误:未捕获(状态400((请求req_1D9UTDO2Ip8zI(您无法确认此PaymentIntent,因为它缺少付款方法。您可以使用付款方式更新PaymentIntent,然后再次确认,也可以直接使用付款方式再次确认。

我认为,付款方式是付款意向的id。我已经将其放入付款意向脚本的输出中,但这不起作用。有什么想法吗?非常感谢。

如果您想执行MOTO条带支付,有以下要求:

  1. 您需要直接激活带条纹的MOTO支付选项
  2. 您需要执行一个付款操作,即confirm=true的paymentIntent。在这种情况下,先用confirmCardPayment支付意向是行不通的

在这种情况下,paymentIntent操作看起来是这样的:(以下是一个curl请求,您可以将其转换为后端语言(

curl https://api.stripe.com/v1/payment_intents 
-u sk_test_NfCI7U9wkvqjrgJRFirEuwjN 
-d amount=1099 
-d currency=eur 
-d "payment_method_data[type]"=card 
-d "payment_method_data[card][number]"=4242424242424242 
-d "payment_method_data[card][exp_month]"=4 
-d "payment_method_data[card][exp_year]"=24 
-d "payment_method_data[card][cvc]"=242 
-d "payment_method_options[card][moto]"=true 
-d confirm=true

它将返回一个错误或成功的付款结果,您可以将其用于进一步的操作。

或者,您可以先创建paymentMethod,然后使用paymentMethod ID进行确认意图(以避免直接发送卡详细信息并使用条纹卡输入UI元素(。请先在此处查看有关如何创建付款方式的更多信息:https://stripe.com/docs/payments/accept-a-payment-synchronously#create-a付款方式

如果你这样做,你的MOTO API调用会是这样的:

curl https://api.stripe.com/v1/payment_intents 
-u sk_test_NfCI7U9wkvqjrgJRFirEuwjN 
-d amount=1099 
-d currency=eur 
-d "payment_method"=<YOUR paymentMethodID> 
-d "payment_method_options[card][moto]"=true 
-d confirm=true

使用解决

var url = "https://api.stripe.com/v1/payment_intents";
var httpRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/json";
httpRequest.Headers["Authorization"] = "Bearer sk_test_YOURKEY...";
var data = "amount=1099&currency=eur&payment_method_data[type]=card&payment_method_data[card][number]=4242424242424242&payment_method_data[card][exp_month]=4&payment_method_data[card][exp_year]=24&payment_method_data[card][cvc]=242&payment_method_options[card][moto]=true&confirm=true";
using (var streamWriter = new System.IO.StreamWriter(httpRequest.GetRequestStream())){streamWriter.Write(data);}
var httpResponse = (System.Net.HttpWebResponse)httpRequest.GetResponse();
using (var streamReader = new System.IO.StreamReader(httpResponse.GetResponseStream())) {var result = streamReader.ReadToEnd();}
Response.Write("Result:" + httpResponse.StatusCode + ";");

然后在第一次付款时,你会得到一个错误的

>curl -u "sk_test_51KiFsQIZBabXT9vC1SZAcFMJpgdBHFHa1rMBjaMntI4gGEAGciPFkrERfISvM37sS1SNHcJThaRwjgwLh0bW8u9n00mjcVcPFN:" --data "amount=1099&currency=eur&payment_method_data[type]=card&payment_method_data[card][number]=4242424242424242&payment_method_data[card][exp_month]=4&payment_method_data[card][exp_year]=24&payment_method_data[card][cvc]=242&payment_method_options[card][moto]=true&confirm=true" https://api.stripe.com/v1/payment_intents
{
"error": {
"message": "Sending credit card numbers directly to the Stripe API is generally unsafe. We suggest you use test tokens that map to the test card you are using, see https://stripe.com/docs/testing.",
"type": "invalid_request_error"
}
}

然后按照这个urlhttps://silkstartsupport.zendesk.com/hc/en-us/articles/360000538368-Stripe-Error-Sending-credit-card-numbers-directly-to-the-Stripe-API-is-generally-unsafe-#:~:text=作为%20of%20Octo%2017%2C%20Stripe,谁%20希望%20继续%20处理

你必须去

https://dashboard.stripe.com/settings/integration

单击高级选项并设置toogle选项以允许数据直接来自卡

并完成。

Reemerb,你首先需要手动询问8条纹,让你启用MOTO选项

最终使用以下代码:

var url = "https://api.stripe.com/v1/payment_intents";
var httpRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/json";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.Headers["Authorization"] = "Bearer sk_test_YOUR KEY";
var data = "amount=1099&currency=eur&payment_method_data[type]=card&payment_method_data[card][number]=4242424242424242&payment_method_data[card][exp_month]=4&payment_method_data[card][exp_year]=24&payment_method_data[card][cvc]=242&payment_method_options[card][moto]=true&confirm=true";
using (var streamWriter = new System.IO.StreamWriter(httpRequest.GetRequestStream())) { streamWriter.Write(data); }
var httpResponse = (System.Net.HttpWebResponse)httpRequest.GetResponse();
using (var streamReader = new System.IO.StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); }
Response.Write("Resultado:" + httpResponse.StatusCode + ";");

最新更新