Skip to content

Instantly share code, notes, and snippets.

@goranefbl
Last active September 8, 2024 10:12
Show Gist options
  • Save goranefbl/2b8b11d74fa174e3c383203f04651399 to your computer and use it in GitHub Desktop.
Save goranefbl/2b8b11d74fa174e3c383203f04651399 to your computer and use it in GitHub Desktop.
reach webhooks
<?php
// Exit if accessed directly
if (!defined('ABSPATH')) {
exit;
}
add_action('rest_api_init', 'register_withreach_webhook_endpoint');
function register_withreach_webhook_endpoint() {
register_rest_route('withreach/v1', '/webhook', array(
'methods' => 'POST',
'callback' => 'handle_withreach_webhook',
'permission_callback' => 'verify_withreach_signature'
));
}
function verify_withreach_signature($request) {
$secret = 'your_withreach_secret_key';
$signature = $request->get_header('reach-signature');
$payload = $request->get_body();
$expected_signature = base64_encode(hash_hmac('sha256', $payload, $secret, true));
return hash_equals($expected_signature, $signature);
}
function handle_withreach_webhook($request) {
$data = $request->get_json_params();
switch ($data['EventType']) {
case 'ORDER_PROCESSED':
handle_order_processed($data['Order']);
break;
case 'ORDER_DECLINED':
handle_order_declined($data['Order']);
break;
case 'REFUND_SUCCEEDED':
handle_refund_succeeded($data['Refund']);
break;
case 'REFUND_FAILED':
handle_refund_failed($data['Refund']);
break;
}
return new WP_REST_Response('Webhook received and processed', 200);
}
function handle_order_processed($order_data) {
$order = wc_get_order($order_data['MerchantReference']);
if ($order) {
$order->update_status('processing', 'Payment processed by WithReach');
$order->save();
}
}
function handle_order_declined($order_data) {
$order = wc_get_order($order_data['MerchantReference']);
if ($order) {
$order->update_status('failed', 'Payment declined by WithReach');
$order->save();
}
}
function handle_refund_succeeded($refund_data) {
$order = wc_get_order($refund_data['OrderId']);
if ($order) {
wc_create_refund(array(
'amount' => $refund_data['Amount'],
'reason' => 'Refund processed by WithReach',
'order_id' => $order->get_id(),
));
}
}
function handle_refund_failed($refund_data) {
$order = wc_get_order($refund_data['OrderId']);
if ($order) {
$order->add_order_note('Refund failed: ' . $refund_data['RefundId']);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment