forked from devbuscapecompany/buscape-php
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Apiki_Buscape_API.php
492 lines (443 loc) · 16.1 KB
/
Apiki_Buscape_API.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
<?php
/**
* A classe Apiki_Buscape_API foi criada para ajudar no desenvolvimento de
* aplicações usando os webservices disponibilizados pela API do BuscaPé.
*
* As funções desta classe tem os mesmos nomes dos serviços disponibilizados pelo
* BuscaPé.
*
* @author Apiki
* @author João Batista Neto
* @version 2.0.6
* @license Creative Commons Atribuição 3.0 Brasil. http://creativecommons.org/licenses/by/3.0/br/
*/
class Apiki_Buscape_API {
/**
* Id da aplicação
*
* @var string
*/
protected $_applicationId = '';
/**
* Source ID
*
* @var string
*/
protected $_sourceId = '';
/**
* Código do país
*
* @var string
*/
protected $_countryCode = 'BR';
/**
* Formato de retorno padrão
*
* @var string
*/
protected $_format = 'xml';
/**
* Ambiente bws (produção)
*
* @var string
*/
protected $_environment = 'bws';
/**
* A cada instância criada deverá ser passado como parâmetro obrigatório o
* id da aplicação. O Source ID não é obrigatório
*
* @param string $applicationId
* @param string $sourceId
* @throws InvalidArgumentException Se o ID da aplicação não for passado
*/
public function __construct( $applicationId , $sourceId = '' ) {
$this->setApplicationId( $applicationId );
$this->setSourceId( $sourceId );
}
/**
* Método busca retorna os dados da url requisitada
*
* @param string $serviceName Nome do serviço
* @param array $args Parâmetros que serão enviados
* @return string Dados de retorno da URL requisitada
* @throws RuntimeException Se a extensão CURL do PHP estiver desabilitada
*/
protected function _getContent( $serviceName , array $args , $lomadee = false ) {
// @codeCoverageIgnoreStart
if ( !function_exists( 'curl_init' ) ){
throw new RuntimeException( 'A extensão CURL do PHP está desabilitada. Habilite-a para o funcionamento da classe.' );
}
// @codeCoverageIgnoreEnd
if ( (bool) $lomadee ) {
$serviceName .= '/lomadee';
}
if ( !empty( $this->_sourceId ) ){
$args[ 'sourceId' ] = $this->_sourceId;
}
if ( $this->_environment == 'bws' && ( isset( $_SERVER[ 'REMOTE_ADDR' ] ) || ( $xip = isset( $_SERVER[ 'HTTP_X_IP' ] ) ) != false ) ) {
$args[ 'clientIp' ] = preg_replace( '/[^0-9., ]/' , '' , $_SERVER[ $xip ? 'HTTP_X_IP' : 'REMOTE_ADDR' ] );
}
if ($this->_isFormatJson()) {
$args['format'] = 'json';
}
$url = sprintf( 'http://%s.buscape.com/service/%s/%s/%s/?%s' , $this->_environment , $serviceName , $this->_applicationId , $this->_countryCode , http_build_query( $args ) );
$curl = curl_init();
curl_setopt( $curl , CURLOPT_URL , $url );
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false );
curl_setopt( $curl , CURLOPT_USERAGENT , isset( $_SERVER[ 'HTTP_USER_AGENT' ] ) ? $_SERVER[ 'HTTP_USER_AGENT' ] : "Mozilla/4.0" );
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true );
$retorno = curl_exec( $curl );
curl_close( $curl );
return $retorno;
}
/**
* Verifia se o formato de retorno configurado é JSON
*
* @codeCoverageIgnore
* @return bool
*/
private function _isFormatJson() {
if ( $this->getFormat() == 'json' ){
return true;
}
return false;
}
/**
* Define o ambiente de integração
*
* @param string $environment (bws|sandbox)
*/
private function _setEnvironment( $environment ) {
$this->_environment = $environment;
}
/**
* Serviço utilizado somente na integração do Aplicativo com o Lomadee.
* Dentro do fluxo de integração, o aplicativo utiliza esse serviço para
* criar sourceId (código) para o Publisher que deseja utiliza-lo.
* Os parâmetros necessários neste serviço são informados pelo próprio
* Lomadee ao aplicativo.
* No ambiente de homologação sandbox, os valores dos parâmetros podem ser
* fictícios pois neste ambiente este serviço retornará sempre o mesmo sourceId
* para os testes do Developer.
*
* Todos os parâmetros necessários para a busca são informados em um array
* que deve ser passado para o método, são eles:
*
* <ul>
* <li>sourceName = Nome do código.</li>
* <li>publisherId = ID do publisher.</li>
* <li>siteId = ID do site selecionado pelo publisher.</li>
* <li>campaignList = Lista de IDs das campanhas separados por vírgula.</li>
* <li>token = Token utilizado para validação da requisição.</li>
* </ul>
*
* @param array $args
* @return string O sourceId
*/
public function createSourceId( array $args ) {
return $this->_getContent( 'createSource' , $args , true );
}
/**
* Método faz busca de categorias, permite que você exiba informações
* relativas às categorias. É possível obter categorias, produtos ou ofertas
* informando apenas um ID de categoria.
*
*
* <ul>
* <li>categoryId = Id da categoria</li>
* <li>keyword = Palavra-chave buscada entre as categorias</li>
* <li>callback = Função de retorno a ser executada caso esteja usando o método
* json como retorno.</li>
* </ul>
*
* Se não for informado nenhum dos parâmetros, a função retornará por padrão
* uma lista de categorias raiz, de id 0.
*
* @param array $args Parâmetros passados para gerar a url de requisição
* @return string Retorno da pesquisa feita no BuscaPé, no formato requerido.
* @throws UnexpectedValueException Se a palavra chave for uma string vazia.
* @throws UnexpectedValueException Se o id da categoria for menor que zero.
*/
public function findCategoryList( array $args = array() ) {
return $this->_getContent( 'findCategoryList' , $this->validateParams( array_merge( array( 'categoryId' => 0 ) , $args ) ) );
}
/**
* Método busca uma lista de ofertas. É possível obter a lista de ofertas
* informando o ID do produto.
*
* Todos os parâmetros necessários para a busca são informados em um array
* que deve ser passado para o método, são eles:
*
* <ul>
* <li>categoryId = Id da categoria</li>
* <li>keyword = Palavra-chave buscada entre as categorias</li>
* <li>productId = Id do produto</li>
* <li>barcode = Código de barras do produto</li>
* <li>callback = Função de retorno a ser executada caso esteja usando o método
* json como retorno.</li>
* </ul>
*
* Pelo menos um dos parâmetros de pesquisa devem ser informados para o retorno
* da função. Os parâmetros <categoryId> e <keyword> podem ser usados em conjunto.
*
* @param array $args Parâmetros passados para gerar a url de requisição.
* @param boolean $lomadee Indica se deverá ser utilizada a API do Lomadee
* @return string Retorno da pesquisa feita no BuscaPé, no formato requerido.
* @throws UnexpectedValueException Se nenhum parâmetro for passado
* @throws UnexpectedValueException Se o id da categoria for menor que zero.
* @throws UnexpectedValueException Se o id do produto for menor que zero.
* @throws UnexpectedValueException Se a palavra chave for uma string vazia.
*/
public function findOfferList( array $args = array() , $lomadee = false ) {
return $this->_getContent( 'findOfferList' , $this->validateParams( $args , array() , array( 'categoryId' , 'productId' , 'keyword' ) ) , $lomadee );
}
/**
* Método permite que você busque uma lista de produtos únicos
* utilizando o id da categoria final ou um conjunto de palavras-chaves
* ou ambos.
*
* Todos os parâmetros necessários para a busca são informados em um array
* que deve ser passado para o método, são eles:
*
* <ul>
* <li>categoryId = Id da categoria</li>
* <li>keyword = Palavra-chave buscada entre as categorias</li>
* <li>callback = Função de retorno a ser executada caso esteja usando o método
* json como retorno.</li>
* </ul>
*
* Pelo menos um dos parâmetros, <categoryID> ou <keyword> são requeridos para
* funcionamento desta função. Os dois também podem ser usados em conjunto.
* Ou seja, podemos buscar uma palavra-chave em apenas uma determinada categoria.
*
* @param array $args Parâmetros para gerar a url de requisição
* @param boolean $lomadee Indica se deverá ser utilizada a API do Lomadee
* @return string Retorno da pesquisa feita no BuscaPé, no formato requerido.
* @throws UnexpectedValueException Se nenhum parâmetro for passado.
* @throws UnexpectedValueException Se o id da categoria for menor que zero.
* @throws UnexpectedValueException Se a palavra chave for uma string vazia.
*/
public function findProductList( array $args = array() , $lomadee = false ) {
return $this->_getContent( 'findProductList' , $this->validateParams( $args , array() , array( 'categoryId' , 'keyword' ) ) , $lomadee );
}
/**
* Retorna o Id da aplicação
*
* @return string
*/
public function getApplicationId() {
return $this->_applicationId;
}
/**
* Retorna o código do país
*
* @return string
*/
public function getCountryCode() {
return $this->_countryCode;
}
/**
* Retorna o ambiente de integração
*
* @return string
*/
public function getEnvironment() {
return $this->_environment;
}
/**
* Retorna o formato de retorno
*
* @return string
*/
public function getFormat() {
return $this->_format;
}
/**
* Retorna o Source ID
*
* @return string
*/
public function getSourceId() {
return $this->_sourceId;
}
/**
* Define o Id da aplicação
*
* @param string $applicationId
* @throws InvalidArgumentException Se o ID da aplicação não for passado
*/
public function setApplicationId( $applicationId ) {
if ( empty( $applicationId ) ){
throw new InvalidArgumentException( 'ID da aplicação não pode ser vazio.' );
}
$this->_applicationId = $applicationId;
}
/**
* Define o código do país
*
* @param string $countryCode (AR|BR|CL|CO|MX|PE|VE)
* @throws InvalidArgumentException Se o código do país não existir
*/
public function setCountryCode( $countryCode ) {
if ( !in_array( strtoupper( $countryCode ) , array( 'AR' , 'BR' , 'CL' , 'CO' , 'MX' , 'PE' , 'VE' ) ) ){
throw new InvalidArgumentException( sprintf( 'O código do país <b>%s</b> não existe.' , $countryCode ) );
}
$this->_countryCode = $countryCode;
}
/**
* Define o formato de retorno
*
* @param string $format (xml|json)
* @throws InvalidArgumentException Se o formato não existir
*/
public function setFormat( $format ) {
if ( !in_array( strtolower( $format ) , array( 'xml' , 'json' ) ) ){
throw new InvalidArgumentException( sprintf( 'O formato de retorno <b>%s</b> não existe.' , $format ) );
}
$this->_format = $format;
}
/**
* Define se a integração vai ser feita no sandbox ou não
*
* @param bool $is
*/
public function setSandbox() {
$this->_setEnvironment( 'sandbox' );
}
/**
* Define o Source Id
*
* @param string $sourceId
*/
public function setSourceId( $sourceId ) {
$this->_sourceId = $sourceId;
}
/**
* Método retorna os produtos mais populares do BuscaPé
*
* Todos os parâmetros necessários para a busca são informados em um array
* que deve ser passado para o método, são eles:
*
* <ul>
* <li>callback = Função de retorno a ser executada caso esteja usando o método
* json como retorno.</li>
* </ul>
*
* @param array $args Parâmetros passados para gerar a url de requisição.
* @return string Retorno da pesquisa feita no BuscaPé, no formato requerido.
* @throws UnexpectedValueException Se o id da categoria for menor que zero.
*/
public function topProducts( array $args = array() ) {
return $this->_getContent( 'topProducts' , $this->validateParams( $args ) );
}
/**
* Valida os parâmetros que serão enviados à API do BuscaPé
* @param array $args Matriz com os parâmetros
* @param integer $and Lista de parâmetros obrigatórios
* @param integer $or Lista de parâmetros opcionais, mas que pelo menos 1 deve existir
* @throws OutOfBoundsException Se o número de parâmetros passados for menor que
* os obrigatórios.
* @throws UnexpectedValueException Se algum dos parâmetros forem inválidos
* @throws UnexpectedValueException Se nenhum dos parâmetros opcionais forem passados
*/
private function validateParams( array $args , array $and = array() , array $or = array() ){
if ( isset( $args[ 'keyword' ] ) ){
$args[ 'keyword' ] = trim( (string) $args[ 'keyword' ] );
if ( empty( $args[ 'keyword' ] ) ){
throw new UnexpectedValueException( 'A palavra chave não pode ser uma string vazia' );
}
}
if ( isset( $args[ 'categoryId' ] ) ){
$args[ 'categoryId' ] = (int) $args[ 'categoryId' ];
if ( $args[ 'categoryId' ] < 0 ){
throw new UnexpectedValueException( 'O id da categoria deve ser maior ou igual a zero' );
}
}
if ( isset( $args[ 'productId' ] ) ){
$args[ 'productId' ] = (int) $args[ 'productId' ];
if ( $args[ 'productId' ] < 0 ){
throw new UnexpectedValueException( 'O id do produto deve ser maior ou igual a zero' );
}
}
if ( isset( $args[ 'sellerId' ] ) ){
$args[ 'sellerId' ] = (int) $args[ 'sellerId' ];
if ( $args[ 'sellerId' ] < 0 ){
throw new UnexpectedValueException( 'O id da loja/empresa deve ser maior ou igual a zero' );
}
}
foreach ( $and as $param ){
if ( !isset( $args[ $param ] ) ){
throw new UnexpectedValueException( sprintf( 'O parâmetro %s é requerido' , $param ) );
}
}
for ( $i = 0 , $t = count( $or ) , $f = 0 ; $i < $t ; ++$i ){
if ( isset( $args[ $or[ $i ] ] ) ){
++$f;
break;
}
}
if ( $t != 0 && $f == 0 ){
throw new UnexpectedValueException( sprintf( 'Pelo menos um dos parâmetros: "%s", devem ser passados e "%s" foi passado.' , implode( '","' , $or ) , implode( '","' , array_keys( $args ) ) ) );
}
return $args;
}
/**
* Função retorna os detalhes técnicos de um determinado produto.
*
* Todos os parâmetros necessários para a busca são informados em um array
* que deve ser passado para o método, são eles:
*
* <ul>
* <li>productId = Id do produto (requerido)</li>
* <li>callback = Função de retorno a ser executada caso esteja usando o método
* json como retorno.</li>
* </ul>
*
* @param array $args Parâmetros passados para gerar a url de requisição.
* @return string Função de retorno a ser executada caso esteja usando o método
* @throws UnexpectedValueException Se o ID do produto não for passado
*/
public function viewProductDetails( array $args = array() ) {
return $this->_getContent( 'viewProductDetails' , $this->validateParams( $args , array( 'productId' ) ) );
}
/**
* Função retorna os detalhes da loja/empresa como: endereços, telefones de
* contato etc...
*
* Todos os parâmetros necessários para a busca são informados em um array
* que deve ser passado para o método, são eles:
*
* <ul>
* <li>sallerId = Id da loja/empresa (requerido)</li>
* <li>callback = Função de retorno a ser executada caso esteja usando o método
* json como retorno.</li>
* </ul>
*
* @param array $args Parâmetros passados para gerar a url de requisição.
* @return string Função de retorno a ser executada caso esteja usando o método.
* @throws UnexpectedValueException Se o ID da loja não for passado
*/
public function viewSellerDetails( array $args = array() ) {
return $this->_getContent( 'viewSellerDetails' , $this->validateParams( $args , array( 'sellerId' ) ) );
}
/**
* Método retorna as avaliações dos usuários sobre um determinado produto
*
* Todos os parâmetros necessários para a busca são informados em um array
* que deve ser passado para o método, são eles:
*
* <ul>
* <li>productId = Id do produto (requerido)</li>
* <li>callback = Função de retorno a ser executada caso esteja usando o método
* json como retorno.</li>
* </ul>
*
* @param args $args Parâmetros passados para gerar a url de requisição.
* @return string Retorno da pesquisa feita no BuscaPé, no formato requerido.
* @throws UnexpectedValueException Se o ID do produto não for passado.
* @throws UnexpectedValueException Se o ID do produto for menor que zero.
*/
public function viewUserRatings( array $args = array() ) {
return $this->_getContent( 'viewUserRatings' , $this->validateParams( $args , array( 'productId' ) ) );
}
}