Исключение недействительного отпечатка пальца при обработке через securepay с использованием omnipay

Я пытаюсь понять процесс оплаты с помощью Omnipay/SecurePay, но всегда получаю сообщение об ошибке при попытке совершить покупку.

Из того, что я вижу из онлайн-документов, функция completePurchase должна вызываться с теми же параметрами, что и функция purchase, но когда я вызываю completePurchase, я получаю исключение «Неверный отпечаток пальца».

Также вылетают эти ошибки:

Undefined index: merchant in /var/www/vendor/omnipay/securepay/src/Message/DirectPostCompletePurchaseRequest.php on line 28
Undefined index: refid in /var/www/vendor/omnipay/securepay/src/Message/DirectPostCompletePurchaseRequest.php on line 30
Undefined index: timestamp in /var/www/vendor/omnipay/securepay/src/Message/DirectPostCompletePurchaseRequest.php on line 32
Undefined index: summarycode in /var/www/vendor/omnipay/securepay/src/Message/DirectPostCompletePurchaseRequest.php on line 33

Я где-то пропустил шаг, который добавляет эти недостающие данные? или эти данные должны возвращаться в ответ?

Код:

$params = array(
    'amount' =>  $data->payment['amount'] . '.00',
    'currency' => $this->getOptions()->getCurrency(),
    'description' => 'test purchase',
    'transactionId' => '12345',
    'transactionReference' => $data->course['course_code'],
    'returnUrl' => 'http://test.localhost/register/55622/confirmation',
    'cancelUrl' => 'http://test.localhost/register/55622/summary',
    'card'=>$card
 );

$gateway = new DirectPostGateway();
$gateway->setMerchantId( $this->getOptions()->getGateway( $type )['merchant_id'] );
$gateway->setTransactionPassword( $this->getOptions()->getGateway( $type )['password'] );

$gateway->setTestMode( $this->getOptions()->getTestMode() );

$response = $gateway->purchase($params)->send();
var_dump($response->getRedirectData());

$response = $gateway->completePurchase($params)->send();
var_dump($response);
//"Invalid fingerprint" exception thrown

if ($response->isSuccessful()) {
    // payment was successful: update database
    return $response;
} elseif ($response->isRedirect()) {
    // redirect to offsite payment gateway
    if($response->getRedirectData()){
        var_dump($response->getRedirectData());
    } else {
        return $response->redirect();    
    }
    exit;
    return $response->redirect();
} else {
    // payment failed: display message to customer
    // echo $response->getMessage();
    throw new Exception("Error Processing Request", 1);
}

person Stephen    schedule 26.05.2014    source источник


Ответы (2)


Вы делаете все правильно. Когда SecurePay вернется на ваш сайт, должны быть данные POST, содержащие эти параметры, а также параметр fingerprint, подтверждающий подлинность запроса.

Я бы смотрел вкладку «Сеть» вашего браузера во время оплаты с помощью SecurePay и проверял данные HTTP POST после завершения оплаты (и перенаправления на ваш сайт). Я предполагаю, что какой-то htaccess или другой скрипт выполняет второе перенаправление и одновременно удаляет важные данные POST.

Omnipay автоматически проверяет данные POST, поэтому нет необходимости явно отправлять их. Пока вы вызываете completePurchase() из того же запроса, он должен правильно обрабатывать платеж.

См.: https://github.com/omnipay/securepay/blob/master/src/Message/DirectPostCompletePurchaseRequest.php

person Adrian Macneil    schedule 27.05.2014
comment
Сначала я думал, что проблема решена, но понял, что все еще получаю сообщение об ошибке. Данные возвращаются из securepay через GET, а POST пуст. Я добавил отладку в класс, который вы указали, и $this-›httpRequest-›request-›all() пуст, тогда как $this-›httpRequest-›query-›all() содержит данные от шлюза. Изменив класс для использования запроса, я могу завершить транзакцию. Как вы думаете, это ошибка в классе или данные ожидаются обратно в POST? - person Stephen; 29.05.2014

Securepay использовала конечную точку https://test.securepay.com.au, а затем переключилась на https://test.api.securepay.com.au

person exiang    schedule 21.02.2017
comment
Это была моя проблема. Спасибо! Было бы здорово, если бы они обновили свою документацию этой новой конечной точкой. Кстати, полный URL-адрес будет https://test.api.securepay.com.au/live/directpost/authorise - person trajedy; 07.03.2017