Skip to content

Commit 290b85d

Browse files
authored
Merge pull request #45 from XShaan/master
close #35; Nextpay gateway added
2 parents 636cabd + 17160b4 commit 290b85d

File tree

10 files changed

+350
-2
lines changed

10 files changed

+350
-2
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Here are a few short examples of what you can do:
3535
- Zarinpal Gateway / درگاه پرداخت زرین پال
3636
- IDPay Gateway / درگاه آیدی پی
3737
- Zibal Gateway / درگاه زیبال
38+
- nextpay Gateway / درگاه نکست پی
3839

3940
- ...
4041
- Other gateways, coming soon... لطفا شما هم در تکمیل پکیج مشارکت کنید

config/larapay.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
| the gateways list is comma separated
2828
|
2929
*/
30-
'gateways' => env('LARAPAY_GATES', 'Mellat,Saman,Pasargad,Parsian,ZarinPal,Idpay,Payir,Saderat,Zibal'),
30+
'gateways' => env('LARAPAY_GATES', 'Mellat,Saman,Pasargad,Parsian,ZarinPal,Idpay,Payir,Saderat,Zibal,Nextpay'),
3131

3232
/*
3333
|--------------------------------------------------------------------------
@@ -159,6 +159,21 @@
159159
'description' => env('ZIBAL_DESCRIPTION', 'powered-by-Larapay'),
160160
],
161161

162+
/*
163+
|--------------------------------------------------------------------------
164+
| Nextpay gateway configuration
165+
|--------------------------------------------------------------------------
166+
|
167+
*/
168+
'nextpay' => [
169+
'api_key' => env('NEXTPAY_MERCHANT_ID', ''),
170+
'type' => env('NEXTPAY_TYPE', 'normal'),
171+
'callback_url' => env('NEXTPAY_CALLBACK_URL', ''),
172+
'email' => env('NEXTPAY_EMAIL', ''),
173+
'mobile' => env('NEXTPAY_MOBILE', '09xxxxxxxxx'),
174+
'description' => env('NEXTPAY_DESCRIPTION', 'powered-by-Larapay'),
175+
],
176+
162177
/*
163178
|--------------------------------------------------------------------------
164179
| SoapClient Options

src/Adapter/Nextpay.php

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Tartan\Larapay\Adapter;
5+
6+
use Tartan\Larapay\Adapter\Nextpay\Exception;
7+
use Tartan\Larapay\Adapter\Nextpay\Helper;
8+
use Tartan\Log\Facades\XLog;
9+
10+
/**
11+
* Class Nextpay
12+
* @package Tartan\Larapay\Adapter
13+
*/
14+
class Nextpay extends AdapterAbstract implements AdapterInterface
15+
{
16+
17+
public $endPoint = 'https://nextpay.org/nx/gateway/token';
18+
public $endPointForm = 'https://nextpay.org/nx/gateway/payment/{trans_id}';
19+
public $endPointVerify = 'https://nextpay.org/nx/gateway/verify';
20+
21+
public $reverseSupport = false;
22+
23+
/**
24+
* @return string
25+
* @throws Exception
26+
* @throws \Tartan\Larapay\Adapter\Exception
27+
*/
28+
protected function requestToken(): string
29+
{
30+
if ($this->getTransaction()->checkForRequestToken() == false) {
31+
throw new Exception('larapay::larapay.could_not_request_payment');
32+
}
33+
34+
$this->checkRequiredParameters([
35+
'api_key',
36+
'amount',
37+
'redirect_url',
38+
'order_id',
39+
]);
40+
41+
$sendParams = [
42+
'api_key' => $this->api_key,
43+
'amount' => intval($this->amount),
44+
'order_id' => ($this->order_id),
45+
'payer_desc' => $this->description ? $this->description : '',
46+
'customer_phone' => $this->mobile ? $this->mobile : '',
47+
'callback_uri' => $this->redirect_url,
48+
];
49+
50+
try {
51+
XLog::debug('PaymentRequest call', $sendParams);
52+
$result = Helper::post2https($sendParams, $this->endPoint);
53+
$resultObj = json_decode($result);
54+
55+
XLog::info('PaymentRequest response', $this->obj2array($resultObj));
56+
57+
if (isset($resultObj->code)) {
58+
59+
if ($resultObj->code == -1) {
60+
$this->getTransaction()->setGatewayToken(strval($resultObj->trans_id)); // update transaction reference id
61+
return $resultObj->trans_id;
62+
} else {
63+
throw new Exception('larapay::larapay.nextpay.errors.error_'.$resultObj->code);
64+
}
65+
} else {
66+
throw new Exception('larapay::larapay.invalid_response');
67+
}
68+
} catch (\Exception $e) {
69+
throw new Exception('Nextpay Fault: ' . $e->getMessage() . ' #' . $e->getCode(), $e->getCode());
70+
}
71+
}
72+
73+
74+
/**
75+
* @return string
76+
* @throws Exception
77+
* @throws \Tartan\Larapay\Adapter\Exception
78+
*/
79+
protected function generateForm(): string
80+
{
81+
$authority = $this->requestToken();
82+
83+
$form = view('larapay::nextpay-form', [
84+
'endPoint' => strtr($this->endPointForm, ['{trans_id}' => $authority]),
85+
'submitLabel' => !empty($this->submit_label) ? $this->submit_label : trans("larapay::larapay.goto_gate"),
86+
'autoSubmit' => true,
87+
]);
88+
return $form->__toString();
89+
}
90+
91+
/**
92+
* @return array
93+
* @throws Exception
94+
* @throws \Tartan\Larapay\Adapter\Exception
95+
*/
96+
public function formParams(): array
97+
{
98+
$authority = $this->requestToken();
99+
100+
return [
101+
'endPoint' => strtr($this->endPointForm, ['{trans_id}' => $authority]),
102+
];
103+
}
104+
105+
/**
106+
* @return bool
107+
* @throws Exception
108+
* @throws \Tartan\Larapay\Adapter\Exception
109+
*/
110+
protected function verifyTransaction(): bool
111+
{
112+
113+
if ($this->getTransaction()->checkForVerify() == false) {
114+
throw new Exception('larapay::larapay.could_not_verify_payment');
115+
}
116+
117+
$this->checkRequiredParameters([
118+
'api_key',
119+
'trans_id',
120+
'amount'
121+
]);
122+
123+
$sendParams = [
124+
'api_key' => $this->api_key,
125+
'trans_id' => $this->trans_id,
126+
'amount' => $this->amount,
127+
];
128+
129+
try {
130+
XLog::debug('PaymentVerification call', $sendParams);
131+
$result = Helper::post2https($sendParams, $this->endPointVerify);
132+
$response = json_decode($result);
133+
XLog::info('PaymentVerification response', $this->obj2array($response));
134+
if (isset($response->code , $response->Shaparak_Ref_Id)) {
135+
if ($response->code == 0) {
136+
$this->getTransaction()->setVerified();
137+
$this->getTransaction()->setReferenceId(strval($response->Shaparak_Ref_Id)); // update transaction reference id
138+
return true;
139+
} else {
140+
throw new Exception('larapay::larapay.nextpay.errors.error_'.$response->code);
141+
}
142+
} else {
143+
throw new Exception('larapay::larapay.invalid_response');
144+
}
145+
} catch (\Exception $e) {
146+
throw new Exception('Nextpay Fault: ' . $e->getMessage() . ' #' . $e->getCode(), $e->getCode());
147+
}
148+
}
149+
150+
/**
151+
* @return bool
152+
*/
153+
public function canContinueWithCallbackParameters(): bool
154+
{
155+
if (!empty($this->parameters['trans_id'])) {
156+
return true;
157+
}
158+
159+
return false;
160+
}
161+
162+
/**
163+
* @return string
164+
* @throws \Tartan\Larapay\Adapter\Exception
165+
*/
166+
public function getGatewayReferenceId(): string
167+
{
168+
$this->checkRequiredParameters([
169+
'trans_id',
170+
]);
171+
172+
return strval($this->trans_id);
173+
}
174+
}

