PHP code example of doudian / hyperf-sdk

1. Go to this page and download the library: Download doudian/hyperf-sdk library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

doudian / hyperf-sdk example snippets




return [
    'default' => [
        'app_key' => env('DOUDIAN_APP_KEY', ''),
        'app_secret' => env('DOUDIAN_APP_SECRET', ''),
        'open_request_url' => env('DOUDIAN_OPEN_REQUEST_URL', 'https://openapi-fxg.jinritemai.com'),
        'http_connect_timeout' => (int) env('DOUDIAN_HTTP_CONNECT_TIMEOUT', 3),
        'http_read_timeout' => (int) env('DOUDIAN_HTTP_READ_TIMEOUT', 10),
        'pool' => [
            'min_connections' => 1,
            'max_connections' => 10,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
            'heartbeat' => -1,
            'max_idle_time' => 60.0,
        ],
    ],
    // 支持多个应用配置
    'shops' => [
        'shop1' => [
            'app_key' => 'your_app_key_1',
            'app_secret' => 'your_app_secret_1',
            // 其他配置项...
        ],
        'shop2' => [
            'app_key' => 'your_app_key_2',
            'app_secret' => 'your_app_secret_2',
            // 其他配置项...
        ],
    ],
];



namespace App\Controller;

use Doudian\Core\Contract\ClientFactoryInterface;
use Doudian\Core\AccessTokenBuilder;
use Doudian\Api\Product\ProductListRequest;
use Doudian\Api\Product\Param\ProductListParam;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;

#[Controller]
class DoudianController
{
    public function __construct(
        private ClientFactoryInterface $doudianClientFactory
    ) {}

    #[GetMapping('/doudian/products')]
    public function getProducts(): array
    {
        // 获取客户端(使用默认配置)
        $client = $this->doudianClientFactory->create();
        
        // 或者获取指定应用的客户端
        // $client = $this->doudianClientFactory->get('shop1');
        
        // 构建访问令牌
        $accessToken = AccessTokenBuilder::parse('your_access_token');
        
        // 构建请求
        $request = new ProductListRequest();
        $param = new ProductListParam();
        $param->page = 0;
        $param->size = 20;
        $param->status = 1; // 上架状态
        $request->setParam($param);
        
        // 发起请求
        $response = $client->request($request, $accessToken);
        
        return ['data' => $response];
    }
}



namespace App\Service;

use Doudian\Core\Contract\ClientFactoryInterface;
use Doudian\Core\AccessToken;
use Doudian\Api\Product\ProductListRequest;
use Doudian\Api\Product\Param\ProductListParam;
use Hyperf\Di\Annotation\Inject;

class DoudianService
{
    #[Inject]
    private ClientFactoryInterface $clientFactory;

    public function getProductList(AccessToken $accessToken, int $page = 0, int $size = 10): object
    {
        $client = $this->clientFactory->create();
        
        $request = new ProductListRequest();
        $param = new ProductListParam();
        $param->page = $page;
        $param->size = $size;
        $request->setParam($param);
        
        return $client->request($request, $accessToken);
    }
    
    public function getShop1ProductList(AccessToken $accessToken): object
    {
        // 使用指定的应用配置
        $client = $this->clientFactory->get('shop1');
        
        $request = new ProductListRequest();
        $param = new ProductListParam();
        $param->page = 0;
        $param->size = 100;
        $request->setParam($param);
        
        return $client->request($request, $accessToken);
    }
}

use Doudian\Core\AccessTokenBuilder;

// 方式 1: 使用授权码获取访问令牌
$accessToken = AccessTokenBuilder::build(
    'your_authorization_code', 
    AccessTokenBuilder::ACCESS_TOKEN_CODE
);

// 方式 2: 使用 shop_id 获取访问令牌(自用型应用)
$accessToken = AccessTokenBuilder::build(
    'your_shop_id', 
    AccessTokenBuilder::ACCESS_TOKEN_SHOP_ID
);

// 方式 3: 使用指定应用配置
$accessToken = AccessTokenBuilder::build(
    'your_authorization_code', 
    AccessTokenBuilder::ACCESS_TOKEN_CODE,
    'shop1'  // 应用配置名称
);

if ($accessToken->isSuccess()) {
    echo "访问令牌: " . $accessToken->getAccessToken();
    echo "有效期: " . $accessToken->getExpireIn() . " 秒";
    echo "刷新令牌: " . $accessToken->getRefreshToken();
} else {
    echo "获取失败: " . $accessToken->getMsg();
}

// 使用刷新令牌刷新访问令牌
$refreshToken = 'your_refresh_token';
$accessToken = AccessTokenBuilder::refresh($refreshToken);

// 或者使用 AccessToken 对象直接刷新
$accessToken = AccessTokenBuilder::refresh($existingAccessToken);

// 当你已经有访问令牌字符串时
$accessToken = AccessTokenBuilder::parse('your_access_token_string');

use Doudian\Api\Product\ProductListRequest;
use Doudian\Api\Product\Param\ProductListParam;

// 获取产品列表
$request = new ProductListRequest();
$param = new ProductListParam();
$param->page = 0;
$param->size = 20;
$param->status = 1; // 上架状态
$param->title = '搜索标题'; // 可选
$request->setParam($param);

$response = $client->request($request, $accessToken);



namespace App\Api\Custom;

use Doudian\Core\AbstractRequest;

class CustomApiRequest extends AbstractRequest
{
    public function getUrlPath(): string
    {
        return '/your/custom/api/path';
    }
}

// 使用
$request = new CustomApiRequest();
$param = (object) [
    'your_param' => 'value',
    'another_param' => 123,
];
$request->setParam($param);

$response = $client->request($request, $accessToken);

try {
    $response = $client->request($request, $accessToken);
    
    // 检查业务状态码
    if (property_exists($response, 'code') && $response->code == 10000) {
        // 成功
        $data = $response->data;
    } else {
        // 业务错误
        $errorMsg = $response->message ?? '未知错误';
        throw new \Exception("API 调用失败: $errorMsg");
    }
} catch (\GuzzleHttp\Exception\RequestException $e) {
    // HTTP 请求异常
    throw new \Exception("网络请求失败: " . $e->getMessage());
} catch (\Exception $e) {
    // 其他异常
    throw new \Exception("调用异常: " . $e->getMessage());
}

// 协程并发示例
use Hyperf\Coroutine\Parallel;

$parallel = new Parallel();

$parallel->add(function () use ($client, $accessToken) {
    // 并发请求 1
    $request1 = new ProductListRequest();
    // ... 设置参数
    return $client->request($request1, $accessToken);
});

$parallel->add(function () use ($client, $accessToken) {
    // 并发请求 2
    $request2 = new AnotherRequest();
    // ... 设置参数
    return $client->request($request2, $accessToken);
});

$results = $parallel->wait();

if (property_exists($response, 'code') && in_array($response->code, [40006, 40007])) {
    // 令牌过期,尝试刷新
    $newAccessToken = AccessTokenBuilder::refresh($refreshToken);
    // 重新发起请求
}

$shop1Client = $this->clientFactory->get('shop1');
$shop2Client = $this->clientFactory->get('shop2');

// config/autoload/logger.php
'guzzle' => [
    'handler' => [
        'class' => \Monolog\Handler\StreamHandler::class,
        'constructor' => [
            'stream' => BASE_PATH . '/runtime/logs/guzzle.log',
            'level' => \Monolog\Logger::DEBUG,
        ],
    ],
],
bash
php bin/hyperf.php vendor:publish doudian/hyperf-sdk