PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.29.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.29.0
4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / Controllers / Web / WebhookController.php
surecart / app / src / Controllers / Web Last commit date
.gitkeep 3 years ago BasePageController.php 2 years ago BuyPageController.php 2 years ago CheckoutFormsController.php 2 years ago CollectionPageController.php 2 years ago DashboardController.php 2 years ago ProductPageController.php 2 years ago PurchaseController.php 3 years ago SubscriptionsController.php 3 years ago UpsellPageController.php 2 years ago WebhookController.php 2 years ago
WebhookController.php
192 lines
1 <?php
2
3 namespace SureCart\Controllers\Web;
4
5 use SureCart\Models\IncomingWebhook;
6 use SureCart\Models\RegisteredWebhook;
7 use SureCartVendors\Psr\Http\Message\ResponseInterface;
8
9 /**
10 * Handles webhooks
11 */
12 class WebhookController {
13 /**
14 * Create new webhook for this site.
15 *
16 * @param \SureCartCore\Requests\RequestInterface $request Request.
17 * @return ResponseInterface
18 */
19 public function create( $request ) {
20 // We'll create a webhook for this site register the webhooks.
21 $registered = RegisteredWebhook::create();
22
23 // handle error and show notice to user.
24 if ( is_wp_error( $registered ) ) {
25 // show notice.
26 \SureCart::notices()->add(
27 [
28 'name' => 'webhooks_registration_error',
29 'type' => 'warning',
30 'title' => esc_html__( 'SureCart Webhook Creation Error', 'surecart' ),
31 'text' => sprintf( '<p>%s</p>', ( implode( '<br />', $registered->get_error_messages() ?? [] ) ) ),
32 ]
33 );
34 }
35
36 // test it.
37 $registered->test();
38
39 return \SureCart::redirect()->to( esc_url_raw( admin_url( 'admin.php?page=sc-dashboard' ) ) );
40 }
41
42 /**
43 * Update the webhook.
44 *
45 * @param \SureCartCore\Requests\RequestInterface $request Request.
46 * @return ResponseInterface
47 */
48 public function update( $request ) {
49 // Find the registered webhook.
50 $webhook = RegisteredWebhook::find();
51 if ( is_wp_error( $webhook ) ) {
52 wp_die( wp_kses_post( $webhook->get_error_message() ) );
53 }
54
55 // update webhook.
56 $updated = RegisteredWebhook::update();
57
58 // handle error.
59 if ( is_wp_error( $updated ) ) {
60 wp_die( wp_kses_post( $updated->get_error_message() ) );
61 }
62
63 return \SureCart::redirect()->to( esc_url_raw( admin_url( 'admin.php?page=sc-dashboard' ) ) );
64 }
65
66 /**
67 * This deletes and recreates the webhook
68 * in case the signing secret is invalid for some reason.
69 *
70 * @param \SureCartCore\Requests\RequestInterface $request Request.
71 * @return ResponseInterface
72 */
73 public function resync( $request ) {
74 // Delete the registered webhook.
75 $webhook = RegisteredWebhook::registration()->delete();
76 if ( is_wp_error( $webhook ) ) {
77 wp_die( wp_kses_post( $webhook->get_error_message() ) );
78 }
79
80 // recreate.
81 return $this->create( $request );
82 }
83
84 /**
85 * Recieve webhook.
86 *
87 * @param \SureCartCore\Requests\RequestInterface $request Request.
88 * @return ResponseInterface
89 */
90 public function receive( $request ) {
91 // get json if sent.
92 if ( 'application/json' === $request->getHeaderLine( 'Content-Type' ) ) {
93 $body = json_decode( $request->getBody(), true );
94 } else {
95 $body = $request->getParsedBody();
96 }
97
98 // validate body.
99 if ( empty( $body['type'] ) ) {
100 return new \WP_Error( 'missing_type', 'Missing type.' );
101 }
102 if ( empty( $body['data'] ) ) {
103 return new \WP_Error( 'missing_data', 'Missing data.' );
104 }
105 if ( empty( $body['id'] ) ) {
106 return new \WP_Error( 'missing_id', 'Missing id.' );
107 }
108
109 // make sure we don't have a duplicate webhook.
110 $webhook = IncomingWebhook::where( 'webhook_id', $body['id'] )->first();
111 if ( ! empty( $webhook->id ) ) {
112 return \SureCart::json(
113 [
114 'status' => 'already_handled',
115 ]
116 )
117 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
118 ->withStatus( 200 );
119 }
120
121 // create incoming webhook.
122 $incoming = IncomingWebhook::create(
123 [
124 'webhook_id' => $body['id'],
125 'data' => $body,
126 'source' => 'surecart',
127 ]
128 );
129
130 if ( is_wp_error( $incoming ) ) {
131 return \SureCart::json(
132 [
133 'error' => $incoming->get_error_message(),
134 ]
135 )
136 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
137 ->withStatus( 500 );
138 }
139
140 if ( empty( $incoming->id ) ) {
141 return \SureCart::json(
142 [
143 'error' => 'Failed to create webhook.',
144 ]
145 )
146 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
147 ->withStatus( 400 );
148 }
149
150 // dispatch an async request.
151 \SureCart::async()->data(
152 [
153 'id' => $incoming->id,
154 ]
155 )->dispatch();
156
157 // handle the response.
158 return $this->handleResponse( $incoming->id, $incoming->toArray() );
159 }
160
161 /**
162 * Handle the response back to the webhook.
163 *
164 * @param array|\WP_Error $data Data.
165 * @return function
166 */
167 public function handleResponse( $id, $data ) {
168 // handle the response.
169 if ( is_wp_error( $data ) ) {
170 return \SureCart::json( [ $data->get_error_code() => $data->get_error_message() ] )
171 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
172 ->withStatus( 500 );
173 }
174
175 if ( empty( $data ) ) {
176 return \SureCart::json( [ 'failed' => true ] )
177 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
178 ->withStatus( 400 );
179 }
180
181 return \SureCart::json(
182 [
183 'process_id' => $id,
184 'event_triggered' => $data['event'] ?? 'none',
185 'data' => $data,
186 ]
187 )
188 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
189 ->withStatus( 200 );
190 }
191 }
192