@nomer1

Почему не создаётся push рассылка на sendpulse api?

https://sendpulse.com/ru/integrations/api
Я новичок и поэтому могу сильно ошибаться.
Есть файл push.php. В нём есть класс, взятый с гитхаба. Есть файл push_int.php. В этом файле интерфейс, от которого имплементируется класс.
Я создал файл timer.php, в котором создаётся объект класса и вызывается функция createPushTask. timer.php я поставил на cron.
Также есть token.txt в который, как я понял, записывается токен, тк в самом классе я написал, что токен будет записываться в файл.

код

push_int.php
<?php
    /*
     * Interface for SendPulse REST API
     *
     * Documentation
     * https://login.sendpulse.com/manual/rest-api/
     * https://sendpulse.com/api
     *
     */
    interface SendpulseApi_Interface {
        
        public function pushListCampaigns( $limit = NULL, $offset = NULL );
        /**
         * Get list of websites
         *
         * @param null $limit
         * @param null $offset
         */
        public function pushListWebsites( $limit = NULL, $offset = NULL );
        /**
         * Get amount of websites
         */
        public function pushCountWebsites();
        /**
         * Get list of all variables for the website
         *
         * @param $websiteId
         */
        public function pushListWebsiteVariables( $websiteId );
        /**
         * Get list of all subscriptions for the website
         *
         * @param $websiteId
         */
        public function pushListWebsiteSubscriptions( $websiteId, $limit = NULL, $offset = NULL );
        /**
         * Get amount of subscriptions for the site
         *
         * @param $websiteId
         */
        public function pushCountWebsiteSubscriptions( $websiteId );
        /**
         * Set state for subscription
         *
         * @param $subscriptionId
         * @param $stateValue
         */
        public function pushSetSubscriptionState( $subscriptionId, $stateValue );
        /**
         * Create new push campaign
         *
         * @param $taskInfo
         * @param array $additionalParams
         */
        public function createPushTask( $taskInfo, $additionalParams = array() );
    }


push.php
<?php
/*
 * SendPulse REST API PHP Class
 *
 * Documentation
 * https://login.sendpulse.com/manual/rest-api/
 * https://sendpulse.com/api
 *
 */
 include 'push_int.php';
 
class SendpulseApi implements SendpulseApi_Interface {
    private $apiUrl = 'https://api.sendpulse.com';
    private $userId = 'тут юзерид';
    private $secret = 'тут секрет';
    private $token = NULL;
    private $refreshToken = 0;
    /*
     *  Define where script will save access token
     *  Types: session, file, memcache
     */
    private $storageType = 'file';
    private $apiFilesPath = 'token.txt';
    
    
    
    
    
    
    
    /**
     * Sendpulse API constructor
     *
     * @param $userId
     * @param $secret
     * @param string $storageType
     *        Define where script will save access token
     *        Types: session, file, memcache
     * @throws Exception
     */
    public function __construct( $userId, $secret, $storageType = 'file' ) {
        if( empty( $userId ) || empty( $secret ) ) {
            throw new Exception( 'Empty ID or SECRET' );
        }
        $this->userId = $userId;
        $this->secret = $secret;
        $this->storageType = $storageType;
        $hashName = md5( $userId . '::' . $secret );
        switch ($this->storageType) {
            case 'session':
                if (isset($_SESSION[$hashName]) && !empty($_SESSION[$hashName])) {
                    $this->token = $_SESSION[$hashName];
                }
                break;
            case 'memcache':
                $memcache = new Memcache();
                $memcache->connect('localhost', 11211) or die('Could not connect to Memcache');
                $token = $memcache->get($hashName);
                if (!empty($token)) {
                    $this->token = $token;
                }
                break;
            default:
                $filePath = $this->apiFilesPath.$hashName;
                if (file_exists($filePath)) {
                    $this->token = file_get_contents($filePath);
                }
        }
        if( empty( $this->token ) ) {
            if( !$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 );
        switch ($this->storageType) {
            case 'session':
                $_SESSION[$hashName] = $this->token;
                break;
            case 'memcache':
                $memcache = new Memcache();
                $memcache->connect('localhost', 11211) or die('Could not connect to Memcache');
                $memcache->set($hashName, $this->token, false, 3600);
                break;
            default:
                $tokenFile = fopen($this->apiFilesPath.$hashName, "w");
                fwrite($tokenFile, $this->token);
                fclose($tokenFile);
        }
        return true;
    }
    
    
    
    
    
    
    
    /**
     * Form and send request to API service
     *
     * @param $path
     * @param string $method
     * @param array $data
     * @param bool $useToken
     * @return array|NULL
     */
    private 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 );
            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, 0);
        curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt( $curl, CURLOPT_HEADER, 1 );
        $response = curl_exec( $curl );
        $header_size = curl_getinfo( $curl, CURLINFO_HEADER_SIZE );
        $headerCode = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
        $responseBody = substr( $response, $header_size );
        curl_close( $curl );
        if( $headerCode == 401 && $this->refreshToken == 0 ) {
            $this->refreshToken += 1;
            $this->getToken();
            $return = $this->sendRequest( $path, $method, $data );
        } else {
            $return = new stdClass();
            $return->data = json_decode( $responseBody );
            $return->http_code = $headerCode;
        }
        return $return;
    }
    
    
    
    
    
    
    /**
     * Process results
     *
     * @param $data
     * @return mixed
     */
    private 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;
        }
        return $data->data;
    }
    
    
    
    
    
    
    /**
     * Process errors
     *
     * @param null $customMessage
     * @return stdClass
     */
    private function handleError( $customMessage = NULL ) {
        $message = new stdClass();
        $message->is_error = true;
        if( !is_null( $customMessage ) ) {
            $message->message = $customMessage;
        }
        return $message;
    }
    
    
    
    
    
    
    
    public function createPushTask( $taskInfo, $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 );
    }
}


timer.php
<?php
include 'push.php';
$push = array(
    "title" => "dfgfhfhf",
    "website_id" => "41081",
    "body" => "gfhtghgh",
    "ttl" => "200",
);

$p = array(
    "link" => "https://toster.ru/"
);

$object = new SendpulseApi;
$object->createPushTask($push, $p);

?>

  • Вопрос задан
  • 757 просмотров
Решения вопроса 1
shimdim
@shimdim
Оставьте либу, которую взяли с гитхаба, как есть - там не нужно ничего править.
А вот в файле timer.php:
<?php
require_once('./sendpulse-rest-api-php/api/sendpulseInterface.php');
require_once('./sendpulse-rest-api-php/api/sendpulse.php');

define('API_USER_ID', 'ТУТ_ВАШ_ID'); // https://login.sendpulse.com/settings/#api
define('API_SECRET', 'ВАШ_SECRET'); // там же

$SPApiProxy = new SendpulseApi( API_USER_ID, API_SECRET, 'file' );

// дальше ваш код
$push = array(
    "title" => "dfgfhfhf",
    "website_id" => "41081",
    "body" => "gfhtghgh",
    "ttl" => "200",
    "stretch_time" => 1
);

$p = array(
    "link" => "https://toster.ru/"
);

$SPApiProxy->createPushTask($push, $p);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы