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
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 2.21.13, at includes/Core/Integration/ZohoCampaigns/ZohoCampaignsHandler.php

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