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.
- package/README.md +179 -22
- package/admin/src/pages/App/components/AppHeader.js +22 -4
- package/admin/src/pages/App/components/AppTabs.js +25 -1
- package/admin/src/pages/App/components/ApplePayButton.js +737 -0
- package/admin/src/pages/App/components/ApplePayConfig.js +364 -0
- package/admin/src/pages/App/components/ApplePayConfigPanel.js +81 -0
- package/admin/src/pages/App/components/ConfigurationPanel.js +19 -3
- package/admin/src/pages/App/components/DocsPanel.js +1057 -0
- package/admin/src/pages/App/components/GooglePayConfig.js +217 -0
- package/admin/src/pages/App/components/GooglePayConfigPanel.js +82 -0
- package/admin/src/pages/App/components/GooglePaybutton.js +1 -1
- package/admin/src/pages/App/components/PaymentActionsPanel.js +24 -6
- package/admin/src/pages/App/components/paymentActions/AuthorizationForm.js +60 -4
- package/admin/src/pages/App/components/paymentActions/CaptureForm.js +1 -0
- package/admin/src/pages/App/components/paymentActions/CardDetailsInput.js +18 -16
- package/admin/src/pages/App/components/paymentActions/PaymentMethodSelector.js +106 -2
- package/admin/src/pages/App/components/paymentActions/PreauthorizationForm.js +64 -4
- package/admin/src/pages/App/components/paymentActions/RefundForm.js +1 -0
- package/admin/src/pages/App/index.js +70 -1
- package/admin/src/pages/hooks/usePaymentActions.js +13 -2
- package/admin/src/pages/hooks/useSettings.js +2 -0
- package/admin/src/pages/utils/applePayConstants.js +222 -0
- package/admin/src/pages/utils/googlePayConstants.js +79 -0
- package/admin/src/pages/utils/paymentUtils.js +22 -74
- package/package.json +1 -1
- package/server/bootstrap.js +5 -1
- package/server/config/index.js +5 -1
- package/server/controllers/payone.js +10 -0
- package/server/routes/index.js +17 -0
- package/server/services/applePayService.js +261 -0
- package/server/services/payone.js +10 -0
- 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;
|