PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.21.13
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.21.13
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.13, at includes/Core/Integration/ZohoSign/ZohoSignHandler.php

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