shell bypass 403
<?php
/*
* SendPulse REST API Client
*
* Documentation
* https://login.sendpulse.com/manual/rest-api/
* https://sendpulse.com/api
*
*/
namespace Sendpulse\RestApi;
use Exception;
use Sendpulse\RestApi\Storage\FileStorage;
use Sendpulse\RestApi\Storage\TokenStorageInterface;
use stdClass;
class ApiClient implements ApiInterface
{
private $apiUrl = 'https://api.sendpulse.com';
private $userId;
private $secret;
private $token;
private $refreshToken = 0;
private $retry = false;
/**
* @var null|TokenStorageInterface
*/
private $tokenStorage;
/**
* Sendpulse API constructor
*
* @param $userId
* @param $secret
* @param TokenStorageInterface $tokenStorage
*
* @throws Exception
*/
public function __construct($userId, $secret, TokenStorageInterface $tokenStorage = null)
{
if ($tokenStorage === null) {
$tokenStorage = new FileStorage();
}
if (empty($userId) || empty($secret)) {
throw new Exception('Empty ID or SECRET');
}
$this->userId = $userId;
$this->secret = $secret;
$this->tokenStorage = $tokenStorage;
$hashName = md5($userId . '::' . $secret);
/** load token from storage */
$this->token = $this->tokenStorage->get($hashName);
if (empty($this->token) && !$this->getToken()) {
throw new Exception('Could not connect to api, check your ID and SECRET');
}
}
/**
* Get token and store it
*
* @return bool
*/
private function getToken()
{
$data = array(
'grant_type' => 'client_credentials',
'client_id' => $this->userId,
'client_secret' => $this->secret,
);
$requestResult = $this->sendRequest('oauth/access_token', 'POST', $data, false);
if ($requestResult->http_code !== 200) {
return false;
}
$this->refreshToken = 0;
$this->token = $requestResult->data->access_token;
$hashName = md5($this->userId . '::' . $this->secret);
/** Save token to storage */
$this->tokenStorage->set($hashName, $this->token);
return true;
}
/**
* Form and send request to API service
*
* @param $path
* @param string $method
* @param array $data
* @param bool $useToken
*
* @return stdClass
*/
protected function sendRequest($path, $method = 'GET', $data = array(), $useToken = true)
{
$url = $this->apiUrl . '/' . $path;
$method = strtoupper($method);
$curl = curl_init();
if ($useToken && !empty($this->token)) {
$headers = array('Authorization: Bearer ' . $this->token, 'Expect:');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
switch ($method) {
case 'POST':
curl_setopt($curl, CURLOPT_POST, count($data));
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
break;
case 'PUT':
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
break;
case 'DELETE':
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
break;
default:
if (!empty($data)) {
$url .= '?' . http_build_query($data);
}
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
curl_setopt($curl, CURLOPT_TIMEOUT, 300);
$response = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$headerCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$responseBody = substr($response, $header_size);
$responseHeaders = substr($response, 0, $header_size);
$ip = curl_getinfo($curl, CURLINFO_PRIMARY_IP);
$curlErrors = curl_error($curl);
curl_close($curl);
if ($headerCode === 401 && $this->refreshToken === 0) {
++$this->refreshToken;
$this->getToken();
$retval = $this->sendRequest($path, $method, $data);
} else {
$retval = new stdClass();
$retval->data = json_decode($responseBody);
$retval->http_code = $headerCode;
$retval->headers = $responseHeaders;
$retval->ip = $ip;
$retval->curlErrors = $curlErrors;
$retval->method = $method . ':' . $url;
$retval->timestamp = date('Y-m-d h:i:sP');
}
return $retval;
}
/**
* Process results
*
* @param $data
*
* @return stdClass
*/
protected function handleResult($data)
{
if (empty($data->data)) {
$data->data = new stdClass();
}
if ($data->http_code !== 200) {
$data->data->is_error = true;
$data->data->http_code = $data->http_code;
$data->data->headers = $data->headers;
$data->data->curlErrors = $data->curlErrors;
$data->data->ip = $data->ip;
$data->data->method = $data->method;
$data->data->timestamp = $data->timestamp;
}
return $data->data;
}
/**
* Process errors
*
* @param null $customMessage
*
* @return stdClass
*/
protected function handleError($customMessage = null)
{
$message = new stdClass();
$message->is_error = true;
if (null !== $customMessage) {
$message->message = $customMessage;
}
return $message;
}
/*
* API interface implementation
*/
/**
* Create address book
*
* @param $bookName
*
* @return stdClass
*/
public function createAddressBook($bookName)
{
if (empty($bookName)) {
return $this->handleError('Empty book name');
}
$data = array('bookName' => $bookName);
$requestResult = $this->sendRequest('addressbooks', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Edit address book name
*
* @param $id
* @param $newName
*
* @return stdClass
*/
public function editAddressBook($id, $newName)
{
if (empty($newName) || empty($id)) {
return $this->handleError('Empty new name or book id');
}
$data = array('name' => $newName);
$requestResult = $this->sendRequest('addressbooks/' . $id, 'PUT', $data);
return $this->handleResult($requestResult);
}
/**
* Remove address book
*
* @param $id
*
* @return stdClass
*/
public function removeAddressBook($id)
{
if (empty($id)) {
return $this->handleError('Empty book id');
}
$requestResult = $this->sendRequest('addressbooks/' . $id, 'DELETE');
return $this->handleResult($requestResult);
}
/**
* Get list of address books
*
* @param null $limit
* @param null $offset
*
* @return mixed
*/
public function listAddressBooks($limit = null, $offset = null)
{
$data = array();
if (null !== $limit) {
$data['limit'] = $limit;
}
if (null !== $offset) {
$data['offset'] = $offset;
}
$requestResult = $this->sendRequest('addressbooks', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* Get information about book
*
* @param $id
*
* @return stdClass
*/
public function getBookInfo($id)
{
if (empty($id)) {
return $this->handleError('Empty book id');
}
$requestResult = $this->sendRequest('addressbooks/' . $id);
return $this->handleResult($requestResult);
}
/**
* Get variables from book
*
* @param $id
* Address book id.
*
* @return stdClass
*/
public function getBookVariables($id)
{
if (empty($id)) {
return $this->handleError('Empty book id');
}
$requestResult = $this->sendRequest('addressbooks/' . $id . '/variables');
return $this->handleResult($requestResult);
}
/**
* Change varible by user email
*
* @param int $bookID
* @param string $email User email
* @param array $vars User vars in [key=>value] format
* @return stdClass
*/
public function updateEmailVariables(int $bookID, string $email, array $vars)
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$data = ['email' => $email, 'variables' => []];
foreach ($vars as $name => $val) {
$data['variables'][] = ['name' => $name, 'value' => $val];
}
$requestResult = $this->sendRequest('/addressbooks/' . $bookID . '/emails/variable', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* List email addresses from book
*
* @param $id
* @param $limit
* @param $offset
*
* @return stdClass
*/
public function getEmailsFromBook($id, $limit = null, $offset = null)
{
if (empty($id)) {
return $this->handleError('Empty book id');
}
$data = array();
if (null !== $limit) {
$data['limit'] = $limit;
}
if (null !== $offset) {
$data['offset'] = $offset;
}
$requestResult = $this->sendRequest('addressbooks/' . $id . '/emails', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* Add new emails to address book
*
* @param $bookID
* @param $emails
* @param $additionalParams
*
* @return stdClass
*/
public function addEmails($bookID, $emails, $additionalParams = [])
{
if (empty($bookID) || empty($emails)) {
return $this->handleError('Empty book id or emails');
}
$data = array(
'emails' => json_encode($emails),
);
if ($additionalParams) {
$data = array_merge($data, $additionalParams);
}
$requestResult = $this->sendRequest('addressbooks/' . $bookID . '/emails', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Remove email addresses from book
*
* @param $bookID
* @param $emails
*
* @return stdClass
*/
public function removeEmails($bookID, $emails)
{
if (empty($bookID) || empty($emails)) {
return $this->handleError('Empty book id or emails');
}
$data = array(
'emails' => serialize($emails),
);
$requestResult = $this->sendRequest('addressbooks/' . $bookID . '/emails', 'DELETE', $data);
return $this->handleResult($requestResult);
}
/**
* Get information about email address from book
*
* @param $bookID
* @param $email
*
* @return stdClass
*/
public function getEmailInfo($bookID, $email)
{
if (empty($bookID) || empty($email)) {
return $this->handleError('Empty book id or email');
}
$requestResult = $this->sendRequest('addressbooks/' . $bookID . '/emails/' . $email);
return $this->handleResult($requestResult);
}
/**
* Get cost of campaign based on address book
*
* @param $bookID
*
* @return stdClass
*/
public function campaignCost($bookID)
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$requestResult = $this->sendRequest('addressbooks/' . $bookID . '/cost');
return $this->handleResult($requestResult);
}
/**
* Get list of campaigns
*
* @param null $limit
* @param null $offset
*
* @return mixed
*/
public function listCampaigns($limit = null, $offset = null)
{
$data = array();
if (!empty($limit)) {
$data['limit'] = $limit;
}
if (!empty($offset)) {
$data['offset'] = $offset;
}
$requestResult = $this->sendRequest('campaigns', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* Get information about campaign
*
* @param $id
*
* @return stdClass
*/
public function getCampaignInfo($id)
{
if (empty($id)) {
return $this->handleError('Empty campaign id');
}
$requestResult = $this->sendRequest('campaigns/' . $id);
return $this->handleResult($requestResult);
}
/**
* Get campaign statistic by countries
*
* @param $id
*
* @return stdClass
*/
public function campaignStatByCountries($id)
{
if (empty($id)) {
return $this->handleError('Empty campaign id');
}
$requestResult = $this->sendRequest('campaigns/' . $id . '/countries');
return $this->handleResult($requestResult);
}
/**
* Get campaign statistic by referrals
*
* @param $id
*
* @return stdClass
*/
public function campaignStatByReferrals($id)
{
if (empty($id)) {
return $this->handleError('Empty campaign id');
}
$requestResult = $this->sendRequest('campaigns/' . $id . '/referrals');
return $this->handleResult($requestResult);
}
/**
* Create new campaign
*
* @param $senderName
* @param $senderEmail
* @param $subject
* @param $bodyOrTemplateId
* @param $bookId
* @param string $name
* @param array $attachments
* @param string $type
* @param bool $useTemplateId
* @param string $sendDate
* @param int|null $segmentId
* @param array $attachmentsBinary
* @return mixed
*/
public function createCampaign(
$senderName,
$senderEmail,
$subject,
$bodyOrTemplateId,
$bookId,
$name = '',
$attachments = [],
$type = '',
$useTemplateId = false,
$sendDate = '',
$segmentId = null,
$attachmentsBinary = []
)
{
if (empty($senderName) || empty($senderEmail) || empty($subject) || empty($bodyOrTemplateId) || empty($bookId)) {
return $this->handleError('Not all data.');
}
if ($useTemplateId) {
$paramName = 'template_id';
$paramValue = $bodyOrTemplateId;
} else {
$paramName = 'body';
$paramValue = base64_encode($bodyOrTemplateId);
}
$data = array(
'sender_name' => $senderName,
'sender_email' => $senderEmail,
'subject' => $subject,
$paramName => $paramValue,
'list_id' => $bookId,
'name' => $name,
'type' => $type,
);
if (!empty($attachments)) {
$data['attachments'] = $attachments;
} elseif (!empty($attachmentsBinary)) {
$data['attachments_binary'] = $attachmentsBinary;
}
if (!empty($sendDate)) {
$data['send_date'] = $sendDate;
}
if (!empty($segmentId)) {
$data['segment_id'] = $segmentId;
}
$requestResult = $this->sendRequest('campaigns', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Cancel campaign
*
* @param $id
*
* @return stdClass
*/
public function cancelCampaign($id)
{
if (empty($id)) {
return $this->handleError('Empty campaign id');
}
$requestResult = $this->sendRequest('campaigns/' . $id, 'DELETE');
return $this->handleResult($requestResult);
}
/**
* List all senders
*
* @return mixed
*/
public function listSenders()
{
$requestResult = $this->sendRequest('senders');
return $this->handleResult($requestResult);
}
/**
* List SMS senders
*
* @return mixed
*/
public function listSMSSenders()
{
$requestResult = $this->sendRequest('sms/senders');
return $this->handleResult($requestResult);
}
/**
* Add new sender
*
* @param $senderName
* @param $senderEmail
*
* @return stdClass
*/
public function addSender($senderName, $senderEmail)
{
if (empty($senderName) || empty($senderEmail)) {
return $this->handleError('Empty sender name or email');
}
$data = array(
'email' => $senderEmail,
'name' => $senderName,
);
$requestResult = $this->sendRequest('senders', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Remove sender
*
* @param $email
*
* @return stdClass
*/
public function removeSender($email)
{
if (empty($email)) {
return $this->handleError('Empty email');
}
$data = array(
'email' => $email,
);
$requestResult = $this->sendRequest('senders', 'DELETE', $data);
return $this->handleResult($requestResult);
}
/**
* Activate sender using code
*
* @param $email
* @param $code
*
* @return stdClass
*/
public function activateSender($email, $code)
{
if (empty($email) || empty($code)) {
return $this->handleError('Empty email or activation code');
}
$data = array(
'code' => $code,
);
$requestResult = $this->sendRequest('senders/' . $email . '/code', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Request mail with activation code
*
* @param $email
*
* @return stdClass
*/
public function getSenderActivationMail($email)
{
if (empty($email)) {
return $this->handleError('Empty email');
}
$requestResult = $this->sendRequest('senders/' . $email . '/code');
return $this->handleResult($requestResult);
}
/**
* Get global information about email
*
* @param $email
*
* @return stdClass
*/
public function getEmailGlobalInfo($email)
{
if (empty($email)) {
return $this->handleError('Empty email');
}
$requestResult = $this->sendRequest('emails/' . $email);
return $this->handleResult($requestResult);
}
/**
* Get global information about list of emails
*
* @param array $emails Emails list
* @return stdClass
*/
public function getEmailsGlobalInfo($emails)
{
if (empty($emails)) {
return $this->handleError('Empty emails list');
}
$requestResult = $this->sendRequest('emails', 'POST', $emails);
return $this->handleResult($requestResult);
}
/**
* Remove email from all books
*
* @param $email
*
* @return stdClass
*/
public function removeEmailFromAllBooks($email)
{
if (empty($email)) {
return $this->handleError('Empty email');
}
$requestResult = $this->sendRequest('emails/' . $email, 'DELETE');
return $this->handleResult($requestResult);
}
/**
* Get email statistic by all campaigns
*
* @param $email
*
* @return stdClass
*/
public function emailStatByCampaigns($email)
{
if (empty($email)) {
return $this->handleError('Empty email');
}
$requestResult = $this->sendRequest('emails/' . $email . '/campaigns');
return $this->handleResult($requestResult);
}
/**
* Get all emails from blacklist
*
* @return mixed
*/
public function getBlackList()
{
$requestResult = $this->sendRequest('blacklist');
return $this->handleResult($requestResult);
}
/**
* Add email to blacklist
*
* @param $emails - string with emails, separator - ,
* @param string $comment
*
* @return stdClass
*/
public function addToBlackList($emails, $comment = '')
{
if (empty($emails)) {
return $this->handleError('Empty email');
}
$data = array(
'emails' => base64_encode($emails),
'comment' => $comment,
);
$requestResult = $this->sendRequest('blacklist', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Remove emails from blacklist
*
* @param $emails - string with emails, separator - ,
*
* @return stdClass
*/
public function removeFromBlackList($emails)
{
if (empty($emails)) {
return $this->handleError('Empty email');
}
$data = array(
'emails' => base64_encode($emails),
);
$requestResult = $this->sendRequest('blacklist', 'DELETE', $data);
return $this->handleResult($requestResult);
}
/**
* Get balance
*
* @param string $currency
*
* @return mixed
*/
public function getBalance($currency = '')
{
$currency = strtoupper($currency);
$url = 'balance';
if (!empty($currency)) {
$url .= '/' . strtoupper($currency);
}
$requestResult = $this->sendRequest($url);
return $this->handleResult($requestResult);
}
/**
* SMTP: get list of emails
*
* @param int $limit
* @param int $offset
* @param string $fromDate
* @param string $toDate
* @param string $sender
* @param string $recipient
* @param string $country
*
* @return mixed
*/
public function smtpListEmails($limit = 0, $offset = 0, $fromDate = '', $toDate = '', $sender = '', $recipient = '', $country = 'off')
{
$data = array(
'limit' => $limit,
'offset' => $offset,
'from' => $fromDate,
'to' => $toDate,
'sender' => $sender,
'recipient' => $recipient,
'country' => $country,
);
$requestResult = $this->sendRequest('/smtp/emails', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* Get information about email by id
*
* @param $id
*
* @return stdClass
*/
public function smtpGetEmailInfoById($id)
{
if (empty($id)) {
return $this->handleError('Empty id');
}
$requestResult = $this->sendRequest('/smtp/emails/' . $id);
return $this->handleResult($requestResult);
}
/**
* SMTP: get list of unsubscribed emails
*
* @param null $limit
* @param null $offset
*
* @return mixed
*/
public function smtpListUnsubscribed($limit = null, $offset = null)
{
$data = array();
if (null !== $limit) {
$data['limit'] = $limit;
}
if (null !== $offset) {
$data['offset'] = $offset;
}
$requestResult = $this->sendRequest('smtp/unsubscribe', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* SMTP: add emails to unsubscribe list
*
* @param $emails
*
* @return stdClass
*/
public function smtpUnsubscribeEmails($emails)
{
if (empty($emails)) {
return $this->handleError('Empty emails');
}
$data = array(
'emails' => serialize($emails),
);
$requestResult = $this->sendRequest('/smtp/unsubscribe', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* SMTP: remove emails from unsubscribe list
*
* @param $emails
*
* @return stdClass
*/
public function smtpRemoveFromUnsubscribe($emails)
{
if (empty($emails)) {
return $this->handleError('Empty emails');
}
$data = array(
'emails' => serialize($emails),
);
$requestResult = $this->sendRequest('/smtp/unsubscribe', 'DELETE', $data);
return $this->handleResult($requestResult);
}
/**
* Get list of IP
*
* @return mixed
*/
public function smtpListIP()
{
$requestResult = $this->sendRequest('smtp/ips');
return $this->handleResult($requestResult);
}
/**
* SMTP: get list of allowed domains
*
* @return mixed
*/
public function smtpListAllowedDomains()
{
$requestResult = $this->sendRequest('smtp/domains');
return $this->handleResult($requestResult);
}
/**
* SMTP: add new domain
*
* @param $email
*
* @return stdClass
*/
public function smtpAddDomain($email)
{
if (empty($email)) {
return $this->handleError('Empty email');
}
$data = array(
'email' => $email,
);
$requestResult = $this->sendRequest('smtp/domains', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* SMTP: verify domain
*
* @param $email
*
* @return stdClass
*/
public function smtpVerifyDomain($email)
{
if (empty($email)) {
return $this->handleError('Empty email');
}
$requestResult = $this->sendRequest('smtp/domains/' . $email);
return $this->handleResult($requestResult);
}
/**
* SMTP: send mail
*
* @param $email
*
* @return stdClass
*/
public function smtpSendMail($email)
{
if (empty($email)) {
return $this->handleError('Empty email data');
}
$emailData = $email;
if (isset($email['html'])) {
$emailData['html'] = base64_encode($email['html']);
}
$data = array(
'email' => serialize($emailData),
);
$requestResult = $this->sendRequest('smtp/emails', 'POST', $data);
if ($requestResult->http_code !== 200 && !$this->retry) {
$this->retry = true;
sleep(2);
return $this->smtpSendMail($email);
}
return $this->handleResult($requestResult);
}
/**
* Get list of push campaigns
*
* @param null $limit
* @param null $offset
*
* @return mixed
*/
public function pushListCampaigns($limit = null, $offset = null)
{
$data = array();
if (null !== $limit) {
$data['limit'] = $limit;
}
if (null !== $offset) {
$data['offset'] = $offset;
}
$requestResult = $this->sendRequest('push/tasks', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* Get list of websites
*
* @param null $limit
* @param null $offset
*
* @return mixed
*/
public function pushListWebsites($limit = null, $offset = null)
{
$data = array();
if (null !== $limit) {
$data['limit'] = $limit;
}
if (null !== $offset) {
$data['offset'] = $offset;
}
$requestResult = $this->sendRequest('push/websites', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* Get amount of websites
*
* @return mixed
*/
public function pushCountWebsites()
{
$requestResult = $this->sendRequest('push/websites/total');
return $this->handleResult($requestResult);
}
/**
* Get list of all variables for website
*
* @param $websiteId
*
* @return mixed
*/
public function pushListWebsiteVariables($websiteId)
{
$requestResult = $this->sendRequest('push/websites/' . $websiteId . '/variables');
return $this->handleResult($requestResult);
}
/**
* Get list of subscriptions for the website
*
* @param $websiteID
*
* @param null $limit
* @param null $offset
*
* @return mixed
*/
public function pushListWebsiteSubscriptions($websiteID, $limit = null, $offset = null)
{
$data = array();
if (null !== $limit) {
$data['limit'] = $limit;
}
if (null !== $offset) {
$data['offset'] = $offset;
}
$requestResult = $this->sendRequest('push/websites/' . $websiteID . '/subscriptions', 'GET', $data);
return $this->handleResult($requestResult);
}
/**
* Get amount of subscriptions for the site
*
* @param $websiteID
*
* @return mixed
*/
public function pushCountWebsiteSubscriptions($websiteID)
{
$requestResult = $this->sendRequest('push/websites/' . $websiteID . '/subscriptions/total');
return $this->handleResult($requestResult);
}
/**
* Set state for subscription
*
* @param $subscriptionID
* @param $stateValue
*
* @return mixed
*/
public function pushSetSubscriptionState($subscriptionID, $stateValue)
{
$data = array(
'id' => $subscriptionID,
'state' => $stateValue,
);
$requestResult = $this->sendRequest('push/subscriptions/state', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Get common website info
*
* @param $websiteId
*
* @return mixed
*/
public function pushGetWebsiteInfo($websiteId)
{
$requestResult = $this->sendRequest('push/websites/info/' . $websiteId);
return $this->handleResult($requestResult);
}
/**
* Create new push campaign
*
* @param $taskInfo
* @param array $additionalParams
*
* @return stdClass
*/
public function createPushTask($taskInfo, array $additionalParams = array())
{
$data = $taskInfo;
if (!isset($data['ttl'])) {
$data['ttl'] = 0;
}
if (empty($data['title']) || empty($data['website_id']) || empty($data['body'])) {
return $this->handleError('Not all data');
}
if ($additionalParams) {
foreach ($additionalParams as $key => $val) {
$data[$key] = $val;
}
}
$requestResult = $this->sendRequest('/push/tasks', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Get integration code for Push Notifications.
*
* @param $websiteID
*
* @return stdClass
*/
public function getPushIntegrationCode($websiteID)
{
if (empty($websiteID)) {
return $this->handleError('Empty website id');
}
$requestResult = $this->sendRequest('/push/websites/' . $websiteID . '/code');
return $this->handleResult($requestResult);
}
/**
* Get stats for push campaign
*
* @param $campaignID
*
* @return stdClass
*/
public function getPushCampaignStat($campaignID)
{
$requestResult = $this->sendRequest('push/tasks/' . $campaignID);
return $this->handleResult($requestResult);
}
/**
* @Author Maksym Dzhym m.jim@sendpulse.com
* @param $eventName
* @param array $variables
* @return stdClass
*/
public function startEventAutomation360($eventName, array $variables)
{
if (!$eventName) {
return $this->handleError('Event name is empty');
}
if (!array_key_exists('email', $variables) && !array_key_exists('phone', $variables)) {
return $this->handleError('Email and phone is empty');
}
$requestResult = $this->sendRequest('events/name/' . $eventName, 'POST', $variables);
return $this->handleResult($requestResult);
}
/**
* Add phones to addressbook
*
* @param $bookID
* @param array $phones
* @return stdClass
*/
public function addPhones($bookID, array $phones)
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$data = [
'addressBookId' => $bookID,
'phones' => json_encode($phones)
];
$requestResult = $this->sendRequest('/sms/numbers', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Add phones with variables to addressbook
*
* @param $bookID
* @param array $phones
* @return stdClass
*/
public function addPhonesWithVariables($bookID, array $phonesWithVariables)
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$data = [
'addressBookId' => $bookID,
'phones' => json_encode($phonesWithVariables)
];
$requestResult = $this->sendRequest('/sms/numbers/variables', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Update variables for phones
*
* @param $bookID
* @param array $phones
* @param array $variables
* @return stdClass
*/
public function updatePhoneVaribales($bookID, array $phones, array $variables)
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$data = [
'addressBookId' => $bookID,
'phones' => json_encode($phones),
'variables' => json_encode($variables)
];
$requestResult = $this->sendRequest('/sms/numbers', 'PUT', $data);
return $this->handleResult($requestResult);
}
/**
* Delete phones from book
*
* @param $bookID
* @param array $phones
* @return stdClass
*/
public function deletePhones($bookID, array $phones)
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$data = [
'addressBookId' => $bookID,
'phones' => json_encode($phones)
];
$requestResult = $this->sendRequest('/sms/numbers', 'DELETE', $data);
return $this->handleResult($requestResult);
}
/**
* get information about phone number
*
* @param $bookID
* @param $phoneNumber
* @return stdClass
*/
public function getPhoneInfo($bookID, $phoneNumber)
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$requestResult = $this->sendRequest('/sms/numbers/info/' . $bookID . '/' . $phoneNumber);
return $this->handleResult($requestResult);
}
/**
* Add phones to blacklist
*
* @param $bookID
* @param array $phones
* @return stdClass
*/
public function addPhonesToBlacklist(array $phones)
{
$data = [
'phones' => json_encode($phones)
];
$requestResult = $this->sendRequest('/sms/black_list', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Delete phones from blacklist
*
* @param array $phones
* @return stdClass
*/
public function removePhonesFromBlacklist(array $phones)
{
$data = [
'phones' => json_encode($phones)
];
$requestResult = $this->sendRequest('/sms/black_list', 'DELETE', $data);
return $this->handleResult($requestResult);
}
/**
* Get list of phones from blacklist
*
* @return stdClass
*/
public function getPhonesFromBlacklist()
{
$requestResult = $this->sendRequest('/sms/black_list');
return $this->handleResult($requestResult);
}
/**
* Create sms campaign based on phones in book
*
* @param $bookID
* @param array $params
* @param array $additionalParams
* @return stdClass
*/
public function sendSmsByBook($bookID, array $params, array $additionalParams = [])
{
if (empty($bookID)) {
return $this->handleError('Empty book id');
}
$data = [
'addressBookId' => $bookID
];
$data = array_merge($data, $params);
if ($additionalParams) {
$data = array_merge($data, $additionalParams);
}
$requestResult = $this->sendRequest('/sms/campaigns', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* Create sms campaign based on list
*
* @param $phones
* @param array $params
* @param array $additionalParams
* @return stdClass
*/
public function sendSmsByList(array $phones, array $params, array $additionalParams)
{
$data = [
'phones' => json_encode($phones)
];
$data = array_merge($data, $params);
if ($additionalParams) {
$data = array_merge($data, $additionalParams);
}
$requestResult = $this->sendRequest('/sms/send', 'POST', $data);
return $this->handleResult($requestResult);
}
/**
* List sms campaigns
*
* @param $params
* @return stdClass
*/
public function listSmsCampaigns(array $params = null)
{
$requestResult = $this->sendRequest('/sms/campaigns/list', 'GET', $params);
return $this->handleResult($requestResult);
}
/**
* Get info about sms campaign
*
* @param $campaignID
* @return stdClass
*/
public function getSmsCampaignInfo($campaignID)
{
$requestResult = $this->sendRequest('/sms/campaigns/info/' . $campaignID);
return $this->handleResult($requestResult);
}
/**
* Cancel SMS campaign
*
* @param $campaignID
* @return stdClass
*/
public function cancelSmsCampaign($campaignID)
{
$requestResult = $this->sendRequest('/sms/campaigns/cancel/' . $campaignID, 'PUT');
return $this->handleResult($requestResult);
}
/**
* Get SMS campaign cost based on book or simple list
*
* @param array $params
* @param array|null $additionalParams
* @return stdClass
*/
public function getSmsCampaignCost(array $params, array $additionalParams = null)
{
if (!isset($params['addressBookId']) && !isset($params['phones'])) {
return $this->handleError('You mast pass phones list or addressbook ID');
}
if ($additionalParams) {
$params = array_merge($params, $additionalParams);
}
$requestResult = $this->sendRequest('/sms/campaigns/cost', 'GET', $params);
return $this->handleResult($requestResult);
}
/**
* Delete SMS campaign
*
* @param $campaignID
* @return stdClass
*/
public function deleteSmsCampaign($campaignID)
{
$requestResult = $this->sendRequest('/sms/campaigns', 'DELETE', ['id' => $campaignID]);
return $this->handleResult($requestResult);
}
}