alleREST Forum

Przyjazne REST API i JSON.

You are not logged in.

#1 02-09-2016 12:32:42

admin
Administrator
Registered: 21-03-2015
Posts: 13

Zmiana ceny change-price-commands

Poniżej zamieszczam funkcję do zmiany ceny.
Zaznaczam, że pisałem ją z pamięci i nie testowałem, także mogą wystąpić jakieś błędy składniowe itp.
Proszę o potwierdzenie działania w praktyce.

<?php

  function commandRequest($uri, array $params = []) {
    $headers = [
      'Accept: application/vnd.allegro.public.v1+json',
      'Content-Type: application/vnd.allegro.public.v1+json',
      'Authorization: Bearer (Token Allegro)',
      'Api-Key: (Klucz API)'
    ];
    
    $curl = curl_init($uri);
 
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 
    $data = json_encode($params);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);    
 
    return curl_exec($curl);
  }




  $itemId = 123456; // Numer aukcji
  $guId = trim(com_create_guid(), '{}'); // GUID, np. d7c0c24b-c0d1-4aef-80da-96107ae7a7fc
  
  $data = [
    'input' => [
      'buyNowPrice' => [
        'amount' => '53',
        'currency' => 'PLN'
      ]
    ]
  ];
  
  commandRequest('https://allegroapi.io/offers/' . $itemId . '/change-price-commands/' . $guId, $data);
?>

-- edit --
Po wielu kontaktach w sprawie skryptu, umieszczam w 100% przetestowany w praktyce, działający przykład.

Offline

#2 14-09-2016 22:19:03

konrad183
Member
Registered: 14-09-2016
Posts: 2

Re: Zmiana ceny change-price-commands

Na Moim serwerze wyskakuje błąd php związany z generowaniem GUID. Rozwiązałem go importując klasę do ich generowania

Postanowiłem zmodyfikować kod na tyle by można było go wywoływać bezpośrednio z linku o strukturze.

http://link.podany.na.allegro/plik.php?nraukcji=6324345474&cena=175.99
<?php
 

    function commandRequest($uri, $generatedKey, array $params = []) {
    $headers = [
      'Accept: application/vnd.allegro.public.v1+json',
      'Content-Type: application/vnd.allegro.public.v1+json',
      'Authorization: Bearer '.$generatedKey.'',
      'Api-Key: ....IjBhODRkZDAzLTgyZmItNGY4YS1iMmI4LTFjNDJiY2FkZDYwOSJ9.zlW6ew8wHDWkYlCNuICO3OxKKaoIspVjRFAYFIIQ6...'
    ];
    


    $curl = curl_init($uri);
 
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 
    $data = json_encode($params);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);    
 
    return curl_exec($curl);
  }




$generatedKey = "....HrNp6tPw5EHs79wfmuX-O-sDX4POHlqzJYvqrjJY5TyVQnzGsteGQaFilQl7D3MMdwfrjYJ3OR7hUqUiZsQoXD98mzXUyAoHe9v7UywbngtTFAJ3SGCTknqGBETPFWH5uvClBUAPVaYa42lUfOwTqYlQzF2quOhXguYj6ms7nA97r_EfeOAWlqPtXNA.....";  //klucz pobrany po poprawnym zalogowaniu do REST

$itemId = $_GET['nraukcji'];
$cena = $_GET['cena'];

include 'uid.php';
$v5uuid = UUID::v5('1546058f-5a25-4334-85ae-e68f2a44bbaf', 'SomeRandomString');  //generuje GUID jednorazowy kod do komunikacji wymagany w REST

  
  $data = [
    'input' => [
      'buyNowPrice' => [
        'amount' => $cena,
        'currency' => 'PLN'
      ]
    ]
  ];
  
  commandRequest('https://allegroapi.io/offers/' . $itemId . '/change-price-commands/' . $v5uuid, $generatedKey, $data);





?>



i klasa do generowania nazwana uid.php



<?php
/**
 * UUID class
 *
 * The following class generates VALID RFC 4122 COMPLIANT
 * Universally Unique IDentifiers (UUID) version 3, 4 and 5.
 *
 * UUIDs generated validates using OSSP UUID Tool, and output
 * for named-based UUIDs are exactly the same. This is a pure
 * PHP implementation.
 *
 * @author Andrew Moore
 * @link http://www.php.net/manual/en/function.uniqid.php#94959
 */
