mahdi_1986
جمعه 29 آبان 1394, 23:55 عصر
با سلام
چند وقت پیش برای یک پروژه باید به درگاه بانک پارسیان وصل میشدم و الان اون کد رو در اختیار شما قرار میدهم:
در قسمت مدل کلاس زیر را نوشتم:
class Parsian{
const STATUS_OK = 0; const UNKNOWN_STATUS = 1; const INVALID_PIN = 20; const MERCHANT_AUTHENTICATION_FAILD = 22; const OPERATION_DID_SUCCESS = 30; const INVALID_TRANSACTION = 34;
const FAIL_STATUS = -1;
const GENERAL_ERROR = 99;
const REDIRECT_TO_GATEWAY = 200; const SUCCESS_PAYMENT_NOT_CONFIRM = 201; const SUCCESS_PAYMENT_CONFIRM = 202;
public function connect_parsian($orderId, $amount) { $authority = 0; // default authority $status = 1; // default status $params = array( 'pin' => Yii::app()->params['parsianPin'], // شماره رمز که بانک در اختیار شما قرار میدهد. 'amount' => $amount,//مبلغ 'orderId' => $orderId,//شماره یکتا که شما به بانک ارسال میکنید، من کلید جدول را انتخاب کردم 'callbackUrl' => Yii::app()->params['myCallBackURL'],//این آدرس را شما باید برای بانک ارسال نمایید تا جواب بر روی این ادرس بیاید 'authority' => $authority,//این توسط بانک پر میشود 'status' => $status//توسط بانک پر میشود ); try { Yii::log("***start payment**** parsian gateway for order id==>" . $orderId, CLogger::LEVEL_INFO, 'payment'); $client = new SoapClient(Yii::app()->params['parsianURL']);//در داکیومنت بانک موجود است $sendParams = array($params); $res = $client->__soapCall('PinPaymentRequest', $sendParams); $authority = $res->authority; $status = $res->status; if (($authority != 0) and ($status == $this::STATUS_OK)) { $parsURL = Yii::app()->params['parsianURLPayment'] . $authority;//در داکیومنت بانک موجود است Yii::log("***success payment route to gateway**** for order id ==> " . $orderId . " and ref_number ==>" . $authority, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $this::STATUS_OK, 'url' => $parsURL, 'authority' => $res->authority ); } else { Yii::log("***fail payment route to gateway**** for order id ==> " . $orderId . " and get status ==>" . $status, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $status, 'url' => null, 'authority' => 0 ); } } catch (Exception $ex) { Yii::log("***exception payment route to gateway**** for order id ==>" . $orderId . $ex, CLogger::LEVEL_ERROR, 'payment'); return array( 'status' => $this::FAIL_STATUS, 'url' => null, 'authority' => 0 ); }
}
//تایید کردن تراکنش، در صورت تایید نکردن پول به حساب برمیگردد. function check_payment_parsian($status, $authority) { $status = 1; // default status try { Yii::log("***start confirm payment**** for ref number ==> " . $authority, CLogger::LEVEL_INFO, 'payment'); $client = new SoapClient(Yii::app()->params['parsianURL']); $params = array( 'pin' => Yii::app()->params['parsianPin'], // this is our PIN NUMBER 'authority' => $authority, 'status' => $status); // to see if we can change it $sendParams = array($params); $res = $client->__soapCall('PinPaymentEnquiry', $sendParams); $status = $res->status; if ($status == $this::STATUS_OK) { Yii::log("***success confirm payment**** for ref number ==> " . $authority, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $this::STATUS_OK, 'url' => null ); } else { Yii::log("***error confirm payment**** for ref number ==> " . $authority . " get status from server is ==> " . $status, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $status, 'url' => null ); } } catch (Exception $ex) { Yii::log("***exception payment**** for ref number ==>" . $authority . $ex, CLogger::LEVEL_ERROR, 'payment'); return array( 'status' => $this::FAIL_STATUS, 'url' => null ); } }
}
,در قسمت کنترکر تنها این دو متد را فراخوانی میکنم
فراخوانی متد وصل شدن به درگاه:
$parsian = new Parsian(); $val = $parsian->connect_parsian($request->id, $request->amount); if ($val['status'] == Parsian::STATUS_OK) { $request = $this->loadModel($request->id); $request->status = Parsian::REDIRECT_TO_GATEWAY; $request->ref_number = $val['authority']; $request->save(false); $this->redirect($val['url']);// exit; } else { $request = $this->loadModel($request->id); $request->status = $val['status']; if (strlen($val['authority']) > 0) { $request->ref_number = $val['authority']; } $request->save(false); throw new CHttpException(500, 'error in connect gateWay' . ' : ' . $val['status']); }
برای تایید
public function actionConfirm() { if (isset($_GET['au']) && isset($_GET['rs'])) { $status = $_GET['rs']; $authority = $_GET['au']; try { if ($status != Parsian::STATUS_OK) { $request = $this->loadModel($authority); $request->status = $status; $request->save(false); $this->render('failPayment', array( 'model' => $request, )); } else { $request = $this->loadModel($authority); $parsian = new Parsian();
//خروجی متد یک آرایه است $val = $parsian->check_payment_parsian($status, $authority); if ($val['status'] == Parsian::STATUS_OK) { $request->status = Parsian::STATUS_OK; if($request->save()){ $this->redirect(array('successPAyment', 'id' => $request->id)); } } else { $request->status = $val['status']; $request->save(false); throw new CHttpException(500, 'error in connect gateWay'); } } } catch (exception $ex) { throw new CHttpException(500, 'bad request'); }
} else { throw new CHttpException(400, 'bad request'); } }
اگر بد نوشتم لطفا شما تکمیل کنید تا بهتر شود و در اختیار دیگران قرار دهید.
با سپاس
چند وقت پیش برای یک پروژه باید به درگاه بانک پارسیان وصل میشدم و الان اون کد رو در اختیار شما قرار میدهم:
در قسمت مدل کلاس زیر را نوشتم:
class Parsian{
const STATUS_OK = 0; const UNKNOWN_STATUS = 1; const INVALID_PIN = 20; const MERCHANT_AUTHENTICATION_FAILD = 22; const OPERATION_DID_SUCCESS = 30; const INVALID_TRANSACTION = 34;
const FAIL_STATUS = -1;
const GENERAL_ERROR = 99;
const REDIRECT_TO_GATEWAY = 200; const SUCCESS_PAYMENT_NOT_CONFIRM = 201; const SUCCESS_PAYMENT_CONFIRM = 202;
public function connect_parsian($orderId, $amount) { $authority = 0; // default authority $status = 1; // default status $params = array( 'pin' => Yii::app()->params['parsianPin'], // شماره رمز که بانک در اختیار شما قرار میدهد. 'amount' => $amount,//مبلغ 'orderId' => $orderId,//شماره یکتا که شما به بانک ارسال میکنید، من کلید جدول را انتخاب کردم 'callbackUrl' => Yii::app()->params['myCallBackURL'],//این آدرس را شما باید برای بانک ارسال نمایید تا جواب بر روی این ادرس بیاید 'authority' => $authority,//این توسط بانک پر میشود 'status' => $status//توسط بانک پر میشود ); try { Yii::log("***start payment**** parsian gateway for order id==>" . $orderId, CLogger::LEVEL_INFO, 'payment'); $client = new SoapClient(Yii::app()->params['parsianURL']);//در داکیومنت بانک موجود است $sendParams = array($params); $res = $client->__soapCall('PinPaymentRequest', $sendParams); $authority = $res->authority; $status = $res->status; if (($authority != 0) and ($status == $this::STATUS_OK)) { $parsURL = Yii::app()->params['parsianURLPayment'] . $authority;//در داکیومنت بانک موجود است Yii::log("***success payment route to gateway**** for order id ==> " . $orderId . " and ref_number ==>" . $authority, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $this::STATUS_OK, 'url' => $parsURL, 'authority' => $res->authority ); } else { Yii::log("***fail payment route to gateway**** for order id ==> " . $orderId . " and get status ==>" . $status, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $status, 'url' => null, 'authority' => 0 ); } } catch (Exception $ex) { Yii::log("***exception payment route to gateway**** for order id ==>" . $orderId . $ex, CLogger::LEVEL_ERROR, 'payment'); return array( 'status' => $this::FAIL_STATUS, 'url' => null, 'authority' => 0 ); }
}
//تایید کردن تراکنش، در صورت تایید نکردن پول به حساب برمیگردد. function check_payment_parsian($status, $authority) { $status = 1; // default status try { Yii::log("***start confirm payment**** for ref number ==> " . $authority, CLogger::LEVEL_INFO, 'payment'); $client = new SoapClient(Yii::app()->params['parsianURL']); $params = array( 'pin' => Yii::app()->params['parsianPin'], // this is our PIN NUMBER 'authority' => $authority, 'status' => $status); // to see if we can change it $sendParams = array($params); $res = $client->__soapCall('PinPaymentEnquiry', $sendParams); $status = $res->status; if ($status == $this::STATUS_OK) { Yii::log("***success confirm payment**** for ref number ==> " . $authority, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $this::STATUS_OK, 'url' => null ); } else { Yii::log("***error confirm payment**** for ref number ==> " . $authority . " get status from server is ==> " . $status, CLogger::LEVEL_INFO, 'payment'); return array( 'status' => $status, 'url' => null ); } } catch (Exception $ex) { Yii::log("***exception payment**** for ref number ==>" . $authority . $ex, CLogger::LEVEL_ERROR, 'payment'); return array( 'status' => $this::FAIL_STATUS, 'url' => null ); } }
}
,در قسمت کنترکر تنها این دو متد را فراخوانی میکنم
فراخوانی متد وصل شدن به درگاه:
$parsian = new Parsian(); $val = $parsian->connect_parsian($request->id, $request->amount); if ($val['status'] == Parsian::STATUS_OK) { $request = $this->loadModel($request->id); $request->status = Parsian::REDIRECT_TO_GATEWAY; $request->ref_number = $val['authority']; $request->save(false); $this->redirect($val['url']);// exit; } else { $request = $this->loadModel($request->id); $request->status = $val['status']; if (strlen($val['authority']) > 0) { $request->ref_number = $val['authority']; } $request->save(false); throw new CHttpException(500, 'error in connect gateWay' . ' : ' . $val['status']); }
برای تایید
public function actionConfirm() { if (isset($_GET['au']) && isset($_GET['rs'])) { $status = $_GET['rs']; $authority = $_GET['au']; try { if ($status != Parsian::STATUS_OK) { $request = $this->loadModel($authority); $request->status = $status; $request->save(false); $this->render('failPayment', array( 'model' => $request, )); } else { $request = $this->loadModel($authority); $parsian = new Parsian();
//خروجی متد یک آرایه است $val = $parsian->check_payment_parsian($status, $authority); if ($val['status'] == Parsian::STATUS_OK) { $request->status = Parsian::STATUS_OK; if($request->save()){ $this->redirect(array('successPAyment', 'id' => $request->id)); } } else { $request->status = $val['status']; $request->save(false); throw new CHttpException(500, 'error in connect gateWay'); } } } catch (exception $ex) { throw new CHttpException(500, 'bad request'); }
} else { throw new CHttpException(400, 'bad request'); } }
اگر بد نوشتم لطفا شما تکمیل کنید تا بهتر شود و در اختیار دیگران قرار دهید.
با سپاس