/** * @brief 提现付款给用户账号成功 * * @return public function * @retval * @see * @note * @author 吕宝贵 * @date 2015/12/06 20:31:42 **/ public function processWithdrawPaySuccess($payId, $paySuccessCallback) { //处理交易信息 $payable = Payable::findOne($payId); if (!$payable) { $this->addError(__METHOD__, '获取付款记录信息失败'); return false; } $trans = $payable->trans; $trans->status = Trans::PAY_STATUS_FINISHED; if (!$trans->save()) { $this->addError(__METHOD__, '交易信息保存失败'); return false; } //完成冻结,用户的冻结金额进行操作 $withdrawUser = $this->getUserAccount($payable->receive_uid); if (!$this->finishFreeze($withdrawUser->uid, $trans->id)) { $this->addError(__METHOD__, '减除用户冻结余额时出错!'); return false; } //用户设定的回调操作 $withdrawId = $trans->trans_id_ext; $callbackData['id'] = $withdrawId; if (call_user_func($paySuccessCallback, $callbackData)) { return true; } else { $this->addError(__METHOD__, '处理提现支付成功回掉函数时出错'); return false; } }
/** * @brief 提现付款给用户账号成功 * * @return public function * @retval * @see * @note * @author 吕宝贵 * @date 2015/12/06 20:31:42 **/ public function processWithdrawPaySuccess($payId, $paySuccessCallback) { $payable = Payable::findOne($payId); if (!$payable) { $this->addError('display-error', '获取付款记录信息失败'); return false; } //处理交易信息 $trans = $payable->trans; $trans->status = Trans::PAY_STATUS_FINISHED; if (!$trans->save()) { $this->addError('display-error', '交易信息保存失败'); return false; } $withdrawUser = $this->getUserAccount($payable->receive_uid); //完成冻结,将款项从冻结中减除 if ($withdrawUser->finishFreeze($trans->total_money)) { return true; } else { $this->addError('display-error', '减除用户冻结余额时出错!'); $this->addErrors($withdrawUser->getErrors()); return false; } //冻结记录完成 $freeze = Freeze::fineOne(['trans_id' => $trans->id, 'type' => Freeze::FREEZE_TYPE_WITHDRAW]); if (!$freeze) { $this->addError('display-error', '冻结记录不存在'); return false; } if (!$freeze->finishFreeze()) { $this->addError('display-error', '冻结记录无法更改状态'); return false; } //用户设定的回调操作 $callbackData['id'] = $withdrawId; return call_user_func($paySuccessCallback, $callbackData); }
/** * @brief 从银行返回的excel列表总导出支付成功和失败信息,用于后续处理,解冻,结算等。 * * @return public function * @retval * @see * @note * @author 吕宝贵 * @date 2015/12/22 18:14:17 **/ public function actionImportFromExcel() { //获取文件 $excelFile = UploadedFile::getInstanceByName('payedfile'); if (!$excelFile) { throw new Exception('获取上传文件失败'); } $excelConverter = new Excel(); $payedItems = $excelConverter->importFromFile(); //循环处理支付结果,对有问题的结果写入文件,导出给用户,一天提取的款项默认不多,因此不需要做异步处理 foreach ($payedItems as $payedItem) { if ($payedItem['status']) { $payable = Payable::findOne($payedItem['id']); $userAccount = Yii::$app->account->getUserAccount($payable->uid); $callbackFunc = [UserWithdraw::className(), 'processFinishPayNotify']; if (!$userAccount->processWithdrawPaySuccess($payable->id, $callbackFunc)) { //将错误处理的信息记录下来 } } } }