www.gusucode.com > KPPW众包威客PHP开源建站系统 v3.0源码程序 > KPPW/app/Modules/Finance/Http/Controllers/PayController.php
<?php namespace App\Modules\Finance\Http\Controllers; use App\Modules\Finance\Http\Requests\CashoutInfoRequest; use App\Modules\Finance\Http\Requests\CashoutRequest; use App\Modules\Finance\Http\Requests\PayRequest; use App\Modules\Finance\Model\CashoutModel; use App\Modules\Finance\Model\FinancialModel; use App\Modules\Manage\Model\ConfigModel; use App\Modules\Order\Model\OrderModel; use App\Modules\User\Http\Controllers\UserCenterController; use App\Modules\User\Model\AlipayAuthModel; use App\Modules\User\Model\BankAuthModel; use App\Modules\User\Model\UserDetailModel; use App\Modules\User\Model\UserModel; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Session; use Omnipay; Use QrCode; class PayController extends UserCenterController { public function __construct() { parent::__construct(); $this->initTheme('userfinance'); } public function getCash() { $this->theme->setTitle('我要充值'); $user = Auth::User(); $userInfo = UserDetailModel::select('balance')->where('uid', $user->id)->first(); $payConfig = ConfigModel::getConfigByType('thirdpay'); if (!empty($userInfo)){ $data = array( 'balance' => $userInfo->balance, 'payConfig' => $payConfig ); return $this->theme->scope('finance.cash', $data)->render(); } } public function postCash(PayRequest $request) { $user = Auth::User(); $config = ConfigModel::getConfigByAlias('cash'); $config->rule = json_decode($config->rule, true); if ($request->get('cash') < $config->rule['recharge_min']) { return \CommonClass::formatResponse('充值金额不得小于' . $config->rule['recharge_min'] . '元', 201); } $data = array( 'code' => OrderModel::randomCode($user->id), 'title' => '余额充值', 'cash' => $request->get('cash'), 'uid' => $user->id, 'created_at' => date('Y-m-d H:i:s', time()) ); $order = OrderModel::create($data); if ($order) { $payType = $request->get('pay_type'); $siteUrl = \CommonClass::getConfig('site_url'); switch ($payType) { case 'alipay': $config = ConfigModel::getPayConfig('alipay'); $objOminipay = Omnipay::gateway('alipay'); $objOminipay->setPartner($config['partner']); $objOminipay->setKey($config['key']); $objOminipay->setSellerEmail($config['sellerEmail']); $objOminipay->setReturnUrl($siteUrl . '/finance/pay/alipay/return'); $objOminipay->setNotifyUrl($siteUrl . '/finance/pay/alipay/notify'); $response = Omnipay::purchase([ 'out_trade_no' => $order->code, 'subject' => \CommonClass::getConfig('site_name') . '余额充值', 'total_fee' => $order->cash, ])->send(); return \CommonClass::formatResponse('确认充值', 200, array('url' => $response->getRedirectUrl(), 'orderCode' => Crypt::encrypt($order->code))); break; case 'wechat': return \CommonClass::formatResponse('确认充值', 200, array('url' => '/finance/wechatPay/' . Crypt::encrypt($order), 'orderCode' => Crypt::encrypt($order->code))); break; case 'unionbank': $objOminipay = Omnipay::gateway('unionpay'); $objOminipay->setReturnUrl($siteUrl . '/finance/pay/unionpay/return'); $objOminipay->setNotifyUrl($siteUrl . '/finance/pay/unionpay/notify'); $orderParam = [ 'orderId' => $order->code, 'txnTime' => date('YmdHis'), 'orderDesc' => \CommonClass::getConfig('site_name') . '余额充值', 'txnAmt' => $order->cash, ]; $response = $objOminipay->purchase($orderParam)->send(); return \CommonClass::formatResponse('确认充值', 200, array('url' => $response->getRedirectUrl(), 'orderCode' => Crypt::encrypt($order->code))); break; } } } public function getWechatPay($order) { $this->theme->setTitle('我要充值'); $order = Crypt::decrypt($order); if ($order) { $siteUrl = \CommonClass::getConfig('site_url'); $config = ConfigModel::getPayConfig('wechatpay'); $wechat = Omnipay::gateway('wechat'); $wechat->setAppId($config['appId']); $wechat->setMchId($config['mchId']); $wechat->setAppKey($config['appKey']); $params = array( 'out_trade_no' => $order->code, 'notify_url' => $siteUrl . '/finance/pay/wechat/notify', 'body' => \CommonClass::getConfig('site_name') . '余额充值', 'total_fee' => $order->cash, 'fee_type' => 'CNY', ); $response = $wechat->purchase($params)->send(); $img = QrCode::size('280')->generate($response->getRedirectUrl()); $view = array( 'cash' => $order->cash, 'img' => $img ); return $this->theme->scope('pay.wechatpay', $view)->render(); } } public function alipayReturn(Request $request) { $gateway = Omnipay::gateway('alipay'); $options = [ 'request_params' => $_REQUEST, ]; $response = $gateway->completePurchase($options)->send(); if ($response->isSuccessful() && $response->isTradeStatusOk()) { $data = array( 'pay_account' => $request->get('buyer_email'), 'code' => $request->get('out_trade_no'), 'pay_code' => $request->get('trade_no'), 'money' => $request->get('total_fee'), ); $res = OrderModel::where('code', $data['code'])->first(); if (!empty($res) && $res->status == 0) { $orderModel = new OrderModel(); $staus = $orderModel->recharge('alipay', $data); if ($staus) { echo '支付成功'; return redirect('finance/cash'); } } } else { exit('支付失败'); } } public function alipayNotify(Request $request) { $gateway = Omnipay::gateway('alipay'); $options = [ 'request_params' => $_REQUEST, ]; $response = $gateway->completePurchase($options)->send(); if ($response->isSuccessful() && $response->isTradeStatusOk()) { $data = array( 'pay_account' => $request->get('buyer_email'), 'code' => $request->get('out_trade_no'), 'pay_code' => $request->get('trade_no'), 'money' => $request->get('total_fee'), ); $res = OrderModel::where('code', $data['code'])->first(); if (!empty($res) && $res->status == 0) { $orderModel = new OrderModel(); $staus = $orderModel->recharge('alipay', $data); if ($staus) { exit('支付成功'); } } } else { exit('支付失败'); } } public function wechatNotify() { $arrNotify = \CommonClass::xmlToArray($GLOBALS['HTTP_RAW_POST_DATA']); $content = '<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>'; if ($arrNotify['result_code'] == 'SUCCESS' && $arrNotify['return_code'] == 'SUCCESS') { $data = array( 'pay_account' => $arrNotify['openid'], 'code' => $arrNotify['out_trade_no'], 'pay_code' => $arrNotify['transaction_id'], 'money' => $arrNotify['total_fee'] / 100, ); $res = OrderModel::where('code', $data['code'])->first(); if (!empty($res) && $res->status == 0) { $orderModel = new OrderModel(); $status = $orderModel->recharge('wechat', $data); if ($status) { return response($content)->header('Content-Type', 'text/xml'); } } } } public function unionpayReturn() { $gateway = Omnipay::gateway('unionpay'); $options = [ 'request_params' => $_REQUEST, ]; $response = $gateway->completePurchase($options)->send(); if ($response->isPaid()) { } else { } } public function unionpayNotify() { $gateway = Omnipay::gateway('unionpay'); $options = [ 'request_params' => $_REQUEST, ]; $response = $gateway->completePurchase($options)->send(); if ($response->isPaid()) { } else { } } public function verifyOrder($orderCode) { $orderCode = Crypt::decrypt($orderCode); $orderInfo = OrderModel::where('code', $orderCode)->first(); if (!empty($orderInfo) && $orderInfo->status) { return \CommonClass::formatResponse('success', 200, array('url' => 'finance/cash')); } return \CommonClass::formatResponse('fail'); } public function getCashout() { $this->theme->setTitle('我要提现'); $user = Auth::User(); $userInfo = UserDetailModel::select('balance')->where('uid', $user->id)->first(); $cashRule = json_decode(ConfigModel::getConfigByAlias('cash')->rule, true); $alipayAccount = AlipayAuthModel::where('uid', $user->id)->where('status', 2)->orderBy('auth_time', 'desc')->get(); $bankAccount = BankAuthModel::where('uid', $user->id)->where('status', 2)->orderBy('auth_time', 'desc')->get(); $data = array( 'balance' => $userInfo->balance, 'alipayAccount' => $alipayAccount, 'bankAccount' => $bankAccount, 'cashRule' => $cashRule ); return $this->theme->scope('finance.cashout', $data)->render(); } public function postCashout(CashoutRequest $request) { $user = Auth::User(); $userInfo = UserDetailModel::select('balance')->where('uid', $user->id)->first(); $cashConfig = ConfigModel::getConfigByAlias('cash'); $cashConfig->rule = json_decode($cashConfig->rule, true); $now = strtotime(date('Y-m-d')); $start = date('Y-m-d H:i:s', $now); $end = date('Y-m-d H:i:s', $now + 24 * 3600); $cashoutSum = CashoutModel::where('uid', $user->id)->whereBetween('created_at', [$start, $end])->sum('cash'); $error = array(); if ($request->get('cash') > $userInfo->balance) { $error['cash'] = '提现金额不得大于账户余额'; } if ($cashConfig->rule['withdraw_min'] && $request->get('cash') < $cashConfig->rule['withdraw_min']) { $error['cash'] = '单笔提现金额不得小于' . $cashConfig->rule['withdraw_min'] . '元'; } if ($cashConfig->rule['withdraw_max'] && $cashoutSum > $cashConfig->rule['withdraw_max']) { $error['cash'] = '提现金额不得大于' . $cashConfig->rule['withdraw_max'] . '元'; } if (!empty($error)) { return back()->withErrors($error); } $account = $request->get('cashout_account'); $alipayInfo = AlipayAuthModel::where('alipay_account', $account)->where('status', 2)->first(); $bankInfo = BankAuthModel::where('bank_account', $account)->where('status', 2)->first(); if (!empty($alipayInfo) || !empty($bankInfo)) { if (!empty($alipayInfo)) { $cashout_type = 1; $account_name = $alipayInfo->alipay_name; } elseif (!empty($bankInfo)) { $cashout_type = 2; $account_name = $bankInfo->realname; } $data = array( 'cashout_type' => $cashout_type, 'cashout_account' => $account, 'cash' => $request->get('cash'), 'account_name' => $account_name ); return redirect('finance/cashoutInfo/' . Crypt::encrypt($data)); } } public function getCashoutInfo($cashoutInfo) { $cashoutInfo = Crypt::decrypt($cashoutInfo); $user = Auth::User(); $userInfo = UserDetailModel::select('balance')->where('uid', $user->id)->first(); $data = array( 'balance' => $userInfo->balance, 'cashout_type' => $cashoutInfo['cashout_type'], 'cashout_account' => $cashoutInfo['cashout_account'], 'cash' => $cashoutInfo['cash'], 'account_name' => $cashoutInfo['account_name'], 'fees' => FinancialModel::getFees($cashoutInfo['cash']), 'cashoutInfo' => Crypt::encrypt($cashoutInfo) ); return $this->theme->scope('finance.cashoutinfo', $data)->render(); } public function postCashoutInfo(CashoutInfoRequest $request) { $alternate_password = $request->get('alternate_password'); $cashoutInfo = Crypt::decrypt($request->get('cashInfo')); $user = Auth::User(); if (UserModel::encryptPassword($alternate_password, $user->salt) === $user->alternate_password) { $data = array( 'uid' => $user->id, 'cash' => $cashoutInfo['cash'], 'fees' => FinancialModel::getFees($cashoutInfo['cash']), 'real_cash' => $cashoutInfo['cash'] - FinancialModel::getFees($cashoutInfo['cash']), 'cashout_type' => $cashoutInfo['cashout_type'], 'cashout_account' => $cashoutInfo['cashout_account'], ); $status = CashoutModel::addCashout($data); if ($status) return redirect('finance/waitcashout'); } return back()->withErrors(array('alternate_password' => '提现密码错误')); } public function waitCashout() { return $this->theme->scope('finance.waitcashout')->render(); } public function getFinanceList(Request $request) { $user = Auth::User(); if ($request->get('type')){ switch ($request->get('type')){ case 'cash': $list = FinancialModel::where('uid', $user->id)->where('action', 3)->orderBy('created_at', 'desc')->paginate(10); break; case 'cashout': $list = CashoutModel::where('uid', $user->id)->orderBy('created_at', 'desc')->paginate(10); break; } } else { $list = FinancialModel::where('uid', $user->id)->orderBy('created_at', 'desc')->paginate(10); } $userDetail = UserDetailModel::select('balance')->where('uid', $user->id)->first(); $data = [ 'balance' => $userDetail->balance, 'list' => $list, 'type' => $request->get('type') ? $request->get('type') : '' ]; $this->initTheme('usercenterfinance'); $this->theme->setTitle('收支明细'); return $this->theme->scope('finance.financelist', $data)->render(); } public function assetdetail(Request $request) { $user = Auth::User(); $balance = UserDetailModel::where('uid', $user->id)->first()->balance; $list = FinancialModel::where('uid', $user->id); $cashIn = FinancialModel::where('uid', $user->id)->whereIn('action', [2, 3, 7])->sum('cash'); $cashOut = FinancialModel::where('uid', $user->id)->whereIn('action', [1, 4, 5, 6])->sum('cash'); if ($request->get('start')) { $start = date('Y-m-d H:i:s', strtotime($request->get('start'))); $list = $list->where('created_at', '>', $start); } if ($request->get('end')) { $end = date('Y-m-d H:i:s', strtotime($request->get('end'))); $list = $list->where('created_at', '<', $end); } if ($request->get('type')) { $list = $list->where('action', $request->get('type')); } $list = $list->orderBy('created_at', 'desc')->paginate(10); $data = [ 'balance' => $balance, 'list' => $list, 'cashIn' => $cashIn, 'cashOut' => $cashOut, 'start' => $request->get('start'), 'end' => $request->get('end'), 'type' => $request->get('type') ]; $this->initTheme('userfinance'); $this->theme->setTitle('资产明细'); return $this->theme->scope('finance.assetdetail', $data)->render(); } public function assetDetailminute($id) { $user = Auth::User(); $avatar = UserDetailModel::where('uid', $user->id)->first()->avatar; $info = FinancialModel::where('uid', $user->id)->where('id', $id)->first(); if (!empty($info)) { $data = [ 'info' => $info, 'avatar' => $avatar ]; $this->initTheme('userfinance'); $this->theme->setTitle('收支详情'); return $this->theme->scope('finance.assetDetailminute', $data)->render(); } } }