Połączenie z API

0

Cześć.
Próbuję połączyć się z API mojego sklepu w Cupsell. Niestety PHP jest mi obcy, ale od jakiegoś czasu uczę się JS. Więc wygląda to tak, że odpalam sobie plik example.php pobrany z http://cupsell.pl/api-php-sdk/ na wirtualnym serwerze XAMPP, i wyświetla mi się taki błąd:

Notice: Trying to access array offset on value of type null in C:\xampp\htdocs\test\CupSellAPI.php on line 61

Plik CupSellAPI.php znajduje się w tym samym folderze co plik example.php Czy ktoś mógłby mi pomóc i podpowie, jak mam nawiązać połączenie z tym API?

example.php :

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>CupSell API</title>
    </head>
    <body>
        <pre>
            <?php
            $config = array(
                'api_key' => 'YOUR_API_KEY',
                'private_key' => 'YOUR_PRIVATE_KEY'
            );

            include "CupSellAPI.php";
            $api = new CupSellAPI($config);

            $result = $api->request("api-test");
            print_r($result);

CupSellAPI.php :

<?php

/**
 *
 * API 1.1.0 PHP-SDK
 *
 * Class CupSellAPI
 */
class CupSellAPI
{
    const TARGET_URL = 'https://cupsell.pl/api/';
    private $target = self::TARGET_URL;
    private $config;

    function __construct($config)
    {
        $this->config = $config;
    }

    function request($data, $val = NULL, $data_only = false, $debug = false)
    {
        if (is_array($val)) {

            $get  = (isset($val['get'])) ? $val['get'] : NULL;
            $post = (isset($val['post'])) ? $val['post'] : NULL;
            if (($get == NULL) && ($post == NULL)) {
                $post = $val;
            }
        } else {

            $id   = $val;
            $get  = NULL;
            $post = NULL;
        }

        $target = $this->target.$data.(isset($id) && $id ? "/$id" : "")."?";

        $excluded_params = array('signature', 'pages_count', 'page');
        $params          = array(
            'api_key' => $this->config['api_key'],
            'timestamp' => time(),
            'signature' => NULL
        );
        if (isset($id)) {
            $params['id'] = $id;
        }
        if ($get) {
            $params = $params + $get;
        }

        $params['signature'] = $this->toHash($params,
            $this->config['private_key'], $excluded_params, $post);
        $response            = $this->sendRequest($params, $target, $post);

        # DEBUG #
        if ($debug) {
            echo "DEBUG START \n".htmlentities($response, ENT_QUOTES, "UTF-8")."\nDEBUG END \n";
        }
        $jd = json_decode($response, true);

        return $data_only ? $jd['response']['details']['data'] : $jd['response'];
    }

    function test()
    {
        $ret = $this->request("api-test");
        return ($ret['status'] == 200 ? true : false);
    }

    private function toHash(array $params, $private_key, $excluded_params, $post)
    {
        $string = '';
        if ($post) {
            $params = $params + $post;
        }

        ksort($params);
        foreach ($params as $key => $val) {
            if (!in_array($key, $excluded_params) && !is_null($val)) {
                $string .= $key.'='.$val.'#';
            }
        }

        return hash_hmac('sha256', $string, $private_key);
    }

    private function sendRequest(array $params, $target, $post)
    {
        foreach ($params as $key => $val) {
            if ($val === null) {
                unset($params[$key]);
            }
        }
        $target .= http_build_query($params);
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $target);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Host: cupsell.local'));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl, CURLOPT_CAINFO, getcwd() . '/cupsell-api-cert.crt');

        if ($post) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
        }
        $return = curl_exec($curl);
        curl_close($curl);
        return $return;
    }
}
2

Sprawdz logi i zobacz co jest na $response, bo curl nie zwraca tego, czego skrypt sie spodziewa

0
.__. napisał(a):

Sprawdz logi i zobacz co jest na $response, bo curl nie zwraca tego, czego skrypt sie spodziewa

Logi z Apache zawierały jakiś błąd z bibliotekami dll, próbowałem to naprawić ale skończyło się na tym, że zmieniłem XAMPPa na Bitnami WAPP. Od tej pory problem z komunikatem zniknął.

Jednak nie dostaję żadnej odpowiedzi od API, typ $result to NULL, typ $response też NULL... Klucze mam oczywiście przypisane. Jakiś pomysł jak mogę się połączyć z tym API?

2

do zdebugowania curla dodaj:

curl_setopt($curl, CURLOPT_FAILONERROR, true);
// ...
curl_exec($curl);
if(curl_errno($curl)) {
    $error_msg = curl_error($curl);
}
curl_close($curl);

if (isset($error_msg)) {
    echo 'curl error: '.$error_msg;
}
0
.__. napisał(a):

do zdebugowania curla dodaj: ...

teraz jest taka zwrotka:

curl error: error setting certificate verify locations: CAfile: C:\Bitnami\wappstack-7.3.15-2\apache2\htdocs\test/cupsell-api-cert.crt CApath: none

1

Testowo wyłącz weryfikację w CURL

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,false)

I zakomentuj bądź skasuj linijkę gdzie wskazujesz certyfikat (CURLOPT_CAINFO)

0
jurek1980 napisał(a):

Testowo wyłącz weryfikację w CURL

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,false)

I zakomentuj bądź skasuj linijkę gdzie wskazujesz certyfikat (CURLOPT_CAINFO)

Niestety po tych zmianach wyświetla mi pustą stronę, zero reakcji

0

Sprawdź, czy ścieżka do certyfikatu jest prawidłowa:

echo file_exists(getcwd() . '/cupsell-api-cert.crt') ? 'Prawidlowa' : 'Nieprawidłowa';
0
.__. napisał(a):

Sprawdź, czy ścieżka do certyfikatu jest prawidłowa:

echo file_exists(getcwd() . '/cupsell-api-cert.crt') ? 'Prawidlowa' : 'Nieprawidłowa';

"Prawidlowa"

0

Sprawdź jeszcze windowsowe uprawnienia do pliku (certyfikatu)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0