/** * Process logic by payment Type * * @throws ProcessorException */ private function doProcessType() { $type = new Type($this->payment->type, $this->payment->toArray()); switch ($type->sid()) { case Type::CITY: break; case Type::FEE: break; case Type::CHECK: // todo check 'check' request // register check request $this->payment->status = Status::ENABLED; break; case Type::PAY: // pay after 'check' request $payment = self::findCheck($this->payment->term, $this->payment->city, $this->payment->amount, $this->payment->to, Status::ENABLED); if (!$payment) { throw new ProcessorException(ProcessorException::RC_CHECK_NOT_FOUND); } // close 'check' request $payment->status = Status::PAY; $payment->saveByType(); // processed 'payment' request $this->payment->status = Status::PROCESSED; $this->payment->code = uniqid(); break; case Type::CANCEL: // find pay in status 'processed' $payment = self::findPayTo($this->payment->term, $this->payment->code, $this->payment->to, Status::PROCESSED); if ($payment) { // cancel 'pay' request $payment->status = Status::CANCELED; $payment->saveByType(); // save cancel request in 'processed' $this->payment->status = Status::PROCESSED; $this->payment->amount = $payment->amount; $this->payment->name = $payment->name; $this->payment->to = $payment->to; } else { throw new ProcessorException(ProcessorException::RC_PAY_NOT_FOUND); } break; case Type::STATUS: // status for pay $payment = self::findPayTo($this->payment->term, $this->payment->code, $this->payment->to); // init data from 'pay' request into current 'status' request if ($payment) { $this->payment->id = $payment->id; $this->payment->status = $payment->status; $this->payment->amount = $payment->amount; $this->payment->to = $payment->to; $this->payment->name = $payment->name; } else { throw new ProcessorException(ProcessorException::RC_PAY_NOT_FOUND); } break; } return '00'; }
private function initValidator() { $fields = $this->type->fields(); $rules = array(); foreach ($fields as $value) { $rules[$value] = self::$rules[$value]; } $this->validator = Validator::make($this->input, $rules); }
/** * @param array $input * @param int $code * @param string $message * * @return void * * @dataProvider check */ public function testCheck($input, $code = null, $message = null) { Secure::sign($input, 'check', 'secret'); $opType = new Type('check', $input); try { $this->assertTrue($opType->validate()); if ($code) { $this->assertFalse(true, 'Exception must be there with code ' . $code); } } catch (ProcessorException $e) { $this->assertEquals($code, $e->getCode(), $e->getMessage()); $this->assertContains($message, $e->getMessage()); } }
/** * * Check, clear and verify input params * * @param $action * @param $type * @param $input * * @throws ProcessorException * @return array */ private function getVerifiedInput($action, $type, $input) { $input = Type::clearInput($type, $input); $baseInput = $input; $termId = $input['term']; $term = Terminal::find($termId); $sign = $input['sign']; Secure::sign($input, $type, $term->secret); $isCorrect = $sign === $input['sign']; if (!$isCorrect) { Log::warning($action . 'pull', array('message' => 'Invalid signature', 'sign' => $input['sign'], 'input' => Input::all())); throw new ProcessorException(ProcessorException::INVALID_SIGN); } Log::info($action . 'pull', array('message' => 'Correct signature', 'input' => Input::all())); return $baseInput; }
private function getResponseData() { $data = array('term' => $this->payment->item()->term, 'type' => $this->payment->item()->type, 'code' => $this->payment->item()->code, 'amount' => $this->payment->item()->amount, 'cur' => $this->payment->item()->cur, 'status' => $this->payment->item()->status, 'time' => Time::ts()); Secure::sign($data, $this->type->sid(), $this->term->secret); return $data; }