erp/app/Services/Business/KuaiTuanTuan/KuaiTuanTuan.php

145 lines
5.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Services\Business\KuaiTuanTuan;
use App\Models\BusinessGoodsSku;
use App\Models\GoodsSku;
use App\Services\Business\BusinessClient;
class KuaiTuanTuan extends BusinessClient
{
// 所有的请求和响应数据编码皆为utf-8格式url里的所有参数值请做urlencode编码。
// 如果请求的content-type是 application/x-www-form-urlencoded所有参数值也做urlencode编码
// 如果是multipart/form-data格式每个表单字段的参数值无需编码但每个表单字段的charset需要指定为utf-8
// 如果指定接口返回数据格式为JSON请指明header头content-type: application/json
protected $clientId = '8d7ca13bc27247b6a04e08404b51dfd8';
protected $clientSecret = '4478bc82dc1e1f68fe06c9f2bc683f1dcb3e6d83';
protected $publicParams = [
'type' => '',
'client_id' => '',
'access_token' => '', // 非必填,通过code获取的access_token
'timestamp' => '',
'data_type' => '', // 非必填,响应格式即返回数据的格式JSON或者XML二选一默认JSON注意是大写
'version' => '', // 非必填, API协议版本号默认为V1可不填
'sign' => ''
];
public function auth()
{
$accessToken = $this->getAccessTokenWithCode();
$accessToken['scope'] = json_encode($accessToken['scope'], 256);
$accessToken['pop_auth_token_create_response'] = json_encode($accessToken, 256);
$accessToken['status'] = 1;
$this->shop->update($accessToken);
return $this->shop;
}
public function downloadGoodsListAndBind($page = 1)
{
[$type, $appendParams] = Goods::downloadGoods($this->shop->owner_id, $page);
$res = $this->doRequest($type, $appendParams);
$goods = $res['ktt_goods_query_list_response']['goods_list'];
$this->bindGoods($goods);
$pageNum = ceil($res['ktt_goods_query_list_response']['total'] / $appendParams['size']);
if ($pageNum > $page && 10 >= $page) {
$this->downloadGoods($page + 1);
}
}
public function bindGoods($goods)
{
Goods::bindGoods($goods, $this->shop->id);
}
public function incrQuantity($businessGoodsSku, $num, $incremental)
{
[$type, $appendParams] = Goods::incrQuantity($businessGoodsSku->goods_id, $businessGoodsSku->sku_id, $num, $incremental ? 1 : 2);
$this->doRequest($type, $appendParams);
}
/**
* 下载没有发起售后,未取消的订单
*
* @param $beginTime
* @param $endTime
* @param int $page
* @param string $downloadType
* @return void
*/
public function downloadOrdersAndSave($beginTime, $endTime, $downloadType = 'default', $page = 1)
{
if ('increment' === $downloadType) {
[$type, $appendParams] = Order::downloadIncrementOrders($beginTime, $endTime, $page);
$responseName = 'ktt_increment_order_query_response';
} else {
[$type, $appendParams] = Order::downloadOrders($beginTime, $endTime, $page);
$responseName = 'ktt_order_list_response';
}
$res = $this->doRequest($type, $appendParams);
$this->saveOrders($res[$responseName]['order_list']);
$pageNum = ceil($res[$responseName]['total_count'] / $appendParams['page_size']);
if ($pageNum > $page && 10 >= $page) {
$this->downloadOrdersAndSave($beginTime, $endTime, $page + 1);
}
}
protected function getAccessTokenWithCode()
{
$type = 'pdd.pop.auth.token.create';
$res = $this->doRequest($type, ['code' => $this->code]);
return $res['pop_auth_token_create_response'];
}
protected function getSign($params)
{
ksort($params);
$str = '';
foreach ($params as $key => $val) {
$str .= $key . $val;
}
$str = $this->clientSecret . $str . $this->clientSecret;
return strtoupper(md5($str));
}
public function doRequest($type, $appendParams = [], $url = 'https://gw-api.pinduoduo.com/api/router')
{
$publicParams = [
'type' => $type,
'client_id' => $this->clientId,
'timestamp' => time()
];
if ('pdd.pop.auth.token.create' !== $type) {
$publicParams['access_token'] = $this->getShop()->access_token;
}
$publicParams = array_merge($publicParams, $appendParams);
$publicParams['sign'] = $this->getSign($publicParams);
return $this->formDataPostRequest($url, $publicParams);
}
public function downloadGoods($skuId)
{
$goodsSku = GoodsSku::query()
->with(['goods:id,goods_code'])
->find($skuId);
$code = $goodsSku->goods->goods_code . '_' . $goodsSku->sku_code;
$business = BusinessGoodsSku::query()->where('shop_id', $this->shop->id)->where('external_sku_id', $code)->first(['goods_id', 'sku_id']);
[$type, $appendParams] = Goods::downloadSingle($business->goods_id);
$res = $this->doRequest($type, $appendParams);
$goods = $res['response']['result'];
$this->bindGoods([$goods]);
}
public function getAuthUrl($shopId, $platId)
{
$state = $shopId . '_' . $platId;
return "https://oauth.pinduoduo.com/authorize/ktt?client_id={$this->clientId}&redirect_uri={$this->redirectUri}&state={$state}";
}
}