Skip to content

Commit

Permalink
Merge pull request #45 from XShaan/master
Browse files Browse the repository at this point in the history
close #35; Nextpay gateway added
  • Loading branch information
samuraee authored Sep 11, 2022
2 parents 636cabd + 17160b4 commit 290b85d
Show file tree
Hide file tree
Showing 10 changed files with 350 additions and 2 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ Here are a few short examples of what you can do:
- Zarinpal Gateway / درگاه پرداخت زرین پال
- IDPay Gateway / درگاه آیدی پی
- Zibal Gateway / درگاه زیبال
- nextpay Gateway / درگاه نکست پی

- ...
- Other gateways, coming soon... لطفا شما هم در تکمیل پکیج مشارکت کنید
Expand Down
17 changes: 16 additions & 1 deletion config/larapay.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
| the gateways list is comma separated
|
*/
'gateways' => env('LARAPAY_GATES', 'Mellat,Saman,Pasargad,Parsian,ZarinPal,Idpay,Payir,Saderat,Zibal'),
'gateways' => env('LARAPAY_GATES', 'Mellat,Saman,Pasargad,Parsian,ZarinPal,Idpay,Payir,Saderat,Zibal,Nextpay'),

/*
|--------------------------------------------------------------------------
Expand Down Expand Up @@ -159,6 +159,21 @@
'description' => env('ZIBAL_DESCRIPTION', 'powered-by-Larapay'),
],

/*
|--------------------------------------------------------------------------
| Nextpay gateway configuration
|--------------------------------------------------------------------------
|
*/
'nextpay' => [
'api_key' => env('NEXTPAY_MERCHANT_ID', ''),
'type' => env('NEXTPAY_TYPE', 'normal'),
'callback_url' => env('NEXTPAY_CALLBACK_URL', ''),
'email' => env('NEXTPAY_EMAIL', ''),
'mobile' => env('NEXTPAY_MOBILE', '09xxxxxxxxx'),
'description' => env('NEXTPAY_DESCRIPTION', 'powered-by-Larapay'),
],

/*
|--------------------------------------------------------------------------
| SoapClient Options
Expand Down
174 changes: 174 additions & 0 deletions src/Adapter/Nextpay.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
<?php
declare(strict_types=1);

namespace Tartan\Larapay\Adapter;

use Tartan\Larapay\Adapter\Nextpay\Exception;
use Tartan\Larapay\Adapter\Nextpay\Helper;
use Tartan\Log\Facades\XLog;

/**
* Class Nextpay
* @package Tartan\Larapay\Adapter
*/
class Nextpay extends AdapterAbstract implements AdapterInterface
{

public $endPoint = 'https://nextpay.org/nx/gateway/token';
public $endPointForm = 'https://nextpay.org/nx/gateway/payment/{trans_id}';
public $endPointVerify = 'https://nextpay.org/nx/gateway/verify';

public $reverseSupport = false;

/**
* @return string
* @throws Exception
* @throws \Tartan\Larapay\Adapter\Exception
*/
protected function requestToken(): string
{
if ($this->getTransaction()->checkForRequestToken() == false) {
throw new Exception('larapay::larapay.could_not_request_payment');
}

$this->checkRequiredParameters([
'api_key',
'amount',
'redirect_url',
'order_id',
]);

$sendParams = [
'api_key' => $this->api_key,
'amount' => intval($this->amount),
'order_id' => ($this->order_id),
'payer_desc' => $this->description ? $this->description : '',
'customer_phone' => $this->mobile ? $this->mobile : '',
'callback_uri' => $this->redirect_url,
];

try {
XLog::debug('PaymentRequest call', $sendParams);
$result = Helper::post2https($sendParams, $this->endPoint);
$resultObj = json_decode($result);

XLog::info('PaymentRequest response', $this->obj2array($resultObj));

if (isset($resultObj->code)) {

if ($resultObj->code == -1) {
$this->getTransaction()->setGatewayToken(strval($resultObj->trans_id)); // update transaction reference id
return $resultObj->trans_id;
} else {
throw new Exception('larapay::larapay.nextpay.errors.error_'.$resultObj->code);
}
} else {
throw new Exception('larapay::larapay.invalid_response');
}
} catch (\Exception $e) {
throw new Exception('Nextpay Fault: ' . $e->getMessage() . ' #' . $e->getCode(), $e->getCode());
}
}


/**
* @return string
* @throws Exception
* @throws \Tartan\Larapay\Adapter\Exception
*/
protected function generateForm(): string
{
$authority = $this->requestToken();

$form = view('larapay::nextpay-form', [
'endPoint' => strtr($this->endPointForm, ['{trans_id}' => $authority]),
'submitLabel' => !empty($this->submit_label) ? $this->submit_label : trans("larapay::larapay.goto_gate"),
'autoSubmit' => true,
]);
return $form->__toString();
}

/**
* @return array
* @throws Exception
* @throws \Tartan\Larapay\Adapter\Exception
*/
public function formParams(): array
{
$authority = $this->requestToken();

return [
'endPoint' => strtr($this->endPointForm, ['{trans_id}' => $authority]),
];
}

/**
* @return bool
* @throws Exception
* @throws \Tartan\Larapay\Adapter\Exception
*/
protected function verifyTransaction(): bool
{

if ($this->getTransaction()->checkForVerify() == false) {
throw new Exception('larapay::larapay.could_not_verify_payment');
}

$this->checkRequiredParameters([
'api_key',
'trans_id',
'amount'
]);

$sendParams = [
'api_key' => $this->api_key,
'trans_id' => $this->trans_id,
'amount' => $this->amount,
];

try {
XLog::debug('PaymentVerification call', $sendParams);
$result = Helper::post2https($sendParams, $this->endPointVerify);
$response = json_decode($result);
XLog::info('PaymentVerification response', $this->obj2array($response));
if (isset($response->code , $response->Shaparak_Ref_Id)) {
if ($response->code == 0) {
$this->getTransaction()->setVerified();
$this->getTransaction()->setReferenceId(strval($response->Shaparak_Ref_Id)); // update transaction reference id
return true;
} else {
throw new Exception('larapay::larapay.nextpay.errors.error_'.$response->code);
}
} else {
throw new Exception('larapay::larapay.invalid_response');
}
} catch (\Exception $e) {
throw new Exception('Nextpay Fault: ' . $e->getMessage() . ' #' . $e->getCode(), $e->getCode());
}
}

/**
* @return bool
*/
public function canContinueWithCallbackParameters(): bool
{
if (!empty($this->parameters['trans_id'])) {
return true;
}

return false;
}

/**
* @return string
* @throws \Tartan\Larapay\Adapter\Exception
*/
public function getGatewayReferenceId(): string
{
$this->checkRequiredParameters([
'trans_id',
]);

return strval($this->trans_id);
}
}
7 changes: 7 additions & 0 deletions src/Adapter/Nextpay/Exception.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace Tartan\Larapay\Adapter\Nextpay;

