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

2

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)

0
.__. napisał(a):

Sprawdź jeszcze windowsowe uprawnienia do pliku (certyfikatu)

Tu także wszystko w porządku, plik odblokowany, uprawnienia ok, ściągałem już nawet drugi raz paczkę z http://cupsell.pl/api-php-sdk/ i podmieniałem plik, podawałem bezpośrednią ścieżkę do pliku w

curl_setopt($curl, CURLOPT_CAINFO, getcwd() . '/cupsell-api-cert.crt')

nic to nie daje

2

Na zmienionych opcjach dotyczących certyfikatu spokojnie uzyskuje testowe połączenie:

$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, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        //curl_setopt($curl, CURLOPT_CAINFO, getcwd() . '/cupsell-api-cert.crt');

Użytkownik i hasło z pliku, czyli testowe.
Odpwowiedź z użyciem pliku example.php

Array ( [status] => 200 [statusText] => success [details] => Array ( [time] => 1584470636 [data] => Array ( [current_timestamp] => 1584470636 [current_date_and_time] => Tue, 17 Mar 2020 19:43:56 +0100 ) [success] => Array ( [message] => DATA: api_test ) [error] => ) ) 

Jak uzyskasz jakiekolwiek połączenie to powalcz potem z certyfikatami, nie zachęcam do pomijania weryfikacji na stałe.

0

Za radą mojego kolegi pobawiłem sie trochę xdebugiem w PHPStorm, i do czego doszedłem to to, że curl ma prawidłowy target (po wklejeniu adresu bezpośrednio w przeglądarkę dostaję odpowiedź i wszystkie dane). Potem skrypt wraca do:

        # 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'];

i wszystkie zmienne z których korzysta są albo null, albo false, $response = false , $target jest niepełny itd... no i na koniec dostaję $result = null

Może tutaj szanowni koledzy będą mieli jakiś pomysł, niestety moja wiedza tu się urywa.

0

Trochę nie rozumiem. Gdzie wklejasz jaki adres? Jak wchodzi Ci w if'a od debug to musisz wyżej w wywołaniu funkcji podać ten parametr, bo on ma default = false
Jak skonfigurowałeś sobie Xdebug w PHPStrorm to super. Podejrzyj po kolei swój skrypt stawiając brakepointy. Moim zdaniem jednak ciągle masz problem z CURLem. Za radą @._. dodaj sobie sprawdzanie czy CURL nie zwraca ciągle błędu.

0

Ok, faktycznie bez certyfikatu tym razem udało mi się połączyć. Nie rozumiem tylko dlaczego skrypt nie widzi tego certyfikatu skoro ścieżka i wszystko inne się zgadza...

2

Skrypt raczej widzi certyfikat ale ten nie przechodzi walidacji. Jak wejdziesz do przeglądarki i podejrzysz certyfikat to będzie on inny niż ten z paczki. Możesz pobrać certyfikat z przeglądarki i skonwertować do .pem i zobaczyć czy zadziała.

0

Od początku... Wróć do XAMPP-a..

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

Błąd, który Ci się wyświetla oznacza, że chcesz skorzystać z pustej zmiennej tak jakbyś chciał użyć tablicy.

Skoro korzystasz z XAMPP, domyślam się, że nie konfigurowałeś go? W pliku php.ini zmień zawartość zmiennej error_reporting na E_ALL & ~E_STRICT & ~E_DEPRECATED, albo wyłącz raportowanie błędów w ogóle, zmieniając wartość zmiennej display_errors na off.

Błąd jest wyświetlany, ponieważ domyślna konfiguracja XAMPPa ustawiona jest na raportowanie każdego drobnego błędu, dlatego w pierwszej kolejności należy skonfigurować go do własnych potrzeb. Mało który serwer domyślnie ustawione ma baczne raportowanie.

https://ictlaboratory.com/pl/porady/12-webdesign-pl-pl/4-xampp-konfiguracja-php-ini.html

0
jurek1980 napisał(a):

Skrypt raczej widzi certyfikat ale ten nie przechodzi walidacji. Jak wejdziesz do przeglądarki i podejrzysz certyfikat to będzie on inny niż ten z paczki. Możesz pobrać certyfikat z przeglądarki i skonwertować do .pem i zobaczyć czy zadziała.

Skonwertowanie certyfikatu do .pem pomogło! Dzięki wszystkim za rady, w końcu wszystko śmiga jak należy.

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