lucifergaming / savagetech-sdk
整合 SavageTech 遊戲化 API 的 Laravel 套件
dev-master
2025-05-28 02:43 UTC
Requires
- php: ^8.0
- guzzlehttp/guzzle: ^7.0
- illuminate/console: ^8.0|^9.0|^10.0|^11.0|^12.0
- illuminate/contracts: ^8.0|^9.0|^10.0|^11.0|^12.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0|^12.0
Requires (Dev)
- orchestra/testbench: ^8.35
- pestphp/pest: ^2.36
- pestphp/pest-plugin-laravel: ^2.4
- phpunit/phpunit: ^9.0|^10.0
This package is auto-updated.
Last update: 2025-05-28 02:43:22 UTC
README
這個套件為 Laravel 應用提供了與 SavageTech 遊戲化 API 整合的簡單方法。
安裝
使用 Composer 安裝套件:
composer require lucifergaming/savagetech-sdk
設定
安裝後,發布配置檔案:
php artisan vendor:publish --tag=savagetech-config
這會創建一個 config/savagetech.php
檔案,您可以在此配置 SavageTech API 的相關設定。
環境變數
在您的 .env
檔案中添加以下設定:
SAVAGETECH_VENDOR_ID=your-vendor-id SAVAGETECH_VENDOR_SECRET=your-vendor-secret SAVAGETECH_API_URL=https://api.savagetech.com SAVAGETECH_TOKEN_REFRESH_BEFORE_MINUTES=10
基本使用
使用 Facade
use LuciferGaming\SavageTechSDK\Facades\SavageTech; // 獲取 Access Token (可指定貨幣) $token = SavageTech::getAccessToken('user-id', 'usd'); // 記錄玩家存款事件 SavageTech::depositMade('user-id', 100, 'usd'); // 記錄玩家投注事件 SavageTech::betPlaced('user-id', 100, 1.5, 'usd'); // 設置貨幣 $currencies = [ 'eur' => [ 'symbol' => 'EUR', 'fullName' => 'Euro', 'shortName' => 'EUR', 'conversionToUSD' => 1.09, 'roundedTo' => 1 ] ]; SavageTech::setCurrencies($currencies); // 生成小工具初始化代碼 (可指定貨幣) $initCode = SavageTech::generateWidgetInitCode('user-id', [], 'usd');
直接注入服務
use LuciferGaming\SavageTechSDK\Services\SavageTechService; class GameController extends Controller { protected $savageTech; public function __construct(SavageTechService $savageTech) { $this->savageTech = $savageTech; } public function recordBet(Request $request) { try { $result = $this->savageTech->betPlaced( $request->user()->id, $request->amount, $request->odds, $request->currency ); return response()->json(['success' => true, 'data' => $result]); } catch (SavageTechException $e) { return response()->json(['success' => false, 'message' => $e->getMessage()], $e->getCode()); } } }
SavageTech 小工具整合
在您的 Blade 視圖中整合 SavageTech 小工具:
<div id="savage-widget"></div> <script> // 初始化 SavageTech 代理 document.addEventListener('DOMContentLoaded', function() { // 從後端獲取初始化代碼 fetch('/api/savage-tech-init?user_id={{ auth()->id() }}¤cy=usd') .then(response => response.json()) .then(data => { // 執行初始化代碼 eval(data.init_code); // 處理 Token 過期 window.Savage.onTokenExpiration(() => { // 重新獲取 Token fetch('/api/savage-tech-refresh-token?user_id={{ auth()->id() }}¤cy=usd') .then(response => response.json()) .then(data => { // 更新憑證 window.Savage.setCredentials(data.credentials); }); }); }); }); </script>
使用 SavageTechHelper 類
使用我們提供的 SavageTechHelper 類可以更方便地管理 Token 的自動刷新:
<div id="savage-widget"></div> <script src="{{ asset('vendor/savagetech/savage-tech-helper.js') }}"></script> <script> document.addEventListener('DOMContentLoaded', function() { // 創建 SavageTechHelper 實例 const savageTech = new SavageTechHelper({ userId: '{{ auth()->id() }}', currency: 'usd', refreshBeforeMinutes: {{ config('savagetech.widget.token_refresh_before_minutes', 10) }}, initEndpoint: '/api/savage-tech-init', refreshEndpoint: '/api/savage-tech-refresh-token', onError: function(error) { console.error('SavageTech 錯誤:', error); } }); // 初始化小工具 (將自動處理 Token 刷新) savageTech.init() .then(function(data) { console.log('SavageTech 小工具已初始化'); }) .catch(function(error) { console.error('初始化失敗', error); }); }); </script>
對應的路由和控制器:
// 路由 Route::get('/api/savage-tech-init', 'SavageTechController@getInitCode'); Route::get('/api/savage-tech-refresh-token', 'SavageTechController@refreshToken'); // 控制器 public function getInitCode(Request $request) { $userId = $request->user()->id; $currency = $request->query('currency'); // 獲取貨幣參數 $initCode = SavageTech::generateWidgetInitCode($userId, [], $currency); // 返回初始化代碼和刷新設定 return response()->json([ 'init_code' => $initCode, 'refresh_before_minutes' => config('savagetech.widget.token_refresh_before_minutes', 10) ]); } public function refreshToken(Request $request) { $userId = $request->user()->id; $currency = $request->query('currency'); // 獲取貨幣參數 $token = SavageTech::getAccessToken($userId, $currency); // 返回憑證和刷新設定 return response()->json([ 'credentials' => [ 'jwt' => $token['jwt'], 'pubsub' => $token['pubsub'] ], 'refresh_before_minutes' => config('savagetech.widget.token_refresh_before_minutes', 10) ]); }
異常處理
所有的 API 調用都可能拋出 SavageTechException
,您應該適當地處理這些異常:
use LuciferGaming\SavageTechSDK\Exceptions\SavageTechException; try { $result = SavageTech::betPlaced('user-id', 100, 1.5, 'usd'); } catch (SavageTechException $e) { // 獲取錯誤信息 $message = $e->getMessage(); // 獲取 HTTP 狀態碼 $statusCode = $e->getCode(); // 獲取完整的 API 響應(如果有) $response = $e->getResponse(); // 記錄錯誤 Log::error('SavageTech API 錯誤', [ 'message' => $message, 'code' => $statusCode, 'response' => $response ]); }
測試
我們提供了全面的測試套件,包括單元測試、功能測試和整合測試,以確保套件的可靠性和正確性。詳細說明請參考 TESTING.md 文件。
運行測試
# 安裝開發依賴 composer install --dev # 運行所有 PHP 測試 ./vendor/bin/pest # 運行 JavaScript 測試 npm install npm test
測試特點
- 單元測試:針對服務類和異常處理的獨立測試
- 功能測試:驗證控制器和路由的正確性(需要 Laravel 環境)
- 整合測試:與真實 API 進行交互的測試(需要有效的 API 憑證)
- JavaScript 測試:測試前端 Token 刷新和 API 交互功能
這些測試確保了整個套件在不同情況下的正確行為,從而提高了代碼質量和可靠性。
授權
此套件使用 MIT 授權發布。