From 136cffcf135251061bf24f9a06c62f653cd1e49f Mon Sep 17 00:00:00 2001 From: Tokumeikoi Date: Thu, 4 Jun 2020 18:00:33 +0800 Subject: [PATCH] stripe test --- app/Console/Commands/Test.php | 21 +++++++ .../Controllers/Admin/ConfigController.php | 1 + .../Controllers/Guest/OrderController.php | 25 ++++---- app/Http/Controllers/User/OrderController.php | 60 +++++++++++++++---- app/Http/Requests/Admin/ConfigSave.php | 1 + app/Services/OrderService.php | 11 ++++ composer.json | 4 +- 7 files changed, 98 insertions(+), 25 deletions(-) diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php index 667e616c..67487c14 100644 --- a/app/Console/Commands/Test.php +++ b/app/Console/Commands/Test.php @@ -2,7 +2,12 @@ namespace App\Console\Commands; +use App\Utils\Helper; use Illuminate\Console\Command; +use Stripe\Source; +use Stripe\Stripe; +use Stripe\StripeClient; +use Omnipay\Omnipay; class Test extends Command { @@ -37,5 +42,21 @@ class Test extends Command */ public function handle() { + $gateway = Omnipay::create('Stripe'); + $gateway->setApiKey('sk_test_gDIIPtUgWZHbnTR7CUWZS8k500NsLS9SYB'); + + $formData = array('number' => '4242424242424242', 'expiryMonth' => '6', 'expiryYear' => '2030', 'cvv' => '333'); + $response = $gateway->purchase(array('amount' => '10.00', 'currency' => 'USD', 'card' => $formData))->send(); + + if ($response->isRedirect()) { + // redirect to offsite payment gateway + $response->redirect(); + } elseif ($response->isSuccessful()) { + // payment was successful: update database + print_r($response); + } else { + // payment failed: display message to customer + echo $response->getMessage(); + } } } diff --git a/app/Http/Controllers/Admin/ConfigController.php b/app/Http/Controllers/Admin/ConfigController.php index 358e8f8f..174795da 100755 --- a/app/Http/Controllers/Admin/ConfigController.php +++ b/app/Http/Controllers/Admin/ConfigController.php @@ -76,6 +76,7 @@ class ConfigController extends Controller // stripe 'stripe_alipay_enable' => (int)config('v2board.stripe_alipay_enable', 0), 'stripe_wepay_enable' => (int)config('v2board.stripe_wepay_enable', 0), + 'stripe_card_enable' => (int)config('v2board.stripe_card_enable', 0), 'stripe_sk_live' => config('v2board.stripe_sk_live'), 'stripe_pk_live' => config('v2board.stripe_pk_live'), 'stripe_webhook_key' => config('v2board.stripe_webhook_key'), diff --git a/app/Http/Controllers/Guest/OrderController.php b/app/Http/Controllers/Guest/OrderController.php index 89b97207..f97cc077 100644 --- a/app/Http/Controllers/Guest/OrderController.php +++ b/app/Http/Controllers/Guest/OrderController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Guest; +use App\Services\OrderService; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Models\Order; @@ -67,21 +68,25 @@ class OrderController extends Controller switch ($event->type) { case 'source.chargeable': $source = $event->data->object; - $charge = \Stripe\Charge::create([ + \Stripe\Charge::create([ 'amount' => $source['amount'], 'currency' => $source['currency'], 'source' => $source['id'], - 'description' => config('v2board.app_name', 'V2Board') . $source['metadata']['invoice_id'], + 'metadata' => $source->metadata ]); - if ($charge['status'] == 'succeeded') { - $trade_no = Cache::get($source['id']); + die('success'); + break; + case 'source.succeeded': + $source = $event->data->object; + if ($source->status === 'succeeded') { + $metaData = $source->metadata; + $trade_no = $metaData->out_trade_no; if (!$trade_no) { abort(500, 'redis is not found trade no by stripe source id'); } - if (!$this->handle($trade_no, $source['id'])) { + if (!$this->handle($trade_no, $source->balance_transaction)) { abort(500, 'fail'); } - Cache::forget($source['id']); die('success'); } break; @@ -143,11 +148,7 @@ class OrderController extends Controller if (!$order) { abort(500, 'order is not found'); } - if ($order->status !== 0) { - return true; - } - $order->status = 1; - $order->callback_no = $callbackNo; - return $order->save(); + $orderService = new OrderService($order); + return $orderService->success($callbackNo); } } diff --git a/app/Http/Controllers/User/OrderController.php b/app/Http/Controllers/User/OrderController.php index eda9fb70..6621ae9d 100755 --- a/app/Http/Controllers/User/OrderController.php +++ b/app/Http/Controllers/User/OrderController.php @@ -9,12 +9,10 @@ use App\Services\OrderService; use App\Services\UserService; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; -use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\DB; use App\Models\Order; use App\Models\Plan; use App\Models\User; -use App\Models\Coupon; use App\Utils\Helper; use Omnipay\Omnipay; use Stripe\Stripe; @@ -173,7 +171,7 @@ class OrderController extends Controller ]); } switch ($method) { - // return type => 0: QRCode / 1: URL + // return type => 0: QRCode / 1: URL / 2: No action case 0: // alipayF2F if (!(int)config('v2board.alipay_enable')) { @@ -218,6 +216,14 @@ class OrderController extends Controller 'type' => 1, 'data' => $this->payTaro($order) ]); + case 6: + if (!(int)config('v2board.stripe_card_enable')) { + abort(500, '支付方式不可用'); + } + return response([ + 'type' => 2, + 'data' => $this->stripeCard($order, $request->input('token')) + ]); default: abort(500, '支付方式不存在'); } @@ -280,6 +286,14 @@ class OrderController extends Controller array_push($data, $obj); } + if ((int)config('v2board.stripe_card_enable')) { + $obj = new \StdClass(); + $obj->name = '信用卡'; + $obj->method = 6; + $obj->icon = 'card'; + array_push($data, $obj); + } + return response([ 'data' => $data ]); @@ -347,7 +361,7 @@ class OrderController extends Controller 'statement_descriptor' => $order->trade_no, 'metadata' => [ 'user_id' => $order->user_id, - 'invoice_id' => $order->trade_no, + 'out_trade_no' => $order->trade_no, 'identifier' => '' ], 'redirect' => [ @@ -357,10 +371,6 @@ class OrderController extends Controller if (!$source['redirect']['url']) { abort(500, '支付网关请求失败'); } - - if (!Cache::put($source['id'], $order->trade_no, 3600)) { - abort(500, '订单创建失败'); - } return $source['redirect']['url']; } @@ -378,7 +388,7 @@ class OrderController extends Controller 'type' => 'wechat', 'metadata' => [ 'user_id' => $order->user_id, - 'invoice_id' => $order->trade_no, + 'out_trade_no' => $order->trade_no, 'identifier' => '' ], 'redirect' => [ @@ -388,12 +398,38 @@ class OrderController extends Controller if (!$source['wechat']['qr_code_url']) { abort(500, '支付网关请求失败'); } - if (!Cache::put($source['id'], $order->trade_no, 3600)) { - abort(500, '订单创建失败'); - } return $source['wechat']['qr_code_url']; } + private function stripeCard($order, string $token) + { + $currency = config('v2board.stripe_currency', 'hkd'); + $exchange = Helper::exchange('CNY', strtoupper($currency)); + if (!$exchange) { + abort(500, '货币转换超时,请稍后再试'); + } + Stripe::setApiKey(config('v2board.stripe_sk_live')); + try { + $charge = \Stripe\Charge::create([ + 'amount' => floor($order->total_amount * $exchange), + 'currency' => $currency, + 'source' => $token, + 'metadata' => [ + 'user_id' => $order->user_id, + 'out_trade_no' => $order->trade_no, + 'identifier' => '' + ] + ]); + } catch (\Exception $e) { + abort(500, '遇到了点问题,请刷新页面稍后再试'); + } + info($charge); + if (!$charge->paid) { + abort(500, '扣款失败,请检查信用卡信息'); + } + return $charge->paid; + } + private function bitpayX($order) { $bitpayX = new BitpayX(config('v2board.bitpayx_appsecret')); diff --git a/app/Http/Requests/Admin/ConfigSave.php b/app/Http/Requests/Admin/ConfigSave.php index b5ffe828..183a0717 100755 --- a/app/Http/Requests/Admin/ConfigSave.php +++ b/app/Http/Requests/Admin/ConfigSave.php @@ -44,6 +44,7 @@ class ConfigSave extends FormRequest // stripe 'stripe_alipay_enable' => 'in:0,1', 'stripe_wepay_enable' => 'in:0,1', + 'stripe_card_enable' => 'in:0,1', 'stripe_sk_live' => '', 'stripe_pk_live' => '', 'stripe_webhook_key' => '', diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 22f43cd2..0bdd7e9f 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -141,4 +141,15 @@ class OrderService $order->surplus_amount = $surplusAmount > 0 ? $surplusAmount : 0; $order->surplus_order_ids = json_encode(array_map(function ($v) { return $v['id'];}, $orderModel->get()->toArray())); } + + public function success(string $callbackNo) + { + $order = $this->order; + if ($order->status !== 0) { + return true; + } + $order->status = 1; + $order->callback_no = $callbackNo; + return $order->save(); + } } diff --git a/composer.json b/composer.json index 5e76bb68..ae528cd5 100755 --- a/composer.json +++ b/composer.json @@ -13,9 +13,11 @@ "fideloper/proxy": "^4.0", "laravel/framework": "^6.0", "laravel/tinker": "^1.0", + "league/omnipay": "^3.0", "lokielse/omnipay-alipay": "3.0.6", + "omnipay/stripe": "^3.1", "php-curl-class/php-curl-class": "^8.6", - "stripe/stripe-php": "^7.5", + "stripe/stripe-php": "^7.36.1", "symfony/yaml": "^4.3" }, "require-dev": {