public function join()
 {
     $join_id = I('join_id');
     $join = M('job_join')->find($join_id) or $this->error('找不到此兼职参与信息!');
     $payModel = new \Job\Model\PayModel();
     $pay_money = $payModel->joinMoney($join_id);
     $pay_money === false && $this->error($payModel->getError());
     if ($pay_money <= 0) {
         $this->error('此兼职不需要缴纳费用!');
     }
     if (M('job_pay')->where(['type' => 2, 'job_id' => $join['job_id'], 'join_id' => $join['id'], 'is_paid' => 1, 'is_closed' => 0])->count() > 0) {
         $this->error('存在未结算记录,禁止重复支付!');
     }
     $title = '支付兼职诚意金';
     $trade_no = date('YmdHis') . str_pad(mt_rand(0, 9999), 4, '0', STR_PAD_LEFT);
     $remark = '';
     $user = get_user();
     $op_uid = $user ? $user['uid'] : 0;
     M('job_pay')->add(['trade_no' => $trade_no, 'type' => 2, 'created' => time(), 'job_id' => $join['job_id'], 'join_id' => $join['id'], 'money_guaranty' => $pay_money, 'remark' => $remark, 'uid' => $op_uid]);
     // 跳转到钱包支付页面(支付成功,目前由钱包产品直接调用兼职的PayModel
     $return_url = U('/job/user_my_join/@mobile');
     $this->_wallet($join['uid'], $trade_no, $pay_money, $title, $remark, $return_url);
 }
 public function checkout()
 {
     $id = I('id', 0, 'intval');
     $money_student = I('money_student', 0, 'float');
     $money_company = I('money_company', 0, 'float');
     $money_service = I('money_service', 0, 'float');
     $type = I('type');
     $jobModel = new \Job\Model\PayModel();
     if ($type == 'company') {
         $ret = $jobModel->checkout($id, $money_student, $money_company, $money_service);
         $ret or $this->error($jobModel->getError());
         // 结算成功后,立即执行自动还款
         $join = M('job_join')->find($id) or $this->error('找不到此参与信息!');
         $orderModel = new \Loan\Model\OrderModel();
         $ret = $orderModel->autoRepay($join['uid'], $money_student);
         $ret ? $this->success() : $this->error('结算成功,但自动分期还款失败:' . $jobModel->getError());
     } elseif ($type == 'student') {
         $ret = $jobModel->checkoutStudent($id, $money_student, $money_company, $money_service);
         $ret ? $this->success() : $this->error($jobModel->getError());
     } else {
         $this->error('未知请求类型!');
     }
 }
 /**
  * 支付页面
  */
 public function pay()
 {
     $param = $_GET;
     $uid = $this->user['uid'];
     $userMoneyModel = new UserMoneyModel();
     // 需事先设置交易密码,设置成功后自动跳转回来继续支付
     if (!$userMoneyModel->isSetPassword($uid)) {
         $this->assign('return_url', '?to_url=' . U('/wallet/pay/@mobile', $_GET));
         $this->display('set_password_required');
         return;
     }
     if (IS_POST) {
         // 确认支付,检验交易密码
         if (!$userMoneyModel->checkPassword($uid, I('password'))) {
             $this->error($userMoneyModel->getError() ?: '交易密码错误!');
         }
         // 还原支付参数
         $param = json_decode(urldecode($_POST['param']), true);
         $source = $param['source'];
         $trade_no = $param['trade_no'];
         $title = $param['title'];
         $money_pay = $param['money'];
         $remark = $param['remark'];
         $return_url = $param['return_url'];
         // 验证请求是否合法
         $sign = $param['sign'];
         unset($param['sign']);
         ksort($param);
         reset($param);
         $query_str = http_build_query($param);
         $key = M('user_money_source')->where('id=' . intval($param['source']))->getField('key');
         if ($sign != md5($query_str . $key)) {
             $this->error('请求数据不合法!');
         }
         // 执行资金操作
         if ($userMoneyModel->frozen($source, $trade_no, $uid, $money_pay, $title, $remark)) {
             // 不发通知请求给支付方,而是直接调用具体业务模型方法,执行完成交易结果
             if ($source == $userMoneyModel::SOURCE_JOB) {
                 $payModel = new \Job\Model\PayModel();
                 $ret = $payModel->pay_success($trade_no);
                 $ret or $this->error('支付成功,但业务处理失败:' . $payModel->getError());
             }
             $this->success('支付成功', $return_url);
         } else {
             $this->error($userMoneyModel->getError());
         }
         return;
     }
     // 判断可用金额是否满足,否则提示充值
     $money_pay = I('money', 0, 'float');
     if ($money_pay <= 0) {
         $this->error('支付金额异常!');
     }
     $money_avaliable = $userMoneyModel->get($uid);
     if (bccomp($money_avaliable, $money_pay) < 0) {
         $this->display('pay_insufficient');
         return;
     }
     // 显示支付页面
     $this->assign('param', urlencode(json_encode($param)));
     $this->assign('title', I('title'));
     $this->assign('money_pay', number_format($money_pay, 2, '.', ''));
     $this->assign('money_avaliable', $money_avaliable);
     $this->display();
 }