strapi-plugin-payone-provider 1.4.2 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +179 -22
  2. package/admin/src/pages/App/components/AppHeader.js +22 -4
  3. package/admin/src/pages/App/components/AppTabs.js +25 -1
  4. package/admin/src/pages/App/components/ApplePayButton.js +737 -0
  5. package/admin/src/pages/App/components/ApplePayConfig.js +364 -0
  6. package/admin/src/pages/App/components/ApplePayConfigPanel.js +81 -0
  7. package/admin/src/pages/App/components/ConfigurationPanel.js +19 -3
  8. package/admin/src/pages/App/components/DocsPanel.js +1057 -0
  9. package/admin/src/pages/App/components/GooglePayConfig.js +217 -0
  10. package/admin/src/pages/App/components/GooglePayConfigPanel.js +82 -0
  11. package/admin/src/pages/App/components/GooglePaybutton.js +1 -1
  12. package/admin/src/pages/App/components/PaymentActionsPanel.js +24 -6
  13. package/admin/src/pages/App/components/paymentActions/AuthorizationForm.js +60 -4
  14. package/admin/src/pages/App/components/paymentActions/CaptureForm.js +1 -0
  15. package/admin/src/pages/App/components/paymentActions/CardDetailsInput.js +18 -16
  16. package/admin/src/pages/App/components/paymentActions/PaymentMethodSelector.js +106 -2
  17. package/admin/src/pages/App/components/paymentActions/PreauthorizationForm.js +64 -4
  18. package/admin/src/pages/App/components/paymentActions/RefundForm.js +1 -0
  19. package/admin/src/pages/App/index.js +70 -1
  20. package/admin/src/pages/hooks/usePaymentActions.js +13 -2
  21. package/admin/src/pages/hooks/useSettings.js +2 -0
  22. package/admin/src/pages/utils/applePayConstants.js +222 -0
  23. package/admin/src/pages/utils/googlePayConstants.js +79 -0
  24. package/admin/src/pages/utils/paymentUtils.js +22 -74
  25. package/package.json +1 -1
  26. package/server/bootstrap.js +5 -1
  27. package/server/config/index.js +5 -1
  28. package/server/controllers/payone.js +10 -0
  29. package/server/routes/index.js +17 -0
  30. package/server/services/applePayService.js +261 -0
  31. package/server/services/payone.js +10 -0
  32. package/server/utils/paymentMethodParams.js +19 -2
@@ -0,0 +1,1057 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import {
3
+ Box,
4
+ Card,
5
+ CardBody,
6
+ Flex,
7
+ Typography,
8
+ Stack,
9
+ Accordion,
10
+ AccordionToggle,
11
+ AccordionContent
12
+ } from "@strapi/design-system";
13
+
14
+ const CodeBlock = ({ children }) => {
15
+ const [isDark, setIsDark] = useState(false);
16
+
17
+ useEffect(() => {
18
+ const checkTheme = () => {
19
+ if (typeof window !== 'undefined') {
20
+ const bodyBg = window.getComputedStyle(document.body).backgroundColor;
21
+ const rgb = bodyBg.match(/\d+/g);
22
+ if (rgb && rgb.length >= 3) {
23
+ const brightness = (parseInt(rgb[0]) * 299 + parseInt(rgb[1]) * 587 + parseInt(rgb[2]) * 114) / 1000;
24
+ setIsDark(brightness < 128);
25
+ } else {
26
+ const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
27
+ setIsDark(prefersDark);
28
+ }
29
+ }
30
+ };
31
+
32
+ checkTheme();
33
+ const mediaQuery = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');
34
+ if (mediaQuery) {
35
+ mediaQuery.addEventListener('change', checkTheme);
36
+ return () => mediaQuery.removeEventListener('change', checkTheme);
37
+ }
38
+ }, []);
39
+
40
+ return (
41
+ <Box
42
+ padding={3}
43
+ borderRadius="4px"
44
+ style={{
45
+ backgroundColor: isDark ? '#1e1e1e' : '#f6f6f9',
46
+ color: isDark ? '#d4d4d4' : '#32324d',
47
+ fontFamily: 'monospace',
48
+ fontSize: '14px',
49
+ overflow: 'auto'
50
+ }}
51
+ >
52
+ <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>
53
+ {children}
54
+ </pre>
55
+ </Box>
56
+ );
57
+ };
58
+
59
+ const DocsPanel = () => {
60
+ const [expandedAccordions, setExpandedAccordions] = useState({
61
+ toc: false,
62
+ creditCard: false,
63
+ paypal: false,
64
+ googlePay: false,
65
+ applePay: false,
66
+ threeDSecure: false,
67
+ captureRefund: false,
68
+ testCredentials: false
69
+ });
70
+
71
+ const toggleAccordion = (key) => {
72
+ setExpandedAccordions(prev => ({
73
+ ...prev,
74
+ [key]: !prev[key]
75
+ }));
76
+ };
77
+
78
+ return (
79
+ <Box
80
+ className="payment-container"
81
+ paddingTop={8}
82
+ paddingBottom={8}
83
+ paddingLeft={8}
84
+ paddingRight={8}
85
+ >
86
+ <Flex direction="column" alignItems="stretch" gap={6}>
87
+ <Box>
88
+ <Typography variant="beta" as="h2" fontWeight="bold" className="payment-title" style={{ fontSize: '24px', marginBottom: '12px' }}>
89
+ Payone Provider Plugin - Frontend Integration Guide
90
+ </Typography>
91
+ <Typography variant="pi" textColor="neutral600" marginTop={2} className="payment-subtitle" style={{ fontSize: '16px' }}>
92
+ Complete documentation for integrating Payone payment methods in your frontend application
93
+ </Typography>
94
+ </Box>
95
+
96
+ <Accordion expanded={expandedAccordions.toc} onToggle={() => toggleAccordion('toc')}>
97
+ <AccordionToggle title="Table of Contents" />
98
+ <AccordionContent>
99
+ <Stack spacing={2} padding={4}>
100
+ <Typography variant="pi">1. <a href="#base-url">Base URL & Authentication</a></Typography>
101
+ <Typography variant="pi">2. <a href="#payment-methods">Supported Payment Methods</a></Typography>
102
+ <Typography variant="pi">3. <a href="#credit-card">Credit Card Integration</a></Typography>
103
+ <Typography variant="pi">4. <a href="#paypal">PayPal Integration</a></Typography>
104
+ <Typography variant="pi">5. <a href="#google-pay">Google Pay Integration</a></Typography>
105
+ <Typography variant="pi">6. <a href="#apple-pay">Apple Pay Integration</a></Typography>
106
+ <Typography variant="pi">7. <a href="#3d-secure">3D Secure Authentication</a></Typography>
107
+ <Typography variant="pi">8. <a href="#capture-refund">Capture & Refund Operations</a></Typography>
108
+ <Typography variant="pi">9. <a href="#test-credentials">Test Credentials</a></Typography>
109
+ </Stack>
110
+ </AccordionContent>
111
+ </Accordion>
112
+
113
+ <Card className="payment-card" id="base-url">
114
+ <CardBody padding={6}>
115
+ <Stack spacing={4}>
116
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
117
+ Base URL & Authentication
118
+ </Typography>
119
+ <Box>
120
+ <Typography variant="pi" fontWeight="bold" marginBottom={2}>
121
+ Content API (Frontend):
122
+ </Typography>
123
+ <CodeBlock>/api/strapi-plugin-payone-provider</CodeBlock>
124
+ </Box>
125
+ <Box>
126
+ <Typography variant="pi" fontWeight="bold" marginBottom={2}>
127
+ Required Headers:
128
+ </Typography>
129
+ <CodeBlock>{`{
130
+ "Content-Type": "application/json",
131
+ "Authorization": "Bearer YOUR_AUTH_TOKEN"
132
+ }`}</CodeBlock>
133
+ <Typography variant="pi" textColor="neutral600" marginTop={6}>
134
+ <strong>Note:</strong> <code>YOUR_AUTH_TOKEN</code> is your Strapi authentication token (JWT), not a Payone token. You can get this token by logging into Strapi admin panel or using Strapi's authentication API.
135
+ </Typography>
136
+ </Box>
137
+ </Stack>
138
+ </CardBody>
139
+ </Card>
140
+
141
+ <Card className="payment-card" id="payment-methods">
142
+ <CardBody padding={6}>
143
+ <Stack spacing={4}>
144
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
145
+ Supported Payment Methods
146
+ </Typography>
147
+ <Box>
148
+ <Typography variant="pi" fontWeight="bold" marginBottom={2}>
149
+ Available Payment Methods:
150
+ </Typography>
151
+ <Stack spacing={2}>
152
+ <Typography variant="pi">• <strong>cc</strong> - Credit Card (Visa, Mastercard, Amex)</Typography>
153
+ <Typography variant="pi">• <strong>wlt</strong> - PayPal</Typography>
154
+ <Typography variant="pi">• <strong>gpp</strong> - Google Pay</Typography>
155
+ <Typography variant="pi">• <strong>apl</strong> - Apple Pay</Typography>
156
+ <Typography variant="pi">• <strong>sb</strong> - Sofort Banking</Typography>
157
+ <Typography variant="pi">• <strong>elv</strong> - SEPA Direct Debit</Typography>
158
+ </Stack>
159
+ </Box>
160
+ <Box>
161
+ <Typography variant="pi" fontWeight="bold" marginBottom={2}>
162
+ Available Card Types (for Credit Card):
163
+ </Typography>
164
+ <Stack spacing={2}>
165
+ <Typography variant="pi">• <strong>V</strong> - Visa</Typography>
166
+ <Typography variant="pi">• <strong>M</strong> - Mastercard</Typography>
167
+ <Typography variant="pi">• <strong>A</strong> - American Express (Amex)</Typography>
168
+ <Typography variant="pi">• <strong>D</strong> - Diners Club</Typography>
169
+ <Typography variant="pi">• <strong>J</strong> - JCB</Typography>
170
+ <Typography variant="pi">• <strong>C</strong> - Carte Bleue</Typography>
171
+ </Stack>
172
+ </Box>
173
+ </Stack>
174
+ </CardBody>
175
+ </Card>
176
+
177
+ <Accordion id="credit-card" expanded={expandedAccordions.creditCard} onToggle={() => toggleAccordion('creditCard')}>
178
+ <AccordionToggle title="Credit Card Integration" />
179
+ <AccordionContent>
180
+ <Card className="payment-card">
181
+ <CardBody padding={6}>
182
+ <Stack spacing={4}>
183
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
184
+ Credit Card Integration
185
+ </Typography>
186
+ <Box>
187
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
188
+ Preauthorization Request:
189
+ </Typography>
190
+ <CodeBlock>{`POST /api/strapi-plugin-payone-provider/preauthorization
191
+
192
+ {
193
+ "amount": 1000,
194
+ "currency": "EUR",
195
+ "reference": "ORD-00123-ABCD",
196
+ "clearingtype": "cc",
197
+ "cardtype": "V",
198
+ "cardpan": "4111111111111111",
199
+ "cardexpiredate": "2512",
200
+ "cardcvc2": "123",
201
+ "firstname": "John",
202
+ "lastname": "Doe",
203
+ "email": "john.doe@example.com",
204
+ "street": "Main Street 123",
205
+ "zip": "12345",
206
+ "city": "Berlin",
207
+ "country": "DE",
208
+ "successurl": "https://www.example.com/success",
209
+ "errorurl": "https://www.example.com/error",
210
+ "backurl": "https://www.example.com/back"
211
+ }`}</CodeBlock>
212
+ </Box>
213
+ <Box>
214
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
215
+ Response (Success):
216
+ </Typography>
217
+ <CodeBlock>{`{
218
+ "status": "APPROVED",
219
+ "txid": "12345678",
220
+ "reference": "ORD-00123-ABCD",
221
+ "amount": 1000,
222
+ "currency": "EUR"
223
+ }`}</CodeBlock>
224
+ </Box>
225
+ <Box>
226
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
227
+ Response (3D Secure Redirect):
228
+ </Typography>
229
+ <CodeBlock>{`{
230
+ "status": "REDIRECT",
231
+ "redirecturl": "https://secure.pay1.de/3ds/...",
232
+ "requires3DSRedirect": true
233
+ }`}</CodeBlock>
234
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
235
+ ⚠️ When 3D Secure is enabled, you must redirect the user to the <code>redirecturl</code> for authentication.
236
+ </Typography>
237
+ </Box>
238
+ <Box>
239
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
240
+ 📚 <strong>Payone Credit Card Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Credit+Card" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Credit+Card</a>
241
+ </Typography>
242
+ </Box>
243
+ </Stack>
244
+ </CardBody>
245
+ </Card>
246
+ </AccordionContent>
247
+ </Accordion>
248
+
249
+ <Accordion id="paypal" expanded={expandedAccordions.paypal} onToggle={() => toggleAccordion('paypal')}>
250
+ <AccordionToggle title="PayPal Integration" />
251
+ <AccordionContent>
252
+ <Card className="payment-card">
253
+ <CardBody padding={6}>
254
+ <Stack spacing={4}>
255
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
256
+ PayPal Integration
257
+ </Typography>
258
+ <Box>
259
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
260
+ Required Parameters:
261
+ </Typography>
262
+ <Stack spacing={2}>
263
+ <Typography variant="pi">• <strong>clearingtype</strong>: "wlt"</Typography>
264
+ <Typography variant="pi">• <strong>wallettype</strong>: "PPE" (PayPal Express)</Typography>
265
+ <Typography variant="pi">• <strong>shipping_firstname</strong>, <strong>shipping_lastname</strong>, <strong>shipping_street</strong>, <strong>shipping_zip</strong>, <strong>shipping_city</strong>, <strong>shipping_country</strong> - Shipping address</Typography>
266
+ </Stack>
267
+ </Box>
268
+ <Box>
269
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
270
+ Preauthorization Request:
271
+ </Typography>
272
+ <CodeBlock>{`POST /api/strapi-plugin-payone-provider/preauthorization
273
+
274
+ {
275
+ "amount": 1000,
276
+ "currency": "EUR",
277
+ "reference": "ORD-00123-ABCD",
278
+ "clearingtype": "wlt",
279
+ "wallettype": "PPE",
280
+ "firstname": "John",
281
+ "lastname": "Doe",
282
+ "email": "john.doe@example.com",
283
+ "street": "Main Street 123",
284
+ "zip": "12345",
285
+ "city": "Berlin",
286
+ "country": "DE",
287
+ "shipping_firstname": "John",
288
+ "shipping_lastname": "Doe",
289
+ "shipping_street": "Main Street 123",
290
+ "shipping_zip": "12345",
291
+ "shipping_city": "Berlin",
292
+ "shipping_country": "DE",
293
+ "successurl": "https://www.example.com/success",
294
+ "errorurl": "https://www.example.com/error",
295
+ "backurl": "https://www.example.com/back"
296
+ }`}</CodeBlock>
297
+ </Box>
298
+ <Box>
299
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
300
+ Response (Redirect to PayPal):
301
+ </Typography>
302
+ <CodeBlock>{`{
303
+ "status": "REDIRECT",
304
+ "redirecturl": "https://www.paypal.com/checkoutnow?token=..."
305
+ }`}</CodeBlock>
306
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
307
+ ⚠️ PayPal always redirects. You must redirect the user to <code>redirecturl</code> to complete the payment.
308
+ </Typography>
309
+ </Box>
310
+ <Box>
311
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
312
+ PayPal Callback Response (after redirect):
313
+ </Typography>
314
+ <CodeBlock>{`{
315
+ "status": "APPROVED",
316
+ "txid": "12345678",
317
+ "reference": "ORD-00123-ABCD"
318
+ }`}</CodeBlock>
319
+ </Box>
320
+ <Box>
321
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
322
+ 📚 <strong>Payone PayPal Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/PayPal" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/PayPal</a>
323
+ </Typography>
324
+ </Box>
325
+ </Stack>
326
+ </CardBody>
327
+ </Card>
328
+ </AccordionContent>
329
+ </Accordion>
330
+
331
+ <Accordion id="google-pay" expanded={expandedAccordions.googlePay} onToggle={() => toggleAccordion('googlePay')}>
332
+ <AccordionToggle title="Google Pay Integration" />
333
+ <AccordionContent>
334
+ <Card className="payment-card">
335
+ <CardBody padding={6}>
336
+ <Stack spacing={4}>
337
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
338
+ Google Pay Integration
339
+ </Typography>
340
+ <Box>
341
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
342
+ Step 1: Configure Strapi Middleware
343
+ </Typography>
344
+ <Typography variant="pi" marginBottom={2}>
345
+ Add Google Pay SDK to your <code>config/middlewares.js</code>:
346
+ </Typography>
347
+ <CodeBlock>{`module.exports = [
348
+ 'strapi::logger',
349
+ 'strapi::errors',
350
+ {
351
+ name: 'strapi::security',
352
+ config: {
353
+ contentSecurityPolicy: {
354
+ useDefaults: true,
355
+ directives: {
356
+ 'script-src': [
357
+ "'self'",
358
+ "'unsafe-inline'",
359
+ "'unsafe-eval'",
360
+ 'https://pay.google.com',
361
+ ],
362
+ 'connect-src': [
363
+ "'self'",
364
+ 'https:',
365
+ 'https://pay.google.com',
366
+ ],
367
+ 'frame-src': [
368
+ "'self'",
369
+ 'https://pay.google.com',
370
+ ],
371
+ },
372
+ },
373
+ },
374
+ },
375
+ // ... other middlewares
376
+ ];`}</CodeBlock>
377
+ </Box>
378
+ <Box>
379
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
380
+ Step 2: Install Google Pay Button Library (Optional)
381
+ </Typography>
382
+ <CodeBlock>npm install @google-pay/button-react</CodeBlock>
383
+ </Box>
384
+ <Box>
385
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
386
+ Step 3: Implement Google Pay Button (Using NPM Library)
387
+ </Typography>
388
+ <CodeBlock>{`import { GooglePayButton } from '@google-pay/button-react';
389
+
390
+ function PaymentForm() {
391
+ const handleGooglePay = async (paymentData) => {
392
+ const token = paymentData.paymentMethodData.tokenizationData.token;
393
+
394
+ // Send token to your backend
395
+ const response = await fetch('/api/strapi-plugin-payone-provider/preauthorization', {
396
+ method: 'POST',
397
+ headers: {
398
+ 'Content-Type': 'application/json',
399
+ 'Authorization': 'Bearer YOUR_TOKEN'
400
+ },
401
+ body: JSON.stringify({
402
+ amount: 1000,
403
+ currency: 'EUR',
404
+ reference: 'ORD-00123-ABCD',
405
+ clearingtype: 'wlt',
406
+ wallettype: 'GGP',
407
+ 'add_paydata[paymentmethod_token_data]': token,
408
+ 'add_paydata[paymentmethod]': 'GGP',
409
+ 'add_paydata[paymentmethod_type]': 'GOOGLEPAY',
410
+ 'add_paydata[gatewayid]': 'payonegmbh',
411
+ firstname: 'John',
412
+ lastname: 'Doe',
413
+ email: 'john.doe@example.com',
414
+ street: 'Main Street 123',
415
+ zip: '12345',
416
+ city: 'Berlin',
417
+ country: 'DE',
418
+ shipping_firstname: 'John',
419
+ shipping_lastname: 'Doe',
420
+ shipping_street: 'Main Street 123',
421
+ shipping_zip: '12345',
422
+ shipping_city: 'Berlin',
423
+ shipping_country: 'DE'
424
+ })
425
+ });
426
+
427
+ const result = await response.json();
428
+ console.log('Payment result:', result);
429
+ };
430
+
431
+ return (
432
+ <GooglePayButton
433
+ environment="TEST"
434
+ paymentRequest={{
435
+ apiVersion: 2,
436
+ apiVersionMinor: 0,
437
+ allowedPaymentMethods: [{
438
+ type: 'CARD',
439
+ parameters: {
440
+ allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
441
+ allowedCardNetworks: ['MASTERCARD', 'VISA']
442
+ },
443
+ tokenizationSpecification: {
444
+ type: 'PAYMENT_GATEWAY',
445
+ parameters: {
446
+ gateway: 'payonegmbh',
447
+ gatewayMerchantId: 'YOUR_MERCHANT_ID'
448
+ }
449
+ }
450
+ }],
451
+ merchantInfo: {
452
+ merchantId: 'YOUR_MERCHANT_ID',
453
+ merchantName: 'Your Store Name'
454
+ },
455
+ transactionInfo: {
456
+ totalPriceStatus: 'FINAL',
457
+ totalPriceLabel: 'Total',
458
+ totalPrice: '10.00',
459
+ currencyCode: 'EUR',
460
+ countryCode: 'DE'
461
+ }
462
+ }}
463
+ onLoadPaymentData={handleGooglePay}
464
+ />
465
+ );
466
+ }`}</CodeBlock>
467
+ </Box>
468
+ <Box>
469
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
470
+ Step 4: Manual Implementation
471
+ </Typography>
472
+ <CodeBlock>{`// Load Google Pay SDK
473
+ <script src="https://pay.google.com/gp/p/js/pay.js"></script>
474
+
475
+ // Initialize Google Pay
476
+ const paymentsClient = new google.payments.api.PaymentsClient({
477
+ environment: 'TEST' // or 'PRODUCTION'
478
+ });
479
+
480
+ // Create payment request
481
+ const paymentRequest = {
482
+ apiVersion: 2,
483
+ apiVersionMinor: 0,
484
+ allowedPaymentMethods: [{
485
+ type: 'CARD',
486
+ parameters: {
487
+ allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
488
+ allowedCardNetworks: ['MASTERCARD', 'VISA']
489
+ },
490
+ tokenizationSpecification: {
491
+ type: 'PAYMENT_GATEWAY',
492
+ parameters: {
493
+ gateway: 'payonegmbh',
494
+ gatewayMerchantId: 'YOUR_MERCHANT_ID'
495
+ }
496
+ }
497
+ }],
498
+ merchantInfo: {
499
+ merchantId: 'YOUR_MERCHANT_ID',
500
+ merchantName: 'Your Store Name'
501
+ },
502
+ transactionInfo: {
503
+ totalPriceStatus: 'FINAL',
504
+ totalPrice: '10.00',
505
+ currencyCode: 'EUR',
506
+ countryCode: 'DE'
507
+ }
508
+ };
509
+
510
+ // Check if Google Pay is available
511
+ paymentsClient.isReadyToPay(paymentRequest).then((response) => {
512
+ if (response.result) {
513
+ // Show Google Pay button
514
+ paymentsClient.loadPaymentData(paymentRequest).then((paymentData) => {
515
+ const token = paymentData.paymentMethodData.tokenizationData.token;
516
+ // Send token to backend
517
+ sendTokenToBackend(token);
518
+ });
519
+ }
520
+ });`}</CodeBlock>
521
+ </Box>
522
+ <Box>
523
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
524
+ Token Parameters (Backend Request):
525
+ </Typography>
526
+ <CodeBlock>{`{
527
+ "amount": 1000,
528
+ "currency": "EUR",
529
+ "reference": "ORD-00123-ABCD",
530
+ "clearingtype": "wlt",
531
+ "wallettype": "GGP",
532
+ "add_paydata[paymentmethod_token_data]": "TOKEN_FROM_GOOGLE_PAY",
533
+ "add_paydata[paymentmethod]": "GGP",
534
+ "add_paydata[paymentmethod_type]": "GOOGLEPAY",
535
+ "add_paydata[gatewayid]": "payonegmbh",
536
+ "add_paydata[gateway_merchantid]": "YOUR_MERCHANT_ID",
537
+ // ... customer and shipping info
538
+ }`}</CodeBlock>
539
+ </Box>
540
+ <Box>
541
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
542
+ 📚 <strong>Payone Google Pay Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Google+Pay" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Google+Pay</a>
543
+ </Typography>
544
+ </Box>
545
+ </Stack>
546
+ </CardBody>
547
+ </Card>
548
+ </AccordionContent>
549
+ </Accordion>
550
+
551
+ <Accordion id="apple-pay" expanded={expandedAccordions.applePay} onToggle={() => toggleAccordion('applePay')}>
552
+ <AccordionToggle title="Apple Pay Integration" />
553
+ <AccordionContent>
554
+ <Card className="payment-card">
555
+ <CardBody padding={6}>
556
+ <Stack spacing={4}>
557
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
558
+ Apple Pay Integration
559
+ </Typography>
560
+ <Box>
561
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} textColor="danger600" style={{ marginBottom: '12px', marginRight: '6px' }}>
562
+ ⚠️ Important: Apple Pay does NOT work on localhost
563
+ </Typography>
564
+ <Typography variant="pi" textColor="neutral600">
565
+ Apple Pay requires a registered domain with HTTPS. For testing, use a production domain with HTTPS or test on a device with Safari (iOS/macOS).
566
+ </Typography>
567
+ </Box>
568
+ <Box>
569
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
570
+ Step 1: Configure Strapi Middleware
571
+ </Typography>
572
+ <Typography variant="pi" marginBottom={2}>
573
+ Add Apple Pay SDK to your <code>config/middlewares.js</code>:
574
+ </Typography>
575
+ <CodeBlock>{`module.exports = [
576
+ 'strapi::logger',
577
+ 'strapi::errors',
578
+ {
579
+ name: 'strapi::security',
580
+ config: {
581
+ contentSecurityPolicy: {
582
+ useDefaults: true,
583
+ directives: {
584
+ 'script-src': [
585
+ "'self'",
586
+ "'unsafe-inline'",
587
+ "'unsafe-eval'",
588
+ 'https://applepay.cdn-apple.com',
589
+ 'https://www.apple.com',
590
+ ],
591
+ 'connect-src': [
592
+ "'self'",
593
+ 'https:',
594
+ 'https://applepay.cdn-apple.com',
595
+ 'https://www.apple.com',
596
+ ],
597
+ 'frame-src': [
598
+ "'self'",
599
+ 'https://applepay.cdn-apple.com',
600
+ ],
601
+ },
602
+ },
603
+ },
604
+ },
605
+ // ... other middlewares
606
+ ];`}</CodeBlock>
607
+ </Box>
608
+ <Box>
609
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
610
+ Step 2: Setup .well-known File
611
+ </Typography>
612
+ <Typography variant="pi" marginBottom={2}>
613
+ Download the Apple Pay domain verification file from Payone documentation:{" "}
614
+ <a
615
+ href="https://docs.payone.com/payment-methods/apple-pay/apple-pay-without-dev"
616
+ target="_blank"
617
+ rel="noopener noreferrer"
618
+ style={{ color: "#0066ff", textDecoration: "underline" }}
619
+ >
620
+ https://docs.payone.com/payment-methods/apple-pay/apple-pay-without-dev
621
+ </a>
622
+ {" "}or from your Payone merchant portal and place it:
623
+ </Typography>
624
+ <Stack spacing={2} marginBottom={2}>
625
+ <Typography variant="pi"><strong>In Strapi:</strong> <code>public/.well-known/apple-developer-merchantid-domain-association</code></Typography>
626
+ <Typography variant="pi"><strong>In Frontend:</strong> <code>public/.well-known/apple-developer-merchantid-domain-association</code></Typography>
627
+ </Stack>
628
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
629
+ The file must be accessible at: <code>https://yourdomain.com/.well-known/apple-developer-merchantid-domain-association</code>
630
+ </Typography>
631
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
632
+ <strong>Alternative Download:</strong> Log into your Payone Merchant Interface (PMI) → Configuration → Payment Portals → Apple Pay → Download domain verification file
633
+ </Typography>
634
+ </Box>
635
+ <Box>
636
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
637
+ Step 3: Implement Apple Pay Button
638
+ </Typography>
639
+ <CodeBlock>{`// Load Apple Pay SDK
640
+ <script src="https://applepay.cdn-apple.com/jsapi/1.latest/apple-pay-sdk.js"></script>
641
+
642
+ // Check if Apple Pay is available
643
+ if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
644
+ // Create payment request
645
+ const paymentRequest = {
646
+ countryCode: 'DE',
647
+ currencyCode: 'EUR',
648
+ supportedNetworks: ['visa', 'masterCard', 'amex'],
649
+ merchantCapabilities: ['supports3DS'],
650
+ total: {
651
+ label: 'Your Store',
652
+ amount: '10.00'
653
+ }
654
+ };
655
+
656
+ // Create session
657
+ const session = new ApplePaySession(3, paymentRequest);
658
+
659
+ // Handle merchant validation
660
+ session.onmerchantvalidation = async (event) => {
661
+ const validationURL = event.validationURL;
662
+
663
+ // Call your backend to validate merchant
664
+ const response = await fetch('/api/strapi-plugin-payone-provider/validate-apple-pay-merchant', {
665
+ method: 'POST',
666
+ headers: {
667
+ 'Content-Type': 'application/json',
668
+ 'Authorization': 'Bearer YOUR_TOKEN'
669
+ },
670
+ body: JSON.stringify({
671
+ validationURL: validationURL,
672
+ displayName: 'Your Store Name',
673
+ domainName: window.location.hostname
674
+ })
675
+ });
676
+
677
+ const merchantSession = await response.json();
678
+ session.completeMerchantValidation(merchantSession);
679
+ };
680
+
681
+ // Handle payment authorization
682
+ session.onpaymentauthorized = async (event) => {
683
+ const payment = event.payment;
684
+ const token = payment.token;
685
+
686
+ // Send token to backend
687
+ const response = await fetch('/api/strapi-plugin-payone-provider/preauthorization', {
688
+ method: 'POST',
689
+ headers: {
690
+ 'Content-Type': 'application/json',
691
+ 'Authorization': 'Bearer YOUR_TOKEN'
692
+ },
693
+ body: JSON.stringify({
694
+ amount: 1000,
695
+ currency: 'EUR',
696
+ reference: 'ORD-00123-ABCD',
697
+ clearingtype: 'wlt',
698
+ wallettype: 'APL',
699
+ 'add_paydata[paymentmethod_token_data]': JSON.stringify(token),
700
+ 'add_paydata[paymentmethod]': 'APL',
701
+ 'add_paydata[paymentmethod_type]': 'APPLEPAY',
702
+ 'add_paydata[gatewayid]': 'payonegmbh',
703
+ firstname: payment.billingContact.givenName || 'John',
704
+ lastname: payment.billingContact.familyName || 'Doe',
705
+ email: payment.billingContact.emailAddress || 'john.doe@example.com',
706
+ street: payment.billingContact.addressLines?.[0] || 'Main Street 123',
707
+ zip: payment.billingContact.postalCode || '12345',
708
+ city: payment.billingContact.locality || 'Berlin',
709
+ country: payment.billingContact.countryCode || 'DE',
710
+ shipping_firstname: payment.shippingContact?.givenName || payment.billingContact.givenName || 'John',
711
+ shipping_lastname: payment.shippingContact?.familyName || payment.billingContact.familyName || 'Doe',
712
+ shipping_street: payment.shippingContact?.addressLines?.[0] || payment.billingContact.addressLines?.[0] || 'Main Street 123',
713
+ shipping_zip: payment.shippingContact?.postalCode || payment.billingContact.postalCode || '12345',
714
+ shipping_city: payment.shippingContact?.locality || payment.billingContact.locality || 'Berlin',
715
+ shipping_country: payment.shippingContact?.countryCode || payment.billingContact.countryCode || 'DE'
716
+ })
717
+ });
718
+
719
+ const result = await response.json();
720
+
721
+ if (result.status === 'APPROVED') {
722
+ session.completePayment(ApplePaySession.STATUS_SUCCESS);
723
+ } else {
724
+ session.completePayment(ApplePaySession.STATUS_FAILURE);
725
+ }
726
+ };
727
+
728
+ // Show payment sheet
729
+ session.begin();
730
+ }`}</CodeBlock>
731
+ </Box>
732
+ <Box>
733
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
734
+ Token Parameters (Backend Request):
735
+ </Typography>
736
+ <CodeBlock>{`{
737
+ "amount": 1000,
738
+ "currency": "EUR",
739
+ "reference": "ORD-00123-ABCD",
740
+ "clearingtype": "wlt",
741
+ "wallettype": "APL",
742
+ "add_paydata[paymentmethod_token_data]": "JSON_STRINGIFIED_TOKEN",
743
+ "add_paydata[paymentmethod]": "APL",
744
+ "add_paydata[paymentmethod_type]": "APPLEPAY",
745
+ "add_paydata[gatewayid]": "payonegmbh",
746
+ "add_paydata[gateway_merchantid]": "YOUR_MERCHANT_ID",
747
+ // ... customer and shipping info
748
+ }`}</CodeBlock>
749
+ </Box>
750
+ <Box>
751
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
752
+ 📚 <strong>Payone Apple Pay Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Apple+Pay" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Apple+Pay</a>
753
+ </Typography>
754
+ </Box>
755
+ </Stack>
756
+ </CardBody>
757
+ </Card>
758
+ </AccordionContent>
759
+ </Accordion>
760
+
761
+ <Accordion id="3d-secure" expanded={expandedAccordions.threeDSecure} onToggle={() => toggleAccordion('threeDSecure')}>
762
+ <AccordionToggle title="3D Secure Authentication" />
763
+ <AccordionContent>
764
+ <Card className="payment-card">
765
+ <CardBody padding={6}>
766
+ <Stack spacing={4}>
767
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
768
+ 3D Secure Authentication
769
+ </Typography>
770
+ <Box>
771
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
772
+ How 3D Secure Works:
773
+ </Typography>
774
+ <Stack spacing={2}>
775
+ <Typography variant="pi">1. Enable 3D Secure in Strapi admin panel (Configuration tab)</Typography>
776
+ <Typography variant="pi">2. Make a credit card payment request</Typography>
777
+ <Typography variant="pi">3. If 3DS is required, you'll receive a <code>redirecturl</code> in the response</Typography>
778
+ <Typography variant="pi">4. Redirect the user to the <code>redirecturl</code> for authentication</Typography>
779
+ <Typography variant="pi">5. User enters password/confirms with bank</Typography>
780
+ <Typography variant="pi">6. User is redirected back to your <code>successurl</code>, <code>errorurl</code>, or <code>backurl</code></Typography>
781
+ <Typography variant="pi">7. Handle the callback and check transaction status</Typography>
782
+ </Stack>
783
+ </Box>
784
+ <Box>
785
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
786
+ Special 3D Secure Test Cards (from Payone Documentation):
787
+ </Typography>
788
+ <Stack spacing={2}>
789
+ <Typography variant="pi">• <strong>Visa 3DS Test Card:</strong> 4000000000000002</Typography>
790
+ <Typography variant="pi">• <strong>Mastercard 3DS Test Card:</strong> 5453010000059543</Typography>
791
+ <Typography variant="pi">• <strong>Expiry:</strong> Any future date (e.g., 12/25 = "2512")</Typography>
792
+ <Typography variant="pi">• <strong>CVC:</strong> Any 3 digits (e.g., 123)</Typography>
793
+ <Typography variant="pi">• <strong>3DS Password:</strong> Usually "123456" or as provided by Payone (check your Payone test documentation)</Typography>
794
+ </Stack>
795
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
796
+ 📚 <strong>Payone 3D Secure Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/3D+Secure" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/3D+Secure</a>
797
+ </Typography>
798
+ </Box>
799
+ <Box>
800
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
801
+ Standard Credit Card Test Cards (without 3DS):
802
+ </Typography>
803
+ <Stack spacing={2}>
804
+ <Typography variant="pi">• <strong>Visa:</strong> 4111111111111111</Typography>
805
+ <Typography variant="pi">• <strong>Mastercard:</strong> 5555555555554444</Typography>
806
+ <Typography variant="pi">• <strong>Amex:</strong> 378282246310005</Typography>
807
+ <Typography variant="pi">• <strong>Expiry:</strong> Any future date (e.g., 12/25 = "2512")</Typography>
808
+ <Typography variant="pi">• <strong>CVC:</strong> Any 3 digits (4 digits for Amex)</Typography>
809
+ </Stack>
810
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
811
+ 📚 <strong>Payone Test Cards Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Credit+Card+Test+Cards" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Credit+Card+Test+Cards</a>
812
+ </Typography>
813
+ </Box>
814
+ <Box>
815
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
816
+ Example Flow:
817
+ </Typography>
818
+ <CodeBlock>{`// 1. Make payment request
819
+ const response = await fetch('/api/strapi-plugin-payone-provider/preauthorization', {
820
+ method: 'POST',
821
+ body: JSON.stringify({
822
+ amount: 1000,
823
+ currency: 'EUR',
824
+ clearingtype: 'cc',
825
+ cardtype: 'V',
826
+ cardpan: '4111111111111111',
827
+ cardexpiredate: '2512',
828
+ cardcvc2: '123',
829
+ successurl: 'https://yoursite.com/payment/success',
830
+ errorurl: 'https://yoursite.com/payment/error',
831
+ backurl: 'https://yoursite.com/payment/back',
832
+ // ... other params
833
+ })
834
+ });
835
+
836
+ const result = await response.json();
837
+
838
+ // 2. Check if 3DS redirect is required
839
+ if (result.status === 'REDIRECT' && result.redirecturl) {
840
+ // 3. Redirect user to 3DS authentication page
841
+ window.location.href = result.redirecturl;
842
+ }
843
+
844
+ // 4. Handle callback (in your success/error/back URL handler)
845
+ // The callback will include transaction status and txid`}</CodeBlock>
846
+ </Box>
847
+ <Box>
848
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
849
+ 📚 <strong>Payone 3D Secure Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/3D+Secure" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/3D+Secure</a>
850
+ </Typography>
851
+ </Box>
852
+ </Stack>
853
+ </CardBody>
854
+ </Card>
855
+ </AccordionContent>
856
+ </Accordion>
857
+
858
+ <Accordion id="capture-refund" expanded={expandedAccordions.captureRefund} onToggle={() => toggleAccordion('captureRefund')}>
859
+ <AccordionToggle title="Capture & Refund Operations" />
860
+ <AccordionContent>
861
+ <Card className="payment-card">
862
+ <CardBody padding={6}>
863
+ <Stack spacing={4}>
864
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
865
+ Capture & Refund Operations
866
+ </Typography>
867
+ <Box>
868
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
869
+ Capture (Complete Preauthorized Transaction):
870
+ </Typography>
871
+ <CodeBlock>{`POST /api/strapi-plugin-payone-provider/capture
872
+
873
+ {
874
+ "txid": "12345678",
875
+ "amount": 1000,
876
+ "currency": "EUR",
877
+ "reference": "CAPTURE-00123-ABCD",
878
+ "sequencenumber": 1,
879
+ "capturemode": "full" // For wallet payments: "full" or "partial"
880
+ }`}</CodeBlock>
881
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
882
+ <strong>Note:</strong> <code>capturemode</code> is only required for wallet payments (PayPal, Google Pay, Apple Pay).
883
+ </Typography>
884
+ </Box>
885
+ <Box>
886
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
887
+ Refund (Return Funds):
888
+ </Typography>
889
+ <CodeBlock>{`POST /api/strapi-plugin-payone-provider/refund
890
+
891
+ {
892
+ "txid": "12345678",
893
+ "amount": -1000, // Negative amount for refund
894
+ "currency": "EUR",
895
+ "reference": "REFUND-00123-ABCD",
896
+ "sequencenumber": 2
897
+ }`}</CodeBlock>
898
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
899
+ <strong>Note:</strong> Refund amount must be negative. <code>sequencenumber</code> should be incremented for each operation on the same transaction.
900
+ </Typography>
901
+ </Box>
902
+ <Box>
903
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
904
+ Sequence Numbers:
905
+ </Typography>
906
+ <Stack spacing={2}>
907
+ <Typography variant="pi">• <strong>Preauthorization:</strong> sequencenumber = 0 (default)</Typography>
908
+ <Typography variant="pi">• <strong>Capture:</strong> sequencenumber = 1 (first capture)</Typography>
909
+ <Typography variant="pi">• <strong>Refund:</strong> sequencenumber = 2 (first refund), 3 (second refund), etc.</Typography>
910
+ </Stack>
911
+ </Box>
912
+ <Box>
913
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
914
+ 📚 <strong>Payone Capture Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Capture" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Capture</a>
915
+ </Typography>
916
+ </Box>
917
+ <Box>
918
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
919
+ 📚 <strong>Payone Refund Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Refund" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Refund</a>
920
+ </Typography>
921
+ </Box>
922
+ </Stack>
923
+ </CardBody>
924
+ </Card>
925
+ </AccordionContent>
926
+ </Accordion>
927
+
928
+ <Accordion id="test-credentials" expanded={expandedAccordions.testCredentials} onToggle={() => toggleAccordion('testCredentials')}>
929
+ <AccordionToggle title="Test Credentials" />
930
+ <AccordionContent>
931
+ <Card className="payment-card">
932
+ <CardBody padding={6}>
933
+ <Stack spacing={4}>
934
+ <Typography variant="delta" as="h3" fontWeight="bold" style={{ marginBottom: '12px' }}>
935
+ Test Credentials
936
+ </Typography>
937
+ <Box>
938
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
939
+ Credit Card Test Cards (Standard):
940
+ </Typography>
941
+ <Stack spacing={2}>
942
+ <Typography variant="pi">• <strong>Visa:</strong> 4111111111111111</Typography>
943
+ <Typography variant="pi">• <strong>Mastercard:</strong> 5555555555554444</Typography>
944
+ <Typography variant="pi">• <strong>Amex:</strong> 378282246310005</Typography>
945
+ <Typography variant="pi">• <strong>Expiry:</strong> Any future date (e.g., 12/25 = "2512")</Typography>
946
+ <Typography variant="pi">• <strong>CVC:</strong> Any 3 digits (4 digits for Amex)</Typography>
947
+ </Stack>
948
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
949
+ 📚 <strong>Payone Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Test+and+Live+Data" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Test+and+Live+Data</a>
950
+ </Typography>
951
+ </Box>
952
+ <Box>
953
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
954
+ 3D Secure Test Cards (Special Test Data):
955
+ </Typography>
956
+ <Stack spacing={2}>
957
+ <Typography variant="pi">• <strong>Visa 3DS Test Card:</strong> 4000000000000002</Typography>
958
+ <Typography variant="pi">• <strong>Mastercard 3DS Test Card:</strong> 5453010000059543</Typography>
959
+ <Typography variant="pi">• <strong>3DS Password:</strong> Usually "123456" or as provided by Payone</Typography>
960
+ <Typography variant="pi">• <strong>Expiry:</strong> Any future date (e.g., 12/25 = "2512")</Typography>
961
+ <Typography variant="pi">• <strong>CVC:</strong> Any 3 digits</Typography>
962
+ </Stack>
963
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
964
+ 📚 <strong>Payone 3D Secure Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/3D+Secure" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/3D+Secure</a>
965
+ </Typography>
966
+ </Box>
967
+ <Box>
968
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
969
+ PayPal Test Data:
970
+ </Typography>
971
+ <Stack spacing={2}>
972
+ <Typography variant="pi">• Use PayPal Sandbox test accounts</Typography>
973
+ <Typography variant="pi">• Create test accounts in PayPal Developer Dashboard</Typography>
974
+ <Typography variant="pi">• Test with both buyer and merchant sandbox accounts</Typography>
975
+ </Stack>
976
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
977
+ 📚 <strong>Payone PayPal Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/PayPal" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/PayPal</a>
978
+ </Typography>
979
+ </Box>
980
+ <Box>
981
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
982
+ Google Pay Test Data:
983
+ </Typography>
984
+ <Stack spacing={2}>
985
+ <Typography variant="pi">• Use Google Pay test environment</Typography>
986
+ <Typography variant="pi">• Test cards are automatically provided by Google Pay SDK</Typography>
987
+ <Typography variant="pi">• Set <code>environment: 'TEST'</code> in Google Pay configuration</Typography>
988
+ </Stack>
989
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
990
+ 📚 <strong>Payone Google Pay Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Google+Pay" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Google+Pay</a>
991
+ </Typography>
992
+ </Box>
993
+ <Box>
994
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
995
+ Apple Pay Test Data:
996
+ </Typography>
997
+ <Stack spacing={2}>
998
+ <Typography variant="pi">• Use Apple Pay test environment</Typography>
999
+ <Typography variant="pi">• Test cards are available in Wallet app on test devices</Typography>
1000
+ <Typography variant="pi">• Requires registered domain with HTTPS (not localhost)</Typography>
1001
+ </Stack>
1002
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
1003
+ 📚 <strong>Payone Apple Pay Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Apple+Pay" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Apple+Pay</a>
1004
+ </Typography>
1005
+ </Box>
1006
+ <Box>
1007
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
1008
+ Sofort Banking Test Data:
1009
+ </Typography>
1010
+ <Stack spacing={2}>
1011
+ <Typography variant="pi">• Use Sofort test environment</Typography>
1012
+ <Typography variant="pi">• Test credentials provided by Payone</Typography>
1013
+ </Stack>
1014
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
1015
+ 📚 <strong>Payone Sofort Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Sofort" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Sofort</a>
1016
+ </Typography>
1017
+ </Box>
1018
+ <Box>
1019
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
1020
+ SEPA Direct Debit Test Data:
1021
+ </Typography>
1022
+ <Stack spacing={2}>
1023
+ <Typography variant="pi">• <strong>Test IBAN:</strong> DE89370400440532013000</Typography>
1024
+ <Typography variant="pi">• <strong>Test BIC:</strong> COBADEFFXXX</Typography>
1025
+ <Typography variant="pi">• <strong>Account Holder:</strong> Any test name</Typography>
1026
+ </Stack>
1027
+ <Typography variant="pi" textColor="neutral600" marginTop={2}>
1028
+ 📚 <strong>Payone SEPA Documentation:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/SEPA+Direct+Debit" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/SEPA+Direct+Debit</a>
1029
+ </Typography>
1030
+ </Box>
1031
+ <Box>
1032
+ <Typography variant="pi" fontWeight="bold" marginBottom={2} style={{ marginBottom: '12px' }}>
1033
+ General Test Data Resources:
1034
+ </Typography>
1035
+ <Stack spacing={2}>
1036
+ <Typography variant="pi">📚 <strong>Payone Test Data Overview:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Test+and+Live+Data" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Test+and+Live+Data</a></Typography>
1037
+ <Typography variant="pi">📚 <strong>Payone Test Cards:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Credit+Card+Test+Cards" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Credit+Card+Test+Cards</a></Typography>
1038
+ <Typography variant="pi">📚 <strong>Payone Test Environment:</strong> <a href="https://docs.payone.com/display/public/PLATFORM/Test+Environment" target="_blank" rel="noopener noreferrer">https://docs.payone.com/display/public/PLATFORM/Test+Environment</a></Typography>
1039
+ </Stack>
1040
+ </Box>
1041
+ </Stack>
1042
+ </CardBody>
1043
+ </Card>
1044
+ </AccordionContent>
1045
+ </Accordion>
1046
+
1047
+ <Box paddingTop={4}>
1048
+ <Typography variant="sigma" textColor="neutral600">
1049
+ For more information, visit the Payone documentation or contact your Payone account manager.
1050
+ </Typography>
1051
+ </Box>
1052
+ </Flex>
1053
+ </Box>
1054
+ );
1055
+ };
1056
+
1057
+ export default DocsPanel;