public function income($uid = 0) { $moneyModel = new \Common\Model\UserMoneyModel(); if (IS_POST) { $money = I('money', 0, 'float'); $money > 0 or $this->error('请输入正确的金额!'); $remark = I('remark'); $ret = $moneyModel->in(I('uid'), $money, $remark); $ret ? $this->success('更新金额成功!') : $this->error($moneyModel->getError()); return; } $money = $moneyModel->get($uid, true) or $this->error($moneyModel->getError()); $this->assign('money', $money); $user = M('user')->find($uid) or $this->error('找不到此用户信息!'); $this->assign('user', $user); $this->meta_title = '用户充值'; $this->display(); }
/** * 确认充值成功,对业务进行处理(注意高并发及重复请求) * * @param ing $pay_id 支付操作编号 */ protected function _paySuccess($pay_id) { // 验证是否重复操作 $payRow = M('user_money_pay_alipay')->find($pay_id); if (!$payRow) { return '此交易记录不存在!'; } if ($payRow['is_action'] > 0) { return true; } if (bccomp($_REQUEST['total_fee'], $payRow['money'], 2) != 0) { return '支付金额与记录不符!'; } // 抢占处理 if (!M('user_money_pay_alipay')->where(['id' => $pay_id, 'is_action' => $payRow['is_action']])->setField('is_action', 1)) { return true; } // 增加用户钱包金额 $moneyModel = new \Common\Model\UserMoneyModel(); $ret = $moneyModel->in($payRow['uid'], $payRow['money'], '支付宝充值', $_REQUEST['trade_no']); return $ret ?: $moneyModel->getError(); }
/** * 自动还款(从个人钱包扣款) * * @param int $uid 用户编号 * @param number $money 最大还款金额 * * @return 实际还款金额 */ public function autoRepay($uid, $money) { if ($money <= 0) { return true; } $billModel = new \Loan\Model\BillModel(); // 获取当前总共欠下的还款金额 $total_need_repay_money = $billModel->autoRepay($uid); $pay_money = min($money, $total_need_repay_money); if ($money <= 0) { return true; } // 为扣款做好准备 $trade_no = date('YmdHis') . str_pad(mt_rand(0, 9999), 4, '0', STR_PAD_LEFT); $pay_id = M('loan_pay_wallet')->add(['trade_no' => $trade_no, 'created' => time(), 'uid' => $uid, 'money' => $pay_money, 'is_paid' => 0, 'is_success' => 0]); // 执行扣款 $userMoneyModel = new \Common\Model\UserMoneyModel(); $ret = $userMoneyModel->pay($userMoneyModel::SOURCE_LOAN, $trade_no, $uid, $pay_money, '兼职换购还款'); if (!$ret) { system_warn('自动还款失败:' . $userMoneyModel->getError()); return $userMoneyModel->getError(); } M('loan_pay_wallet')->where('id=' . $pay_id)->setField('is_paid', 1); // 执行还款 $total_pay_money = $billModel->autoRepay($uid, $pay_money, $trade_no); if (!$ret) { system_warn('自动还款失败:' . $billModel->getError()); return $billModel->getError(); } M('loan_pay_wallet')->where('id=' . $pay_id)->setField('is_success', 1); return true; }
/** * 结算学生诚意金 * 将学生的诚意金结算给三方 * * @param int $join_id 参与编号 * @param number $money_student 退还给学生的金额 * @param number $money_company 支付给商家的金额 * @param number $money_service 支付给公司的金额 */ public function checkoutStudent($join_id, $money_student, $money_company, $money_service) { // 获取参与记录 $join = M('job_join')->find($join_id); if (!$join) { return $this->_error('找不到此兼职参与信息!'); } if ($join['money_from_student'] <= 0) { return $this->_error('此参与无可用诚意金!'); } // 获取兼职记录 $job_id = $join['job_id']; $job = M('job')->find($job_id); if (!$job) { return $this->_error('找不到此兼职信息!'); } // 格式化所有金额 $total_money = number_format($join['money_from_student'], 2, '.', ''); $money_company = number_format($money_company, 2, '.', ''); $money_student = number_format($money_student, 2, '.', ''); $money_service = number_format($money_service, 2, '.', ''); // 验证金额是否一致 if ($total_money <= 0) { return $this->_error('结算费用异常!'); } if (bccomp($total_money, $money_company + $money_student + $money_service, 2) != 0) { return $this->_error('金额不正确,应结算金额为:' . $total_money); } // 获取支付时所用的交易单号 $pay_logs = M('job_pay')->where(['type' => 2, 'job_id' => $join['job_id'], 'join_id' => $join['id'], 'is_paid' => 1, 'is_action' => 1, 'is_closed' => 0])->select(); if (count($pay_logs) < 1) { return $this->_error('无法获取支付记录!'); } if (count($pay_logs) > 1) { system_warn('检测到多条未结算记录!'); return $this->_error('系统异常,请联系技术人员处理!'); } if (bccomp($total_money, $pay_logs[0]['money_guaranty'], 2) != 0) { return $this->_error('金额不正确,应结算金额为:' . $pay_logs[0]['money_guaranty']); } $title = '结算兼职诚意金'; $trade_no = $pay_logs[0]['trade_no']; $remark = '参与编号:' . $join_id . ',支付商家:' . $money_company . ',支付学生:' . $money_student . ',支付服务费:' . $money_service; $user = get_user(); $op_uid = $user ? $user['uid'] : 0; // 判断是否重复操作 $history = M('job_pay_checkout')->where(['trade_no' => $trade_no])->find(); if ($history) { if ($history['back_money'] != $money_student || $history['to_money'] != $money_company || $history['service_money'] != $money_service) { return $this->_error('存在重复却金额不同的结算记录:' . $trade_no); } } else { M('job_pay_checkout')->add(['trade_no' => $trade_no, 'created' => time(), 'back_money' => $money_student, 'to_uid' => $job['uid'], 'to_money' => $money_company, 'service_money' => $money_service, 'uid' => $op_uid, 'remark' => $remark]); } // 执行冻结资金操作 $moneyModel = new \Common\Model\UserMoneyModel(); $params = ['source_id' => $moneyModel::SOURCE_JOB, 'trade_no' => $trade_no, 'title' => $title, 'remark' => $remark, 'total_money' => $total_money, 'from_uid' => $join['uid'], 'back_money' => $money_student, 'back_title' => '返还兼职费用,参与编号:' . $join_id, 'to_uid' => $job['uid'], 'to_money' => $money_company, 'to_title' => '支付兼职费用,参与编号:' . $join_id, 'service_money' => $money_service, 'service_title' => '支付兼职服务费,参与编号:' . $join_id]; $ret = $moneyModel->checkout($params); // 返回操作结果 if ($ret) { $this->where(['trade_no' => $trade_no, 'is_closed' => 0])->setField('is_closed', 1); M('job_join')->save(['id' => $join_id, 'money_from_student' => 0]); return true; } else { $this->error = $moneyModel->getError(); return false; } }