class UUID
{
	/**
	 * Generate v3 UUID
	 *
	 * Version 3 UUIDs are named based. They require a namespace (another 
	 * valid UUID) and a value (the name). Given the same namespace and 
	 * name, the output is always the same.
	 * 
	 * @param	uuid	$namespace
	 * @param	string	$name
	 */
	public static function v3($namespace, $name)
	{
		if(!self::is_valid($namespace)) return false;
		// Get hexadecimal components of namespace
		$nhex = str_replace(array('-','{','}'), '', $namespace);
		// Binary Value
		$nstr = '';
		// Convert Namespace UUID to bits
		for($i = 0; $i < strlen($nhex); $i+=2) 
		{
			$nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
		}
		// Calculate hash value
		$hash = md5($nstr . $name);
		return sprintf('%08s-%04s-%04x-%04x-%12s',
		// 32 bits for "time_low"
		substr($hash, 0, 8),
		// 16 bits for "time_mid"
		substr($hash, 8, 4),
		// 16 bits for "time_hi_and_version",
		// four most significant bits holds version number 3
		(hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x3000,
		// 16 bits, 8 bits for "clk_seq_hi_res",
		// 8 bits for "clk_seq_low",
		// two most significant bits holds zero and one for variant DCE1.1
		(hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,
		// 48 bits for "node"
		substr($hash, 20, 12)
		);
	}
	/**
	 * 
	 * Generate v4 UUID
	 * 
	 * Version 4 UUIDs are pseudo-random.
	 */
	public static function v4() 
	{
		return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
		// 32 bits for "time_low"
		mt_rand(0, 0xffff), mt_rand(0, 0xffff),
		// 16 bits for "time_mid"
		mt_rand(0, 0xffff),
		// 16 bits for "time_hi_and_version",
		// four most significant bits holds version number 4
		mt_rand(0, 0x0fff) | 0x4000,
		// 16 bits, 8 bits for "clk_seq_hi_res",
		// 8 bits for "clk_seq_low",
		// two most significant bits holds zero and one for variant DCE1.1
		mt_rand(0, 0x3fff) | 0x8000,
		// 48 bits for "node"
		mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
		);
	}
	/**
	 * Generate v5 UUID
	 * 
	 * Version 5 UUIDs are named based. They require a namespace (another 
	 * valid UUID) and a value (the name). Given the same namespace and 
	 * name, the output is always the same.
	 * 
	 * @param	uuid	$namespace
	 * @param	string	$name
	 */
	public static function v5($namespace, $name) 
	{
		if(!self::is_valid($namespace)) return false;
		// Get hexadecimal components of namespace
		$nhex = str_replace(array('-','{','}'), '', $namespace);
		// Binary Value
		$nstr = '';
		// Convert Namespace UUID to bits
		for($i = 0; $i < strlen($nhex); $i+=2) 
		{
			$nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
		}
		// Calculate hash value
		$hash = sha1($nstr . $name);
		return sprintf('%08s-%04s-%04x-%04x-%12s',
		// 32 bits for "time_low"
		substr($hash, 0, 8),
		// 16 bits for "time_mid"
		substr($hash, 8, 4),
		// 16 bits for "time_hi_and_version",
		// four most significant bits holds version number 5
		(hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x5000,
		// 16 bits, 8 bits for "clk_seq_hi_res",
		// 8 bits for "clk_seq_low",
		// two most significant bits holds zero and one for variant DCE1.1
		(hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,
		// 48 bits for "node"
		substr($hash, 20, 12)
		);
	}
	public static function is_valid($uuid) {
		return preg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?'.
                      '[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i', $uuid) === 1;
	}
}
?>

Offline

#3 14-09-2016 23:42:59

admin
Administrator
Registered: 21-03-2015
Posts: 13

Re: Zmiana ceny change-price-commands

Tak, specjalnie w komentarzu dodałem przykładowy GUID, ponieważ com_create_guid() nie jest standardową funkcją PHP.
Chciałem dać tylko do zrozumienia, że powinien być generowany w każdej operacji.
Na obecną chwilę odważę się napisać, że GUID nie jest jakoś specjalnie (o ile w ogóle) wykorzystywany przez Allegro.
Osobiście podaję raz wygenerowany GUID do każdego żądania zmiany ceny (także do tej samej aukcji) i polecenie jest za każdym razem przyjmowane.
Z początku myślałem, że zadanie o tym samym GUID, ale zakończone już sukcesem, zostanie odrzucone, ale nie.
Być może w przyszłości będzie wykorzystywany ten identyfikator do pobierania informacji o wykonanych zadaniach, na zasadzie dziennika zdarzeń.
Przykładowy GUID można wygenerować sobie na stronie:
https://www.guidgenerator.com/

Offline

#4 29-09-2016 11:33:49

konrad183
Member
Registered: 14-09-2016
Posts: 2

Re: Zmiana ceny change-price-commands

Ciekawy error przy podaniu złej ceny do REST zakończonej kropką.
co REST ALLEGRO ma wspólnego z ZALANDO???

eror.jpg

Offline

#5 01-10-2016 10:54:30

admin
Administrator
Registered: 21-03-2015
Posts: 13

Re: Zmiana ceny change-price-commands

konrad183 wrote:

Ciekawy error przy podaniu złej ceny do REST zakończonej kropką.
co REST ALLEGRO ma wspólnego z ZALANDO???

Widać Allegro korzysta z rozszerzenia:

https://github.com/zalando/jackson-datatype-money

https://github.com/zalando/jackson-datatype-money wrote:

Jackson Datatype Money is a Jackson module to support JSON serialization and deserialization of JavaMoney data types. It fills a niche, in that it connects the JavaMoney and Jackson libraries so that they work seamlessly together, without requiring additional developer effort. In doing so, it aims to perform a small but repetitive task — once and for all.

The maintainers of Jackson Datatype Money build APIs, so you might notice that this project reflects an API design point of view. In developing our work, we sought a reusable library that would enable us to express monetary amounts in JSON while reflecting our API preferences, as shown in the following example. We couldn't find one, so we created one.

Idąc dalej tym tropem, mogą korzystać z frameworka:
https://jersey.java.net/

RESTful Web Services in Java.

Offline

#6 01-05-2017 16:07:09

Jooj
Member
Registered: 12-04-2017
Posts: 2

Re: Zmiana ceny change-price-commands

dzieje mi się zbyt Na Moim serwerze wyskakuje błąd php związany z generowaniem GUID. Rozwiązałem go importując klasę do ich generowania

Offline

#7 16-12-2017 23:36:37

bdhpl
Member
Registered: 16-12-2017
Posts: 1

Re: Zmiana ceny change-price-commands

Witam,


Pardon za bardzo proste pytanie.

Po skopiowaniu przykładu otrzymuje:

{"error":"invalid_token","error_description":"Cannot convert access token to JSON"}




Przykłąd wygląda tak:

class AllegroOAuth2Client {

  protected $providerSettings = [
    'ClientId' => 'CLIENT ID-cb54-48ba-b12c-5429cc55b734',
    'ClientSecret' => 'SECRET',
    'ApiKey' => KLUCZ API',
    'RedirectUri' => 'http://bdhpl.nazwa.pl/magazyn/stan/cena_allegro.php',

    'AuthorizationUri' => 'https://ssl.allegro.pl/auth/oauth/authorize',
    'TokenUri' => 'https://ssl.allegro.pl/auth/oauth/token'
  ];

  protected $headers = [
    'Content-Type: application/x-www-form-urlencoded'
  ];

  public function __construct(array $customSettings = []) {
    $this->providerSettings = array_merge($this->providerSettings, $customSettings);
    $this->headers[] = 'Authorization: Basic '. base64_encode($this->providerSettings['ClientId'] . ':' . $this->providerSettings['ClientSecret']);
  }

  public function tokenRequest($code) {
    $curl = curl_init($this->providerSettings['TokenUri']);

    curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query([
      'grant_type' => 'authorization_code',
      'code' => $code,
      'api-key' => $this->providerSettings['ApiKey'],
      'redirect_uri' => $this->providerSettings['RedirectUri']
    ]));   

    $result = ($result = curl_exec($curl)) === false ? false : json_decode($result);

    if ($result === false) {
      throw new Exception('Unrecognized error');
    } else if (!empty($result->error)) {
      throw new Exception($result->error . ' - ' . $result->error_description);
    } else {
      return $result;
    }
  }

  public function getAuthorizationUri() {
    return $this->providerSettings['AuthorizationUri'] . '?' . http_build_query([
      'response_type' => 'code',
      'client_id' => $this->providerSettings['ClientId'],
      'api-key' => $this->providerSettings['ApiKey'],
      'redirect_uri' => $this->providerSettings['RedirectUri']
    ]);
  }
}
$auth = new AllegroOAuth2Client();

// Dobrze byłoby sprawdzić od kogo przychodzi żądanie
if (!empty($_GET['code'])) {
  try
  {
    $result = $auth->tokenRequest($_GET['code']);
    echo 'Twój Access Token: ' . $result->access_token . '.';
  }
  catch(Exception $e)
  {
    echo $e->getMessage();
  }
} else {
  echo '<a href="'.$auth->getAuthorizationUri().'">Zaloguj do Allegro</a>';
}
    function commandRequest($uri, $generatedKey, array $params = []) {
    $headers = [
      'Accept: application/vnd.allegro.public.v1+json',
      'Content-Type: application/vnd.allegro.public.v1+json',
      'Authorization: Bearer '.$generatedKey.'',
      'Api-Key: KLUCZ API'
    ];
   


    $curl = curl_init($uri);

    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    $data = json_encode($params);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);   

    return curl_exec($curl);
  }




//$generatedKey = "vRczps31e9Z77Q8k024jAG40XRsuNPy0";  //klucz pobrany po poprawnym zalogowaniu do REST

$itemId = 'numeraukcji';


//include 'uid.php';
$v5uuid = UUID::v5('c9b32284-48d9-4fa3-93a6-8fdb283ee569', 'SomeRandomString');  //generuje GUID jednorazowy kod do komunikacji wymagany w REST

 
  $data = [
    'input' => [
      'buyNowPrice' => [
        'amount' => '199',
        'currency' => 'PLN'
      ]
    ]
  ];
 
echo commandRequest('https://allegroapi.io/offers/' . $itemId . '/change-price-commands/' . $v5uuid, $generatedKey, $data);

Offline

Board footer

Powered by FluxBB