Я пытаюсь перенести поток платежей из API платежей в методы платежей.
В документах с полосовой миграцией указано, что на шаге 2 необходимо создать способ оплаты на сервере https://stripe.com/docs/payments/payment-intents/quickstart#creating-with-manual-confirmation
Если платеж не удастся и пользователь попытается выполнить другой платеж, я создам несколько способов оплаты для одного и того же заказа.
Существует ли способ повторного использования одного и того же платежного намерения, если, скажем, я создал платежное намерение, как только известная сумма, а затем сохранил платежное намерение для этого заказа в таблице базы данных, используя ручное подтверждениеметод?
Так что-то вроде этого:
// create intent
$intent = \Stripe\PaymentIntent::create([
'amount' => 1099,
'currency' => 'usd',
'confirmation_method' => 'manual',
],[
'idempotency_key' => $orderId,
]);
// Update orders table with payment intent id and set order status to unpaid
Затем, когда пользователь делает платеж:
# vendor using composer
require_once('vendor/autoload.php');
\Stripe\Stripe::setApiKey(getenv('STRIPE_SECRET_KEY'));
header('Content-Type: application/json');
# retrieve json from POST body
$json_str = file_get_contents('php://input');
$json_obj = json_decode($json_str);
#$intent = null;
$order = // get from database
$intent = \Stripe\PaymentIntent::retrieve($order->payment_intent_id);
try {
if (isset($json_obj->payment_method_id)) {
# Create the PaymentIntent
#$intent = \Stripe\PaymentIntent::create([
# 'payment_method' => $json_obj->payment_method_id,
# 'amount' => 1099,
# 'currency' => 'usd',
# 'confirmation_method' => 'manual',
# 'confirm' => true,
#]);
# Instead of creating a new payment intent we update the previously saved PaymentIntent
\Stripe\PaymentIntent::update($intent->id,
[
'payment_method' => $json_obj->payment_method_id,
'confirm' => true,
]
);
}
if (isset($json_obj->payment_intent_id)) {
$intent = \Stripe\PaymentIntent::retrieve(
$json_obj->payment_intent_id
);
$intent->confirm();
}
generatePaymentResponse($intent);
} catch (\Stripe\Error\Base $e) {
# Display error on client
echo json_encode([
'error' => $e->getMessage()
]);
}
function generatePaymentResponse($intent) {
# Note that if your API version is before 2019-02-11, 'requires_action'
# appears as 'requires_source_action'.
if ($intent->status == 'requires_action' &&
$intent->next_action->type == 'use_stripe_sdk') {
# Tell the client to handle the action
echo json_encode([
'requires_action' => true,
'payment_intent_client_secret' => $intent->client_secret
]);
} else if ($intent->status == 'succeeded') {
# The payment didn’t need any additional actions and completed!
# Handle post-payment fulfillment
echo json_encode([
"success" => true
]);
} else {
# Invalid status
http_response_code(500);
echo json_encode(['error' => 'Invalid PaymentIntent status']);
}
}
Любые советы и рекомендации приветствуются.