Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea
218 changes: 106 additions & 112 deletions ClickController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
use app\models\User;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\web\Response;
use Yii;

class ClickController extends Controller
{
Expand All @@ -27,39 +29,43 @@ public function beforeAction($action)
}

/**
* @return string
* @return string|int|array
* @throws \yii\base\InvalidConfigException
* @throws \yii\base\NotSupportedException
* @throws \yii\db\Exception
* @throws \yii\db\StaleObjectException
*/
public function actionPrepare()
{
$this->reqData = $_POST;
Yii::$app->responce->format = Response::FORMAT_JSON;
$this->reqData = Yii::$app->request->post();
$this->validateData();
$checkExists = ClickTransactions::find()
->where(['click_trans_id' => $this->reqData['click_trans_id']])->one();

if ($checkExists !== NULL) {
if ($checkExists->status == ClickTransactions::STATUS_CANCEL) {
//Transaction cancelled
die(json_encode(ClickData::getMessage('9')));
} //Already paid
else die(json_encode(ClickData::getMessage('4')));
return ClickData::getMessage(ClickData::ERROR_TRANSACTION_CANCELLED);
} else {
// Already paid
return ClickData::getMessage(ClickData::ERROR_ALREADY_PAID);
}
}

//Error in request from click
if (!$this->reqData['error'] == 0) die(json_encode(ClickData::getMessage('8')));

if (!$this->reqData['error'] == 0) {
return ClickData::getMessage(ClickData::ERROR_ERROR_REQUEST_CLICK);
}
$newTransaction = new ClickTransactions;
$newTransaction->user_id = $this->reqData['merchant_trans_id'];
$newTransaction->user_id = $this->reqData['merchant_trans_id'];
$newTransaction->click_trans_id = $this->reqData['click_trans_id'];
$newTransaction->service_id = $this->reqData['service_id'];
$newTransaction->amount = $this->reqData['amount'];
$newTransaction->sign_time = $this->reqData['sign_time'];
$newTransaction->service_id = $this->reqData['service_id'];
$newTransaction->amount = $this->reqData['amount'];
$newTransaction->sign_time = $this->reqData['sign_time'];
$newTransaction->click_paydoc_id = $this->reqData['click_paydoc_id'];
$newTransaction->create_time = time();
$newTransaction->status = ClickTransactions::STATUS_INACTIVE;
$newTransaction->create_time = time();
$newTransaction->status = ClickTransactions::STATUS_INACTIVE;

if ($newTransaction->save(false)) {

Expand All @@ -70,17 +76,68 @@ public function actionPrepare()
'merchant_prepare_id' => $merchant_prepare_id // ID платежа для подтверждения
);

$result = array_merge(ClickData::getMessage('0'), $return_array);

die(json_encode($result));
$result = array_merge(ClickData::getMessage(ClickData::ERROR_SUCCESS), $return_array);
return $result;
}
// other case report: Unknown Error
die(json_encode(1));
return 1;
}

private function validateData()
{
Yii::$app->responce->format = Response::FORMAT_JSON;
//check complete parameters: Unknown Error
if ((!isset($this->reqData['click_trans_id'])) ||
(!isset($this->reqData['service_id'])) ||
(!isset($this->reqData['click_paydoc_id'])) ||
(!isset($this->reqData['merchant_trans_id'])) ||
(!isset($this->reqData['amount'])) ||
(!isset($this->reqData['action'])) ||
(!isset($this->reqData['sign_time'])) ||
(!isset($this->reqData['sign_string'])) ||
(!isset($this->reqData['error']))
) {

return ClickData::getMessage(ClickData::ERROR_UNKNOWN);
}

// Формирование ХЭШ подписи
$sign_string_veryfied = md5(
$this->reqData['click_trans_id'] .
$this->reqData['service_id'] .
ClickData::$secretKey .
$this->reqData['merchant_trans_id'] .
(($this->reqData['action'] == 1) ? $this->reqData['merchant_prepare_id'] : '') . // TODO 1 is hard code
$this->reqData['amount'] .
$this->reqData['action'] .
$this->reqData['sign_time']
);

if ($this->reqData['sign_string'] != $sign_string_veryfied) {
return ClickData::getMessage(ClickData::ERROR_FAILED_SIGN);
}

// Check Actions: Action not found
if (!in_array($this->reqData['action'], [0, 1])) { // TODO 0 and 1 is hard code
return ClickData::getMessage(ClickData::ERROR_ACTION_NOT_FOUND);
}

// Check sum: Incorrect parameter amount
if (($this->reqData['amount'] < ClickData::$minAmount) || ($this->reqData['amount'] > ClickData::$maxAmount)) {
return ClickData::getMessage(ClickData::ERROR_INCORRECT_AMOUNT);
}

$this->user = User::findOne($this->reqData['merchant_trans_id']);
if ($this->user === NULL) {
// User does not exist
return ClickData::getMessage(ClickData::ERROR_USER_NOT_FOUND);
}
}

