PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / trunk
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments vtrunk
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 / Webhooks / WebhooksService.php
surecart / app / src / Webhooks Last commit date
WebhooksService.php 2 years ago WebhooksServiceProvider.php 2 years ago
WebhooksService.php
226 lines
1 <?php
2
3 namespace SureCart\Webhooks;
4
5 use SureCart\Models\ApiToken;
6 use SureCart\Models\IncomingWebhook;
7 use SureCart\Support\Encryption;
8 use SureCart\Support\Server;
9 use SureCart\Support\URL;
10
11 /**
12 * Webhooks service.
13 */
14 class WebhooksService {
15 /**
16 * The registered webhook.
17 *
18 * @var \SureCart\Models\RegisteredWebhook
19 */
20 protected $webhook;
21
22 /**
23 * Get the registered webhook.
24 *
25 * @param \SureCart\Models\RegisteredWebhook $webhook The registered webhook.
26 */
27 public function __construct( \SureCart\Models\RegisteredWebhook $webhook ) {
28 $this->webhook = $webhook;
29 }
30
31 /**
32 * Bootstrap the integration.
33 *
34 * @return void
35 */
36 public function bootstrap() {
37 // delete any old webhook processes.
38 add_action( 'delete_expired_transients', [ $this, 'deleteOldWebhookProcesses' ] );
39 // we can skip this for localhost or non-secure connections.
40 if ( apply_filters( 'surecart/webhooks/localhost/register', $this->isLocalHost() ) || ! is_ssl() ) {
41 return;
42 }
43 // maybe create webhooks if they are not yet created.
44 \add_action( 'admin_init', [ $this, 'maybeCreate' ] );
45 // listen for any domain changes and show notice.
46 \add_action( 'admin_notices', [ $this, 'maybeShowDomainChangeNotice' ] );
47 // verify existing webhooks are functioning properly.
48 // \add_action( 'admin_init', [ $this, 'verify' ] );
49 }
50
51 /**
52 * Delete any webhook processes older than 30 days.
53 *
54 * @return void
55 */
56 public function deleteOldWebhookProcesses() {
57 IncomingWebhook::deleteExpired( apply_filters( 'surecart/webhook/processes/log_expiration', '30 days' ) );
58 }
59
60 /**
61 * Maybe show a notice to the user that the domain has changed.
62 *
63 * This will prompt them to take action to either update the webhook or create a new webhook.
64 *
65 * @return string|null
66 */
67 public function maybeShowDomainChangeNotice() {
68 $webhook = $this->webhook->get();
69
70 // let's handle the error elsewhere.
71 if ( is_wp_error( $webhook ) || empty( $webhook['id'] ) || empty( $webhook['url'] ) ) {
72 return;
73 }
74
75 // the domain matches, so everything is good.
76 if ( $this->webhook->currentDomainMatches() ) {
77 return;
78 }
79
80 // if domain does not match, then show notice.
81 wp_enqueue_style( 'surecart-webhook-admin-notices' );
82 return \SureCart::render(
83 'admin/notices/webhook-change',
84 [
85 'previous_webhook' => $webhook,
86 'update_url' => esc_url( \SureCart::getUrl()->editModel( 'update_webhook', $webhook['id'] ) ),
87 'add_url' => esc_url( \SureCart::getUrl()->editModel( 'create_webhook', '0' ) ),
88 'previous_web_url' => esc_url_raw( URL::getSchemeAndHttpHost( $webhook['url'] ) ),
89 'current_web_url' => esc_url_raw( URL::getSchemeAndHttpHost( $this->webhook->getListenerUrl() ) ),
90 ]
91 );
92 }
93
94 /**
95 * Do we have a token.
96 *
97 * @return boolean
98 */
99 public function hasToken(): bool {
100 return ! empty( ApiToken::get() );
101 }
102
103 /**
104 * May be Create webhooks for this site.
105 *
106 * @return void
107 */
108 public function maybeCreate(): void {
109 // Check for API key and early return if not.
110 if ( ! $this->hasToken() ) {
111 return;
112 }
113
114 // get the saved webhook.
115 $registered = $this->webhook->get();
116
117 // We have one registered already.
118 if ( ! empty( $registered->id ) ) {
119 return;
120 }
121
122 // register the webhooks.
123 $registered = $this->webhook->create();
124
125 // handle error and show notice to user.
126 if ( is_wp_error( $registered ) ) {
127 \SureCart::notices()->add(
128 [
129 'name' => 'webhooks_registration_error',
130 'type' => 'warning',
131 'title' => esc_html__( 'SureCart Webhook Registration Error', 'surecart' ),
132 'text' => sprintf( '<p>%s</p>', ( implode( '<br />', $registered->get_error_messages() ?? [] ) ) ),
133 ]
134 );
135 return;
136 }
137
138 // send a test.
139 $registered->test();
140 }
141
142 /**
143 * Is this localhost?
144 *
145 * @return boolean
146 */
147 public function isLocalHost() {
148 return ( new Server( $this->webhook->getListenerUrl() ) )->isLocalHost();
149 }
150
151 /**
152 * Verify webhooks.
153 *
154 * @return function
155 */
156 // public function verify() {
157 // $webhook = $this->webhook->get();
158
159 // if ( is_wp_error( $webhook ) ) {
160 // not found, let's recreate one.
161 // if ( 'webhook_endpoint.not_found' === $webhook->get_error_code() ) {
162 // delete saved.
163 // $this->webhook->registration()->delete();
164 // create.
165 // return $this->maybeCreate();
166 // }
167
168 // handle other errors.
169 // return \SureCart::notices()->add(
170 // [
171 // 'name' => 'webhooks_general_error',
172 // 'type' => 'error',
173 // 'title' => esc_html__( 'SureCart Webhooks Error', 'surecart' ),
174 // 'text' => sprintf( '<p>%s</p>', ( implode( '<br />', $webhook->get_error_messages() ?? [] ) ) ),
175 // ]
176 // );
177 // }
178
179 // If webhook is not created, show notice.
180 // This should not happen, but just in case.
181 // if ( ! $webhook || empty( $webhook->id ) ) {
182 // return \SureCart::notices()->add(
183 // [
184 // 'name' => 'webhooks_not_created',
185 // 'type' => 'error',
186 // 'title' => esc_html__( 'SureCart Webhooks Error', 'surecart' ),
187 // 'text' => '<p>' . esc_html__( 'Webhooks cannot be created.', 'surecart' ) . '</p>',
188 // ]
189 // );
190 // }
191
192 // Show the grace period notice.
193 // if ( ! empty( $webhook->erroring_grace_period_ends_at ) ) {
194 // $message = [];
195 // $message[] = $webhook->erroring_grace_period_ends_at > time() ? esc_html__( 'Your SureCart webhook connection is being monitored due to errors. This can cause issues with any of your SureCart integrations.', 'surecart' ) : esc_html__( 'Your SureCart webhook connection was disabled due to repeated errors. This can cause issues with any of your SureCart integrations.', 'surecart' );
196 // $message[] = $webhook->erroring_grace_period_ends_at > time() ? sprintf( wp_kses( 'These errors will automatically attempt to be retried, however, we will disable this in <strong>%s</strong> if it continues to fail.', 'surecart' ), human_time_diff( $webhook->erroring_grace_period_ends_at ) ) : sprintf( wp_kses( 'It was automatically disabled %s ago.', 'surecart' ), human_time_diff( $webhook->erroring_grace_period_ends_at ) );
197 // $message[] = __( 'If you have already fixed this you can dismiss this notice.', 'surecart' );
198 // $message[] = '<p>
199 // <a href="' . esc_url( \SureCart::getUrl()->editModel( 'resync_webhook', $webhook['id'] ) ) . '" class="button">' . esc_html__( 'Resync Webhook', 'surecart' ) . '</a>
200 // &nbsp;<a href="' . esc_url( untrailingslashit( SURECART_APP_URL ) . '/developer' ) . '" target="_blank">' . esc_html__( 'Troubleshoot Connection', 'surecart' ) . '</a>
201 // </p>';
202
203 // return \SureCart::notices()->add(
204 // [
205 // 'name' => 'webhooks_erroring_grace_period_' . $webhook->erroring_grace_period_ends_at,
206 // 'type' => 'warning',
207 // 'title' => esc_html__( 'SureCart Webhook Connection', 'surecart' ),
208 // 'text' => sprintf( '<p>%s</p>', ( implode( '<br />', $message ) ) ),
209 // ]
210 // );
211 // }
212 // }
213
214 /**
215 * Get the signing secret stored as encrypted data in the WP database.
216 *
217 * @return string|bool Decrypted value, or false on failure.
218 */
219 public function getSigningSecret() {
220 // Get the registered webhook.
221 $webhook = $this->webhook->get();
222 // Return the signing secret from the registered webhook.
223 return Encryption::decrypt( $webhook['signing_secret'] ?? '' );
224 }
225 }
226