src/Adapter/Nextpay/Exception.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Tartan\Larapay\Adapter\Nextpay;
4+
5+
class Exception extends \Tartan\Larapay\Adapter\Exception {
6+
protected $adapter = 'nextpay';
7+
}

src/Adapter/Nextpay/Helper.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
namespace Tartan\Larapay\Adapter\Nextpay;
3+
4+
use Tartan\Log\Facades\XLog;
5+
6+
class Helper
7+
{
8+
/**
9+
* CURL POST TO HTTPS
10+
*
11+
* @param $fields_arr
12+
* @param $url
13+
* @return mixed
14+
*/
15+
public static function post2https($fields_arr, $url)
16+
{
17+
//open connection
18+
$ch = curl_init();
19+
20+
//set the url, number of POST vars, POST data
21+
curl_setopt($ch, CURLOPT_URL, $url);
22+
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
23+
curl_setopt($ch, CURLOPT_POST, count($fields_arr));
24+
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($fields_arr));
25+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
26+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
27+
28+
29+
//execute post
30+
$res = curl_exec($ch);
31+
32+
//close connection
33+
curl_close($ch);
34+
35+
XLog::debug('Nextpay call result: '. $res);
36+
return $res;
37+
}
38+
}

src/Adapter/Payir.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace Tartan\Larapay\Adapter;
55

6-
use Tartan\Larapay\Adapter\Zarinpal\Exception;
6+
use Tartan\Larapay\Adapter\PayIr\Exception;
77
use Tartan\Larapay\Adapter\PayIr\Helper;
88
use Tartan\Log\Facades\XLog;
99

src/Models/Enum/Bank.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ class Bank
1515
const ZARINPAL = 'Zarinpal';
1616
const IDPAY = 'Idpay';
1717
const ZIBAL = 'Zibal';
18+
const NEXTPAY = 'Nextpay';
1819

1920
}

translations/en/larapay.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,55 @@
220220
'error_-27' => 'در انتظار تایید درگاه توسط شاپرک',
221221
'error_-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد',
222222
]
223+
],
224+
'nextpay' => [
225+
'errors' => [
226+
'error_0' => "تراکنش تکمیل و موفق است",
227+
'error_-1' => "حالت پیش فرض تراکنش",
228+
'error_-2' => "خطای بانکی یا انصراف از پرداخت",
229+
'error_-3' => "در انتظار پرداخت بانکی",
230+
'error_-4' => "انصراف در درگاه بانک",
231+
'error_-20' => "کلید مجوزدهی ارسال نشده است",
232+
'error_-21' => "شماره تراکنش ارسال نشده است",
233+
'error_-22' => "مبلغ ارسال نشده است",
234+
'error_-23' => "مسیر بازگشت ارسال نشده است",
235+
'error_-24' => "مبلغ اشتباه است",
236+
'error_-25' => "شماره تراکنش تکراریست و قادر به ادامه کار نیستید",
237+
'error_-26' => "توکن ارسال نشده است",
238+
'error_-30' => "مقدار مبلغ کمتر از ۱۰۰ تومان است",
239+
'error_-32' => "مسیر بازگشت خطا دارد",
240+
'error_-33' => "ساختار کلید مجوز دهی صحیح نیست",
241+
'error_-34' => "شماره تراکنش صحیح نیست",
242+
'error_-35' => "نوع کلید مجوز دهی صحیح نیست",
243+
'error_-36' => "شماره سفارش ارسال نشده است",
244+
'error_-37' => "تراکنش یافت نشد",
245+
'error_-38' => "توکن یافت نشد",
246+
'error_-39' => "کلید مجوز دهی یافت نشد",
247+
'error_-40' => "کلید مجوز دهی مسدود شده است",
248+
'error_-41' => "پارامتر های ارسالی از بانک مورد تایید نیست",
249+
'error_-42' => "سیستم پرداخت دچار مشکل شده است",
250+
'error_-43' => "درگاهی برای پرداخت یافت نشد",
251+
'error_-44' => "پاسخ بانک صحیح نیست",
252+
'error_-45' => "سیستم پرداخت غیر فعال شده است",
253+
'error_-46' => "درخواست اشتباه",
254+
'error_-48' => "نرخ کمیسیون تعیین نشده است",
255+
'error_-49' => "تراکنش تکراریست",
256+
'error_-50' => "حساب کاربری یافت نشد",
257+
'error_-51' => "کاربر یافت نشد",
258+
'error_-60' => "ایمیل صحیح نیست",
259+
'error_-61' => "کد ملی صحیح نیست",
260+
'error_-62' => "کد پستی صحیح نیست",
261+
'error_-63' => "آدرس پستی صحیح نیست",
262+
'error_-64' => "توضیحات صحیح نیست",
263+
'error_-65' => "نام و نام خانوادگی صحیح نیست",
264+
'error_-66' => "شماره تلفن صحیح نیست",
265+
'error_-67' => "نام کاربری صحیح نیست",
266+
'error_-68' => "نام محصول صحیح نیست",
267+
'error_-69' => "مسیر بازگشت برای حالت موفق صحیح نیست",
268+
'error_-70' => "مسیر بازگشت برای حالت ناموفق صحیح نیست",
269+
'error_-71' => "شماره موبایل صحیح نیست",
270+
'error_-72' => "بانک عامل پاسخ گو نیست"
271+
]
223272
]
224273

