Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
meibuyu-rpc
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
without authentication
meibuyu-rpc
Commits
9094556b
Commit
9094556b
authored
Sep 18, 2020
by
王源
🎧
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'test' into shopify
parents
9ec6ab8f
9f9dd18e
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
373 additions
and
19 deletions
+373
-19
ShopifyApp.php
src/Shopify/ShopifyApp.php
+8
-0
AbstractShopify.php
src/Shopify/lib/AbstractShopify.php
+115
-19
Product.php
src/Shopify/lib/Product.php
+34
-0
ProductImage.php
src/Shopify/lib/ProductImage.php
+16
-0
ProductVariant.php
src/Shopify/lib/ProductVariant.php
+28
-0
CurlRequest.php
src/Tools/CurlRequest.php
+97
-0
CurlResponse.php
src/Tools/CurlResponse.php
+75
-0
No files found.
src/Shopify/ShopifyApp.php
View file @
9094556b
...
...
@@ -14,6 +14,8 @@ use Meibuyu\Micro\Shopify\lib\Collect;
use
Meibuyu\Micro\Shopify\lib\Collection
;
use
Meibuyu\Micro\Shopify\lib\CustomCollection
;
use
Meibuyu\Micro\Shopify\lib\Metafield
;
use
Meibuyu\Micro\Shopify\lib\Product
;
use
Meibuyu\Micro\Shopify\lib\ProductVariant
;
use
Meibuyu\Micro\Shopify\lib\SmartCollection
;
use
Meibuyu\Micro\Shopify\lib\Webhook
;
...
...
@@ -27,12 +29,16 @@ use Meibuyu\Micro\Shopify\lib\Webhook;
* @property-read CustomCollection $CustomCollection
* @property-read SmartCollection $SmartCollection
* @property-read Metafield $Metafield
* @property-read Product $Product
* @property-read ProductVariant $ProductVariant
*
* @method Webhook Webhook(integer $id = null)
* @method Collection Collection(integer $id = null)
* @method CustomCollection CustomCollection(integer $id = null)
* @method SmartCollection SmartCollection(integer $id = null)
* @method Metafield Metafield(integer $id = null)
* @method Product Product(integer $id = null)
* @method ProductVariant ProductVariant(integer $id = null)
*
*/
class
ShopifyApp
...
...
@@ -45,6 +51,8 @@ class ShopifyApp
'CustomCollection'
,
'SmartCollection'
,
'Metafield'
,
'Product'
,
'ProductVariant'
,
];
protected
$childResources
=
array
(
...
...
src/Shopify/lib/AbstractShopify.php
View file @
9094556b
...
...
@@ -153,6 +153,95 @@ abstract class AbstractShopify
return
$resourceUrl
.
(
$customAction
?
"/
$customAction
"
:
''
)
.
'.json'
.
(
!
empty
(
$urlParams
)
?
'?'
.
http_build_query
(
$urlParams
)
:
''
);
}
// /**
// * @param array $urlParams
// * @param null $url
// * @param null $dataKey
// * @return mixed
// * @throws Exception
// */
// public function get($urlParams = [], $url = null, $dataKey = null)
// {
// if (!$url) $url = $this->generateUrl($urlParams);
// $response = HttpRequestJson::get($url, $this->httpHeaders);
// if (!$dataKey) $dataKey = $this->id ? $this->resourceKey : $this->pluralizeKey;
// return $this->processResponse($response, $dataKey);
// }
//
// /**
// * 根据id获取一条数据
// * @param $id
// * @param array $urlParams
// * @return mixed
// * @throws Exception
// */
// public function show($id, $urlParams = [])
// {
// $url = $this->generateUrl($urlParams, $id);
// $response = HttpRequestJson::get($url, $this->httpHeaders);
// return $this->processResponse($response, $this->resourceKey);
// }
//
// /**
// * 获取数量
// * @param array $urlParams
// * @return mixed
// * @throws Exception
// */
// public function count($urlParams = [])
// {
// if (!$this->countEnabled) {
// throw new Exception("当前类{$this->getResourceName()}不支持count()方法");
// }
// $url = $this->generateUrl($urlParams, null, 'count');
// return $this->get([], $url, 'count');
// }
//
// /**
// * @param $dataArray
// * @param null $url
// * @param bool $wrapData
// * @return mixed
// * @throws Exception
// */
// public function post($dataArray, $url = null, $wrapData = true)
// {
// if (!$url) $url = $this->generateUrl();
// if ($wrapData && !empty($dataArray)) $dataArray = $this->wrapData($dataArray);
// $response = HttpRequestJson::post($url, $dataArray, $this->httpHeaders);
// return $this->processResponse($response, $this->resourceKey);
// }
//
// /**
// * @param int|string $id
// * @param $dataArray
// * @param null $url
// * @param bool $wrapData
// * @return mixed
// * @throws Exception
// */
// public function put($id, $dataArray, $url = null, $wrapData = true)
// {
// if (!$url) $url = $this->generateUrl([], $id);
// if ($wrapData && !empty($dataArray)) $dataArray = $this->wrapData($dataArray);
// $response = HttpRequestJson::put($url, $dataArray, $this->httpHeaders);
// return $this->processResponse($response, $this->resourceKey);
// }
//
// /**
// * @param int|string $id
// * @param array $urlParams
// * @param null $url
// * @return mixed
// * @throws Exception
// */
// public function delete($id = null, $urlParams = [], $url = null)
// {
// if (!$url) $url = $this->generateUrl($urlParams, $id);
// $response = HttpRequestJson::delete($url, $this->httpHeaders);
// return $this->processResponse($response);
// }
/**
* @param array $urlParams
* @param null $url
...
...
@@ -196,21 +285,6 @@ abstract class AbstractShopify
return
$this
->
processResponse
(
$response
,
$this
->
resourceKey
);
}
/**
* 获取数量
* @param array $urlParams
* @return mixed
* @throws Exception
*/
public
function
count
(
$urlParams
=
[])
{
if
(
!
$this
->
countEnabled
)
{
throw
new
Exception
(
"当前类
{
$this
->
getResourceName
()
}
不支持count()方法"
);
}
$url
=
$this
->
generateUrl
(
$urlParams
,
null
,
'count'
);
return
$this
->
get
([],
$url
,
'count'
);
}
/**
* @param $dataArray
* @param null $url
...
...
@@ -282,14 +356,36 @@ abstract class AbstractShopify
* @return mixed
* @throws Exception
*/
// public function processResponse($response, $dataKey = null)
// {
// $httpCode = $response->getStatusCode();
// $content = $response->getBody()->getContents();
// $content = json_decode($content, true);
//
// if (isset($content['errors'])) {
// throw new Exception($this->castString($content['errors']), $httpCode);
// }
// if ($dataKey && isset($content[$dataKey])) {
// return $content[$dataKey];
// } else {
// return $content;
// }
// }
/**
* 处理响应
* @param array $response
* @param null $dataKey
* @return mixed
* @throws Exception
*/
public
function
processResponse
(
$response
,
$dataKey
=
null
)
{
$httpCode
=
$response
->
getStatusCode
();
$content
=
$response
->
getBody
()
->
getContents
();
$content
=
json_decode
(
$content
,
true
);
[
$code
,
$header
,
$body
]
=
$response
;
$content
=
json_decode
(
$body
,
true
);
if
(
isset
(
$content
[
'errors'
]))
{
throw
new
Exception
(
$this
->
castString
(
$content
[
'errors'
]),
$
httpC
ode
);
throw
new
Exception
(
$this
->
castString
(
$content
[
'errors'
]),
$
c
ode
);
}
if
(
$dataKey
&&
isset
(
$content
[
$dataKey
]))
{
return
$content
[
$dataKey
];
...
...
src/Shopify/lib/Product.php
0 → 100644
View file @
9094556b
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/9/2
* Time: 16:50
*/
namespace
Meibuyu\Micro\Shopify\lib
;
/**
* Class Product
* @package Meibuyu\Micro\Shopify\lib
*
* @property-read ProductImage $Image
* @property-read ProductVariant $Variant
* @property-read Metafield $Metafield
*
* @method ProductImage Image(integer $id = null)
* @method ProductVariant Variant(integer $id = null)
* @method Metafield Metafield(integer $id = null)
*/
class
Product
extends
AbstractShopify
{
protected
$resourceKey
=
'product'
;
protected
$childResource
=
[
'ProductImage'
=>
'Image'
,
'ProductVariant'
=>
'Variant'
,
'Metafield'
,
];
}
src/Shopify/lib/ProductImage.php
0 → 100644
View file @
9094556b
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/9/2
* Time: 16:50
*/
namespace
Meibuyu\Micro\Shopify\lib
;
class
ProductImage
extends
AbstractShopify
{
protected
$resourceKey
=
'image'
;
}
src/Shopify/lib/ProductVariant.php
0 → 100644
View file @
9094556b
<?php
/**
* Created by PhpStorm.
* User: Zero
* Date: 2020/9/2
* Time: 16:50
*/
namespace
Meibuyu\Micro\Shopify\lib
;
/**
* Class ProductVariant
* @package Meibuyu\Micro\Shopify\lib
*
* @property-read Metafield $Metafield
*
* @method Metafield Metafield(integer $id = null)
*/
class
ProductVariant
extends
AbstractShopify
{
protected
$resourceKey
=
'variant'
;
protected
$childResource
=
[
'Metafield'
,
];
}
src/Tools/CurlRequest.php
0 → 100644
View file @
9094556b
<?php
namespace
Meibuyu\Micro\Tools
;
use
Exception
;
class
CurlRequest
{
protected
static
function
init
(
$url
,
$httpHeaders
=
[])
{
// Create Curl resource
$ch
=
curl_init
();
// Set URL
curl_setopt
(
$ch
,
CURLOPT_URL
,
$url
);
//Return the transfer as a string
curl_setopt
(
$ch
,
CURLOPT_RETURNTRANSFER
,
1
);
curl_setopt
(
$ch
,
CURLOPT_HEADER
,
true
);
curl_setopt
(
$ch
,
CURLOPT_USERAGENT
,
'PHPClassic/PHPShopify'
);
$headers
=
[];
foreach
(
$httpHeaders
as
$key
=>
$value
)
{
$headers
[]
=
"
$key
:
$value
"
;
}
//Set HTTP Headers
curl_setopt
(
$ch
,
CURLOPT_HTTPHEADER
,
$headers
);
return
$ch
;
}
public
static
function
get
(
$url
,
$httpHeaders
=
[])
{
$ch
=
self
::
init
(
$url
,
$httpHeaders
);
return
self
::
processRequest
(
$ch
);
}
public
static
function
post
(
$url
,
$data
,
$httpHeaders
=
[])
{
$ch
=
self
::
init
(
$url
,
$httpHeaders
);
curl_setopt
(
$ch
,
CURLOPT_CUSTOMREQUEST
,
'POST'
);
curl_setopt
(
$ch
,
CURLOPT_POSTFIELDS
,
$data
);
return
self
::
processRequest
(
$ch
);
}
public
static
function
put
(
$url
,
$data
,
$httpHeaders
=
[])
{
$ch
=
self
::
init
(
$url
,
$httpHeaders
);
curl_setopt
(
$ch
,
CURLOPT_CUSTOMREQUEST
,
'PUT'
);
curl_setopt
(
$ch
,
CURLOPT_POSTFIELDS
,
$data
);
return
self
::
processRequest
(
$ch
);
}
public
static
function
delete
(
$url
,
$httpHeaders
=
[])
{
$ch
=
self
::
init
(
$url
,
$httpHeaders
);
curl_setopt
(
$ch
,
CURLOPT_CUSTOMREQUEST
,
'DELETE'
);
return
self
::
processRequest
(
$ch
);
}
protected
static
function
processRequest
(
$ch
)
{
# Check for 429 leaky bucket error
while
(
1
)
{
$output
=
curl_exec
(
$ch
);
$response
=
new
CurlResponse
(
$output
);
$httpCode
=
curl_getinfo
(
$ch
,
CURLINFO_HTTP_CODE
);
if
(
$httpCode
!=
429
)
{
break
;
}
$limitHeader
=
explode
(
'/'
,
$response
->
getHeader
(
'X-Shopify-Shop-Api-Call-Limit'
),
2
);
if
(
isset
(
$limitHeader
[
1
])
&&
$limitHeader
[
0
]
<
$limitHeader
[
1
])
{
throw
new
Exception
(
$response
->
getBody
());
}
usleep
(
500000
);
}
if
(
curl_errno
(
$ch
))
{
throw
new
Exception
(
curl_errno
(
$ch
)
.
' : '
.
curl_error
(
$ch
));
}
// close curl resource to free up system resources
curl_close
(
$ch
);
$httpHeader
=
$response
->
getHeaders
();
return
[
$httpCode
,
$httpHeader
,
$response
->
getBody
()];
}
}
src/Tools/CurlResponse.php
0 → 100644
View file @
9094556b
<?php
namespace
Meibuyu\Micro\Tools
;
class
CurlResponse
{
/** @var array */
private
$headers
=
[];
/** @var string */
private
$body
;
public
function
__construct
(
$response
)
{
$this
->
parse
(
$response
);
}
/**
* @param string $response
*/
private
function
parse
(
$response
)
{
$response
=
\explode
(
"
\r\n\r\n
"
,
$response
);
if
(
\count
(
$response
)
>
1
)
{
// We want the last two parts
$response
=
\array_slice
(
$response
,
-
2
,
2
);
list
(
$headers
,
$body
)
=
$response
;
foreach
(
\explode
(
"
\r\n
"
,
$headers
)
as
$header
)
{
$pair
=
\explode
(
': '
,
$header
,
2
);
if
(
isset
(
$pair
[
1
]))
{
$headerKey
=
strtolower
(
$pair
[
0
]);
$this
->
headers
[
$headerKey
]
=
$pair
[
1
];
}
}
}
else
{
$body
=
$response
[
0
];
}
$this
->
body
=
$body
;
}
/**
* @return array
*/
public
function
getHeaders
()
{
return
$this
->
headers
;
}
/**
* @param string $key
*
* @return string
*/
public
function
getHeader
(
$key
)
{
return
isset
(
$this
->
headers
[
$key
])
?
$this
->
headers
[
$key
]
:
null
;
}
/**
* @return string
*/
public
function
getBody
()
{
return
$this
->
body
;
}
public
function
__toString
()
{
$body
=
$this
->
getBody
();
$body
=
$body
?:
''
;
return
$body
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment