Coverage for packages/epoint/src/integrify/epoint/client.py: 100%

45 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-10-19 02:39 +0000

1from collections.abc import Coroutine 

2from typing import TYPE_CHECKING, Any, Generic, overload 

3from typing import SupportsFloat as Numeric 

4 

5from integrify.api import APIClient, _Async, _Mode, _Sync 

6from integrify.epoint import env 

7from integrify.epoint.handlers import ( 

8 ApplePayPayloadHandler, 

9 ApplePaySessionPayloadHandler, 

10 CreateTokenPaymentPayloadHandler, 

11 CreateWidgetPayloadHandler, 

12 GetTransactionStatusPayloadHandler, 

13 GooglePayPayloadHandler, 

14 PayAndSaveCardPayloadHandler, 

15 PaymentPayloadHandler, 

16 PayoutPayloadHandler, 

17 PayWithSavedCardPayloadHandler, 

18 RefundPayloadHandler, 

19 SaveCardPayloadHandler, 

20 SplitPayAndSaveCardPayloadHandler, 

21 SplitPayPayloadHandler, 

22 SplitPayWithSavedCardPayloadHandler, 

23) 

24from integrify.epoint.schemas.response import ( 

25 BaseResponseSchema, 

26 MinimalResponseSchema, 

27 RedirectUrlResponseSchema, 

28 RedirectUrlWithCardIdResponseSchema, 

29 SplitPayWithSavedCardResponseSchema, 

30 TokenPaymentResponseSchema, 

31 TokenPayResponseSchema, 

32 TransactionStatusResponseSchema, 

33 WidgetResponseSchema, 

34) 

35from integrify.schemas import APIResponse 

36from integrify.utils import UNSET, Unset 

37 

38__all__ = ['EPointAsyncRequest', 'EPointClientClass', 'EPointRequest'] 

39 

40 

41class EPointClientClass(APIClient, Generic[_Mode]): 

42 """EPoint sorğular üçün baza class""" 

43 

44 def __init__( 

45 self, 

46 name='EPoint', 

47 base_url: str | None = env.API.BASE_URL, 

48 default_handler=None, 

49 sync: bool = True, 

50 dry: bool = False, 

51 ): 

52 super().__init__(name, base_url, default_handler, sync, dry) 

53 

54 self.add_url('pay', env.API.PAY, verb='POST') 

55 self.add_handler('pay', PaymentPayloadHandler) 

56 

57 self.add_url('get_transaction_status', env.API.GET_STATUS, verb='POST') 

58 self.add_handler('get_transaction_status', GetTransactionStatusPayloadHandler) 

59 

60 self.add_url('save_card', env.API.SAVE_CARD, verb='POST') 

61 self.add_handler('save_card', SaveCardPayloadHandler) 

62 

63 self.add_url('pay_with_saved_card', env.API.PAY_WITH_SAVED_CARD, verb='POST') 

64 self.add_handler('pay_with_saved_card', PayWithSavedCardPayloadHandler) 

65 

66 self.add_url('pay_and_save_card', env.API.PAY_AND_SAVE_CARD, verb='POST') 

67 self.add_handler('pay_and_save_card', PayAndSaveCardPayloadHandler) 

68 

69 self.add_url('payout', env.API.PAYOUT, verb='POST') 

70 self.add_handler('payout', PayoutPayloadHandler) 

71 

72 self.add_url('refund', env.API.REFUND, verb='POST') 

73 self.add_handler('refund', RefundPayloadHandler) 

74 

75 self.add_url('split_pay', env.API.SPLIT_PAY, verb='POST') 

76 self.add_handler('split_pay', SplitPayPayloadHandler) 

77 

78 self.add_url('split_pay_with_saved_card', env.API.SPLIT_PAY_WITH_SAVED_CARD, verb='POST') 

79 self.add_handler('split_pay_with_saved_card', SplitPayWithSavedCardPayloadHandler) 

80 

81 self.add_url('split_pay_and_save_card', env.API.SPLIT_PAY_AND_SAVE_CARD, verb='POST') 

82 self.add_handler('split_pay_and_save_card', SplitPayAndSaveCardPayloadHandler) 

83 

84 # Apple Pay & Google Pay 

85 self.add_url('create_widget', env.API.CREATE_WIDGET, verb='POST') 

86 self.add_handler('create_widget', CreateWidgetPayloadHandler) 

87 

88 self.add_url('create_token_payment', env.API.CREATE_TOKEN_PAYMENT, verb='POST') 

89 self.add_handler('create_token_payment', CreateTokenPaymentPayloadHandler) 

90 

91 self.add_url('apple_pay_session', env.API.APPLE_PAY_SESSION, verb='POST') 

92 self.add_handler('apple_pay_session', ApplePaySessionPayloadHandler) 

93 

94 self.add_url('apple_pay', env.API.APPLE_PAY, verb='POST') 

95 self.add_handler('apple_pay', ApplePayPayloadHandler) 

96 

97 self.add_url('google_pay', env.API.GOOGLE_PAY, verb='POST') 

98 self.add_handler('google_pay', GooglePayPayloadHandler) 

99 

100 if TYPE_CHECKING: 

101 # pylint: disable=missing-function-docstring,unused-argument 

102 

103 @overload 

104 def pay( 

105 self: 'EPointClientClass[_Sync]', 

106 amount: Numeric, 

107 currency: str, 

108 order_id: str, 

109 description: Unset[str] = UNSET, 

110 **extra: Any, 

111 ) -> APIResponse[RedirectUrlResponseSchema]: 

112 """Ödəniş sorğusu 

113 

114 **Endpoint:** */api/1/request* 

115 

116 Example: 

117 ```python 

118 from integrify.epoint import EPointRequest 

119 

120 EPointRequest.pay(amount=100, currency='AZN', order_id='12345678', description='Ödəniş') 

121 ``` 

122 

123 **Cavab formatı**: [`RedirectUrlResponseSchema`][integrify.epoint.schemas.response.RedirectUrlResponseSchema] 

124 

125 Bu sorğunu göndərdikdə, cavab olaraq `redirect_url` gəlir. Müştəri həmin URLə daxil 

126 olub, kart məlumatlarını daxil edib, uğurlu ödəniş etdikdən sonra, backend callback 

127 APIsinə (EPoint dashboard-ında qeyd etdiyiniz) sorğu daxil olur, və eyni `order_id` 

128 ilə [`DecodedCallbackDataSchema`][integrify.epoint.schemas.callback.DecodedCallbackDataSchema] 

129 formatında məlumat gəlir. 

130 

131 Args: 

132 amount: Ödəniş miqdarı. Numerik dəyər. 

133 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

134 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

135 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

136 **extra: Başqa ötürmək istədiyiniz əlavə dəyərlər. Bu dəyərlər callback sorğuda sizə 

137 geri göndərilir. 

138 """ # noqa: E501 

139 

140 @overload 

141 def pay( 

142 self: 'EPointClientClass[_Async]', 

143 amount: Numeric, 

144 currency: str, 

145 order_id: str, 

146 description: Unset[str] = UNSET, 

147 **extra: Any, 

148 ) -> Coroutine[Any, Any, APIResponse[RedirectUrlResponseSchema]]: ... 

149 def pay(self, *args: Any, **kwds: Any) -> Any: ... 

150 

151 @overload 

152 def get_transaction_status( 

153 self: 'EPointClientClass[_Sync]', 

154 transaction_id: str, 

155 ) -> APIResponse[TransactionStatusResponseSchema]: 

156 """ 

157 Transaksiya statusunu öyrənmək üçün sorğu 

158 

159 **Endpoint:** */api/1/get-status* 

160 

161 Example: 

162 ```python 

163 from integrify.epoint import EPointRequest 

164 

165 EPointRequest.get_transaction_status(transaction_id='texxxxxx') 

166 ``` 

167 

168 Cavab formatı: [`TransactionStatusResponseSchema`][integrify.epoint.schemas.response.TransactionStatusResponseSchema] 

169 

170 Args: 

171 transaction_id: EPoint tərəfindən verilmiş tranzaksiya IDsi. 

172 Adətən `te` prefiksi ilə olur. 

173 """ # noqa: E501 

174 

175 @overload 

176 def get_transaction_status( 

177 self: 'EPointClientClass[_Async]', 

178 transaction_id: str, 

179 ) -> Coroutine[Any, Any, APIResponse[TransactionStatusResponseSchema]]: ... 

180 def get_transaction_status(self, *args: Any, **kwds: Any) -> Any: ... 

181 

182 @overload 

183 def save_card( 

184 self: 'EPointClientClass[_Sync]', 

185 ) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

186 """Ödəniş olmadan kartı yadda saxlamaq sorğusu 

187 

188 **Endpoint:** */api/1/card-registration* 

189 

190 Example: 

191 ```python 

192 from integrify.epoint import EPointRequest 

193 

194 EPointRequest.save_card() 

195 ``` 

196 

197 Cavab formatı: [`RedirectUrlWithCardIdResponseSchema`][integrify.epoint.schemas.response.RedirectUrlWithCardIdResponseSchema] 

198 

199 Bu sorğunu göndərdikdə, cavab olaraq `redirect_url` və `card_id` gəlir. 

200 Müştəri həmin URLə daxil olub, kart məlumatlarını uğurlu qeyd etdikdən sonra, 

201 backend callback APIsinə (EPoint dashboard-ında qeyd etdiyiniz) sorğu daxil olur, 

202 və eyni `card_id` ilə [`DecodedCallbackDataSchema`][integrify.epoint.schemas.callback.DecodedCallbackDataSchema] 

203 formatında məlumat gəlir. 

204 """ # noqa: E501 

205 

206 @overload 

207 def save_card( 

208 self: 'EPointClientClass[_Async]', 

209 ) -> Coroutine[Any, Any, APIResponse[RedirectUrlWithCardIdResponseSchema]]: ... 

210 def save_card(self, *args: Any, **kwds: Any) -> Any: ... 

211 

212 @overload 

213 def pay_with_saved_card( 

214 self: 'EPointClientClass[_Sync]', 

215 amount: Numeric, 

216 currency: str, 

217 order_id: str, 

218 card_id: str, 

219 ) -> APIResponse[BaseResponseSchema]: 

220 """Yadda saxlanılmış kartla ödəniş sorğusu 

221 

222 **Endpoint:** */api/1/execute-pay* 

223 

224 Example: 

225 ```python 

226 from integrify.epoint import EPointRequest 

227 

228 EPointRequest.pay_with_saved_card(amount=100, currency='AZN', order_id='12345678', card_id='cexxxxxx') 

229 ``` 

230 

231 Cavab formatı: [`BaseResponseSchema`][integrify.epoint.schemas.response.BaseResponseSchema] 

232 

233 Bu sorğunu göndərdikdə, cavab olaraq `BaseResponseSchema` formatında 

234 cavab gəlir, və ödənişin statusu birbaşa qayıdır: heç bir callback sorğusu gəlmir. 

235 

236 Args: 

237 amount: Ödəniş miqdarı. Numerik dəyər. 

238 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

239 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

240 card_id: Saxlanılmış kartın id-si. Adətən `ce` prefiksi ilə başlayır. 

241 """ # noqa: E501 

242 

243 @overload 

244 def pay_with_saved_card( 

245 self: 'EPointClientClass[_Async]', 

246 amount: Numeric, 

247 currency: str, 

248 order_id: str, 

249 card_id: str, 

250 ) -> Coroutine[Any, Any, APIResponse[BaseResponseSchema]]: ... 

251 def pay_with_saved_card(self, *args: Any, **kwds: Any) -> Any: ... 

252 

253 @overload 

254 def pay_and_save_card( 

255 self: 'EPointClientClass[_Sync]', 

256 amount: Numeric, 

257 currency: str, 

258 order_id: str, 

259 description: str, 

260 ) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

261 """Ödəniş və kartı yadda saxlama sorğusu 

262 

263 **Endpoint:** */api/1/card-registration-with-pay* 

264 

265 Example: 

266 ```python 

267 from integrify.epoint import EPointRequest 

268 

269 EPointRequest.pay_and_save_card(amount=100, currency='AZN', order_id='12345678', description='Ödəniş') 

270 ``` 

271 

272 Cavab formatı: [`RedirectUrlWithCardIdResponseSchema`][integrify.epoint.schemas.response.RedirectUrlWithCardIdResponseSchema] 

273 

274 Bu sorğunu göndərdikdə, cavab olaraq `redirect_url` və `card_id` gəlir. Müştəri həmin URLə 

275 daxil olub, kart məlumatlarını daxil edib, uğurlu ödəniş etdikdən sonra, backend callback 

276 APIsinə (EPoint dashboard-ında qeyd etdiyiniz) sorğu daxil olur, və eyni `order_id` və 

277 `card_id` ilə [`DecodedCallbackDataSchema`][integrify.epoint.schemas.callback.DecodedCallbackDataSchema] 

278 formatında məlumat gəlir. 

279 

280 Args: 

281 amount: Ödəniş miqdarı. Numerik dəyər. 

282 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

283 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

284 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

285 """ # noqa: E501 

286 

287 @overload 

288 def pay_and_save_card( 

289 self: 'EPointClientClass[_Async]', 

290 amount: Numeric, 

291 currency: str, 

292 order_id: str, 

293 description: str, 

294 ) -> Coroutine[Any, Any, APIResponse[RedirectUrlWithCardIdResponseSchema]]: ... 

295 def pay_and_save_card(self, *args: Any, **kwds: Any) -> Any: ... 

296 

297 @overload 

298 def payout( 

299 self: 'EPointClientClass[_Sync]', 

300 amount: Numeric, 

301 currency: str, 

302 order_id: str, 

303 card_id: str, 

304 description: Unset[str] = UNSET, 

305 ) -> APIResponse[BaseResponseSchema]: 

306 """Hesabınızda olan pulu karta nağdlaşdırmaq sorğusu 

307 

308 **Endpoint:** */api/1/refund-request* 

309 

310 Example: 

311 ```python 

312 from integrify.epoint import EPointRequest 

313 

314 EPointRequest.payout(amount=100, currency='AZN', order_id='12345678', card_id='cexxxxxx', description='Ödəniş') 

315 ``` 

316 

317 Cavab sorğu formatı: [`BaseResponseSchema`][integrify.epoint.schemas.response.BaseResponseSchema] 

318 

319 Bu sorğunu göndərdikdə, əməliyyat Epoint xidməti tərəfindən işləndikdən və bankdan ödəniş 

320 statusu alındıqdan sonra cavab `BaseResponseSchema` formatında qayıdacaqdır 

321 

322 Args: 

323 amount: Nağdlaşdırmaq miqdarı. Numerik dəyər. 

324 currency: Nağdlaşdırma məzənnəsi. Mümkün dəyərlər: AZN 

325 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

326 card_id: Saxlanılmış kartın id-si. Adətən `ce` prefiksi ilə başlayır. 

327 description: Nağdlaşdırmanın təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

328 """ # noqa: E501 

329 

330 @overload 

331 def payout( 

332 self: 'EPointClientClass[_Async]', 

333 amount: Numeric, 

334 currency: str, 

335 order_id: str, 

336 card_id: str, 

337 description: Unset[str] = UNSET, 

338 ) -> Coroutine[Any, Any, APIResponse[BaseResponseSchema]]: ... 

339 def payout(self, *args: Any, **kwds: Any) -> Any: ... 

340 

341 @overload 

342 def refund( 

343 self: 'EPointClientClass[_Sync]', 

344 transaction_id: str, 

345 currency: str, 

346 amount: Unset[Numeric] = UNSET, 

347 ) -> APIResponse[MinimalResponseSchema]: 

348 """Keçmiş ödənişi tam və ya yarımçıq geri qaytarma sorğusu 

349 

350 **Endpoint:** */api/1/reverse* 

351 

352 Example: 

353 ```python 

354 from integrify.epoint import EPointRequest 

355 

356 # Full refund 

357 EPointRequest.refund(transaction_id='texxxxxx', currency='AZN') 

358 

359 # Partial refund 

360 EPointRequest.refund(transaction_id='texxxxxx', currency='AZN', amount=50) 

361 ``` 

362 

363 Cavab formatı: [`MinimalResponseSchema`][integrify.epoint.schemas.response.MinimalResponseSchema] 

364 

365 Bu sorğunu göndərdikdə, cavab olaraq `status` və `message` gəlir. 

366 Heç bir callback sorğusu göndərilmir. 

367 

368 Args: 

369 transaction_id: EPoint tərəfindən verilmiş tranzaksiya IDsi. 

370 Adətən `te` prefiksi ilə olur. 

371 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

372 amount: Ödəniş məbləği. Məbləğin göndərilməsi yarımçıq geri-qaytarma hesab olunur, 

373 əks halda tam geri-qaytarma baş verəcəkdir. 

374 """ # noqa: E501 

375 

376 @overload 

377 def refund( 

378 self: 'EPointClientClass[_Async]', 

379 transaction_id: str, 

380 currency: str, 

381 amount: Unset[Numeric] = UNSET, 

382 ) -> Coroutine[Any, Any, APIResponse[MinimalResponseSchema]]: ... 

383 def refund(self, *args: Any, **kwds: Any) -> Any: ... 

384 

385 @overload 

386 def split_pay( 

387 self: 'EPointClientClass[_Sync]', 

388 amount: Numeric, 

389 currency: str, 

390 order_id: str, 

391 split_user_id: str, 

392 split_amount: Numeric, 

393 description: Unset[str] = UNSET, 

394 **extra: Any, 

395 ) -> APIResponse[RedirectUrlResponseSchema]: 

396 """Ödənişi başqa EPoint istifadəçisi ilə bölüb ödəmə sorğusu 

397 

398 **Endpoint:** */api/1/split-request* 

399 

400 Example: 

401 ```python 

402 from integrify.epoint import EPointRequest 

403 

404 EPointRequest.split_pay(amount=100, currency='AZN', order_id='123456789', split_user_id='epoint_user_id', split_amount=50, description='split payment') 

405 ``` 

406 

407 Cavab formatı: [`RedirectUrlResponseSchema`][integrify.epoint.schemas.response.RedirectUrlResponseSchema] 

408 

409 Args: 

410 amount: Ödəniş miqdarı. Numerik dəyər. 

411 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

412 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

413 split_user_id: Ödənişi böləcəyini **EPoint** user-ini IDsi 

414 split_amount: Bölünən miqdar. Numerik dəyər 

415 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

416 **extra: Başqa ötürmək istədiyiniz əlavə dəyərlər. Bu dəyərlər callback sorğuda sizə 

417 geri göndərilir. 

418 """ # noqa: E501 

419 

420 @overload 

421 def split_pay( 

422 self: 'EPointClientClass[_Async]', 

423 amount: Numeric, 

424 currency: str, 

425 order_id: str, 

426 split_user_id: str, 

427 split_amount: Numeric, 

428 description: Unset[str] = UNSET, 

429 **extra: Any, 

430 ) -> Coroutine[Any, Any, APIResponse[RedirectUrlResponseSchema]]: ... 

431 def split_pay(self, *args: Any, **kwds: Any) -> Any: ... 

432 

433 @overload 

434 def split_pay_with_saved_card( 

435 self: 'EPointClientClass[_Sync]', 

436 amount: Numeric, 

437 currency: str, 

438 order_id: str, 

439 card_id: str, 

440 split_user_id: str, 

441 split_amount: Numeric, 

442 description: Unset[str] = UNSET, 

443 ) -> APIResponse[SplitPayWithSavedCardResponseSchema]: 

444 """Saxlanılmış kartla ödənişi başqa EPoint istifadəçisi ilə bölüb ödəmə sorğusu 

445 

446 **Endpoint:** */api/1/split-execute-pay* 

447 

448 Example: 

449 ```python 

450 from integrify.epoint import EPointRequest 

451 

452 EPointRequest.split_pay_with_saved_card(amount=100, currency='AZN', order_id='123456789', card_id='cexxxxxx', split_user_id='epoint_user_id', split_amount=50, description='split payment') 

453 ``` 

454 

455 Cavab formatı: [`SplitPayWithSavedCardResponseSchema`][integrify.epoint.schemas.response.SplitPayWithSavedCardResponseSchema] 

456 

457 Args: 

458 amount: Ödəniş miqdarı. Numerik dəyər. 

459 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

460 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

461 card_id: Saxlanılmış kartın id-si. Adətən `ce` prefiksi ilə başlayır. 

462 split_user_id: Ödənişi böləcəyini **EPoint** user-ini IDsi 

463 split_amount: Bölünən miqdar. Numerik dəyər 

464 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

465 """ # noqa: E501 

466 

467 @overload 

468 def split_pay_with_saved_card( 

469 self: 'EPointClientClass[_Async]', 

470 amount: Numeric, 

471 currency: str, 

472 order_id: str, 

473 card_id: str, 

474 split_user_id: str, 

475 split_amount: Numeric, 

476 description: Unset[str] = UNSET, 

477 ) -> Coroutine[Any, Any, APIResponse[SplitPayWithSavedCardResponseSchema]]: ... 

478 def split_pay_with_saved_card(self, *args: Any, **kwds: Any) -> Any: ... 

479 

480 @overload 

481 def split_pay_and_save_card( 

482 self: 'EPointClientClass[_Sync]', 

483 amount: Numeric, 

484 currency: str, 

485 order_id: str, 

486 split_user_id: str, 

487 split_amount: Numeric, 

488 description: Unset[str] = UNSET, 

489 ) -> APIResponse[RedirectUrlWithCardIdResponseSchema]: 

490 """Ödənişi başqa EPoint istifadəçisi ilə bölüb ödəmə və kartı saxlama sorğusu 

491 

492 **Endpoint:** */api/1/split-card-registration-with-pay* 

493 

494 Example: 

495 ```python 

496 from integrify.epoint import EPointRequest 

497 

498 EPointRequest.split_pay_and_save_card(amount=100, currency='AZN', order_id='123456789', split_user_id='epoint_user_id', split_amount=50, description='split payment') 

499 ``` 

500 

501 Cavab formatı: [`RedirectUrlWithCardIdResponseSchema`][integrify.epoint.schemas.response.RedirectUrlWithCardIdResponseSchema] 

502 

503 Args: 

504 amount: Ödəniş miqdarı. Numerik dəyər. 

505 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

506 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

507 split_user_id: Ödənişi böləcəyini **EPoint** user-ini IDsi 

508 split_amount: Bölünən miqdar. Numerik dəyər 

509 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. Məcburi arqument deyil. 

510 """ # noqa: E501 

511 

512 @overload 

513 def split_pay_and_save_card( 

514 self: 'EPointClientClass[_Async]', 

515 amount: Numeric, 

516 currency: str, 

517 order_id: str, 

518 split_user_id: str, 

519 split_amount: Numeric, 

520 description: Unset[str] = UNSET, 

521 ) -> Coroutine[Any, Any, APIResponse[RedirectUrlWithCardIdResponseSchema]]: ... 

522 def split_pay_and_save_card(self, *args: Any, **kwds: Any) -> Any: ... 

523 

524 @overload 

525 def create_widget( 

526 self: 'EPointClientClass[_Sync]', 

527 amount: Numeric, 

528 order_id: str, 

529 description: str, 

530 ) -> APIResponse[WidgetResponseSchema]: 

531 """Apple Pay və Google Pay widget-i yaratma sorğusu 

532 

533 **Endpoint:** */api/1/token/widget* 

534 

535 Example: 

536 ```python 

537 from integrify.epoint import EPointRequest 

538 

539 EPointRequest.create_widget(amount=2.5, order_id='12345678', description='Ödəniş') 

540 ``` 

541 

542 **Cavab formatı**: [`WidgetResponseSchema`][integrify.epoint.schemas.response.WidgetResponseSchema] 

543 

544 Apple Pay/Google Pay-i qoşmağın ən sadə yolu. Cavabda gələn `widget_url`-i saytınızda 

545 iframe, mobil tətbiqdə isə webview daxilində açın: düymələr və ödəniş axını EPoint 

546 tərəfindən idarə olunur, əlavə backend endpoint-lərinə ehtiyac yoxdur. Ödəniş bitdikdən 

547 sonra widget səhifəyə `message` event-i göndərir (`event.data`: 

548 `{status: 'success', payment: {...}}`). Ödənişin nəticəsini backend-də 

549 [`get_transaction_status`][integrify.epoint.client.EPointClientClass.get_transaction_status] 

550 ilə yoxlamaq tövsiyə olunur. 

551 

552 Düymələri öz dizaynınızla göstərmək istəyirsinizsə, 

553 [`create_token_payment`][integrify.epoint.client.EPointClientClass.create_token_payment] 

554 ilə başlayan SDK axınından istifadə edin. 

555 

556 Args: 

557 amount: Ödəniş miqdarı. Numerik dəyər. 

558 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

559 description: Ödənişin təsviri. Maksimal uzunluq: 1000 simvol. 

560 """ # noqa: E501 

561 

562 @overload 

563 def create_widget( 

564 self: 'EPointClientClass[_Async]', 

565 amount: Numeric, 

566 order_id: str, 

567 description: str, 

568 ) -> Coroutine[Any, Any, APIResponse[WidgetResponseSchema]]: ... 

569 def create_widget(self, *args: Any, **kwds: Any) -> Any: ... 

570 

571 @overload 

572 def create_token_payment( 

573 self: 'EPointClientClass[_Sync]', 

574 amount: Numeric, 

575 currency: str, 

576 order_id: str, 

577 description: Unset[str] = UNSET, 

578 ) -> APIResponse[TokenPaymentResponseSchema]: 

579 """Apple Pay/Google Pay üçün token ödənişi yaratma sorğusu 

580 

581 **Endpoint:** */api/1/token/payment* 

582 

583 Example: 

584 ```python 

585 from integrify.epoint import EPointRequest 

586 

587 EPointRequest.create_token_payment(amount=2.5, currency='AZN', order_id='12345678', description='Ödəniş') 

588 ``` 

589 

590 **Cavab formatı**: [`TokenPaymentResponseSchema`][integrify.epoint.schemas.response.TokenPaymentResponseSchema] 

591 

592 Apple Pay/Google Pay düymələrini işə salmazdan əvvəl, EPoint-də token ödənişi 

593 yaradılmalıdır: bütün sonrakı token əməliyyatları bu ödənişə istinad edir. Cavabda gələn 

594 ödəniş obyektini (ən azı `id` və məbləği) frontend-də `initTokenPay`-ə `payment` 

595 parametri kimi ötürün. Sonra SDK sizin backend-inizdəki 

596 [`apple_pay_session`][integrify.epoint.client.EPointClientClass.apple_pay_session], 

597 [`apple_pay`][integrify.epoint.client.EPointClientClass.apple_pay] və 

598 [`google_pay`][integrify.epoint.client.EPointClientClass.google_pay] sorğularını 

599 çağıran endpoint-lərə müraciət edəcək. 

600 

601 Args: 

602 amount: Ödəniş miqdarı. Numerik dəyər. 

603 currency: Ödəniş məzənnəsi. Mümkün dəyərlər: AZN 

604 order_id: Unikal ID. Maksimal uzunluq: 255 simvol. 

605 description: Ödənişin təsviri. Məcburi arqument deyil. 

606 """ # noqa: E501 

607 

608 @overload 

609 def create_token_payment( 

610 self: 'EPointClientClass[_Async]', 

611 amount: Numeric, 

612 currency: str, 

613 order_id: str, 

614 description: Unset[str] = UNSET, 

615 ) -> Coroutine[Any, Any, APIResponse[TokenPaymentResponseSchema]]: ... 

616 def create_token_payment(self, *args: Any, **kwds: Any) -> Any: ... 

617 

618 @overload 

619 def apple_pay_session( 

620 self: 'EPointClientClass[_Sync]', 

621 origin: str, 

622 ) -> APIResponse[dict]: 

623 """Apple Pay session-u almaq sorğusu 

624 

625 **Endpoint:** */api/1/token/apple/session* 

626 

627 Example: 

628 ```python 

629 from integrify.epoint import EPointRequest 

630 

631 EPointRequest.apple_pay_session(origin='https://yoursite.az') 

632 ``` 

633 

634 **Cavab formatı**: `dict` (Apple merchant session obyekti, olduğu kimi) 

635 

636 Apple Pay-in əlavə təhlükəsizlik qatı var: SDK ödəniş pəncərəsini açmazdan əvvəl 

637 sizin backend-inizdəki session endpoint-inə (məs., `/epoint/apple/session`) POST 

638 sorğusu göndərir. Həmin endpoint bu sorğunu çağırıb, `resp.body`-ni olduğu kimi 

639 geri qaytarmalıdır. 

640 

641 Args: 

642 origin: Ödəniş səhifəsinin açıldığı saytın origin-i (məs., `https://yoursite.az`). 

643 Adətən daxil olan sorğunun `Origin` header-indən götürülür. 

644 """ # noqa: E501 

645 

646 @overload 

647 def apple_pay_session( 

648 self: 'EPointClientClass[_Async]', 

649 origin: str, 

650 ) -> Coroutine[Any, Any, APIResponse[dict]]: ... 

651 def apple_pay_session(self, *args: Any, **kwds: Any) -> Any: ... 

652 

653 @overload 

654 def apple_pay( 

655 self: 'EPointClientClass[_Sync]', 

656 payment_id: int | str, 

657 token: Any, 

658 billing_contact: Any = None, 

659 ) -> APIResponse[TokenPayResponseSchema]: 

660 """Apple Pay ilə ödənişi tamamlama sorğusu 

661 

662 **Endpoint:** */api/1/token/apple/pay* 

663 

664 Example: 

665 ```python 

666 from integrify.epoint import EPointRequest 

667 

668 # body: SDK-nın sizin `/epoint/apple` endpoint-inə göndərdiyi JSON 

669 EPointRequest.apple_pay( 

670 payment_id=body['id'], 

671 token=body['token'], 

672 billing_contact=body.get('billingContact'), 

673 ) 

674 ``` 

675 

676 **Cavab formatı**: [`TokenPayResponseSchema`][integrify.epoint.schemas.response.TokenPayResponseSchema] 

677 

678 Session uğurla yaradıldıqdan və istifadəçi Apple Pay pəncərəsində ödənişi 

679 təsdiqlədikdən sonra (kart seçimi, təsdiq), SDK sizin backend-inizdəki pay 

680 endpoint-inə (məs., `/epoint/apple`) `id`, `token` və `billingContact` göndərir. 

681 Həmin endpoint bu sorğunu çağırıb, `resp.body`-ni olduğu kimi geri qaytarmalıdır. 

682 `public_key` avtomatik əlavə olunur. 

683 

684 Args: 

685 payment_id: Token ödənişinin IDsi (SDK sorğusundakı `id`). 

686 token: Apple Pay token-i (SDK sorğusundakı `token`). 

687 billing_contact: Ödəyicinin billing məlumatı (SDK sorğusundakı `billingContact`). 

688 """ # noqa: E501 

689 

690 @overload 

691 def apple_pay( 

692 self: 'EPointClientClass[_Async]', 

693 payment_id: int | str, 

694 token: Any, 

695 billing_contact: Any = None, 

696 ) -> Coroutine[Any, Any, APIResponse[TokenPayResponseSchema]]: ... 

697 def apple_pay(self, *args: Any, **kwds: Any) -> Any: ... 

698 

699 @overload 

700 def google_pay( 

701 self: 'EPointClientClass[_Sync]', 

702 payment_id: int | str, 

703 token: Any, 

704 billing_contact: Any = None, 

705 ) -> APIResponse[TokenPayResponseSchema]: 

706 """Google Pay ilə ödənişi tamamlama sorğusu 

707 

708 **Endpoint:** */api/1/token/google/pay* 

709 

710 Example: 

711 ```python 

712 from integrify.epoint import EPointRequest 

713 

714 # body: SDK-nın sizin `/epoint/google` endpoint-inə göndərdiyi JSON 

715 EPointRequest.google_pay( 

716 payment_id=body['id'], 

717 token=body['token'], 

718 billing_contact=body.get('billingContact'), 

719 ) 

720 ``` 

721 

722 **Cavab formatı**: [`TokenPayResponseSchema`][integrify.epoint.schemas.response.TokenPayResponseSchema] 

723 

724 Apple Pay ilə eynidir, yalnız endpoint fərqlidir və session mərhələsi yoxdur. 

725 İstifadəçi Google Pay pəncərəsində ödənişi təsdiqlədikdən sonra, SDK sizin 

726 backend-inizdəki pay endpoint-inə (məs., `/epoint/google`) `id`, `token` və 

727 `billingContact` göndərir. Həmin endpoint bu sorğunu çağırıb, `resp.body`-ni 

728 olduğu kimi geri qaytarmalıdır. `public_key` avtomatik əlavə olunur. 

729 

730 Args: 

731 payment_id: Token ödənişinin IDsi (SDK sorğusundakı `id`). 

732 token: Google Pay token-i (SDK sorğusundakı `token`). 

733 billing_contact: Ödəyicinin billing məlumatı (SDK sorğusundakı `billingContact`). 

734 """ # noqa: E501 

735 

736 @overload 

737 def google_pay( 

738 self: 'EPointClientClass[_Async]', 

739 payment_id: int | str, 

740 token: Any, 

741 billing_contact: Any = None, 

742 ) -> Coroutine[Any, Any, APIResponse[TokenPayResponseSchema]]: ... 

743 def google_pay(self, *args: Any, **kwds: Any) -> Any: ... 

744 

745 

746EPointRequest: 'EPointClientClass[_Sync]' = EPointClientClass(sync=True) 

747EPointAsyncRequest: 'EPointClientClass[_Async]' = EPointClientClass(sync=False)