class Exception extends \Tartan\Larapay\Adapter\Exception {
protected $adapter = 'nextpay';
}
38 changes: 38 additions & 0 deletions src/Adapter/Nextpay/Helper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php
namespace Tartan\Larapay\Adapter\Nextpay;

use Tartan\Log\Facades\XLog;

class Helper
{
/**
* CURL POST TO HTTPS
*
* @param $fields_arr
* @param $url
* @return mixed
*/
public static function post2https($fields_arr, $url)
{
//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, count($fields_arr));
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($fields_arr));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);


//execute post
$res = curl_exec($ch);

//close connection
curl_close($ch);

XLog::debug('Nextpay call result: '. $res);
return $res;
}
}
2 changes: 1 addition & 1 deletion src/Adapter/Payir.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Tartan\Larapay\Adapter;

use Tartan\Larapay\Adapter\Zarinpal\Exception;
use Tartan\Larapay\Adapter\PayIr\Exception;
use Tartan\Larapay\Adapter\PayIr\Helper;
use Tartan\Log\Facades\XLog;

Expand Down
1 change: 1 addition & 0 deletions src/Models/Enum/Bank.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ class Bank
const ZARINPAL = 'Zarinpal';
const IDPAY = 'Idpay';
const ZIBAL = 'Zibal';
const NEXTPAY = 'Nextpay';

}
49 changes: 49 additions & 0 deletions translations/en/larapay.php
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,55 @@
'error_-27' => 'در انتظار تایید درگاه توسط شاپرک',
'error_-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد',
]
],
'nextpay' => [
'errors' => [
'error_0' => "تراکنش تکمیل و موفق است",
'error_-1' => "حالت پیش فرض تراکنش",
'error_-2' => "خطای بانکی یا انصراف از پرداخت",
'error_-3' => "در انتظار پرداخت بانکی",
'error_-4' => "انصراف در درگاه بانک",
'error_-20' => "کلید مجوزدهی ارسال نشده است",
'error_-21' => "شماره تراکنش ارسال نشده است",
'error_-22' => "مبلغ ارسال نشده است",
'error_-23' => "مسیر بازگشت ارسال نشده است",
'error_-24' => "مبلغ اشتباه است",
'error_-25' => "شماره تراکنش تکراریست و قادر به ادامه کار نیستید",
'error_-26' => "توکن ارسال نشده است",
'error_-30' => "مقدار مبلغ کمتر از ۱۰۰ تومان است",
'error_-32' => "مسیر بازگشت خطا دارد",
'error_-33' => "ساختار کلید مجوز دهی صحیح نیست",
'error_-34' => "شماره تراکنش صحیح نیست",
'error_-35' => "نوع کلید مجوز دهی صحیح نیست",
'error_-36' => "شماره سفارش ارسال نشده است",
'error_-37' => "تراکنش یافت نشد",
'error_-38' => "توکن یافت نشد",
'error_-39' => "کلید مجوز دهی یافت نشد",
'error_-40' => "کلید مجوز دهی مسدود شده است",
'error_-41' => "پارامتر های ارسالی از بانک مورد تایید نیست",
'error_-42' => "سیستم پرداخت دچار مشکل شده است",
'error_-43' => "درگاهی برای پرداخت یافت نشد",
'error_-44' => "پاسخ بانک صحیح نیست",
'error_-45' => "سیستم پرداخت غیر فعال شده است",
'error_-46' => "درخواست اشتباه",
'error_-48' => "نرخ کمیسیون تعیین نشده است",
'error_-49' => "تراکنش تکراریست",
'error_-50' => "حساب کاربری یافت نشد",
'error_-51' => "کاربر یافت نشد",
'error_-60' => "ایمیل صحیح نیست",
'error_-61' => "کد ملی صحیح نیست",
'error_-62' => "کد پستی صحیح نیست",
'error_-63' => "آدرس پستی صحیح نیست",
'error_-64' => "توضیحات صحیح نیست",
'error_-65' => "نام و نام خانوادگی صحیح نیست",
'error_-66' => "شماره تلفن صحیح نیست",
'error_-67' => "نام کاربری صحیح نیست",
'error_-68' => "نام محصول صحیح نیست",
'error_-69' => "مسیر بازگشت برای حالت موفق صحیح نیست",
'error_-70' => "مسیر بازگشت برای حالت ناموفق صحیح نیست",
'error_-71' => "شماره موبایل صحیح نیست",
'error_-72' => "بانک عامل پاسخ گو نیست"
]
]

];
49 changes: 49 additions & 0 deletions translations/fa/larapay.php
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,55 @@
'error_-27' => 'در انتظار تایید درگاه توسط شاپرک',
'error_-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد',
]
],
'nextpay' => [
'errors' => [
'error_0' => "تراکنش تکمیل و موفق است",
'error_-1' => "حالت پیش فرض تراکنش",
'error_-2' => "خطای بانکی یا انصراف از پرداخت",
'error_-3' => "در انتظار پرداخت بانکی",
'error_-4' => "انصراف در درگاه بانک",
'error_-20' => "کلید مجوزدهی ارسال نشده است",
'error_-21' => "شماره تراکنش ارسال نشده است",
'error_-22' => "مبلغ ارسال نشده است",
'error_-23' => "مسیر بازگشت ارسال نشده است",
'error_-24' => "مبلغ اشتباه است",
'error_-25' => "شماره تراکنش تکراریست و قادر به ادامه کار نیستید",
'error_-26' => "توکن ارسال نشده است",
'error_-30' => "مقدار مبلغ کمتر از ۱۰۰ تومان است",
'error_-32' => "مسیر بازگشت خطا دارد",
'error_-33' => "ساختار کلید مجوز دهی صحیح نیست",
'error_-34' => "شماره تراکنش صحیح نیست",
'error_-35' => "نوع کلید مجوز دهی صحیح نیست",
'error_-36' => "شماره سفارش ارسال نشده است",
'error_-37' => "تراکنش یافت نشد",
'error_-38' => "توکن یافت نشد",
'error_-39' => "کلید مجوز دهی یافت نشد",
'error_-40' => "کلید مجوز دهی مسدود شده است",
'error_-41' => "پارامتر های ارسالی از بانک مورد تایید نیست",
'error_-42' => "سیستم پرداخت دچار مشکل شده است",
'error_-43' => "درگاهی برای پرداخت یافت نشد",
'error_-44' => "پاسخ بانک صحیح نیست",
'error_-45' => "سیستم پرداخت غیر فعال شده است",
'error_-46' => "درخواست اشتباه",
'error_-48' => "نرخ کمیسیون تعیین نشده است",
'error_-49' => "تراکنش تکراریست",
'error_-50' => "حساب کاربری یافت نشد",
'error_-51' => "کاربر یافت نشد",
'error_-60' => "ایمیل صحیح نیست",
'error_-61' => "کد ملی صحیح نیست",
'error_-62' => "کد پستی صحیح نیست",
'error_-63' => "آدرس پستی صحیح نیست",
'error_-64' => "توضیحات صحیح نیست",
'error_-65' => "نام و نام خانوادگی صحیح نیست",
'error_-66' => "شماره تلفن صحیح نیست",
'error_-67' => "نام کاربری صحیح نیست",
'error_-68' => "نام محصول صحیح نیست",
'error_-69' => "مسیر بازگشت برای حالت موفق صحیح نیست",
'error_-70' => "مسیر بازگشت برای حالت ناموفق صحیح نیست",
'error_-71' => "شماره موبایل صحیح نیست",
'error_-72' => "بانک عامل پاسخ گو نیست"
]
]

];
Loading

0 comments on commit 290b85d

Please sign in to comment.