PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 1.4.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v1.4.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 DashboardController.php 3 years ago PurchaseController.php 3 years ago SubscriptionsController.php 3 years ago WebhookController.php 3 years ago
WebhookController.php
191 lines
1 <?php
2 namespace SureCart\Controllers\Web;
3
4 use SureCart\Models\Webhook;
5 use SureCart\Webhooks\WebhooksHistoryService;
6 use SureCartCore\Responses\RedirectResponse;
7
8 /**
9 * Handles webhooks
10 */
11 class WebhookController {
12 /**
13 * Map object names to their models.
14 *
15 * @var array
16 */
17 protected $models = [
18 'charge' => \SureCart\Models\Charge::class,
19 'coupon' => \SureCart\Models\Coupon::class,
20 'customer' => \SureCart\Models\Customer::class,
21 'purchase' => \SureCart\Models\Purchase::class,
22 'price' => \SureCart\Models\Price::class,
23 'product' => \SureCart\Models\Product::class,
24 'period' => \SureCart\Models\Period::class,
25 'order' => \SureCart\Models\Order::class,
26 'refund' => \SureCart\Models\Refund::class,
27 'subscription' => \SureCart\Models\Subscription::class,
28 'invoice' => \SureCart\Models\Invoice::class,
29 ];
30
31 /**
32 * Remove the webhook.
33 *
34 * @param \SureCartCore\Requests\RequestInterface $request Request.
35 * @return function
36 */
37 public function remove( $request ) {
38 $deleted = Webhook::delete( $request->query( 'id' ) );
39 if ( is_wp_error( $deleted ) ) {
40 wp_die( $deleted->get_error_message() );
41 }
42 return ( new RedirectResponse( $request ) )->back();
43 }
44
45 /**
46 * Remove the webhook.
47 *
48 * @param \SureCartCore\Requests\RequestInterface $request Request.
49 * @return function
50 */
51 public function ignore( $request ) {
52 $service = new WebHooksHistoryService();
53 $service->deletePreviousWebhook();
54 return ( new RedirectResponse( $request ) )->back();
55 }
56
57 /**
58 * Create a webhook for this install.
59 */
60 public function create() {
61 return Webhook::create(
62 [
63 'description' => 'Main webhook for SureCart',
64 'enabled' => true,
65 'url' => \SureCart::routeUrl( 'webhooks.receive' ),
66 ]
67 );
68 }
69
70 /**
71 * Recieve webhook
72 */
73 public function receive( $request ) {
74 // get json if sent.
75 if ( 'application/json' === $request->getHeaderLine( 'Content-Type' ) ) {
76 $body = json_decode( $request->getBody(), true );
77 } else {
78 $body = $request->getParsedBody();
79 }
80
81 // the model does not exist.
82 if ( empty( $this->models[ $body['data']['object']['object'] ] ) ) {
83 return \SureCart::json(
84 [
85 'event_triggered' => 'none',
86 ]
87 )
88 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
89 ->withStatus( 200 );
90 }
91
92 // perform the action.
93 $action = $this->doAction( $body );
94
95 // handle the response.
96 return $this->handleResponse( $action );
97 }
98
99 /**
100 * Handle the response back to the webhook.
101 *
102 * @param array|\WP_Error $data Data.
103 * @return function
104 */
105 public function handleResponse( $data ) {
106 // handle the response.
107 if ( is_wp_error( $data ) ) {
108 return \SureCart::json( [ $data->get_error_code() => $data->get_error_message() ] )
109 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
110 ->withStatus( 500 );
111 }
112
113 if ( empty( $data ) ) {
114 return \SureCart::json( [ 'failed' => true ] )
115 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
116 ->withStatus( 400 );
117 }
118
119 return \SureCart::json(
120 [
121 'event_triggered' => $data['event'] ?? 'none',
122 'data' => $data,
123 ]
124 )
125 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
126 ->withStatus( 200 );
127 }
128
129 /**
130 * Perform the action.
131 *
132 * @param object $request Request.
133 *
134 * @return array|\WP_Error
135 */
136 public function doAction( $request ) {
137 if ( empty( $request['type'] ) ) {
138 return new \WP_Error( 'missing_type', 'Missing type.' );
139 }
140 if ( empty( $request['data'] ) ) {
141 return new \WP_Error( 'missing_data', 'Missing data.' );
142 }
143
144 // create the event name.
145 $event = $this->createEventName( $request['type'] );
146 $id = $this->getObjectId( $request['data'] );
147 $model = new $this->models[ $request['data']['object']['object'] ]( $request['data'] );
148
149 // broadcast the webhook.
150 do_action( $event, $model, $request );
151
152 // return data.
153 return [
154 'event' => $event,
155 'id' => $id,
156 'request' => $request,
157 ];
158 }
159
160 /**
161 * Replace our dot notation webhook with underscore.
162 *
163 * @param string $type The event type.
164 * @return string
165 */
166 public function createEventName( $type = '' ) {
167 $type = str_replace( '.', '_', $type );
168 return "surecart/$type";
169 }
170
171 /**
172 * Get the first object property in data.
173 *
174 * @param object $data Request data.
175 * @return string
176 */
177 public function getObjectId( $data ) {
178 return $data->object->id ?? '';
179 }
180
181 /**
182 * Find the object name.
183 *
184 * @param object|array $data Request data.
185 * @return string
186 */
187 public function getObjectName( $data ) {
188 return array_key_first( (array) $data );
189 }
190 }
191