feat(haichao): 新增聚水潭ERP集成功能

- 新增聚水潭回调接口及事件处理机制
- 添加聚水潭商品、订单、售后同步任务
- 实现聚水潭订单推送及售后状态同步
- 新增手动同步聚水潭商品功能
- 在各路由组添加聚水潭中间件支持
This commit is contained in:
2026-04-01 11:55:18 +08:00
parent 359e9eef48
commit 7e422335e4
30 changed files with 2601 additions and 37 deletions

View File

@@ -0,0 +1,88 @@
<?php
namespace app\haichao;
use think\exception\ValidateException;
use think\facade\Log;
abstract class HaichaoBridge
{
private array $api = [
'appid' => '',
'appSecret' => '',
'api' => 'https://openapi.jushuitan.com/',
'access_token' => '',
'shopId' => '',
];
public function __construct()
{
$this->api['appid'] = env('JST_APP_KEY', '');
$this->api['appSecret'] = env('JST_APP_SECRET', '');
$this->api['api'] = env('JST_API', 'https://openapi.jushuitan.com/');
$this->api['access_token'] = env('JST_ACCESS_TOKEN', '');
$this->api['shopId'] = (string)env('JST_SHOP_ID', '');
}
public function getShopId(): string
{
return $this->api['shopId'];
}
/**
* 聚水潭开放平台请求封装
* @param string $api
* @param array $data
* @param array $addonBody
* @return array
*/
protected function post(string $api, array $data = [], array $addonBody = []): array
{
if (!$this->api['appid'] || !$this->api['appSecret'] || !$this->api['access_token']) {
throw new ValidateException('JST config missing');
}
$time = time();
$baseBody = [
'access_token' => $this->api['access_token'],
'app_key' => $this->api['appid'],
];
$baseBody = array_merge($baseBody, $addonBody);
$baseBody['biz'] = json_encode($data, JSON_UNESCAPED_UNICODE);
$baseBody['charset'] = 'utf-8';
$baseBody['timestamp'] = $time;
$baseBody['version'] = '2';
$baseBody['sign'] = $this->sign($baseBody);
$options['http'] = [
'timeout' => 60,
'method' => 'POST',
'header' => 'Content-Type: application/json;charset=utf-8',
'content' => http_build_query($baseBody)
];
$rt = json_decode(file_get_contents("{$this->api['api']}$api", false, stream_context_create($options)), true);
if (!is_array($rt) || !array_key_exists('code', $rt)) {
Log::error('JST response invalid ' . json_encode([
'api' => $api,
], JSON_UNESCAPED_UNICODE));
throw new ValidateException('JST response invalid');
}
if ($rt['code'] != 0) {
Log::error('JST request failed ' . json_encode([
'api' => $api,
'code' => $rt['code'],
'msg' => (string)($rt['msg'] ?? ''),
], JSON_UNESCAPED_UNICODE));
throw new ValidateException($rt['msg'] ?? 'JST error');
}
return $rt;
}
private function sign(array $data): string
{
$computerStr = "";
foreach ($data as $k => $v) {
$computerStr .= $k . $v;
}
$computerStr = $this->api['appSecret'] . $computerStr;
return md5($computerStr);
}
}