Clickbank IPN версия 6 PHP / Laravel

Я пытаюсь создать прослушиватель IPN для Clickbank, но пока я не добился успеха.

Я использовал пример кода, указанный на сайте clickbank: https://support.clickbank.com/entries/22803622-Instant-Notification-Service

    <?php
// NOTE: the mcrypt libraries need to be installed and listed as an available extension in
// your phpinfo() to be able to use this method of decryption.
$secretKey = "YOUR SECRET KEY"; // secret key from your ClickBank account
// get JSON from raw body...
$message = json_decode(file_get_contents('php://input'));
// Pull out the encrypted notification and the initialization vector for
// AES/CBC/PKCS5Padding decryption
$encrypted = $message->{'notification'};
$iv = $message->{'iv'};
error_log("IV: $iv");
// decrypt the body...
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
substr(sha1($secretKey), 0, 32),
base64_decode($encrypted),
MCRYPT_MODE_CBC,
base64_decode($iv)), "\0..\32");
error_log("Decrypted: $decrypted");
// convert the decrypted string to a JSON object...
$order = json_decode($decrypted);
// Ready to rock and roll - If the decoding of the JSON string wasn't successful,
// then you can assume the notification wasn't encrypted with your secret key.
?>

Для ipn v4 мне удалось получить подтвержденное подтверждение для тестера ipn и сохранить результаты в моих журналах. Но для v6 я даже не могу сохранить вывод в лог-файлы. Кажется, что Clickbank даже не отправляет ничего. Их документация расплывчата, мне интересно, должен ли этот код работать в первую очередь.

У кого-нибудь есть опыт с этим? Должен ли я вернуть что-нибудь кроме ответа 200?

Заранее спасибо.

1

Решение

Есть несколько вещей, которые вы можете сделать, которые хорошо сработали с моим кодом.
(1) Версия PHP — если вы используете PHP 7+, попробуйте изменить его на PHP 5.6
(2) Используйте $ HTTP_RAW_POST_DATA вместо file_get_contents (я знаю, что file_get_contents лучше, но используйте альтернативу, когда она не работает)

Вот код, чтобы попробовать,
$ secretKey = «Ваш секретный ключ»;

// get JSON from raw body...
//$message = json_decode(file_get_contents('php://input'));

$message = $HTTP_RAW_POST_DATA;
$message = json_decode($message, true);
$messageString = http_build_query($message);    //converts associative array in to string
error_log("message string: $messageString");
$encrypted = $message['notification'];
$iv = $message['iv'];
error_log("IV: $iv");

// decrypt the body...
$decrypted = trim(openssl_decrypt(base64_decode($encrypted),'AES-256-CBC',substr(sha1($secretKey), 0, 32),OPENSSL_RAW_DATA, base64_decode($iv)), "\0..\32");

error_log("Decrypted: $decrypted");

////UTF8 Encoding, remove escape back slashes, and convert the decrypted string to a JSON object...
$sanitizedData = utf8_encode(stripslashes($decrypted));
$jsonDecodeData = json_decode($decrypted, true);
$jsonDecodeDataString = http_build_query($jsonDecodeData);
0

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

<?php

function ipnVerification() {
$secretKey="YOUR SECRET KEY";
$pop = "";
$ipnFields = array();
foreach ($_POST as $key => $value) {
if ($key == "cverify") {
continue;
}
$ipnFields[] = $key;
}
sort($ipnFields);
foreach ($ipnFields as $field) {
// if Magic Quotes are enabled $_POST[$field] will need to be
// un-escaped before being appended to $pop
$pop = $pop . $_POST[$field] . "|";
}
$pop = $pop . $secretKey;
$calcedVerify = sha1(mb_convert_encoding($pop, "UTF-8"));
$calcedVerify = strtoupper(substr($calcedVerify,0,8));
return $calcedVerify == $_POST["cverify"];
}

?>

Вы можете использовать это для проверки вашего IPN. Это будет работать очень хорошо

-1

По вопросам рекламы [email protected]