PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.3.7
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.3.7
4.4.9 4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 All 140 releases
learnpress / inc / rest-api / v1 / frontend / class-lp-rest-gateway-webhook-controller.php

class-lp-rest-gateway-webhook-controller.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.3.7, at inc/rest-api/v1/frontend/class-lp-rest-gateway-webhook-controller.php

153 lines 4.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 use LearnPress\Helpers\Response;
3
4 defined( 'ABSPATH' ) || exit();
5
6 if ( ! class_exists( 'LP_REST_Gateway_Webhook_Controller' ) ) {
7 /**
8 * REST API endpoint for gateway subscription webhooks.
9 *
10 * @since 4.3.7
11 * @version 1.0.0
12 */
13 class LP_REST_Gateway_Webhook_Controller extends LP_Abstract_REST_Controller {
14 /**
15 * Configure REST namespace/base for gateway webhook routes.
16 *
17 * @return void
18 */
19 public function __construct() {
20 $this->namespace = 'lp/v1';
21 $this->rest_base = 'gateways';
22
23 parent::__construct();
24 }
25
26 /**
27 * Register public subscription webhook route.
28 *
29 * Path pattern: /lp/v1/gateways/{gateway}/subscription-webhook
30 *
31 * @return void
32 */
33 public function register_routes() {
34 $this->routes = array(
35 '(?P<gateway>[a-zA-Z0-9_-]+)/subscription-webhook' => array(
36 array(
37 'methods' => WP_REST_Server::ALLMETHODS,
38 'callback' => array( $this, 'listen_subscription_webhook' ),
39 'permission_callback' => '__return_true',
40 ),
41 ),
42 );
43
44 parent::register_routes();
45 }
46
47 /**
48 * Dispatch provider subscription webhook to gateway implementation.
49 *
50 * This is the centralized entrypoint used by Stripe/PayPal webhook calls.
51 *
52 * @param WP_REST_Request $request
53 *
54 * @return Response
55 * @since 4.3.7
56 * @version 1.0.0
57 */
58 public function listen_subscription_webhook( WP_REST_Request $request ): Response {
59 $response = new Response();
60
61 try {
62 $gateway_id = sanitize_key( (string) $request->get_param( 'gateway' ) );
63 if ( empty( $gateway_id ) ) {
64 throw new Exception( __( 'Gateway is required.', 'learnpress' ), 400 );
65 }
66
67 $gateway = LP_Gateways::instance()->get_gateway( $gateway_id );
68 if ( ! $gateway instanceof LP_Gateway_Abstract ) {
69 throw new Exception( __( 'Gateway not found.', 'learnpress' ), 404 );
70 }
71
72 if ( ! $gateway->is_enabled() ) {
73 throw new Exception( __( 'Gateway is not enable.', 'learnpress' ), 404 );
74 }
75
76 LP_Debug::log_to_comment( 'Webhook payload: ' . json_encode( $request->get_body(), JSON_UNESCAPED_UNICODE ) );
77
78 // Test
79 if ( isset( $_GET['pay'] ) ) {
80 /** @var LP_Gateway_Paypal $gateway */
81 $plan = $gateway->get_plan( 'P-8N4379132G8477049NIFPNJY' );
82
83 $data_pay = [
84 'lp_order_id' => 94,
85 // 'plan_id' => 'P-8N4379132G8477049NIFPNJY', // Not setup fee, trial 10 day
86 // 'plan_id' => 'P-13E70519U63465016NIGWAMI', // Not fee, Not trial
87 // 'plan_id' => 'P-4FB01122917417635NIHNBWI', // Fee, trial
88 'plan_id' => 'P-2MM29025B1701164HNIH4WGA', // Plan one day
89 ];
90 $g = $gateway->pay_via_subscription( $data_pay );
91 $m = 2;
92 return $response;
93 }
94 // End test
95
96 /**
97 * @var LP_Gateway_Paypal|LP_Gateway_Stripe $gateway
98 */
99 $gateway->capture_subscription_webhook( $request );
100 } catch ( Throwable $e ) {
101 LP_Debug::error_log( $e );
102 $response->message = $e->getMessage();
103 }
104
105 return $response;
106 }
107
108 /**
109 * Build sanitized REST error response for public webhook endpoint.
110 *
111 * Internal provider error details are logged server-side, while API
112 * response returns a generic/safe message by status class.
113 *
114 * @param Throwable $error
115 *
116 * @return WP_REST_Response
117 */
118 protected function build_error_response( Throwable $error ): WP_REST_Response {
119 $status = absint( $error->getCode() );
120 if ( $status < 100 || $status > 599 ) {
121 $status = 400;
122 }
123
124 $error_code = 'lp_subscription_webhook_error';
125 $private_message = (string) $error->getMessage();
126 $public_message = __( 'Invalid webhook request.', 'learnpress' );
127
128 if ( 429 === $status ) {
129 $public_message = __( 'Too many webhook requests.', 'learnpress' );
130 } elseif ( 413 === $status ) {
131 $public_message = __( 'Webhook payload too large.', 'learnpress' );
132 }
133
134 error_log(
135 sprintf(
136 'LP subscription webhook error [%s]: %s',
137 $error_code,
138 $private_message
139 )
140 );
141
142 return new WP_REST_Response(
143 array(
144 'status' => 'error',
145 'code' => $error_code,
146 'message' => $public_message,
147 ),
148 $status
149 );
150 }
151 }
152 }
153