Проверка ключа подписи пакета AuthnetWebhook

Я получил SIGNATURE_KEY из моего торгового интерфейса authorize.net. Я использую AuthnetJson Package. Должен ли я преобразовать 128 шестнадцатеричный SIGNATURE_KEY в двоичный файл? Если ответ «да», то я так и сделал, но мой код никогда не выполняется внутри, если ($ webhook-> isValid ()) {// код никогда не выполнит execute}. Что я делаю не так?

$webhook = new AuthnetWebhook('services.authorize.signature', $payload);
if ($webhook->isValid()) {
// Get the transaction ID
$transactionId = $webhook->payload->id;

// Here you can get more information about the transaction
$request  = AuthnetApiFactory::getJsonApiHandler('services.authorize.login', 'services.authorize.key');
$response = $request->getTransactionDetailsRequest(array(
'transId' => $transactionId
));
$user = User::find(1);
$user->notify( new PasswordResetSuccess($response));
/* You can put these response values in the database or whatever your business logic dictates.
$response->transaction->transactionType
$response->transaction->transactionStatus
$response->transaction->authCode
$response->transaction->AVSResponse
*/
}

Редактировать:

<?php

namespace App\Http\Controllers\Api\Anet;

use Illuminate\Http\Request;
use net\authorize\api\contract\v1 as AnetAPI;
use net\authorize\api\controller as AnetController;
use App\Http\Controllers\Controller;
use JohnConde\Authnet\AuthnetWebhook;
use App\Notifications\PasswordResetSuccess;
use App\Models\User;
use Log;
use \stdClass;
use App\Models\Anet;
class WebhookController extends Controller
{
public function webhook(Request $request){

$headers = getallheaders();
$payloadraw = file_get_contents("php://input");
$payloadEncoded = json_encode($payloadraw);
$payloadDecoded = json_decode($payloadraw);
$type = gettype($payloadraw);

$webhook = new AuthnetWebhook('xxxxx8EF4B4186A3BC745B70637EA1Fxx091E1DD0706BF9A9D721982B882BE54192BD1BBCEAFC0415DF06E6xxxxxxxxx',$payloadEncoded, $headers);
if ($webhook->isValid()) {
// Get the transaction ID
$transactionId = $webhook->payload->id;

// Here you can get more information about the transaction
$request  = AuthnetApiFactory::getJsonApiHandler('AUTHNET_LOGIN','AUTHNET_TRANSKEY');
$response = $request->getTransactionDetailsRequest(array('transId' => $transactionId));

$anet = new Anet();
$anet->notification = $payloadraw ;
$anet->payload = $payloadDecoded ;
$anet->type = $type ;
$anet->transaction_type = $response->transaction->transactionType;
$anet->transactions_status = $response->transaction->transactionStatus;
$anet->auth_code = $response->transaction->authCode;
$anet->avs_response = $response->transaction->AVSResponse;
$anet->save();
}else{
$anet = new Anet();
$anet->notification = $payloadEncoded ;
$anet->payload = $payloadDecoded ;
$anet->type = $type ;
$anet->transactions_status = '401';
$anet->save();
}

}
}

1

Решение

Вам не нужно преобразовывать его в двоичный файл. Как показано в интерфейсе Authorize.Net, его значение должно использоваться в вашем коде:

Пример:

$webhook = new AuthnetWebhook('14FE4A2385812E980CCF97D177F17863CE214D1BE6CE8E1E894487AACF3609C1A5FE1752CB4A002C634B84E397DC8A218E1A160BA7CAB7CBE4C05B35E9CBB05E', $payload);

Или, если вы используете config.inc.php файл конфигурации из вашей библиотеки:

defined('AUTHNET_SIGNATURE') || define('AUTHNET_SIGNATURE', '14FE4A2385812E980CCF97D177F17863CE214D1BE6CE8E1E894487AACF3609C1A5FE1752CB4A002C634B84E397DC8A218E1A160BA7CAB7CBE4C05B35E9CBB05E');

и в вашем коде:

$webhook = new AuthnetWebhook(AUTHNET_SIGNATURE, $payload);
1

Другие решения

Не ссылаясь на остальную часть вашей логики, причина, по которой ваше утверждение if не соответствует действительности, состоит в том, что вы кодируете данные json, которые уже являются json. Когда вы звоните getallheaders() тип контента уже определен как json. Так что замените это:

    $headers = getallheaders();
$payloadraw = file_get_contents("php://input");
$payloadEncoded = json_encode($payloadraw);
$payloadDecoded = json_decode($payloadraw);
$type = gettype($payloadraw);

с этим:

    $headers = getallheaders();
$payload = file_get_contents("php://input");

и это:

  $webhook = new AuthnetWebhook($signature,$payload, $headers);
if ($webhook->isValid()) {
//logic goes here
}

Примет значение true, и будет выполнена любая действительная логика, содержащаяся в условном выражении. Я рекомендую протестировать приведенный выше код, чтобы убедиться, что он работает (работает) перед добавлением дополнительной логики. Вы можете создать простой файл журнала, например так:

$dump = print_r($payload,true);
$fp = file_put_contents( '

test.log', $dump );

И если в вашем каталоге есть файл test.log после доставки одного webhook, вы знаете, что у вас есть базовый уровень, с которого можно перейти. Если в остальной части вашего оператора if есть неверная логика, это может привести к поломке.

И чтобы ответить на ваш первый вопрос, на который уже был дан правильный ответ, не конвертируйте ключ подписи в двоичный. Так $signature в приведенном выше коде ключ подписи в точности соответствует тому, что вы дали вам в авторизации.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector