Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alijvhr #253

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from
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
245 changes: 245 additions & 0 deletions src/Bahamta/Bahamta.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
<?php

namespace Larabookir\Gateway\Bahamta;

use DateTime;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Str;
use Larabookir\Gateway\Enum;
use SoapClient;
use Larabookir\Gateway\PortAbstract;
use Larabookir\Gateway\PortInterface;

class Bahamta extends PortAbstract implements PortInterface {

protected $order_id;
protected $link;
protected $name;
protected $phone;
protected $email;
/**
* Address of main SOAP server
*
* @var string
*/
protected $serverUrl = 'https://webpay.bahamta.com/api/create_request';

protected $verifyUrl = 'https://webpay.bahamta.com/api/confirm_payment';

// public function __construct( $order_id ) {
// $this->order_id = $order_id;
// }

public function getLink() {
return $this->link;
}

public function setLink( $link ) {
$this->link = $link;
}

/**
* {@inheritdoc}
*/
public function set( $amount ) {
$this->amount = $amount * 10;

return $this;
}

/**
* {@inheritdoc}
*/
public function ready() {
$this->sendPayRequest();

return $this;
}

/**
* Send pay request to server
*
* @return void
*
* @throws BahamtaException
*/
protected function sendPayRequest() {
$this->newTransaction();
// $cards = Auth::user()->cardsActive()->pluck( 'card_number' );

// foreach ( $cards as $card ) {
// $cardString = Str::replaceFirst( "[" , "" , $cards );
// if ( ! $cards->last() ) {
// $cardString = Str::replaceFirst( "]" , "," , $cardString );
// }else{
// $cardString = Str::replaceFirst( "]" , "" , $cardString );
// }
// }
$params = "?api_key=" . $this->config->get( 'gateway.bahamta.api_key' ) . "&amount_irr=" . $this->amount .
"&callback_url=" . $this->getCallback() . "&reference=" . $this->getOrderId();
// . "&trusted_pan=" . $cardString;

$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL , $this->serverUrl . $params );
curl_setopt( $ch , CURLOPT_RETURNTRANSFER , true );

$result = curl_exec( $ch );
curl_close( $ch );
$response = json_decode( $result );
if ( $response->ok == false ) {
$this->transactionFailed();
$this->newLog( $response->error , BahamtaException::$errors[ $response->error ] );
throw new \Exception(BahamtaException::$errors[ $response->error ]);
}

$this->refId = $this->getOrderId();
$this->link = $response->result->payment_url;
$this->trackingCode = $this->getOrderId();

$this->transactionSetRefId();
}

/**
* Gets callback url
* @return string
*/
function getCallback() {
if ( ! $this->callbackUrl ) {
$this->callbackUrl = $this->config->get( 'gateway.bahamta.callback-url' );
}

return $this->makeCallback( $this->callbackUrl , [ 'transaction_id' => $this->transactionId() ] );
}

public function getOrderId() {
return $this->order_id;
}

public function setOrderId( $order_id ) {
$this->order_id = $order_id;
}

/**
* {@inheritdoc}
*/
public function redirect() {
$link = $this->link;

return redirect( $link );
}

/**
* {@inheritdoc}
*/
public function verify( $transaction ) {
parent::verify( $transaction );

$this->userPayment();
$this->verifyPayment();

return $this;
}

/**
* Check user payment
*
* @return bool
*
* @throws IdpayException
*/
protected function userPayment() {
// $payRequestResCode = Input::get( 'state' );
// $this->trackingCode = Input::get( 'track_id' );
//// $this->refId = Input::get( 'id' );
//// $this->order_id = Input::get( 'order_id' );
// $this->amount = Input::get( 'total' );
// $this->cardNumber = Input::get( 'pay_pan' );
//
// if ( $payRequestResCode == 'paid' ) {
// return true;
// }

// $this->transactionFailed();
// $this->newLog( $payRequestResCode , IdpayException::$errors[ $payRequestResCode ] );
// throw new IdpayException( $payRequestResCode );
}

/**
* Verify user payment from bank server
*
* @return bool
*
* @throws BahamtaException
* @throws SoapFault
*/
protected function verifyPayment() {

$params = "?api_key=" . $this->config->get( 'gateway.bahamta.api_key' ) . "&amount_irr=" . $this->amount .
"&reference=" . $this->refId();

$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL , $this->verifyUrl . $params );
curl_setopt( $ch , CURLOPT_RETURNTRANSFER , true );

$result = curl_exec( $ch );
curl_close( $ch );
$response = json_decode( $result );

if ( $response->ok == false ) {
$this->transactionFailed();
$this->newLog( $response->error , BahamtaException::$errors[ $response->error ] );
throw new \Exception(BahamtaException::$errors[ $response->error ]);
}

$this->trackingCode = $response->result->pay_trace;
$this->transactionSucceed();
$this->newLog( 'SUCCEED' , Enum::TRANSACTION_SUCCEED_TEXT );

return true;
}

/**
* Sets callback url
*
* @param $url
*/
function setCallback( $url ) {
$this->callbackUrl = $url;

return $this;
}

/**
* Send settle request
*
* @return bool
*
* @throws MellatException
* @throws SoapFault
*/
protected function settleRequest() {

$params = array (
'id' => $this->refId ,
'order_id' => $this->order_id ,
);

$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL , $this->settelUrl );
curl_setopt( $ch , CURLOPT_POSTFIELDS , json_encode( $params ) );
curl_setopt( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt( $ch , CURLOPT_HTTPHEADER , array (
'Content-Type: application/json' ,
'X-API-KEY: ' . $this->config->get( 'gateway.idpay.api-key' ) . '' ,
'X-SANDBOX: 1' ,
) );

$result = curl_exec( $ch );
$httpcode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
curl_close( $ch );

var_dump( $httpcode );
var_dump( $result );
}
}
36 changes: 36 additions & 0 deletions src/Bahamta/BahamtaException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Larabookir\Gateway\Bahamta;

use Larabookir\Gateway\Exceptions\BankException;

class BahamtaException extends BankException {
public static $errors = array (
'NOT_AUTHORIZED' => 'گرچه ساختار کلید درست است، اما هیچ فروشنده‌ای با این کلید در webpay ثبت نشده است.' ,
'INVALID_AMOUNT' => 'پارامتر مبلغ فرستاده نشده و یا نادرست فرستاده شده است. مثلاً ممکن است ارقام مبلغ سه رقم به سه رقم با علامت , جدا شده باشند که نادرست است.' ,
'TOO_LESS_AMOUNT' => 'مبلغ کمتر از حد مجاز (هزار تومان) است.' ,
'TOO_MUCH_AMOUNT' => 'مبلغ بیشتر از حد مجاز (پنجاه میلیون تومان) است.' ,
'INVALID_REFERENCE' => 'شماره شناسه پرداخت ناردست است. این مقدار باید یک عبارت حرفی با طول بین ۱ تا ۶۴ حرف باشد.' ,
'INVALID_TRUSTED_PAN' => 'لیست شماره کارتها نادرست است.' ,
'INVALID_CALLBACK' => 'آدرس فراخوانی نادرست است. این آدرس باید با ://http و یا ://https شروع شود.' ,
'INVALID_PARAM' => 'خطایی در مقادیر فرستاده شده وجود دارد که جزو موارد یاد شده بالا نیست.' ,
'ALREADY_PAID' => 'درخواست پرداختی با شناسه داده شده قبلاً ثبت و پرداخت شده است.' ,
'MISMATCHED_DATA' => ' درخواست پرداختی با شناسه داده شده قبلاً ثبت و منتظر پرداخت است، اما مقادیر فرستاده شده در این درخواست، با درخواست اصلی متفاوت است.' ,
'NO_REG_TERMINAL' => 'ترمینالی برای این فروشنده ثبت نشده است.' ,
'NO_AVAILABLE_GATEWAY' => 'درگاههای پرداختی که این فروشنده در آنها ترمینال ثبت شده دارد، قادر به ارائه خدمات نیستند.' ,
'SERVICE_ERROR' => 'خطای داخلی سرویس رخ داده است.' ,


'INVALID_API_CALL' => 'قالب فراخوانی سرویس رعایت نشده است.' ,
'INVALID_API_KEY' => 'لید الکترونیکی صاحب فروشگاه فرستاده نشده و یا ساختار آن نادرست است.' ,
'UNKNOWN_BILL' => 'پرداختی با شماره شناسه فرستاده شده ثبت نشده است.' ,
'MISMATCHED_DATA' => 'مبلغ اعلام شده با آنچه در webpay ثبت شده است مطابقت ندارد.' ,
'NOT_CONFIRMED' => 'این پرداخت تأیید نشد.' ,
);

public function __construct( $errorId ) {
$this->errorId = intval( $errorId );

parent::__construct( @self::$errors[ $this->errorId ] . ' #' . $this->errorId , $this->errorId );
}
}
75 changes: 42 additions & 33 deletions src/Enum.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,30 @@

class Enum
{
const MELLAT = 'MELLAT';
const SADAD = 'SADAD';
const ZARINPAL = 'ZARINPAL';
const PAYLINE = 'PAYLINE';
const JAHANPAY = 'JAHANPAY';
const PARSIAN = 'PARSIAN';
const PASARGAD = 'PASARGAD';
const SAMAN = 'SAMAN';
const ASANPARDAKHT = 'ASANPARDAKHT';
const PAYPAL = 'PAYPAL';
const PAYIR = 'PAYIR';
const IRANKISH = 'IRANKISH';
const MASKAN = self::IRANKISH;

static function getIPGs(){
const MELLAT = 'MELLAT';
const SADAD = 'SADAD';
const ZARINPAL = 'ZARINPAL';
const PAYLINE = 'PAYLINE';
const JAHANPAY = 'JAHANPAY';
const PARSIAN = 'PARSIAN';
const PASARGAD = 'PASARGAD';
const SAMAN = 'SAMAN';
const ASANPARDAKHT = 'ASANPARDAKHT';
const PAYPAL = 'PAYPAL';
const PAYIR = 'PAYIR';
const IRANKISH = 'IRANKISH';
const IDPAY = 'IDPAY';
const PAYPING = 'PAYPING';
const NEXTPAY = 'NEXTPAY';
const BAHAMTA = 'BAHAMTA';
const YEKPAY = 'YEKPAY';
const MRPAY = 'MRPAY';
const POOLAM = 'POOLAM';
const ZIBAL = 'ZIBAL';
const PAYSTAR = 'PAYSTAR';
const MASKAN = self::IRANKISH;

static function getIPGs(){

$reflect = new \ReflectionClass(static::class);
$excepts=[
Expand All @@ -30,29 +39,29 @@ static function getIPGs(){
'TRANSACTION_FAILED',
'TRANSACTION_FAILED_TEXT',
];

if(function_exists('array_except'))
return array_values(array_except($reflect->getConstants(),$excepts));
else
return array_values(\Illuminate\Support\Arr::except($reflect->getConstants(),$excepts));
}

/**
* Status code for status field in poolport_transactions table
*/
const TRANSACTION_INIT = 'INIT';
const TRANSACTION_INIT_TEXT = 'تراکنش ایجاد شد.';

/**
* Status code for status field in poolport_transactions table
*/
const TRANSACTION_SUCCEED = 'SUCCEED';
const TRANSACTION_SUCCEED_TEXT = 'پرداخت با موفقیت انجام شد.';

/**
* Status code for status field in poolport_transactions table
*/
const TRANSACTION_FAILED = 'FAILED';
const TRANSACTION_FAILED_TEXT = 'عملیات پرداخت با خطا مواجه شد.';
/**
* Status code for status field in poolport_transactions table
*/
const TRANSACTION_INIT = 'INIT';
const TRANSACTION_INIT_TEXT = 'تراکنش ایجاد شد.';

/**
* Status code for status field in poolport_transactions table
*/
const TRANSACTION_SUCCEED = 'SUCCEED';
const TRANSACTION_SUCCEED_TEXT = 'پرداخت با موفقیت انجام شد.';

/**
* Status code for status field in poolport_transactions table
*/
const TRANSACTION_FAILED = 'FAILED';
const TRANSACTION_FAILED_TEXT = 'عملیات پرداخت با خطا مواجه شد.';

}
Loading