public function actionComplete()
{
$this->reqData = $_POST;
Yii::$app->responce->format = Response::FORMAT_JSON;
$this->reqData = Yii::$app->request->post();

//if not validated it is end point
//-------------------------------------------
Expand All @@ -89,8 +146,9 @@ public function actionComplete()
//-------------------------------------------
//Error in request from click

if (empty($this->reqData['merchant_prepare_id'])) die(json_encode(ClickData::getMessage('8')));

if (empty($this->reqData['merchant_prepare_id'])) {
return ClickData::getMessage(ClickData::ERROR_ERROR_REQUEST_CLICK);
}

// --------------------------------------------------------------------------- Start trasaction DB
$transaction = ClickTransactions::findOne(
Expand All @@ -103,145 +161,82 @@ public function actionComplete()
]
);


if ($transaction !== NULL) {

if ($this->reqData['error'] == 0) {

if ($this->reqData['error'] == 0) { // TODO 0 is hard code
if ($this->reqData['amount'] == $transaction->amount) {

if ($transaction->status == ClickTransactions::STATUS_INACTIVE) {

$db = \Yii::$app->db;
$db = Yii::$app->db;
$db_transaction = $db->beginTransaction();
$transaction->status = ClickTransactions::STATUS_ACTIVE;

if (!$transaction->save(false)) {
$db_transaction->rollback();
die(json_encode(ClickData::getMessage('n')));
return ClickData::getMessage(ClickData::ERROR_UNKNOWN);
}
$db_transaction->commit();

$order = Orders::findOne($transaction->user_id); // if pay success -> Change Order status to 2
if(!empty($order)){
$order->state = 2;
$order = Orders::findOne($transaction->user_id);
// if pay success -> Change Order status to 2
if (!empty($order)) {
$order->state = 2; // TODO this [2] change your order payy
$order->save(false);
}
$return_array = [
'click_trans_id' => $transaction->click_trans_id,
'merchant_trans_id' => $transaction->user_id,
'merchant_confirm_id' => $transaction->id,
];

$result = array_merge(ClickData::getMessage('0'), $return_array);

die(json_encode($result));
$result = array_merge(ClickData::getMessage(ClickData::ERROR_SUCCESS), $return_array);
return $result;
} elseif ($transaction->status == ClickTransactions::STATUS_CANCEL) {
//"Transaction cancelled"
die(json_encode(ClickData::getMessage('9')));
return ClickData::getMessage(ClickData::ERROR_TRANSACTION_CANCELLED);
} elseif ($transaction->status == ClickTransactions::STATUS_ACTIVE) {
die(json_encode(ClickData::getMessage('4')));
} else die(json_encode(ClickData::getMessage('n')));
return ClickData::getMessage(ClickData::ERROR_ALREADY_PAID);
} else return ClickData::getMessage(ClickData::ERROR_UNKNOWN);
} else {
if ($transaction->status == ClickTransactions::STATUS_INACTIVE)
//$transaction->delete();
//"Incorrect parameter amount"
die(json_encode(ClickData::getMessage('2')));
return ClickData::getMessage(ClickData::ERROR_INCORRECT_AMOUNT);
}
} elseif ($this->reqData['error'] < 0) {

if ($this->reqData['error'] == -5017) { // "Transaction cancelled"



if ($this->reqData['error'] == -5017) {
// "Transaction cancelled"
if ($transaction->status != ClickTransactions::STATUS_ACTIVE) {
$transaction->status = ClickTransactions::STATUS_CANCEL;
if ($transaction->save(false)) {
// "Transaction cancelled"
$this->send_mail_complete($this->reqData, true);
die(json_encode(ClickData::getMessage('9')));
return ClickData::getMessage(ClickData::ERROR_TRANSACTION_CANCELLED);
}
die(json_encode(ClickData::getMessage('n')));
} else die(json_encode(ClickData::getMessage('n')));
return ClickData::getMessage(ClickData::ERROR_UNKNOWN);
} else return ClickData::getMessage(ClickData::ERROR_UNKNOWN);
} elseif ($this->reqData['error'] == -1 && $transaction->status == ClickTransactions::STATUS_ACTIVE) {
die(json_encode(ClickData::getMessage('4')));
} else die(json_encode(ClickData::getMessage('n')));

return ClickData::getMessage(ClickData::ERROR_ALREADY_PAID);
} else return ClickData::getMessage(ClickData::ERROR_UNKNOWN);
} // error > 0
else {
die(json_encode(ClickData::getMessage('n')));
return ClickData::getMessage(ClickData::ERROR_UNKNOWN);
}
} // Transaction is null
else {
// Transaction does not exist
die(json_encode(ClickData::getMessage('6')));
return ClickData::getMessage(ClickData::ERROR_TRANSACTION_NOT_FOUND);
}
// echo "Hello from Complete // ";
print_r(ClickData::getMessage(0));
// echo "Hello from Complete // ";
print_r(ClickData::getMessage(ClickData::ERROR_SUCCESS)); // TODO Nazirovlix nima uchun print_r
// var_dump(ClickData::$messages);
}

private function validateData()
{
//check complete parameters: Unknown Error
if ((!isset($this->reqData['click_trans_id'])) ||
(!isset($this->reqData['service_id'])) ||
(!isset($this->reqData['click_paydoc_id'])) ||
(!isset($this->reqData['merchant_trans_id'])) ||
(!isset($this->reqData['amount'])) ||
(!isset($this->reqData['action'])) ||
(!isset($this->reqData['sign_time'])) ||
(!isset($this->reqData['sign_string'])) ||
(!isset($this->reqData['error']))
) {

die(json_encode(ClickData::getMessage('n')));
}

// Формирование ХЭШ подписи
$sign_string_veryfied = md5(
$this->reqData['click_trans_id'] .
$this->reqData['service_id'] .
ClickData::SECRET_KEY .
$this->reqData['merchant_trans_id'] .
(($this->reqData['action'] == 1) ? $this->reqData['merchant_prepare_id'] : '') .
$this->reqData['amount'] .
$this->reqData['action'] .
$this->reqData['sign_time']
);

if ($this->reqData['sign_string'] != $sign_string_veryfied) {
die(json_encode(ClickData::getMessage('1')));
}

// Check Actions: Action not found
if (!in_array($this->reqData['action'], [0, 1])) die(json_encode(ClickData::getMessage('3')));

// Check sum: Incorrect parameter amount
if (($this->reqData['amount'] < ClickData::MIN_AMOUNT) || ($this->reqData['amount'] > ClickData::MAX_AMOUNT)) {
die(json_encode(ClickData::getMessage('2')));
}

//
$this->user = User::findOne($this->reqData['merchant_trans_id']);
if ($this->user === NULL) {
// User does not exist
die(json_encode(ClickData::getMessage('5')));
}
}

private function send_mail_complete($data, $notcomplete = false)
{
if (!$notcomplete) {
$message = <<<MESSAGE
<p>Message</p>
MESSAGE;
$subject_text = 'Оплата CLICK';
$message = "<p>" .Yii::t('click', "Message"). "</p>";
$subject_text = Yii::t('click', 'Оплата CLICK');
} else {
$message = <<<MESSAGE
<p>Message</p>
MESSAGE;
$subject_text = 'Отмена CLICK';
$message = "<p>" .Yii::t('click', "Message"). "</p>";
$subject_text = Yii::t('click', 'Отмена CLICK');
}
Yii::$app->mailer->compose()
->setFrom('')
Expand All @@ -257,7 +252,6 @@ private function send_mail_complete($data, $notcomplete = false)
*/
public function actionIndex()
{

return $this->render('click');
}

Expand Down
51 changes: 32 additions & 19 deletions ClickData.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,39 @@

class ClickData {

const SECRET_KEY = '<KEY>';
const MIN_AMOUNT = 100;
const MAX_AMOUNT = 1000000;

static public function getMessage($value)
const ERROR_SUCCESS = '0';
const ERROR_FAILED_SIGN = '1';
const ERROR_INCORRECT_AMOUNT = '2';
const ERROR_ACTION_NOT_FOUND = '3';
const ERROR_ALREADY_PAID = '4';
const ERROR_USER_NOT_FOUND = '5';
const ERROR_TRANSACTION_NOT_FOUND = '6';
const ERROR_FAILED_UPDATE_USER = '7';
const ERROR_ERROR_REQUEST_CLICK = '8';
const ERROR_TRANSACTION_CANCELLED = '9';
const ERROR_UNKNOWN = 'n';

public static $secretKey = "<KEY>";
public static $minAmount = 100;
public static $maxAmount = 1000000;


public static function getMessage($value)
{
$messages = array(
0 => array("error"=>"0","error_note" =>"Success"),
1 => array("error"=>"-1","error_note"=>"SIGN CHECK FAILED!"),
2 => array("error"=>"-2","error_note"=>"Incorrect parameter amount"),
3 => array("error"=>"-3","error_note"=>"Action not found"),
4 => array("error"=>"-4","error_note"=>"Already paid"),
5 => array("error"=>"-5","error_note"=>"User does not exist"),
6 => array("error"=>"-6","error_note"=>"Transaction does not exist"),
7 => array("error"=>"-7","error_note"=>"Failed to update user"),
8 => array("error"=>"-8","error_note"=>"Error in request from click"),
9 => array("error"=>"-9","error_note"=>"Transaction cancelled"),
'n' => array("error"=>"-n","error_note"=>"Unknown Error"),
);
return $messages[$value];
$messages = [
self::ERROR_SUCCESS => ["error" => "0", "error_note" => Yii::t('click',"Success")],
self::ERROR_FAILED_SIGN => ["error" => "-1", "error_note" => Yii::t('click',"SIGN CHECK FAILED!")],
self::ERROR_INCORRECT_AMOUNT => ["error" => "-2", "error_note" => Yii::t('click',"Incorrect parameter amount")],
self::ERROR_ACTION_NOT_FOUND => ["error" => "-3", "error_note" => Yii::t('click',"Action not found")],
self::ERROR_ALREADY_PAID => ["error" => "-4", "error_note" => Yii::t('click',"Already paid")],
self::ERROR_USER_NOT_FOUND => ["error" => "-5", "error_note" => Yii::t('click',"User does not exist")],
self::ERROR_TRANSACTION_NOT_FOUND => ["error" => "-6", "error_note" => Yii::t('click',"Transaction does not exist")],
self::ERROR_FAILED_UPDATE_USER => ["error" => "-7", "error_note" => Yii::t('click',"Failed to update user")],
self::ERROR_ERROR_REQUEST_CLICK => ["error" => "-8", "error_note" => Yii::t('click',"Error in request from click")],
self::ERROR_TRANSACTION_CANCELLED => ["error" => "-9", "error_note" => Yii::t('click',"Transaction cancelled")],
self::ERROR_UNKNOWN => ["error" => "-n", "error_note" => Yii::t('click',"Unknown Error")],
];
return isset($messages[$value]) ? $messages[$value] : $messages[self::ERROR_UNKNOWN];
}
}

Expand Down
Loading