PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.0.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.0.0
4.6.1 4.6.0 4.5.1 4.5.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 4 years ago BuyPageController.php 3 years ago DashboardController.php 3 years ago ProductPageController.php 3 years ago ProductTypePageController.php 3 years ago PurchaseController.php 4 years ago SubscriptionsController.php 4 years ago WebhookController.php 3 years ago
WebhookController.php
178 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 * Recieve webhook
59 */
60 public function receive( $request ) {
61 // get json if sent.
62 if ( 'application/json' === $request->getHeaderLine( 'Content-Type' ) ) {
63 $body = json_decode( $request->getBody(), true );
64 } else {
65 $body = $request->getParsedBody();
66 }
67
68 // the model does not exist.
69 if ( empty( $this->models[ $body['data']['object']['object'] ] ) ) {
70 return \SureCart::json(
71 [
72 'event_triggered' => 'none',
73 ]
74 )
75 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
76 ->withStatus( 200 );
77 }
78
79 // perform the action.
80 $action = $this->doAction( $body );
81
82 // handle the response.
83 return $this->handleResponse( $action );
84 }
85
86 /**
87 * Handle the response back to the webhook.
88 *
89 * @param array|\WP_Error $data Data.
90 * @return function
91 */
92 public function handleResponse( $data ) {
93 // handle the response.
94 if ( is_wp_error( $data ) ) {
95 return \SureCart::json( [ $data->get_error_code() => $data->get_error_message() ] )
96 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
97 ->withStatus( 500 );
98 }
99
100 if ( empty( $data ) ) {
101 return \SureCart::json( [ 'failed' => true ] )
102 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
103 ->withStatus( 400 );
104 }
105
106 return \SureCart::json(
107 [
108 'event_triggered' => $data['event'] ?? 'none',
109 'data' => $data,
110 ]
111 )
112 ->withHeader( 'X-SURECART-WP-PLUGIN-VERSION', \SureCart::plugin()->version() )
113 ->withStatus( 200 );
114 }
115
116 /**
117 * Perform the action.
118 *
119 * @param object $request Request.
120 *
121 * @return array|\WP_Error
122 */
123 public function doAction( $request ) {
124 if ( empty( $request['type'] ) ) {
125 return new \WP_Error( 'missing_type', 'Missing type.' );
126 }
127 if ( empty( $request['data'] ) ) {
128 return new \WP_Error( 'missing_data', 'Missing data.' );
129 }
130
131 // create the event name.
132 $event = $this->createEventName( $request['type'] );
133 $id = $this->getObjectId( $request['data'] );
134 $model = new $this->models[ $request['data']['object']['object'] ]( $request['data']['object'] );
135
136 // broadcast the webhook.
137 do_action( $event, $model, $request );
138
139 // return data.
140 return [
141 'event' => $event,
142 'id' => $id,
143 'request' => $request,
144 ];
145 }
146
147 /**
148 * Replace our dot notation webhook with underscore.
149 *
150 * @param string $type The event type.
151 * @return string
152 */
153 public function createEventName( $type = '' ) {
154 $type = str_replace( '.', '_', $type );
155 return "surecart/$type";
156 }
157
158 /**
159 * Get the first object property in data.
160 *
161 * @param object $data Request data.
162 * @return string
163 */
164 public function getObjectId( $data ) {
165 return $data->object->id ?? '';
166 }
167
168 /**
169 * Find the object name.
170 *
171 * @param object|array $data Request data.
172 * @return string
173 */
174 public function getObjectName( $data ) {
175 return array_key_first( (array) $data );
176 }
177 }
178