/** * 用户退款 * @return string * @throws NotFoundHttpException */ public function actionRefund() { if (\App::$app->request->post()) { $uid = \App::$app->request->post()['Code']['uid']; $orig_outer_trade_no = \App::$app->request->post()['Code']['out_trade_no']; $refund_amount = \App::$app->request->post()['Code']['money']; $summary = \App::$app->request->post()['Code']['msg']; //获取新浪的账户余额 $sina_balance = sinapay::querySinaBalance($uid); if ($sina_balance['errorNum'] == '0') { $available_balance = $sina_balance['data']['available_balance']; } //获取网站的账户信息 $balance = Info::findOne(['member_id' => $uid]); $site_balabce = $balance['balance']; //调用新浪退款接口 $sina = new sina(); $out_trade_no = date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8) . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); $refund = $sina->create_hosting_refund($out_trade_no, $orig_outer_trade_no, $refund_amount, $summary); if (!$refund) { throw new NotFoundHttpException('新浪接口错误'); } if ($refund['response_code'] == "APPLY_SUCCESS") { //提交信息成功 if ($refund['refund_status'] == 'SUCCESS' || $refund['refund_status'] == 'PAY_FINISHED') { //更新账户信息 $sina_balance = sinapay::querySinaBalance($uid); if ($sina_balance['errorNum'] == '0') { $available_balance_now = $sina_balance['data']['available_balance']; } //获取网站的账户信息 $balance = Info::findOne(['member_id' => $uid]); $site_balabce_now = $balance['balance']; //返回数据 $data = array('available_balance' => $available_balance, 'site_balabce' => $site_balabce, 'available_balance_now' => $available_balance_now, 'site_balabce_now' => $site_balabce_now); return $this->render('import', compact("data")); } else { throw new NotFoundHttpException($refund['response_message']); } } else { throw new NotFoundHttpException($refund['response_message']); } } else { $data = array('available_balance' => '-1', 'site_balabce' => '-2', 'available_balance_now' => '-3', 'site_balabce_now' => '-4'); return $this->render('import', compact("data")); } }
/** * Authre:langxi * * 用户赎回操作 */ public static function User_redeem($member_id, $money, $update = 0) { ini_set('max_execution_time', 60); //判断用户是否可进行赎回操作 $is_go = Info::find()->select(['status'])->where(['member_id' => $member_id])->asArray()->one(); if ($is_go['status'] > 0) { $result = array('errorNum' => '1', 'errorMsg' => '处理中,请稍后再试', 'data' => null); return $result; } Info::updateAll(['status' => Info::GO_THREE], ['member_id' => $member_id]); //进行操作,状态变为处理中 //检查用户一日赎回 $check_redeem = self::check_redeem($member_id, $money); if ($check_redeem) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); // $result = array('errorNum' => '1', 'errorMsg' => $check_redeem, 'data' => null); return $check_redeem; } //判断赎回金额是否小于新浪账户与网站账户余额的差值,若小于则网站端进行赎回操作,先赎回利息,然后赎回订单中的金额。 //若大于求取差值获取到网站需要赎回的金额和新浪部分需要赎回的金额,然后两端分别进行赎回操作,先赎回利息,然后赎回订单中的金额 $asset = Info::find()->where(['member_id' => $member_id])->asArray()->one(); $bank_card = $asset['bank_card']; //获取用户在投收益 $profit = $asset['profit']; //判断用户赎回金额是否可赎回。 $order_money = (new \yii\db\Query())->select(['money'])->from('fund_orders')->where(['member_id' => $member_id])->andWhere(['>', 'money', '0'])->sum('money'); //增加了活动红包begin if ($update) { $red_money = member::get_user_red_packet($member_id, $update); if (!$red_money['errorNum']) { $red = $red_money['data']['red_sum']; $order_money = $order_money + $red; } } ////活动红包end if ($order_money + $profit < $money) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '1', 'errorMsg' => '赎回金额大于可赎回金额,请重新输入', 'data' => null); return $result; } $w_blance = self::showBlance($member_id); //网站余额 $s_blance = sinapay::querySinaBalance($member_id); //调用第三方接口查看新浪账户可用余额(含货币基金 if ($s_blance['errorNum']) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '1', 'errorMsg' => $s_blance['errorMsg'], 'data' => null); return $result; } if ($w_blance > $s_blance['data']['available_balance']) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '1', 'errorMsg' => '账户异常请联系客服', 'data' => null); return $result; } $m_fund = $s_blance['data']['available_balance'] - $w_blance; //新浪账户比网站账户多的钱--新浪的货币基金 $red_packet = 0; $red = 0; //如果赎回和活动红包有关系 TODO if ($update) { //赎回时必须有在投金额 $invest = $asset['invest']; if ($invest && $invest >= 1) { //获取那个时间点的金额 $red_money = member::get_user_red_packet($member_id, $update); if (!$red_money['errorNum']) { $red = $red_money['data']['red_sum']; if ((double) $red > (double) $money) { //如果只是提取一部分红包 $return = array('errorNum' => '1', 'errorMsg' => '红包必须全部赎回', 'data' => null); return $return; } } else { $return = array('errorNum' => '1', 'errorMsg' => $red_money['errorMsg'], 'data' => null); return $return; } } } //应该扣除红包的金额 $red_packet = $red; //$m_fund ---新浪的货币基金 //货币基金大于用户要赎回的资金--发上几率比较小 if ($m_fund > $money) { //事物回滚 $transaction = \Yii::$app->db->beginTransaction(); try { //赎回金额小于新浪账户与网站账户的差值,仅网站端进行赎回操作 $profit = (new \yii\db\Query())->select(['profit'])->from('asset_info')->where(['member_id' => $member_id])->one(); //TODO --添加了红包++++++$red_packet; $profit = $profit['profit'] + $red_packet; //用户的可用收益 // money 减去红包 if ($money <= $profit) { // 红包表的处理 if ($update) { $info = Info::findOne($member_id); $info->profit = $info['profit'] + $red_packet; $info = $info->save(); if (!$info) { throw new ErrorException('红包赎回失败', 6001); } $flag = member::draw_red_packet($member_id, $update); if ($flag['errorNum']) { throw new ErrorException('红包赎回失败', 6001); } } //赎回金额小于等于用户可用收益 $info = Info::findOne($member_id); $info->profit = $info['profit'] - $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回失败', 6001); } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回金额放入余额失败', 4002); } //由网站设定好的支付利息的账户进行利息支付 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $money; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $money; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } //赎回成功进行提现记录 $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回成功'; $assetlog->save(); } else { //赎回金额大于用户可用收益 $info = Info::findOne($member_id); $info->profit = 0; $info = $info->save(); if (!$info) { throw new ErrorException('赎回收益失败', 6001); } if ($update) { $flag = member::draw_red_packet($member_id, $update); if ($flag['errorNum']) { throw new ErrorException('红包赎回失败', 6001); } } //由网站设定好的支付利息的账户进行利息支付 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $profit; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $profit; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } $redeem_money = $money - $profit; // TODO $Redeem = self::Redeem($member_id, $redeem_money); if (!$Redeem) { throw new ErrorException('生成赎回字典失败', 4002); } else { $Redeem = self::Set_redeem($Redeem); if (!$Redeem) { throw new ErrorException('赎回失败'); } else { $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $money; $info->invest = $info['invest'] - $redeem_money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回金额放入余额失败', 4002); } //赎回成功进行提现记录 $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $redeem_money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回成功'; $assetlog->save(); } } } $transaction->commit(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '0', 'errorMsg' => 'success', 'data' => null); return $result; } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); \Yii::error($e->getTraceAsString(), 'app'); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '1', 'errorMsg' => $remark, 'data' => null); return $result; } } else { //赎回金额大于新浪账户与网站账户的差值,取得新浪端赎回金额,网站与新浪都进行赎回操作 //---新浪货币基金不足以支撑赎回操作---$s_money ---除去新浪货币基金后要进行的赎回金额 $s_money = $money - $m_fund; //新浪端赎回金额 $profit = (new \yii\db\Query())->select(['profit'])->from('asset_info')->where(['member_id' => $member_id])->one(); $profit = $profit['profit']; //用户的可用收益 ///进行收益的赎回----假定把红包加到用户收益内 //++++用户收益足以满足用户的赎回操作---用户直接赎回投资的收益就可以了 if ($s_money <= $profit + $red_packet) { //事物回滚 赎回收益 $transaction = \Yii::$app->db->beginTransaction(); try { //红包处理---加用户收益 TODO if ($update) { $info = Info::findOne($member_id); $info->profit = $info['profit'] + $red_packet; $info = $info->save(); if (!$info) { throw new ErrorException('红包赎回失败', 6001); } $flag = member::draw_red_packet($member_id, $update); if ($flag['errorNum']) { throw new ErrorException('红包赎回失败', 6001); } } //用户收益足以满足用户的赎回操作---用户直接赎回投资的收益就可以了 $info = Info::findOne($member_id); $info->profit = $info['profit'] - $s_money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回失败', 6001); } //用户只是赎回在投收益---网站给只利息就行了 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $s_money; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $money; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } //--网站账户处理成功了----调用第三方新浪接口赎回收益 $sina_ransom = sinapay::giveInterest($member_id, $s_money); //赎回收益 if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } //更新网站中账户的余额和收益---涉及到货币基金--用户更新数据用$money---实际给付是$s_money $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回金额放入余额失败', 4002); } //赎回成功进行赎回记录 $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回成功'; $assetlog->save(); $transaction->commit(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '0', 'errorMsg' => 'success', 'data' => null); return $result; } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); \Yii::error($e->getTraceAsString(), 'app'); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '1', 'errorMsg' => $remark, 'data' => null); return $result; } } else { //用户的赎回金额大于用户可用收益---需要进行债权赎回操作 $rh_money = 0; //赎回金额 //如果有活动红包奖励--进行红包加到收益里操作 //收益大于0,首先赎回收益 if ($profit + $red_packet > 0) { //事物回滚 赎回收益 $transaction = \Yii::$app->db->beginTransaction(); try { //红包操作---增加用户的账户再投收益 $profit = $profit + $red_packet; if ($update) { $flag = member::draw_red_packet($member_id, $update); if ($flag['errorNum']) { throw new ErrorException('红包赎回失败', 6001); } } //$s_money 是大于用户当前账户中的再投收益的--已经怎加活动奖励红包 $info = Info::findOne($member_id); $info->profit = 0; $info = $info->save(); if (!$info) { throw new ErrorException('赎回收益失败', 6001); } //由网站设定好的支付利息的账户进行利息支付---再投收益全部赎回了 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $profit; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $profit; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $profit; $info = $info->save(); if (!$info) { throw new ErrorException('赎回收益放入余额失败', 4002); } $sina_ransom = sinapay::giveInterest($member_id, (string) $profit); //调用第三方接口赎回收益 if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } //记录用户的赎回金额 $rh_money = $profit; $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); \Yii::error($e->getTraceAsString(), 'app'); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '1', 'errorMsg' => $remark, 'data' => null); return $result; } } //用户已经赎回了所有的再投收益---计算还需要进行多少的债权赎回操作 $money = $money - $profit; $redeem_dic = self::Redeem($member_id, $money); //获取债权字典--进行债权的赎回操作 foreach ($redeem_dic as $k => $v) { if ($v['thirdmoney'] == 0) { continue; } //事物回滚 $transaction = \Yii::$app->db->beginTransaction(); try { //网站赎回部分 //order表金额赎回 $order = Order::findOne($v['order_id']); $order->money = $order['money'] - $v['thirdmoney']; if ($order['money'] == '0') { $order->status = Order::STATUS_DELETE; } $order = $order->save(); if (!$order) { throw new ErrorException('赎回转让债权失败'); } //thirdorder表金额赎回 $thirdorder = Thirdorder::findOne($v['thirdorder_id']); $thirdorder->money = $thirdorder['money'] - $v['thirdmoney']; if ($thirdorder['money'] == '0') { $thirdorder->status = Thirdorder::STATUS_DELETED; } $thirdorder->mcmoney = $thirdorder['mcmoney'] + $v['thirdmoney']; //用户赎回,最大债权人支付此金额,记录 $thirdorder->ocmoney = $thirdorder['ocmoney'] - $v['thirdmoney']; //用户赎回,原始债权人金额减少,记录 $thirdorder = $thirdorder->save(); if (!$thirdorder) { throw new ErrorException('赎回第三方转让债权失败'); } //thirdproduct第三方债权已投金额减少 $thirdproduct = Thirdproduct::findOne($v['thirdproduct_id']); $thirdproduct->invest_sum = $thirdproduct['invest_sum'] - $v['thirdmoney']; $thirdproduct->mcmoney = $thirdproduct['mcmoney'] + $v['thirdmoney']; //赎回导致最大债权人金额增加 $thirdproduct = $thirdproduct->save(); if (!$thirdproduct) { throw new ErrorException('赎回第三方债权已投金额失败'); } //获取债权的最大债权人id,将用户赎回的钱从最大债权人的账户中减去 $maxcreditor = Thirdproduct::find()->select(['maxcreditor'])->where(['id' => $v['thirdproduct_id']])->asArray()->one(); $maxcreditor = $maxcreditor['maxcreditor']; $is_max = Catmiddle::find()->where(['cid' => '1', 'uid' => $maxcreditor])->asArray()->one(); if (!$is_max) { throw new ErrorException('最大债权人异常'); } $max_info = Info::findOne($maxcreditor); $max_info->balance = $max_info['balance'] - $v['thirdmoney']; $max_info = $max_info->save(); if (!$max_info) { throw new ErrorException('消减最大债权人账户金额失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $maxcreditor; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $v['thirdmoney']; $clerk->remark = '最大债权人'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } //新浪赎回部分??? $k_money = $s_money - $v['thirdmoney']; //赎回金额 if ($k_money > 0) { $s_money = $k_money; //获取最大债权人 $maxcreditor = (new \yii\db\Query())->select(['maxcreditor'])->from('fund_thirdproduct')->where(['id' => $v['thirdproduct_id']])->one(); $maxcreditor = $maxcreditor['maxcreditor']; //调用第三方新浪接口赎回 // $money_sina = sprintf("%.2f", $v['thirdmoney']); if ($money_sina > 0) { $sina_ransom = sinapay::sinaRansom($member_id, $money_sina, $maxcreditor); //暂定38为支付利息的用户id if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $v['thirdmoney']; $info->invest = $info['invest'] - $v['thirdmoney']; $info = $info->save(); if (!$info) { $money_log = $money - $s_money + $v['thirdmoney']; throw new ErrorException('成功赎回' . $money_log . '元', 4002); } $rh_money = $rh_money + $v['thirdmoney']; //赎回金额 } else { //获取最大债权人 $maxcreditor = (new \yii\db\Query())->select(['maxcreditor'])->from('fund_thirdproduct')->where(['id' => $v['thirdproduct_id']])->one(); $maxcreditor = $maxcreditor['maxcreditor']; //调用第三方新浪接口赎回 $money_sina = sprintf("%.2f", $s_money); if ($money_sina) { $sina_ransom = sinapay::sinaRansom($member_id, $money_sina, $maxcreditor); //暂定38为支付利息的用户id if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $s_money + $m_fund; $info->invest = $info['invest'] - $s_money - $m_fund; $info = $info->save(); if (!$info) { $money_log = $money - $s_money + $m_fund; throw new ErrorException('赎回' . $money_log . '元', 4002); } $rh_money = $rh_money + $s_money + $m_fund; //赎回金额 } $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); \Yii::error($e->getTraceAsString(), 'app'); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $s_money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); $result = array('errorNum' => '1', 'errorMsg' => $remark, 'data' => null); return $result; break; } } $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $rh_money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回' . $rh_money . '元'; //赎回金额 $assetlog->save(); } Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 $result = array('errorNum' => '0', 'errorMsg' => 'success', 'data' => null); return $result; } }
/** * Authre:langxi * * 用户赎回操作 */ public static function User_redeem($member_id, $money) { ini_set('max_execution_time', 60); //判断用户是否可进行赎回操作 $is_go = Info::find()->select(['status'])->where(['member_id' => $member_id])->asArray()->one(); if ($is_go['status'] > 0) { throw new ErrorException('处理中,请稍后再试'); } Info::updateAll(['status' => Info::GO_THREE], ['member_id' => $member_id]); //赎回进行中 //检查用户一日赎回 $check_redeem = self::check_redeem($member_id, $money); if ($check_redeem) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); throw new ErrorException($check_redeem); } //判断赎回金额是否小于新浪账户与网站账户余额的差值,若小于则网站端进行赎回操作,先赎回利息,然后赎回订单中的金额。 //若大于求取差值获取到网站需要赎回的金额和新浪部分需要赎回的金额,然后两端分别进行赎回操作,先赎回利息,然后赎回订单中的金额 $asset = Info::find()->where(['member_id' => $member_id])->asArray()->one(); $bank_card = $asset['bank_card']; //判断用户赎回金额是否可赎回。 $order_money = (new \yii\db\Query())->select(['money'])->from('fund_orders')->where(['member_id' => $member_id])->andWhere(['>', 'money', '0'])->sum('money'); if ($order_money + $asset['profit'] < $money) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 throw new ErrorException('赎回金额大于在投金额,请重新输入'); } $w_blance = self::showBlance($member_id); //网站余额 $s_blance = sinapay::querySinaBalance($member_id); //调用第三方接口查看新浪账户可用余额(含货币基金 if ($s_blance['errorNum']) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 throw new ErrorException($s_blance['errorMsg'], 7003); } if ($w_blance > $s_blance['data']['available_balance']) { Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 throw new ErrorException('账户异常请联系客服', 7003); } $m_fund = $s_blance['data']['available_balance'] - $w_blance; //新浪账户比网站账户多的钱 if ($m_fund > $money) { //事物回滚 $transaction = \Yii::$app->db->beginTransaction(); try { //赎回金额小于新浪账户与网站账户的差值,仅网站端进行赎回操作 $profit = (new \yii\db\Query())->select(['profit'])->from('asset_info')->where(['member_id' => $member_id])->one(); $profit = $profit['profit']; //用户的可用收益 if ($money <= $profit) { //赎回金额小于等于用户可用收益 $info = Info::findOne($member_id); $info->profit = $info['profit'] - $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回失败', 6001); } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回金额放入余额失败', 4002); } //由网站设定好的支付利息的账户进行利息支付 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $money; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $money; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } //赎回成功进行记录 $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回成功'; $assetlog->save(); } else { //赎回金额大于用户可用收益 $info = Info::findOne($member_id); $info->profit = 0; $info = $info->save(); if (!$info) { throw new ErrorException('赎回收益失败', 6001); } //由网站设定好的支付利息的账户进行利息支付 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $profit; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $profit; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } $redeem_money = $money - $profit; $Redeem = self::Redeem($member_id, $redeem_money); if (!$Redeem) { throw new ErrorException('生成赎回字典失败', 4002); } else { $Redeem = self::Set_redeem($Redeem); if (!$Redeem) { throw new ErrorException('赎回失败'); } else { $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $money; $info->invest = $info['invest'] - $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回金额放入余额失败', 4002); } //赎回成功进行提现记录 $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回成功'; $assetlog->save(); } } } $transaction->commit(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 return true; } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); return false; } } else { //赎回金额大于新浪账户与网站账户的差值,取得新浪端赎回金额,网站与新浪都进行赎回操作 $s_money = $money - $m_fund; //新浪端赎回金额 $profit = (new \yii\db\Query())->select(['profit'])->from('asset_info')->where(['member_id' => $member_id])->one(); $profit = $profit['profit']; //用户的可用收益 if ($s_money <= $profit) { //事物回滚 赎回收益 $transaction = \Yii::$app->db->beginTransaction(); try { //新浪赎回金额小于等于用户可用收益 $info = Info::findOne($member_id); $info->profit = $info['profit'] - $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回失败', 6001); } //由网站设定好的支付利息的账户进行利息支付 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $money; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $money; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } //调用第三方新浪接口赎回收益 $sina_ransom = sinapay::giveInterest($member_id, $s_money); //赎回收益 if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $money; $info = $info->save(); if (!$info) { throw new ErrorException('赎回金额放入余额失败', 4002); } //赎回成功进行提现记录 $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回成功'; $assetlog->trade_no = $sina_ransom['data']['trade_no']; $assetlog->save(); $transaction->commit(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); //赎回结束,操作状态变回常态 return true; } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->trade_no = $sina_ransom['data']['trade_no']; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); return false; } } else { //新浪赎回金额大于用户可用收益 $rh_money = 0; //赎回金额 if ($profit > 0) { //收益大于0,赎回收益 //事物回滚 赎回收益 $transaction = \Yii::$app->db->beginTransaction(); try { $info = Info::findOne($member_id); $info->profit = 0; $info = $info->save(); if (!$info) { throw new ErrorException('赎回收益失败', 6001); } //由网站设定好的支付利息的账户进行利息支付 $sina_config = SinaConfig::find()->select(['sinapay_give_accrual'])->asArray()->one(); $profit_id = $sina_config['sinapay_give_accrual']; $profit_info = Info::findOne($profit_id); $profit_info->balance = $profit_info['balance'] - $profit; $profit_info = $profit_info->save(); if (!$profit_info) { throw new ErrorException('支付利息账户资金减少失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $profit_id; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $profit; $clerk->remark = '支付利息职员'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $profit; $info = $info->save(); if (!$info) { throw new ErrorException('赎回收益放入余额失败', 4002); } $sina_ransom = sinapay::giveInterest($member_id, (string) $profit); //调用第三方接口赎回收益 if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } $rh_money = $profit; //赎回金额 $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); return false; } } $money = $money - $profit; $redeem_dic = self::Redeem($member_id, $money); //获取债权字典 foreach ($redeem_dic as $k => $v) { //事物回滚 $transaction = \Yii::$app->db->beginTransaction(); try { //网站赎回部分 //order表金额赎回 $order = Order::findOne($v['order_id']); $order->money = $order['money'] - $v['thirdmoney']; if ($order['money'] == '0') { $order->status = Order::STATUS_DELETE; } $order = $order->save(); if (!$order) { throw new ErrorException('赎回转让债权失败'); } //thirdorder表金额赎回 $thirdorder = Thirdorder::findOne($v['thirdorder_id']); $thirdorder->money = $thirdorder['money'] - $v['thirdmoney']; if ($thirdorder['money'] == '0') { $thirdorder->status = Thirdorder::STATUS_DELETED; } $thirdorder->mcmoney = $thirdorder['mcmoney'] + $v['thirdmoney']; //用户赎回,最大债权人支付此金额,记录 $thirdorder->ocmoney = $thirdorder['ocmoney'] - $v['thirdmoney']; //用户赎回,原始债权人金额减少,记录 $thirdorder = $thirdorder->save(); if (!$thirdorder) { throw new ErrorException('赎回第三方转让债权失败'); } //thirdproduct第三方债权已投金额减少 $thirdproduct = Thirdproduct::findOne($v['thirdproduct_id']); $thirdproduct->invest_sum = $thirdproduct['invest_sum'] - $v['thirdmoney']; $thirdproduct->mcmoney = $thirdproduct['mcmoney'] + $v['thirdmoney']; //赎回导致最大债权人金额增加 $thirdproduct = $thirdproduct->save(); if (!$thirdproduct) { throw new ErrorException('赎回第三方债权已投金额失败'); } //获取债权的最大债权人id,将用户赎回的钱从最大债权人的账户中减去 $maxcreditor = Thirdproduct::find()->select(['maxcreditor'])->where(['id' => $v['thirdproduct_id']])->asArray()->one(); $maxcreditor = $maxcreditor['maxcreditor']; $is_max = Catmiddle::find()->where(['cid' => '1', 'uid' => $maxcreditor])->asArray()->one(); if (!$is_max) { throw new ErrorException('最大债权人异常'); } $max_info = Info::findOne($maxcreditor); $max_info->balance = $max_info['balance'] - $v['thirdmoney']; $max_info = $max_info->save(); if (!$max_info) { throw new ErrorException('消减最大债权人账户金额失败'); } //写入职员账户记录表中 $clerk = new ClerkLog(); $clerk->member_id = $member_id; $clerk->clerk_id = $maxcreditor; $clerk->behav = ClerkLog::CLERK_BEHAV_TWO; $clerk->step = $v['thirdmoney']; $clerk->remark = '最大债权人'; $clerk = $clerk->save(); if (!$clerk) { throw new ErrorException('写入职员账户记录失败'); } //新浪赎回部分 $k_money = $s_money - $v['thirdmoney']; //赎回金额 if ($k_money > 0) { $s_money = $k_money; //获取最大债权人 $maxcreditor = (new \yii\db\Query())->select(['maxcreditor'])->from('fund_thirdproduct')->where(['id' => $v['thirdproduct_id']])->one(); $maxcreditor = $maxcreditor['maxcreditor']; //调用第三方新浪接口赎回 $sina_ransom = sinapay::sinaRansom($member_id, (string) $v['thirdmoney'], $maxcreditor); if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $v['thirdmoney']; $info->invest = $info['invest'] - $v['thirdmoney']; $info = $info->save(); if (!$info) { $money_log = $money - $s_money + $v['thirdmoney']; throw new ErrorException('成功赎回' . $money_log . '元', 4002); } $rh_money = $rh_money + $v['thirdmoney']; //赎回金额 } else { //获取最大债权人 $maxcreditor = (new \yii\db\Query())->select(['maxcreditor'])->from('fund_thirdproduct')->where(['id' => $v['thirdproduct_id']])->one(); $maxcreditor = $maxcreditor['maxcreditor']; //调用第三方新浪接口赎回 $sina_ransom = sinapay::sinaRansom($member_id, (string) $s_money, $maxcreditor); //暂定38为支付利息的用户id if ($sina_ransom['errorNum']) { throw new ErrorException($sina_ransom['errorMsg'], 7002); } $info = Info::findOne(['member_id' => $member_id]); $info->balance = $info->balance + $s_money + $m_fund; $info->invest = $info['invest'] - $s_money - $m_fund; $info = $info->save(); if (!$info) { $money_log = $money - $s_money + $m_fund; throw new ErrorException('赎回' . $money_log . '元', 4002); } $rh_money = $rh_money + $s_money + $m_fund; //赎回金额 } $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); //对提现失败信息进行记录 $remark = $e->getMessage(); $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $s_money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RERROR; //赎回失败 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回失败' . $remark; $assetlog->trade_no = $sina_ransom['data']['trade_no']; $assetlog->save(); Info::updateAll(['status' => '0'], ['member_id' => $member_id]); throw new ErrorException($remark, 5005); break; //异常跳出赎回操作 } } $assetlog = new Log(); $assetlog->member_id = $member_id; $assetlog->step = $rh_money; $assetlog->action = 'Withdrawals/Redeem'; $assetlog->status = self::RSUCCEED; //赎回成功 $assetlog->bankcard = $bank_card; $assetlog->remark = '赎回' . $rh_money . '元'; $assetlog->trade_no = $sina_ransom['data']['trade_no']; $assetlog->save(); } Info::updateAll(['status' => '0'], ['member_id' => $member_id]); return true; } }