PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.13.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.13.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 CollectionPageController.php 2 years ago DashboardController.php 3 years ago ProductPageController.php 2 years ago PurchaseController.php 3 years ago SubscriptionsController.php 3 years ago WebhookController.php 2 years ago
WebhookController.php
195 lines
1 <?php
2
3 namespace SureCart\Controllers\Web;
4
5 use SureCart\Models\IncomingWebhook;
6 use SureCart\Models\RegisteredWebhook;
7 use SureCartCore\Responses\RedirectResponse;
8 use SureCartVendors\Psr\Http\Message\ResponseInterface;
9
10 /**
11 * Handles webhooks
12 */
13 class WebhookController {
14 /**
15 * Create new webhook for this site.
16 *
17 * @param \SureCartCore\Requests\RequestInterface $request Request.
18 * @return ResponseInterface
19 */
20 public function create( $request ) {
21 // We'll create a webhook for this site register the webhooks.
22 $registered = RegisteredWebhook::create();
23
24 // handle error and show notice to user.
25 if ( is_wp_error( $registered ) ) {
26 // show notice.
27 \SureCart::notices()->add(
28 [
29 'name' => 'webhooks_registration_error',
30 'type' => 'warning',
31 'title' => esc_html__( 'SureCart Webhook Creation Error', 'surecart' ),
32 'text' => sprintf( '<p>%s</p>', ( implode( '<br />', $registered->get_error_messages() ?? [] ) ) ),
33 ]
34 );
35 }
36
37 // test it.
38 $registered->test();
39
40 // respond back.
41 return ( new RedirectResponse( $request ) )->back();
42 }
43
44 /**
45 * Update the webhook.
46 *
47 * @param \SureCartCore\Requests\RequestInterface $request Request.
48 * @return ResponseInterface
49 */
50 public function update( $request ) {
51 // Find the registered webhook.
52 $webhook = RegisteredWebhook::find();
53 if ( is_wp_error( $webhook ) ) {
54 wp_die( wp_kses_post( $webhook->get_error_message() ) );
55 }
56
57 // update webhook.
58 $updated = RegisteredWebhook::update();
59
60 // handle error.
61 if ( is_wp_error( $updated ) ) {
62 wp_die( wp_kses_post( $updated->get_error_message() ) );
63 }
64
65 // redirect back.
66 return ( new RedirectResponse( $request ) )->back();
67 }
68
69 /**
70 * This deletes and recreates the webhook
71 * in case the signing secret is invalid for some reason.
72 *
73 * @param \SureCartCore\Requests\RequestInterface $request Request.
74 * @return ResponseInterface
75 */
76 public function resync( $request ) {
77 // Delete the registered webhook.
78 $webhook = RegisteredWebhook::registration()->delete();
79 if ( is_wp_error( $webhook ) ) {
80 wp_die( wp_kses_post( $webhook->get_error_message() ) );
81 }
82
83 // recreate.
84 return $this->create( $request );
85 }
86
87 /**
88 * Recieve webhook.
89 *
90 * @param \SureCartCore\Requests\RequestInterface $request Request.
91 * @return ResponseInterface
92 */
93 public function receive( $request ) {
94 // get json if sent.
95 if ( 'application/json' === $request->getHeaderLine( 'Content-Type' ) ) {
96 $body = json_decode( $request->getBody(), true );
97 } else {
98 $body = $request->getParsedBody();
99 }
100
101 // validate body.
102 if ( empty( $body['type'] ) ) {
103 return new \WP_Error( 'missing_type', 'Missing type.' );
104 }
105 if ( empty( $body['data'] ) ) {
106 return new \WP_Error( 'missing_data', 'Missing data.' );
107 }
108 if ( empty( $body['id'] ) ) {
109 return new \WP_Error( 'missing_id', 'Missing id.' );
110 }
111
112 // make sure we don't have a duplicate webhook.
113 $webhook = IncomingWebhook::where( 'webhook_id', $body['id'] )->first();
114 if ( ! empty( $webhook->id ) ) {
115 return \SureCart::json(
116 [
117 'status' => 'already_handled',
118 ]
119 )
120 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
121 ->withStatus( 200 );
122 }
123
124 // create incoming webhook.
125 $incoming = IncomingWebhook::create(
126 [
127 'webhook_id' => $body['id'],
128 'data' => $body,
129 'source' => 'surecart',
130 ]
131 );
132
133 if ( is_wp_error( $incoming ) ) {
134 return \SureCart::json(
135 [
136 'error' => $incoming->get_error_message(),
137 ]
138 )
139 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
140 ->withStatus( 500 );
141 }
142
143 if ( empty( $incoming->id ) ) {
144 return \SureCart::json(
145 [
146 'error' => 'Failed to create webhook.',
147 ]
148 )
149 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
150 ->withStatus( 400 );
151 }
152
153 // dispatch an async request.
154 \SureCart::async()->data(
155 [
156 'id' => $incoming->id,
157 ]
158 )->dispatch();
159
160 // handle the response.
161 return $this->handleResponse( $incoming->id, $incoming->toArray() );
162 }
163
164 /**
165 * Handle the response back to the webhook.
166 *
167 * @param array|\WP_Error $data Data.
168 * @return function
169 */
170 public function handleResponse( $id, $data ) {
171 // handle the response.
172 if ( is_wp_error( $data ) ) {
173 return \SureCart::json( [ $data->get_error_code() => $data->get_error_message() ] )
174 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
175 ->withStatus( 500 );
176 }
177
178 if ( empty( $data ) ) {
179 return \SureCart::json( [ 'failed' => true ] )
180 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
181 ->withStatus( 400 );
182 }
183
184 return \SureCart::json(
185 [
186 'process_id' => $id,
187 'event_triggered' => $data['event'] ?? 'none',
188 'data' => $data,
189 ]
190 )
191 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
192 ->withStatus( 200 );
193 }
194 }
195