225274
];

translations/fa/larapay.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,55 @@
220220
'error_-27' => 'در انتظار تایید درگاه توسط شاپرک',
221221
'error_-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد',
222222
]
223+
],
224+
'nextpay' => [
225+
'errors' => [
226+
'error_0' => "تراکنش تکمیل و موفق است",
227+
'error_-1' => "حالت پیش فرض تراکنش",
228+
'error_-2' => "خطای بانکی یا انصراف از پرداخت",
229+
'error_-3' => "در انتظار پرداخت بانکی",
230+
'error_-4' => "انصراف در درگاه بانک",
231+
'error_-20' => "کلید مجوزدهی ارسال نشده است",
232+
'error_-21' => "شماره تراکنش ارسال نشده است",
233+
'error_-22' => "مبلغ ارسال نشده است",
234+
'error_-23' => "مسیر بازگشت ارسال نشده است",
235+
'error_-24' => "مبلغ اشتباه است",
236+
'error_-25' => "شماره تراکنش تکراریست و قادر به ادامه کار نیستید",
237+
'error_-26' => "توکن ارسال نشده است",
238+
'error_-30' => "مقدار مبلغ کمتر از ۱۰۰ تومان است",
239+
'error_-32' => "مسیر بازگشت خطا دارد",
240+
'error_-33' => "ساختار کلید مجوز دهی صحیح نیست",
241+
'error_-34' => "شماره تراکنش صحیح نیست",
242+
'error_-35' => "نوع کلید مجوز دهی صحیح نیست",
243+
'error_-36' => "شماره سفارش ارسال نشده است",
244+
'error_-37' => "تراکنش یافت نشد",
245+
'error_-38' => "توکن یافت نشد",
246+
'error_-39' => "کلید مجوز دهی یافت نشد",
247+
'error_-40' => "کلید مجوز دهی مسدود شده است",
248+
'error_-41' => "پارامتر های ارسالی از بانک مورد تایید نیست",
249+
'error_-42' => "سیستم پرداخت دچار مشکل شده است",
250+
'error_-43' => "درگاهی برای پرداخت یافت نشد",
251+
'error_-44' => "پاسخ بانک صحیح نیست",
252+
'error_-45' => "سیستم پرداخت غیر فعال شده است",
253+
'error_-46' => "درخواست اشتباه",
254+
'error_-48' => "نرخ کمیسیون تعیین نشده است",
255+
'error_-49' => "تراکنش تکراریست",
256+
'error_-50' => "حساب کاربری یافت نشد",
257+
'error_-51' => "کاربر یافت نشد",
258+
'error_-60' => "ایمیل صحیح نیست",
259+
'error_-61' => "کد ملی صحیح نیست",
260+
'error_-62' => "کد پستی صحیح نیست",
261+
'error_-63' => "آدرس پستی صحیح نیست",
262+
'error_-64' => "توضیحات صحیح نیست",
263+
'error_-65' => "نام و نام خانوادگی صحیح نیست",
264+
'error_-66' => "شماره تلفن صحیح نیست",
265+
'error_-67' => "نام کاربری صحیح نیست",
266+
'error_-68' => "نام محصول صحیح نیست",
267+
'error_-69' => "مسیر بازگشت برای حالت موفق صحیح نیست",
268+
'error_-70' => "مسیر بازگشت برای حالت ناموفق صحیح نیست",
269+
'error_-71' => "شماره موبایل صحیح نیست",
270+
'error_-72' => "بانک عامل پاسخ گو نیست"
271+
]
223272
]
224273

225274
];

0 commit comments

Comments
 (0)