В настоящее время я делаю интерфейс платежного шлюза PHP для Eway, интерфейс включает в себя:
interface RecurringPaymentGateway
{
/**
* save subscription information to database
*
* @param Subscription $subscription
* @return bool returns true on success, false on failure
*/
public function saveToDb(Subscription $subscription);
/**
* create new subscription
*
* @param Subscription $subscription
* @return string|bool returns gateway id on success, false on failure
*/
public function createSubscription(Subscription $subscription);
/**
* update existing subscription
*
* @param Subscription $subscription
* @param Subscription $existingSubscription
* @return mixed returns true on success, false on failure
*/
public function updateSubscription(Subscription $subscription, Subscription $existingSubscription);
/**
* update only payment method for an existing subscription
*
* @param Subscription $subscription
* @return bool returns true on success, false on failure
*/
public function updateSubscriptionPayment(Subscription $subscription);
/**
* cancel existing subscription
*
* @param Subscription $subscription
* @return bool returns true on success, false on failure
*/
public function cancelSubscription(Subscription $subscription);
/**
* handles an recurring payment pingback
*
* @param array $data POST data from webhook / silent post
* @return PaymentResponse
*/
public function handleRecurringPayment($data = array());
}
Я смог завершить все остальные функции, кроме функции handleRecurringPayment, функция должна получать молчаливый пост от Eway при обработке каждого повторяющегося платежа и получать статус, например, «Не удалось» или «Успех», чтобы я мог обновить информацию на нашей стороне.
Теперь я сделал это с помощью Stripe API, см. Ниже, потому что это было очень ясно из объекта события в их API документ Также вы можете увидеть мой код ниже:
public function handleRecurringPayment($data = array())
{
$response = new PaymentResponse();
// validate the incoming event
$event = StripeEvent::retrieve($data['id']);
// failed to validate event, ignore event
if ($event === false) {
$response->setStatus('invalid_event');
return $response;
}
$event_type = $event->type;
if ($event_type != 'invoice.payment_succeeded' && $event_type != 'invoice.payment_failed') {
// those are the only 2 events that we are interested in, other events can be ignored
$response->setStatus('invalid_event');
return $response;
}
/** @var Subscription $subscription */
$subscriptionId = $event->data->object->subscription;
$subscription = $this->getSubscriptionFromId($subscriptionId);
// subscription doesn't exist in database, ignore this event
if ($subscription === false || $subscription->id <= 0) {
$response->setStatus('not_found');
return $response;
}
$response->setSubscription($subscription);
if ($event_type == 'invoice.payment_failed') {
/**
* payment error
*/
$chargeId = $event->data->object->charge;
$charge = Charge::retrieve($chargeId);
$errorMessage = $charge->failure_message;
// need to return a response object
$response->setStatus('payment_failed');
$response->setMessage($errorMessage);
$subscription->error = true;
$subscription->errorMessage = $errorMessage;
// next payment attempt
$nextAttempt = $event->data->object->next_payment_attempt;
if ((int)$nextAttempt > 0) {
$nextAttemptDate = \DateTime::createFromFormat('U', (int)$nextAttempt);
$subscription->nextPayment = $nextAttemptDate;
}
$subscription->update();
$response->setSubscription($subscription);
return $response;
}
if ($event_type == 'customer.subscription.deleted') {
/**
* subscription cancelled
*/
$subscription->enabled = false;
$subscription->update();
$response->setSubscription($subscription);
$response->setStatus('cancelled');
return $response;
}
// get stripe subscription
$customer = StripeCustomer::retrieve($event->data->object->customer);
$stripeSubscription = $customer->subscriptions->retrieve($event->data->object->subscription);
// update next payment date
$nextPayment = $stripeSubscription->current_period_end;
if ((int)$nextPayment > 0) {
$nextPaymentDate = \DateTime::createFromFormat('U', (int)$nextPayment);
$subscription->nextPayment = $nextPaymentDate;
$subscription->update();
$response->setSubscription($subscription);
}
// check subscription status
if ($stripeSubscription->status == 'trialing') {
$response->setStatus('invalid_event');
return $response;
}
// update previous payment date to now
$subscription->prevPayment = new \DateTime();
$subscription->error = false;
$subscription->errorMessage = '';
$subscription->update();
$response->setSubscription($subscription);
$response->setStatus('payment_success');
$response->setTransactionId($event->data->object->charge);
return $response;
}
Осмотрев сайт, я не нашел ни одного связанного с этим вопроса, кроме этого. сообщение, в этом посте я не совсем понял: «Вы можете сохранить данные карты своего пользователя в качестве токенов в eWAY, а затем управлять расписанием в своем приложении.», я думаю, что ссылка в этом посте также не работает.
Насколько я понимаю, процесс выглядит следующим образом: сначала создайте клиента токена на Eway -> создайте клиента повторного платежа, используя этого клиента токена -> создайте событие повторного платежа, используя клиент повторного платежа.
Я пытался написать им по электронной почте, они сказали, что если вы не в АС, мы не можем вам помочь. теперь я действительно не знаю с чего начать. Может быть, у Eway просто нет молчаливого поста или уведомления для каждого повторяющегося платежа? Или я что-то упустил, когда строил повторяющееся событие?
Поскольку повторяющийся метод оплаты разрешен только в SOAP, мои коды действительно очень длинные, поэтому я не прикреплял коды для других функций. Извините, я очень новичок в paymentgateways и PHP в целом.
Задача ещё не решена.
Других решений пока нет …