2015-05-12 4 views
1

Я рассмотрел старые вопросы, размещенные здесь в Stackoverflow об этой проблеме. Но я не нашел никакого примера для интеграции php.Загрузить изображение товара, используя API Square Connect и PHP

Вот пример моего кода, чтобы сделать это, но он терпит неудачу

$url = 'https://connect.squareup.com/v1/me/items/9999999/image'; 
    $auth_bearer = 'Authorization: Bearer ' . $this->accessToken; 
    $image_data = base64_encode(file_get_contents('image.jpeg')); 
    $header = array(
     $auth_bearer, 
     'Accept: application/json', 
     'Content-Type: multipart/form-data; boundary=BOUNDARY', 

    ); 

    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'files=' . $image_data); 
    $head = curl_exec($ch); 
    curl_close($ch); 

    $response = json_decode($head); 
    echo "<pre>"; 
    print_r($response); 
    echo "</pre>"; 

И ничего не происходит ... любая помощь здесь?

Благодаря

ответ

2

Вы должны опубликовать исходные данные изображения (не в кодировке Base64) с соответствующим многочастным заголовком для объекта файла. Вот рабочий пример (замените ACCESS_TOKEN, ITEM_ID и IMAGE_FILE).

<?php 
function uploadItemImage($url, $access_token, $image_file) { 
    $headers = ["Authorization: Bearer $access_token"]; 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, ['image_data' => "@$image_file"]); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $data = curl_exec($ch); 
    $return_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    print "POST to $url with status $return_status\n"; 

    curl_close($ch); 

    return $data ? json_decode($data) : false; 
} 

print_r(
    uploadItemImage(
     'https://connect.squareup.com/v1/me/items/ITEM_ID/image', 
     'ACCESS_TOKEN', 
     'IMAGE_FILE.jpg' 
    ) 
); 
?> 
+0

Спасибо @Troy .. он работает очень хорошо ... спасибо много ... я думаю, что они должны привести этот пример в документацию – user1272589

+0

К сожалению, в настоящее время мы не имеем образцы кода для разных языков, но я всегда рад помочь, когда смогу. У меня на самом деле было это удобно, потому что по какой-то причине у людей обычно возникают проблемы с загрузкой изображений. – Troy

0

Вот моя реализация PHP для загрузки изображения PNG. Иногда помогает другой код.

Как указано в @Troy, важным полем для изображений является «Content-Type: multipart/form-data». Все, что я загружаю на Square, использует «Content-Type: application/json».

$square_url = 'https://connect.squareup.com/v1/me/items/' . $square_item_id . '/image'; 

$cfile = new CURLFile($image_path_on_server, 'image/png', 'image_data'); 
$image_data = array('image_data' => $cfile); 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Authorization: Bearer ' . $access_token, 
    'Content-Type: multipart/form-data', 
    'Accept: application/json' 
)); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $image_data); 
curl_setopt($curl, CURLOPT_URL, $square_url); 
curl_setopt($curl, CURLOPT_POST, TRUE); 
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, TRUE); 
curl_setopt($curl, CURLOPT_BINARYTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 
curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE); 
curl_setopt($curl, CURLOPT_VERBOSE, TRUE); 
$json = curl_exec($curl); 
curl_close($curl); 
0

Строго говоря, Square API документации, их метод может быть реализован с учетом нескольких вещей.

- Ваш запрос должен быть заключен в границу и содержать размещение, имя, имя файла, тип контента, например, образец ниже.

--BOUNDARY 
Content-Disposition: form-data; name="image_data"; filename="MyImage.png" 
Content-Type: image/png 
           {BLANK LINE IS REQUIRED} 
IMAGE BINARY DATA GOES HERE 
--BOUNDARY-- 

По сути, формат запроса должен быть точно таким, как указано в образце. Это включает в себя «границу», символы новой строки, необходимые заголовки, пустую строку между заголовками (по какой-то причине ничего не работает, если строка отсутствует) и фактические двоичные данные изображения. ПРИМЕЧАНИЕ. Границей может быть любая строка, которую вы выберете, но ее необходимо использовать последовательно. В коде, это будет выглядеть примерно так:

$boundary = "---------------------" . md5(mt_rand() . microtime()); 
$imageToUpload = "--{$boundary}" . "\r\n" . 
      "Content-Disposition: form-data; name=\"image_data\"; filename=\"" . $full_path_to_image_file . "\"" . "\r\n" . 
      "Content-Type: image/jpeg" . "\r\n" . 
      "\r\n" . // <- empty line is required 
      (file_get_contents($full_path_to_image_file)) . "\r\n" . 
      "--{$boundary}--"; 

выше будет производить запрос, который выглядит следующим образом:

-----------------------51b62743876b1201aee47ff4b1910e49 
Content-Disposition: form-data; name="image_data"; filename="/some/directory/image.jpg" 
Content-Type: image/jpeg 

���� 
-----------------------51b62743876b1201aee47ff4b1910e49-- 

- Технически говоря, Content-Type в запросе необходимо изменить с тип загружаемого изображения (изображение/jpeg или изображение/png). Вы можете установить тип контента в application/octet-stream, чтобы охватить все основы.

-----------------------51b62743876b1201aee47ff4b1910e49 
Content-Disposition: form-data; name="image_data"; filename="/some/directory/image.jpg" 
Content-Type: application/octet-stream 

���� 
-----------------------51b62743876b1201aee47ff4b1910e49-- 

Приведенные выше примеры загружат изображение.

- «Бинарные данные изображения» могут вводить в заблуждение, так как каждый мой поиск показал, что двоичный файл изображения получается с помощью функции base64_encode. В моих экспериментах base64_encoding ничего не делает. Вам нужно только открыть файл с файлом_get_contents.

- В запросе cURL должен быть установлен тип содержимого заголовка для multipart/form-data и иметь ту же границу, что и запрос. Пример ниже:

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $personalAccessToken, 'Content-Type: multipart/form-data; boundary=' . $boundary)); 

Таким образом, это добавляет еще одно решение для смеси.

Смежные вопросы