diff --git a/app/Console/Commands/Cluster/Send.php b/app/Console/Commands/Cluster/Send.php new file mode 100644 index 0000000..1e8cfb6 --- /dev/null +++ b/app/Console/Commands/Cluster/Send.php @@ -0,0 +1,97 @@ +redis = app('redis'); + $this->instance_id = config('app.instance_id'); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + // + + $this->info('将上报节点信息到集群中。'); + + // 非堵塞 + // $this->redis->subscribe(['cluster:sync'], function ($message, $channel) { + // $this->info('收到同步请求'); + // }); + + // echo '开始循环发送心跳'; + while (true) { + + // get cpu usage + $cpu = round($this->getCpuUsage(), 2); + + echo "CPU: {$cpu}%\n"; + $this->redis->publish('cluster_ready', json_encode([ + 'instance_id' => $this->instance_id, + 'cpu' => $cpu, + ])); + + sleep(1); + } + } + + public function getCpuUsage() + { + $load = sys_getloadavg(); + return $load[0]; + } + + + public function subscribe() + { + + // 非堵塞模式 + $this->redis->subscribe(['cluster_ready'], function ($message, $channel) { + echo "Received {$message} from {$channel}\n"; + }); + } + + + public function publish() + { + $this->redis->publish('cluster_ready', json_encode([ + 'instance_id' => $this->instance_id, + 'cpu' => 1 + ])); + } +} diff --git a/app/Console/Commands/Cluster/Work.php b/app/Console/Commands/Cluster/Work.php new file mode 100644 index 0000000..733adbf --- /dev/null +++ b/app/Console/Commands/Cluster/Work.php @@ -0,0 +1,76 @@ +redis = app('redis'); + $this->instance_id = config('app.instance_id'); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + $this->info('节点协调工作开始'); + + $this->redis->subscribe(['cluster_ready'], function ($message, $channel) { + + $message = json_decode($message, true); + + var_dump($message); + }); + } + + + public function subscribe() + { + + // 非堵塞模式 + $this->redis->subscribe(['cluster_ready'], function ($message, $channel) { + echo "Received {$message} from {$channel}\n"; + }); + } + + + public function publish() + { + $this->redis->publish('cluster_ready', json_encode([ + 'instance_id' => $this->instance_id, + 'cpu' => 1 + ])); + } +} diff --git a/app/Console/Commands/Cluster/Worker.php b/app/Console/Commands/Cluster/Worker.php deleted file mode 100644 index e18f8a8..0000000 --- a/app/Console/Commands/Cluster/Worker.php +++ /dev/null @@ -1,66 +0,0 @@ -getCpuUsage(), 2); - - $redis->publish('cluster_ready', json_encode([ - 'instance_id' => $instance_id, - 'cpu' => $cpu, - ])); - - sleep(1); - } - } - - public function getCpuUsage() - { - $load = sys_getloadavg(); - return $load[0]; - } -} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 9dcbbc7..3d829b8 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -41,7 +41,8 @@ class Kernel extends ConsoleKernel Count::class, Status::class, Cluster\Init::class, - Cluster\Worker::class, + Cluster\Send::class, + Cluster\Work::class, Cluster\Sync::class, Commands\System\Down::class, Commands\System\Up::class, diff --git a/app/Http/Controllers/User/BalanceController.php b/app/Http/Controllers/User/BalanceController.php index 08c81ba..fbf6c61 100644 --- a/app/Http/Controllers/User/BalanceController.php +++ b/app/Http/Controllers/User/BalanceController.php @@ -6,12 +6,12 @@ use App\Models\Transaction; use App\Models\User\Balance; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; use App\Exceptions\ChargeException; use Illuminate\Support\Facades\Log; use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Storage; use Alipay\EasySDK\Kernel\Util\ResponseChecker; +use Alipay\EasySDK\Kernel\Config as AlipayConfig; use Alipay\EasySDK\Kernel\Factory as AlipayFactory; class BalanceController extends Controller @@ -73,8 +73,6 @@ public function store(Request $request) public function show(Request $request, Balance $balance) { - // dd(AlipayFactory::payment()->common()->query('20220901070430102316')); - // dd(route('')); if ($balance->paid_at !== null) { return $this->error('订单已支付'); } @@ -85,6 +83,8 @@ public function show(Request $request, Balance $balance) } try { + AlipayFactory::setOptions($this->alipayOptions()); + $result = AlipayFactory::payment()->page()->pay("支付", $balance->order_id, $balance->amount, route('balances.return')); $responseChecker = new ResponseChecker(); @@ -154,6 +154,8 @@ public function notify(Request $request) public function checkAndCharge(Balance $balance) { + AlipayFactory::setOptions($this->alipayOptions()); + $trade = AlipayFactory::payment()->common()->query($balance->order_id); if ($trade->code == "10000" && $trade->tradeStatus == "TRADE_SUCCESS") { @@ -222,4 +224,34 @@ public function drops() return $this->success($resp); } + + + private function alipayOptions() + { + $options = new AlipayConfig(); + $options->protocol = 'https'; + + // if local + if (app()->environment() == 'local') { + $options->gatewayHost = 'openapi.alipaydev.com'; + } else { + $options->gatewayHost = 'openapi.alipay.com'; + } + + $options->signType = 'RSA2'; + + $options->appId = config('payment.alipay.app_id'); + + // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 + $options->merchantPrivateKey = trim(Storage::get('alipayAppPriv.key')); + + $options->alipayCertPath = storage_path('app/alipayCertPublicKey_RSA2.crt'); + $options->alipayRootCertPath = storage_path('app/alipayRootCert.crt'); + $options->merchantCertPath = storage_path('app/appCertPublicKey.crt'); + + $options->notifyUrl = route('balances.notify'); + + + return $options; + } } diff --git a/config/cache.php b/config/cache.php index 6ec6fa6..04f6278 100644 --- a/config/cache.php +++ b/config/cache.php @@ -1,6 +1,6 @@ env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), + 'database' => env('REDIS_DB', 0), 'persistent' => true, ], @@ -130,7 +130,15 @@ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), + 'database' => env('REDIS_CACHE_DB', 1), + ], + + 'cluster_ready' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', 2), ], ],