btcpayserver-greenfield-php/examples/webhook.php
utxo.one c4202a731c
Lightning Internal Node Updates & Tests (#74)
* 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
2022-10-26 23:35:00 +02:00

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();