PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.21.4
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.21.4
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
bit-form / includes / Core / Integration / ZohoSign / ZohoSignHandler.php

ZohoSignHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.21.4, at includes/Core/Integration/ZohoSign/ZohoSignHandler.php

351 lines 11.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * ZohoSign Integration
5 *
6 */
7
8 namespace BitCode\BitForm\Core\Integration\ZohoSign;
9
10 use BitCode\BitForm\Core\Integration\IntegrationHandler;
11 use BitCode\BitForm\Core\Util\HttpHelper;
12 use BitCode\BitForm\Core\Util\IpTool;
13 use BitCode\BitForm\GlobalHelper;
14 use WP_Error;
15
16 /**
17 * Provide functionality for ZohoCrm integration
18 */
19 class ZohoSignHandler
20 {
21 private $_formID;
22 private $_integrationID;
23
24 public function __construct($integrationID, $fromID)
25 {
26 $this->_formID = $fromID;
27 $this->_integrationID = $integrationID;
28 }
29
30 /**
31 * Helps to register ajax function's with wp
32 *
33 * @return null
34 */
35 public static function registerAjax()
36 {
37 add_action('wp_ajax_bitforms_zsign_generate_token', [__CLASS__, 'generateTokens']);
38 add_action('wp_ajax_bitforms_zsign_refresh_templates', [__CLASS__, 'refreshTemplatesAjaxHelper']);
39 add_action('wp_ajax_bitforms_zsign_refresh_template_details', [__CLASS__, 'refreshTemplateDetailsAjaxHelper']);
40 }
41
42 /**
43 * Process ajax request for generate_token
44 *
45 * @return JSON zoho crm api response and status
46 */
47 public static function generateTokens()
48 {
49 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce($_REQUEST['_ajax_nonce'], 'bitforms_save')) {
50 // $inputJSON = file_get_contents('php://input');
51 // $requestsParams = json_decode($inputJSON);
52
53 GlobalHelper::requirePostMethod();
54
55 try {
56 $requestsParams = GlobalHelper::formatRequestData($_POST['data'] ?? []);
57 } catch (\InvalidArgumentException $e) {
58 wp_send_json_error($e->getMessage(), 400);
59 }
60 if (
61 empty($requestsParams->{'accounts-server'})
62 || empty($requestsParams->dataCenter)
63 || empty($requestsParams->clientId)
64 || empty($requestsParams->clientSecret)
65 || empty($requestsParams->redirectURI)
66 || empty($requestsParams->code)
67 ) {
68 wp_send_json_error(
69 __(
70 'Requested parameter is empty',
71 'bit-form'
72 ),
73 400
74 );
75 }
76
77 $apiEndpoint = \urldecode($requestsParams->{'accounts-server'}) . '/oauth/v2/token';
78 $requestParams = [
79 'grant_type' => 'authorization_code',
80 'client_id' => $requestsParams->clientId,
81 'client_secret' => $requestsParams->clientSecret,
82 'redirect_uri' => \urldecode($requestsParams->redirectURI),
83 'code' => $requestsParams->code
84 ];
85 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
86
87 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
88 wp_send_json_error(
89 empty($apiResponse->error) ? 'Unknown' : $apiResponse->error,
90 400
91 );
92 }
93 $apiResponse->generates_on = \time();
94 wp_send_json_success($apiResponse, 200);
95 } else {
96 wp_send_json_error(
97 __(
98 'Token expired',
99 'bit-form'
100 ),
101 401
102 );
103 }
104 }
105
106 /**
107 * Helps to refresh zoho crm access_token
108 *
109 * @param object $apiData Contains required data for refresh access token
110 * @return string|boolean $tokenDetails API token details
111 */
112 protected static function _refreshAccessToken($apiData)
113 {
114 if (
115 empty($apiData->dataCenter)
116 || empty($apiData->clientId)
117 || empty($apiData->clientSecret)
118 || empty($apiData->tokenDetails)
119 ) {
120 return false;
121 }
122 $tokenDetails = $apiData->tokenDetails;
123
124 $dataCenter = $apiData->dataCenter;
125 $apiEndpoint = "https://accounts.zoho.{$dataCenter}/oauth/v2/token";
126 $requestParams = [
127 'grant_type' => 'refresh_token',
128 'client_id' => $apiData->clientId,
129 'client_secret' => $apiData->clientSecret,
130 'refresh_token' => $tokenDetails->refresh_token,
131 ];
132
133 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
134 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
135 return false;
136 }
137 $tokenDetails->generates_on = \time();
138 $tokenDetails->access_token = $apiResponse->access_token;
139 return $tokenDetails;
140 }
141
142 /**
143 * Save updated access_token to avoid unnecessary token generation
144 *
145 * @param integer $fromID ID of Integration related form
146 * @param integer $integrationID ID of Zoho crm Integration
147 * @param object $tokenDetails refreshed token info
148 *
149 * @return null
150 */
151 protected static function _saveRefreshedToken($formID, $integrationID, $tokenDetails, $others = null)
152 {
153 if (empty($formID) || empty($integrationID)) {
154 return;
155 }
156
157 $integrationHandler = new IntegrationHandler($formID, IpTool::getUserDetail());
158 $zsignDetails = $integrationHandler->getAIntegration($integrationID);
159
160 if (is_wp_error($zsignDetails)) {
161 return;
162 }
163 $newDetails = json_decode($zsignDetails[0]->integration_details);
164
165 $newDetails->tokenDetails = $tokenDetails;
166
167 $integrationHandler->updateIntegration($integrationID, $zsignDetails[0]->integration_name, 'Zoho Sign', wp_json_encode($newDetails), 'form');
168 }
169
170 public static function refreshTemplatesAjaxHelper()
171 {
172 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce($_REQUEST['_ajax_nonce'], 'bitforms_save')) {
173 $authorizationHeader = null;
174 // $inputJSON = file_get_contents('php://input');
175 // $queryParams = json_decode($inputJSON);
176
177 GlobalHelper::requirePostMethod();
178
179 try {
180 $queryParams = GlobalHelper::formatRequestData($_POST['data'] ?? []);
181 } catch (\InvalidArgumentException $e) {
182 wp_send_json_error($e->getMessage(), 400);
183 }
184
185 if (
186 empty($queryParams->tokenDetails)
187 || empty($queryParams->dataCenter)
188 || empty($queryParams->clientId)
189 || empty($queryParams->clientSecret)
190 ) {
191 wp_send_json_error(
192 __(
193 'Requested parameter is empty',
194 'bit-form'
195 ),
196 400
197 );
198 }
199
200 $response = [];
201 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
202 $response['tokenDetails'] = ZohoSignHandler::_refreshAccessToken($queryParams);
203 }
204 $templatesMetaApiEndpoint = "https://sign.zoho.{$queryParams->dataCenter}/api/v1/templates";
205
206 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
207 $templatesMetaResponse = HttpHelper::get($templatesMetaApiEndpoint, null, $authorizationHeader);
208
209 $allTemplates = [];
210 if (!is_wp_error($templatesMetaResponse) && empty($templatesMetaResponse->response->error)) {
211 $templates = $templatesMetaResponse->templates;
212 foreach ($templates as $template) {
213 $allTemplates[$template->template_name] = (object) [
214 'templateId' => $template->template_id,
215 'templateName' => $template->template_name
216 ];
217 }
218 uksort($allTemplates, 'strnatcasecmp');
219 $response['templates'] = $allTemplates;
220 } else {
221 wp_send_json_error(
222 $templatesMetaResponse->response->error->message,
223 400
224 );
225 }
226 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
227 ZohoSignHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['templates']);
228 }
229 wp_send_json_success($response, 200);
230 } else {
231 wp_send_json_error(
232 __(
233 'Token expired',
234 'bit-form'
235 ),
236 401
237 );
238 }
239 }
240
241 public static function refreshTemplateDetailsAjaxHelper()
242 {
243 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce($_REQUEST['_ajax_nonce'], 'bitforms_save')) {
244 $authorizationHeader = null;
245 // $inputJSON = file_get_contents('php://input');
246 // $queryParams = json_decode($inputJSON);
247
248 GlobalHelper::requirePostMethod();
249
250 try {
251 $queryParams = GlobalHelper::formatRequestData($_POST['data'] ?? []);
252 } catch (\InvalidArgumentException $e) {
253 wp_send_json_error($e->getMessage(), 400);
254 }
255
256 if (
257 empty($queryParams->tokenDetails)
258 || empty($queryParams->dataCenter)
259 || empty($queryParams->clientId)
260 || empty($queryParams->clientSecret)
261 || empty($queryParams->template)
262 ) {
263 wp_send_json_error(
264 __(
265 'Requested parameter is empty',
266 'bit-form'
267 ),
268 400
269 );
270 }
271 $response = [];
272 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
273 $response['tokenDetails'] = ZohoSignHandler::_refreshAccessToken($queryParams);
274 }
275
276 $templateDetailsMetaApiEndpoint = "https://sign.zoho.{$queryParams->dataCenter}/api/v1/templates/{$queryParams->template}";
277
278 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
279 $templateDetailsMetaResponse = HttpHelper::get($templateDetailsMetaApiEndpoint, null, $authorizationHeader);
280
281 // wp_send_json_success($templateDetailsMetaResponse, 200);
282
283 $details = [];
284 if (!is_wp_error($templateDetailsMetaResponse) && empty($templateDetailsMetaResponse->response->error)) {
285 $templateDetails = $templateDetailsMetaResponse->templates;
286 if (!$templateDetails->is_deleted) {
287 $details['actions'] = $templateDetails->actions;
288 $details['notes'] = $templateDetails->notes;
289 }
290 $response['templateDetails'] = $details;
291 } else {
292 wp_send_json_error(
293 $templateDetailsMetaResponse->response->error->message,
294 400
295 );
296 }
297 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
298 ZohoSignHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['templateDetails']);
299 }
300 wp_send_json_success($response, 200);
301 } else {
302 wp_send_json_error(
303 __(
304 'Token expired',
305 'bit-form'
306 ),
307 401
308 );
309 }
310 }
311
312 public function execute(IntegrationHandler $integrationHandler, $integrationData, $fieldValues, $entryID, $logID)
313 {
314 $integrationDetails = is_string($integrationData->integration_details) ? json_decode($integrationData->integration_details) : $integrationData->integration_details;
315 $templateActions = $integrationDetails->templateActions;
316 $notes = $integrationDetails->notes;
317 $dataCenter = $integrationDetails->dataCenter;
318 $template = $integrationDetails->template;
319 $tokenDetails = $integrationDetails->tokenDetails;
320 if (empty($tokenDetails)) {
321 return new WP_Error('REQ_FIELD_EMPTY', __('module, fields are required for zoho sign api', 'bit-form'));
322 }
323
324 $requiredParams = null;
325 if ((intval($tokenDetails->generates_on) + (55 * 60)) < time()) {
326 $requiredParams['clientId'] = $integrationDetails->clientId;
327 $requiredParams['clientSecret'] = $integrationDetails->clientSecret;
328 $requiredParams['dataCenter'] = $integrationDetails->dataCenter;
329 $requiredParams['tokenDetails'] = $tokenDetails;
330 $newTokenDetails = ZohoSignHandler::_refreshAccessToken((object)$requiredParams);
331 if ($newTokenDetails) {
332 ZohoSignHandler::_saveRefreshedToken($this->_formID, $this->_integrationID, $newTokenDetails);
333 $tokenDetails = $newTokenDetails;
334 }
335 }
336
337 // $actions = $integrationDetails->actions;
338 $recordApiHelper = new RecordApiHelper($tokenDetails, $this->_integrationID, $logID, $this->_formID, $entryID);
339
340 $zsignApiResponse = $recordApiHelper->executeRecordApi(
341 $dataCenter,
342 $template,
343 $templateActions,
344 $notes,
345 $fieldValues
346 );
347
348 return $zsignApiResponse;
349 }
350 }
351