PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 3.3.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v3.3.1
3.3.1 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 All 138 releases
bit-form / includes / Core / Integration / ZohoCampaigns / ZohoCampaignsHandler.php

ZohoCampaignsHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 3.3.1, at includes/Core/Integration/ZohoCampaigns/ZohoCampaignsHandler.php

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