Skip to content

Commit b740153

Browse files
authored
Merge pull request #3 from ar4min/main
V-3
2 parents 252c6f7 + b5973d4 commit b740153

File tree

5 files changed

+135
-0
lines changed

5 files changed

+135
-0
lines changed

examples/FeeCalculation.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
require_once __DIR__ . '/../vendor/autoload.php';
4+
5+
use ZarinPal\Sdk\Options;
6+
use ZarinPal\Sdk\ZarinPal;
7+
use ZarinPal\Sdk\HttpClient\Exception\ResponseException;
8+
use ZarinPal\Sdk\Endpoint\PaymentGateway\RequestTypes\FeeCalculationRequest;
9+
10+
$options = new Options([
11+
'merchant_id' => '67887a6d-e2f8-4de2-86b1-8db27bc171b5',
12+
]);
13+
14+
$zarinpal = new ZarinPal($options);
15+
$paymentGateway = $zarinpal->paymentGateway();
16+
17+
$feeCalculationRequest = new FeeCalculationRequest();
18+
$feeCalculationRequest->amount = 5000000;
19+
$feeCalculationRequest->currency = 'IRR'; // Optional - IRR or IRT
20+
21+
try {
22+
$response = $paymentGateway->feeCalculation($feeCalculationRequest);
23+
echo "Fee Calculation Result: \n";
24+
echo "Amount: " . $response->amount . "\n";
25+
echo "Fee: " . $response->fee . "\n";
26+
echo "Fee Type: " . $response->fee_type . "\n";
27+
echo "Suggested Amount: " . $response->suggested_amount . "\n";
28+
echo "Code: " . $response->code . "\n";
29+
echo "Message: " . $response->message . "\n";
30+
31+
} catch (ResponseException $e) {
32+
echo 'Fee Calculation Error: ' . $e->getMessage() . "\n";
33+
if ($e->getErrorDetails()) {
34+
echo 'Error Details: ' . json_encode($e->getErrorDetails()) . "\n";
35+
}
36+
} catch (\Exception $e) {
37+
echo 'Fee Calculation Error: ' . $e->getMessage();
38+
}

src/Endpoint/PaymentGateway/PaymentGateway.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Exception;
88
use JsonException;
99
use Psr\Http\Message\ResponseInterface;
10+
use ZarinPal\Sdk\Endpoint\PaymentGateway\ResponseTypes\FeeCalculationResponse;
1011
use ZarinPal\Sdk\Endpoint\PaymentGateway\ResponseTypes\RequestResponse;
1112
use ZarinPal\Sdk\Endpoint\PaymentGateway\ResponseTypes\UnverifiedResponse;
1213
use ZarinPal\Sdk\Endpoint\PaymentGateway\ResponseTypes\VerifyResponse;
@@ -23,6 +24,7 @@ final class PaymentGateway
2324
private const UNVERIFIED_URI = self::BASE_URL . 'unVerified.json';
2425
private const REVERSE_URI = self::BASE_URL . 'reverse.json';
2526
private const INQUIRY_URI = self::BASE_URL . 'inquiry.json';
27+
private const FEE_CALCULATION_URI = self::BASE_URL . 'feeCalculation.json';
2628

2729
private ZarinPal $sdk;
2830

@@ -77,6 +79,14 @@ public function inquiry(RequestTypes\InquiryRequest $request): RequestResponse
7779
return new RequestResponse($response['data']);
7880
}
7981

82+
public function feeCalculation(RequestTypes\FeeCalculationRequest $request): FeeCalculationResponse
83+
{
84+
$this->fillMerchantId($request);
85+
$response = $this->httpHandler(self::FEE_CALCULATION_URI, $request->toString());
86+
87+
return new FeeCalculationResponse($response['data']);
88+
}
89+
8090
private function fillMerchantId($request): void
8191
{
8292
if ($request->merchantId === null) {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace ZarinPal\Sdk\Endpoint\PaymentGateway\RequestTypes;
4+
5+
use ZarinPal\Sdk\Endpoint\Fillable;
6+
use ZarinPal\Sdk\Validator;
7+
8+
class FeeCalculationRequest
9+
{
10+
use Fillable;
11+
12+
public ?string $merchantId = null;
13+
public int $amount;
14+
public ?string $currency = null;
15+
16+
public function validate(): void
17+
{
18+
Validator::validateMerchantId($this->merchantId);
19+
Validator::validateAmount($this->amount);
20+
Validator::validateCurrency($this->currency);
21+
}
22+
23+
final public function toString(): string
24+
{
25+
$this->validate();
26+
27+
$data = [
28+
"merchant_id" => $this->merchantId,
29+
"amount" => $this->amount,
30+
];
31+
32+
if ($this->currency !== null) {
33+
$data['currency'] = $this->currency;
34+
}
35+
36+
return json_encode($data, JSON_THROW_ON_ERROR);
37+
}
38+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace ZarinPal\Sdk\Endpoint\PaymentGateway\ResponseTypes;
4+
5+
use ZarinPal\Sdk\Endpoint\Fillable;
6+
7+
class FeeCalculationResponse
8+
{
9+
use Fillable;
10+
11+
public int $amount;
12+
public int $fee;
13+
public string $fee_type;
14+
public int $suggested_amount;
15+
public int $code;
16+
public string $message;
17+
}

tests/PaymentGateway/PaymentGatewayTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Tests\BaseTestCase;
99
use ZarinPal\Sdk\ZarinPal;
1010
use ZarinPal\Sdk\Endpoint\PaymentGateway\PaymentGateway;
11+
use ZarinPal\Sdk\Endpoint\PaymentGateway\RequestTypes\FeeCalculationRequest;
1112
use ZarinPal\Sdk\Endpoint\PaymentGateway\RequestTypes\RequestRequest;
1213
use ZarinPal\Sdk\Endpoint\PaymentGateway\RequestTypes\VerifyRequest;
1314
use ZarinPal\Sdk\Endpoint\PaymentGateway\RequestTypes\UnverifiedRequest;
@@ -172,4 +173,35 @@ public function testInquiry()
172173
$response = $this->gateway->inquiry($inquiryRequest);
173174
$this->assertEquals(15000, $response->amount);
174175
}
176+
177+
public function testFeeCalculation()
178+
{
179+
$responseBody = [
180+
'data' => [
181+
'amount' => 5050543,
182+
'fee' => 1220,
183+
'fee_type' => 'Merchant',
184+
'suggested_amount' => 5051763,
185+
'code' => 100,
186+
'message' => 'Success'
187+
],
188+
'errors' => []
189+
];
190+
191+
$this->clientMock->expects($this->once())
192+
->method('post')
193+
->willReturn($this->createMockResponse($responseBody));
194+
195+
$feeCalculationRequest = new FeeCalculationRequest();
196+
$feeCalculationRequest->amount = 5050543;
197+
$feeCalculationRequest->currency = 'IRR';
198+
199+
$response = $this->gateway->feeCalculation($feeCalculationRequest);
200+
$this->assertEquals(5050543, $response->amount);
201+
$this->assertEquals(1220, $response->fee);
202+
$this->assertEquals('Merchant', $response->fee_type);
203+
$this->assertEquals(5051763, $response->suggested_amount);
204+
$this->assertEquals(100, $response->code);
205+
$this->assertEquals('Success', $response->message);
206+
}
175207
}

0 commit comments

Comments
 (0)