From 3e60cbf968b341e2975ef1e90bee0963e2c383ec Mon Sep 17 00:00:00 2001 From: tokumeikoi Date: Thu, 29 Apr 2021 01:22:40 +0900 Subject: [PATCH] add: stripe wepay --- app/Payments/StripeWepay.php | 113 +++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 app/Payments/StripeWepay.php diff --git a/app/Payments/StripeWepay.php b/app/Payments/StripeWepay.php new file mode 100644 index 00000000..cf019a60 --- /dev/null +++ b/app/Payments/StripeWepay.php @@ -0,0 +1,113 @@ +config = $config; + } + + public function form() + { + return [ + 'currency' => [ + 'label' => '货币单位', + 'description' => '', + 'type' => 'input', + ], + 'stripe_sk_live' => [ + 'label' => 'SK_LIVE', + 'description' => '', + 'type' => 'input', + ], + 'stripe_webhook_key' => [ + 'label' => 'WebHook密钥签名', + 'description' => '', + 'type' => 'input', + ] + ]; + } + + public function pay($order) + { + $currency = $this->config['currency']; + $exchange = $this->exchange('CNY', strtoupper($currency)); + if (!$exchange) { + abort(500, __('user.order.stripeAlipay.currency_convert_timeout')); + } + Stripe::setApiKey($this->config['stripe_sk_live']); + $source = Source::create([ + 'amount' => floor($order['total_amount'] * $exchange), + 'currency' => $currency, + 'type' => 'wechat', + 'statement_descriptor' => $order['trade_no'], + 'metadata' => [ + 'user_id' => $order['user_id'], + 'out_trade_no' => $order['trade_no'], + 'identifier' => '' + ], + 'redirect' => [ + 'return_url' => $order['return_url'] + ] + ]); + if (!$source['wechat']['qr_code_url']) { + abort(500, __('user.order.stripeWepay.gateway_request_failed')); + } + return [ + 'type' => 1, + 'data' => $source['wechat']['qr_code_url'] + ]; + } + + public function notify($params) + { + \Stripe\Stripe::setApiKey($this->config['stripe_sk_live']); + try { + $event = \Stripe\Webhook::constructEvent( + file_get_contents('php://input'), + $_SERVER['HTTP_STRIPE_SIGNATURE'], + $this->config['stripe_webhook_key'] + ); + } catch (\Stripe\Error\SignatureVerification $e) { + abort(400); + } + switch ($event->type) { + case 'source.chargeable': + $object = $event->data->object; + \Stripe\Charge::create([ + 'amount' => $object->amount, + 'currency' => $object->currency, + 'source' => $object->id, + 'metadata' => json_decode($object->metadata, true) + ]); + break; + case 'charge.succeeded': + $object = $event->data->object; + if ($object->status === 'succeeded') { + $metaData = isset($object->metadata->out_trade_no) ? $object->metadata : $object->source->metadata; + $tradeNo = $metaData->out_trade_no; + return [ + 'trade_no' => $tradeNo, + 'callback_no' => $object->balance_transaction + ]; + } + break; + default: + abort(500, 'event is not support'); + } + } + + private function exchange($from, $to) + { + $result = file_get_contents('https://api.exchangerate.host/latest?symbols=' . $to . '&base=' . $from); + $result = json_decode($result, true); + return $result['rates'][$to]; + } +}