add(
[
'name' => 'webhooks_registration_error',
'type' => 'warning',
'title' => esc_html__( 'SureCart Webhook Creation Error', 'surecart' ),
'text' => sprintf( '
%s
', ( implode( '
', $registered->get_error_messages() ?? [] ) ) ),
]
);
}
// test it.
$registered->test();
return \SureCart::redirect()->to( esc_url_raw( admin_url( 'admin.php?page=sc-dashboard' ) ) );
}
/**
* Update the webhook.
*
* @param \SureCartCore\Requests\RequestInterface $request Request.
* @return ResponseInterface
*/
public function update( $request ) {
// Find the registered webhook.
$webhook = RegisteredWebhook::find();
if ( is_wp_error( $webhook ) ) {
wp_die( wp_kses_post( $webhook->get_error_message() ) );
}
// update webhook.
$updated = RegisteredWebhook::update();
// handle error.
if ( is_wp_error( $updated ) ) {
wp_die( wp_kses_post( $updated->get_error_message() ) );
}
return \SureCart::redirect()->to( esc_url_raw( admin_url( 'admin.php?page=sc-dashboard' ) ) );
}
/**
* This deletes and recreates the webhook
* in case the signing secret is invalid for some reason.
*
* @param \SureCartCore\Requests\RequestInterface $request Request.
* @return ResponseInterface
*/
public function resync( $request ) {
// Delete the registered webhook.
$webhook = RegisteredWebhook::registration()->delete();
if ( is_wp_error( $webhook ) ) {
wp_die( wp_kses_post( $webhook->get_error_message() ) );
}
// recreate.
return $this->create( $request );
}
/**
* Recieve webhook.
*
* @param \SureCartCore\Requests\RequestInterface $request Request.
* @return ResponseInterface
*/
public function receive( $request ) {
// get json if sent.
if ( 'application/json' === $request->getHeaderLine( 'Content-Type' ) ) {
$body = json_decode( $request->getBody(), true );
} else {
$body = $request->getParsedBody();
}
// validate body.
if ( empty( $body['type'] ) ) {
return new \WP_Error( 'missing_type', 'Missing type.' );
}
if ( empty( $body['data'] ) ) {
return new \WP_Error( 'missing_data', 'Missing data.' );
}
if ( empty( $body['id'] ) ) {
return new \WP_Error( 'missing_id', 'Missing id.' );
}
// make sure we don't have a duplicate webhook.
$webhook = IncomingWebhook::where( 'webhook_id', $body['id'] )->first();
if ( ! empty( $webhook->id ) ) {
return \SureCart::json(
[
'status' => 'already_handled',
]
)
->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
->withStatus( 200 );
}
// create incoming webhook.
$incoming = IncomingWebhook::create(
[
'webhook_id' => $body['id'],
'data' => $body,
'source' => 'surecart',
]
);
if ( is_wp_error( $incoming ) ) {
return \SureCart::json(
[
'error' => $incoming->get_error_message(),
]
)
->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
->withStatus( 500 );
}
if ( empty( $incoming->id ) ) {
return \SureCart::json(
[
'error' => 'Failed to create webhook.',
]
)
->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
->withStatus( 400 );
}
// dispatch an async request.
\SureCart::async()->data(
[
'id' => $incoming->id,
]
)->dispatch();
// handle the response.
return $this->handleResponse( $incoming->id, $incoming->toArray() );
}
/**
* Handle the response back to the webhook.
*
* @param array|\WP_Error $data Data.
* @return function
*/
public function handleResponse( $id, $data ) {
// handle the response.
if ( is_wp_error( $data ) ) {
return \SureCart::json( [ $data->get_error_code() => $data->get_error_message() ] )
->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
->withStatus( 500 );
}
if ( empty( $data ) ) {
return \SureCart::json( [ 'failed' => true ] )
->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
->withStatus( 400 );
}
return \SureCart::json(
[
'process_id' => $id,
'event_triggered' => $data['event'] ?? 'none',
'data' => $data,
]
)
->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
->withStatus( 200 );
}
}