* Added Missing Invoice Getter Methods * Fixed getId Method Array Key * PreciseNumber to getAmount on invoices * Return parseString method on getAmount() * Updated Signature Key, Exception Condition * Lightning Internal Node Updates & Tests * cs-fix * skipping all tests since they are live * Bumped php version * Removed Null safe returns * removed credentials * fix psalm * php CurlHandle * Removed null safe from status enum * dotenv for testing * protected properties * all .env in setup * Create Invoice within a Test, Throw if variables aren't set * Cleaned up Setup * cs fix * Cleaned up isset env vars * fixed phpunit indent
180 lines
5.8 KiB
PHP
180 lines
5.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
// Include autoload file.
|
|
require __DIR__ . '/../vendor/autoload.php';
|
|
|
|
// Import Invoice client class.
|
|
use BTCPayServer\Client\Invoice;
|
|
use BTCPayServer\Client\Webhook;
|
|
|
|
class WebhookExample
|
|
{
|
|
public $apiKey;
|
|
public $host;
|
|
public $storeId;
|
|
public $secret;
|
|
public $webhookId;
|
|
|
|
public function __construct()
|
|
{
|
|
// Fill in with your BTCPay Server data.
|
|
$this->apiKey = '';
|
|
$this->host = ''; // e.g. https://your.btcpay-server.tld
|
|
$this->storeId = '';
|
|
$this->secret = ''; // webhook secret as shown in the webhook UI / returned by createWebhook()
|
|
$this->webhookId = ''; // only needed for the updateWebhook() example.
|
|
}
|
|
|
|
public function processWebhook()
|
|
{
|
|
$myfile = fopen("BTCPay.log", 'ab');
|
|
$raw_post_data = file_get_contents('php://input');
|
|
|
|
$date = date('m/d/Y h:i:s a');
|
|
|
|
if (false === $raw_post_data) {
|
|
fwrite(
|
|
$myfile,
|
|
$date . " : Error. Could not read from the php://input stream or invalid BTCPayServer payload received.\n"
|
|
);
|
|
fclose($myfile);
|
|
throw new \RuntimeException(
|
|
'Could not read from the php://input stream or invalid BTCPayServer payload received.'
|
|
);
|
|
}
|
|
|
|
$payload = json_decode($raw_post_data, false, 512, JSON_THROW_ON_ERROR);
|
|
|
|
if (empty($payload)) {
|
|
fwrite(
|
|
$myfile,
|
|
$date . " : Error. Could not decode the JSON payload from BTCPay.\n"
|
|
);
|
|
fclose($myfile);
|
|
throw new \RuntimeException('Could not decode the JSON payload from BTCPay.');
|
|
}
|
|
|
|
// verify hmac256
|
|
$headers = getallheaders();
|
|
foreach ($headers as $key => $value) {
|
|
if (strtolower($key) === 'btcpay-sig') {
|
|
$sig = $value;
|
|
}
|
|
}
|
|
|
|
$webhookClient = new Webhook($this->host, $this->apiKey);
|
|
|
|
if (!$webhookClient->isIncomingWebhookRequestValid($raw_post_data, $sig, $this->secret)) {
|
|
fwrite(
|
|
$myfile,
|
|
$date . " : Error. Invalid Signature detected! \n was: " . $sig . " should be: " . hash_hmac(
|
|
'sha256',
|
|
$raw_post_data,
|
|
$this->secret
|
|
) . "\n"
|
|
);
|
|
fclose($myfile);
|
|
throw new \RuntimeException(
|
|
'Invalid BTCPayServer payment notification message received - signature did not match.'
|
|
);
|
|
}
|
|
|
|
if (true === empty($payload->invoiceId)) {
|
|
fwrite(
|
|
$myfile,
|
|
$date . " : Error. Invalid BTCPayServer payment notification message received - did not receive invoice ID.\n"
|
|
);
|
|
fclose($myfile);
|
|
throw new \RuntimeException(
|
|
'Invalid BTCPayServer payment notification message received - did not receive invoice ID.'
|
|
);
|
|
}
|
|
|
|
// Load an existing invoice with the provided invoiceId.
|
|
// Most of the time this is not needed as you can listen to specific webhook events
|
|
// See: https://docs.btcpayserver.org/API/Greenfield/v1/#tag/Webhooks/paths/InvoiceCreated/post
|
|
try {
|
|
$client = new Invoice($this->host, $this->apiKey);
|
|
$invoice = $client->getInvoice($this->storeId, $payload->invoiceId);
|
|
} catch (\Throwable $e) {
|
|
fwrite($myfile, "Error: " . $e->getMessage());
|
|
throw $e;
|
|
}
|
|
|
|
// optional: check whether your webhook is of the desired type
|
|
if ($payload->type !== "InvoiceSettled") {
|
|
throw new \RuntimeException(
|
|
'Invalid payload message type. Only InvoiceSettled is supported, check the configuration of the webhook.'
|
|
);
|
|
}
|
|
|
|
$invoicePrice = $invoice->getData()['amount'];
|
|
$buyerEmail = $invoice->getData()['metadata']['buyerEmail'];
|
|
|
|
fwrite(
|
|
$myfile,
|
|
$date . " : Payload received for BtcPay invoice " . $payload->invoiceId . " Type: " . $payload->type . " Price: " . $invoicePrice . " E-Mail: " . $buyerEmail . "\n"
|
|
);
|
|
fwrite($myfile, "Raw payload: " . $raw_post_data . "\n");
|
|
|
|
// your own processing code goes here!
|
|
|
|
echo 'OK';
|
|
}
|
|
|
|
public function createWebhook()
|
|
{
|
|
$url = 'https://createdurl.test.example.com/webhook';
|
|
$specificEvents = [
|
|
'InvoiceExpired',
|
|
'InvoiceSettled',
|
|
'InvoiceInvalid'
|
|
];
|
|
|
|
try {
|
|
$client = new \BTCPayServer\Client\Webhook($this->host, $this->apiKey);
|
|
var_dump($client->createWebhook($this->storeId, $url, $specificEvents, null));
|
|
} catch (\Throwable $e) {
|
|
echo "Error: " . $e->getMessage();
|
|
}
|
|
}
|
|
|
|
public function updateWebhook()
|
|
{
|
|
$url = 'https://updatedurl.test.example.com/webhook';
|
|
$specificEvents = [
|
|
'InvoiceReceivedPayment',
|
|
'InvoicePaymentSettled',
|
|
'InvoiceProcessing',
|
|
'InvoiceExpired',
|
|
'InvoiceSettled',
|
|
'InvoiceInvalid'
|
|
];
|
|
|
|
try {
|
|
$client = new \BTCPayServer\Client\Webhook($this->host, $this->apiKey);
|
|
var_dump($client->updateWebhook($this->storeId, $url, $this->webhookId, $specificEvents));
|
|
} catch (\Throwable $e) {
|
|
echo "Error: " . $e->getMessage();
|
|
}
|
|
}
|
|
|
|
public function getWebhook()
|
|
{
|
|
try {
|
|
$client = new \BTCPayServer\Client\Webhook($this->host, $this->apiKey);
|
|
var_dump($client->getWebhook($this->storeId, $this->webhookId));
|
|
} catch (\Throwable $e) {
|
|
echo "Error: " . $e->getMessage();
|
|
}
|
|
}
|
|
}
|
|
|
|
$wh = new WebhookExample();
|
|
//$wh->processWebhook();
|
|
//$wh->createWebhook();
|
|
//$wh->getWebhook();
|
|
//$wh->updateWebhook();
|