@unchainedshop/plugins 3.0.0-rc6 → 3.0.0-rc8
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/lib/events/node-event-emitter.js +1 -1
- package/lib/events/node-event-emitter.js.map +1 -1
- package/lib/files/gridfs/gridfs-adapter.d.ts +7 -1
- package/lib/files/gridfs/gridfs-adapter.d.ts.map +1 -1
- package/lib/files/gridfs/gridfs-adapter.js +2 -3
- package/lib/files/gridfs/gridfs-adapter.js.map +1 -1
- package/lib/files/gridfs/gridfs-webhook.js +2 -2
- package/lib/files/gridfs/gridfs-webhook.js.map +1 -1
- package/lib/files/gridfs/index.d.ts +1 -0
- package/lib/files/gridfs/index.d.ts.map +1 -1
- package/lib/files/minio/minio-adapter.d.ts.map +1 -1
- package/lib/files/minio/minio-adapter.js +6 -23
- package/lib/files/minio/minio-adapter.js.map +1 -1
- package/lib/payment/apple-iap/adapter.js +1 -1
- package/lib/payment/apple-iap/adapter.js.map +1 -1
- package/lib/payment/datatrans-v2/api/makeFetcher.d.ts.map +1 -1
- package/lib/payment/datatrans-v2/api/makeFetcher.js +5 -9
- package/lib/payment/datatrans-v2/api/makeFetcher.js.map +1 -1
- package/lib/payment/payrexx/api/makeFetcher.d.ts.map +1 -1
- package/lib/payment/payrexx/api/makeFetcher.js +7 -12
- package/lib/payment/payrexx/api/makeFetcher.js.map +1 -1
- package/lib/payment/stripe/stripe.js +1 -1
- package/lib/worker/email.d.ts.map +1 -1
- package/lib/worker/email.js +17 -14
- package/lib/worker/email.js.map +1 -1
- package/package.json +19 -16
- package/src/events/node-event-emitter.ts +1 -1
- package/src/files/gridfs/gridfs-adapter.ts +14 -7
- package/src/files/gridfs/gridfs-webhook.ts +2 -2
- package/src/files/gridfs/index.ts +2 -0
- package/src/files/minio/minio-adapter.ts +7 -26
- package/src/payment/apple-iap/adapter.ts +1 -1
- package/src/payment/datatrans-v2/api/makeFetcher.ts +8 -11
- package/src/payment/payrexx/api/makeFetcher.ts +10 -13
- package/src/payment/stripe/stripe.ts +1 -1
- package/src/worker/email.ts +19 -14
- package/tests/mock/datatrans/v1/secure-fields.json +4 -0
- package/tests/mock/datatrans/v1/transactions/authorize.json +48 -0
- package/tests/mock/datatrans/v1/transactions/card_check_authorized.json +47 -0
- package/tests/mock/datatrans/v1/transactions/payment_alias_authorized/settle.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_alias_authorized.json +48 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized/cancel.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized/settle.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized.json +48 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount/cancel.json +1 -0
- package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount.json +48 -0
- package/tests/mock/datatrans/v1/transactions/validate.json +1 -0
- package/tests/mock/datatrans/v1/transactions.json +4 -0
- package/tests/mock/payrexx/Gateway/1000001.json +106 -0
- package/tests/mock/payrexx/Gateway.json +24 -0
- package/tests/mock/payrexx/transaction_example1.json +65 -0
- package/tests/mock/payrexx/transaction_example2.json +65 -0
- package/tests/mock/payrexx/transaction_example3.json +94 -0
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { Readable } from 'stream';
|
|
4
|
-
import { URL } from 'url';
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
import type { ReadableStream } from 'node:stream/web';
|
|
5
3
|
import { UploadFileData } from '@unchainedshop/file-upload';
|
|
6
4
|
import {
|
|
7
5
|
FileAdapter,
|
|
@@ -85,24 +83,6 @@ connectToMinio().then(function setClient(c) {
|
|
|
85
83
|
client = c;
|
|
86
84
|
});
|
|
87
85
|
|
|
88
|
-
const createHttpDownloadStream = async (
|
|
89
|
-
fileUrl: string,
|
|
90
|
-
headers: OutgoingHttpHeaders,
|
|
91
|
-
): Promise<http.IncomingMessage> => {
|
|
92
|
-
const { href, protocol } = new URL(fileUrl);
|
|
93
|
-
return new Promise((resolve, reject) => {
|
|
94
|
-
try {
|
|
95
|
-
if (protocol === 'http:') {
|
|
96
|
-
http.get(href, { headers }, resolve);
|
|
97
|
-
} else {
|
|
98
|
-
https.get(href, { headers }, resolve);
|
|
99
|
-
}
|
|
100
|
-
} catch (e) {
|
|
101
|
-
reject(e);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
|
|
106
86
|
const getObjectStats = async (fileName: string) => {
|
|
107
87
|
if (!client) throw new Error('Minio not connected, check env variables');
|
|
108
88
|
|
|
@@ -211,9 +191,10 @@ export const MinioAdapter: IFileAdapter = {
|
|
|
211
191
|
const fileName = fname || href.split('/').pop();
|
|
212
192
|
const hashedFilename = await buildHashedFilename(directoryName, fileName, new Date());
|
|
213
193
|
|
|
214
|
-
const
|
|
215
|
-
const
|
|
216
|
-
|
|
194
|
+
const url = new URL(fileLink);
|
|
195
|
+
const response = await fetch(url, { headers });
|
|
196
|
+
const type = mimeType.lookup(fileName) || response.headers['content-type'];
|
|
197
|
+
const readable = Readable.fromWeb(response.body as ReadableStream<Uint8Array<ArrayBufferLike>>);
|
|
217
198
|
const metaData = {
|
|
218
199
|
'Content-Type': type,
|
|
219
200
|
};
|
|
@@ -221,7 +202,7 @@ export const MinioAdapter: IFileAdapter = {
|
|
|
221
202
|
await client.putObject(
|
|
222
203
|
MINIO_BUCKET_NAME,
|
|
223
204
|
generateMinioPath(directoryName, hashedFilename),
|
|
224
|
-
|
|
205
|
+
readable,
|
|
225
206
|
undefined,
|
|
226
207
|
metaData,
|
|
227
208
|
);
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import util from 'util';
|
|
3
|
-
import { resolve } from 'path';
|
|
4
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
5
|
-
|
|
6
|
-
const readFile = util.promisify(fs.readFile);
|
|
7
|
-
|
|
8
|
-
const { DATATRANS_API_MOCKS_PATH } = process.env;
|
|
2
|
+
const { MOCK_APIS } = process.env;
|
|
9
3
|
|
|
10
4
|
const logger = createLogger('unchained:datatrans');
|
|
11
5
|
|
|
@@ -14,12 +8,15 @@ export default (
|
|
|
14
8
|
merchantId: string,
|
|
15
9
|
secret: string,
|
|
16
10
|
): ((path: string, body: unknown) => Promise<Response>) => {
|
|
17
|
-
if (
|
|
11
|
+
if (MOCK_APIS) {
|
|
18
12
|
return async (path): Promise<Response> => {
|
|
19
13
|
try {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
const { default: json } = await import(
|
|
15
|
+
`${import.meta.dirname}/../../../../tests/mock/datatrans/${path}.json`,
|
|
16
|
+
{
|
|
17
|
+
with: { type: 'json' },
|
|
18
|
+
}
|
|
19
|
+
);
|
|
23
20
|
return {
|
|
24
21
|
json: async () => json,
|
|
25
22
|
status: json?.error ? 500 : 204,
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import util from 'util';
|
|
3
|
-
import { resolve } from 'path';
|
|
4
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
5
2
|
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
const { PAYREXX_API_MOCKS_PATH } = process.env;
|
|
3
|
+
const { MOCK_APIS } = process.env;
|
|
9
4
|
|
|
10
5
|
const logger = createLogger('unchained:payrexx');
|
|
11
6
|
|
|
@@ -14,17 +9,19 @@ export default (
|
|
|
14
9
|
instance: string = null,
|
|
15
10
|
secret: string = null,
|
|
16
11
|
): ((path: string, method: 'GET' | 'DELETE' | 'PUT' | 'POST', data?: any) => Promise<Response>) => {
|
|
17
|
-
if (
|
|
12
|
+
if (MOCK_APIS) {
|
|
18
13
|
return async (path): Promise<Response> => {
|
|
19
14
|
try {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
const { default: jsonData } = await import(
|
|
16
|
+
`${import.meta.dirname}/../../../../tests/mock/payrexx/${path}.json`,
|
|
17
|
+
{
|
|
18
|
+
with: { type: 'json' },
|
|
19
|
+
}
|
|
20
|
+
);
|
|
24
21
|
return {
|
|
25
22
|
json: async () => jsonData,
|
|
26
|
-
text: async () =>
|
|
27
|
-
ok:
|
|
23
|
+
text: async () => JSON.stringify(jsonData?.error),
|
|
24
|
+
ok: true,
|
|
28
25
|
status: jsonData?.error ? 500 : 204,
|
|
29
26
|
} as any;
|
|
30
27
|
} catch (error) {
|
|
@@ -18,7 +18,7 @@ export const initStripeClient = async (): Promise<StripeType> => {
|
|
|
18
18
|
// @ts-ignore
|
|
19
19
|
const { default: Stripe } = await import('stripe');
|
|
20
20
|
stripe = new Stripe(STRIPE_SECRET, {
|
|
21
|
-
apiVersion: '2024-
|
|
21
|
+
apiVersion: '2024-12-18.acacia',
|
|
22
22
|
});
|
|
23
23
|
return stripe;
|
|
24
24
|
};
|
package/src/worker/email.ts
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
import { mkdtemp, writeFile } from 'fs/promises';
|
|
2
|
-
import { join, isAbsolute } from 'path';
|
|
3
|
-
import { tmpdir } from 'os';
|
|
4
1
|
import { WorkerDirector, WorkerAdapter, IWorkerAdapter } from '@unchainedshop/core';
|
|
5
|
-
import open from 'open';
|
|
6
2
|
import nodemailer from 'nodemailer';
|
|
7
3
|
|
|
8
4
|
export const checkEmailInterceptionEnabled = () => {
|
|
9
5
|
return process.env.NODE_ENV !== 'production' && !process.env.UNCHAINED_DISABLE_EMAIL_INTERCEPTION;
|
|
10
6
|
};
|
|
11
7
|
|
|
12
|
-
const buildLink = ({ filename, content, href, contentType, encoding, path }) => {
|
|
8
|
+
const buildLink = async ({ filename, content, href, contentType, encoding, path }) => {
|
|
13
9
|
if (path) {
|
|
14
|
-
return `<a href="
|
|
10
|
+
return `<a href="file:/${path.startsWith('/') ? path : `${process.cwd()}/${path}`}">${filename}</a>`;
|
|
15
11
|
}
|
|
16
12
|
if (href) {
|
|
17
13
|
return `<a href="${href}">${filename}</a>`;
|
|
@@ -23,8 +19,12 @@ const buildLink = ({ filename, content, href, contentType, encoding, path }) =>
|
|
|
23
19
|
};
|
|
24
20
|
|
|
25
21
|
const openInBrowser = async (options) => {
|
|
26
|
-
|
|
22
|
+
// eslint-disable-next-line
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
const { default: open, apps } = await import('open');
|
|
25
|
+
|
|
27
26
|
const messageBody = options.html || options.text.replace(/(\r\n|\n|\r)/gm, '<br/>');
|
|
27
|
+
const attachmentLinks = await Promise.all((options.attachments || []).map(buildLink));
|
|
28
28
|
const content = `
|
|
29
29
|
<!DOCTYPE html>
|
|
30
30
|
<html lang="en" xmlns="https://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
|
@@ -40,16 +40,17 @@ const openInBrowser = async (options) => {
|
|
|
40
40
|
<b>Reply-To: </b>${options.replyTo}<br/>
|
|
41
41
|
<br/>
|
|
42
42
|
<b>subject: </b>${options.subject}<br/>
|
|
43
|
-
<b>attachments: </b>${
|
|
43
|
+
<b>attachments: </b>${attachmentLinks.join(', ')}<br/>
|
|
44
44
|
<hr/>
|
|
45
45
|
${messageBody}
|
|
46
46
|
</body>
|
|
47
47
|
</html>`;
|
|
48
48
|
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
const base64 = Buffer.from(content).toString('base64');
|
|
50
|
+
const dataUri = `data:text/html;base64,${base64}`;
|
|
51
|
+
|
|
52
|
+
await open(dataUri, { app: [{ name: apps.chrome }, { name: apps.firefox }, { name: apps.browser }] });
|
|
53
|
+
return true;
|
|
53
54
|
};
|
|
54
55
|
|
|
55
56
|
const EmailWorkerPlugin: IWorkerAdapter<
|
|
@@ -87,8 +88,12 @@ const EmailWorkerPlugin: IWorkerAdapter<
|
|
|
87
88
|
...rest,
|
|
88
89
|
};
|
|
89
90
|
if (checkEmailInterceptionEnabled()) {
|
|
90
|
-
await openInBrowser(sendMailOptions);
|
|
91
|
-
return {
|
|
91
|
+
const opened = await openInBrowser(sendMailOptions);
|
|
92
|
+
return {
|
|
93
|
+
success: opened,
|
|
94
|
+
result: opened ? { intercepted: true } : undefined,
|
|
95
|
+
error: !opened ? { message: "Interception failed due to missing package 'open'" } : undefined,
|
|
96
|
+
};
|
|
92
97
|
}
|
|
93
98
|
if (!process.env.MAIL_URL) {
|
|
94
99
|
return {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"transactionId": "payment_alias_authorized",
|
|
3
|
+
"type": "payment",
|
|
4
|
+
"status": "authorized",
|
|
5
|
+
"currency": "CHF",
|
|
6
|
+
"refno": "MTExMTExMjIyMjI=",
|
|
7
|
+
"refno2": "user",
|
|
8
|
+
"paymentMethod": "VIS",
|
|
9
|
+
"detail": {
|
|
10
|
+
"authorize": {
|
|
11
|
+
"amount": 30000,
|
|
12
|
+
"acquirerAuthorizationCode": "131704"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"language": "de",
|
|
16
|
+
"card": {
|
|
17
|
+
"alias": "70119122433810042",
|
|
18
|
+
"masked": "424242xxxxxx4242",
|
|
19
|
+
"expiryMonth": "12",
|
|
20
|
+
"expiryYear": "21",
|
|
21
|
+
"info": {
|
|
22
|
+
"brand": "VISA CREDIT",
|
|
23
|
+
"type": "credit",
|
|
24
|
+
"usage": "consumer",
|
|
25
|
+
"country": "GB",
|
|
26
|
+
"issuer": "DATATRANS"
|
|
27
|
+
},
|
|
28
|
+
"3D": {
|
|
29
|
+
"authenticationResponse": "D"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"history": [
|
|
33
|
+
{
|
|
34
|
+
"action": "init",
|
|
35
|
+
"source": "api",
|
|
36
|
+
"date": "2021-09-03T11:16:50Z",
|
|
37
|
+
"success": true,
|
|
38
|
+
"ip": "212.232.234.26"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"action": "authorize",
|
|
42
|
+
"source": "redirect",
|
|
43
|
+
"date": "2021-09-03T11:17:04Z",
|
|
44
|
+
"success": true,
|
|
45
|
+
"ip": "212.232.234.26"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"transactionId": "card_check_authorized",
|
|
3
|
+
"type": "card_check",
|
|
4
|
+
"status": "authorized",
|
|
5
|
+
"currency": "CHF",
|
|
6
|
+
"refno": "ZDRkNGQ0ZDRkNA==",
|
|
7
|
+
"refno2": "user",
|
|
8
|
+
"paymentMethod": "VIS",
|
|
9
|
+
"detail": {
|
|
10
|
+
"authorize": {
|
|
11
|
+
"acquirerAuthorizationCode": "131704"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"language": "de",
|
|
15
|
+
"card": {
|
|
16
|
+
"alias": "70119122433810042",
|
|
17
|
+
"masked": "424242xxxxxx4242",
|
|
18
|
+
"expiryMonth": "12",
|
|
19
|
+
"expiryYear": "21",
|
|
20
|
+
"info": {
|
|
21
|
+
"brand": "VISA CREDIT",
|
|
22
|
+
"type": "credit",
|
|
23
|
+
"usage": "consumer",
|
|
24
|
+
"country": "GB",
|
|
25
|
+
"issuer": "DATATRANS"
|
|
26
|
+
},
|
|
27
|
+
"3D": {
|
|
28
|
+
"authenticationResponse": "D"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"history": [
|
|
32
|
+
{
|
|
33
|
+
"action": "init",
|
|
34
|
+
"source": "api",
|
|
35
|
+
"date": "2021-09-03T11:16:50Z",
|
|
36
|
+
"success": true,
|
|
37
|
+
"ip": "212.232.234.26"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"action": "authorize",
|
|
41
|
+
"source": "redirect",
|
|
42
|
+
"date": "2021-09-03T11:17:04Z",
|
|
43
|
+
"success": true,
|
|
44
|
+
"ip": "212.232.234.26"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"transactionId": "payment_authorized",
|
|
3
|
+
"type": "payment",
|
|
4
|
+
"status": "authorized",
|
|
5
|
+
"currency": "CHF",
|
|
6
|
+
"refno": "MTExMTExMjIyMjI=",
|
|
7
|
+
"refno2": "user",
|
|
8
|
+
"paymentMethod": "VIS",
|
|
9
|
+
"detail": {
|
|
10
|
+
"authorize": {
|
|
11
|
+
"amount": 10000,
|
|
12
|
+
"acquirerAuthorizationCode": "131704"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"language": "de",
|
|
16
|
+
"card": {
|
|
17
|
+
"alias": "70119122433810042",
|
|
18
|
+
"masked": "424242xxxxxx4242",
|
|
19
|
+
"expiryMonth": "12",
|
|
20
|
+
"expiryYear": "21",
|
|
21
|
+
"info": {
|
|
22
|
+
"brand": "VISA CREDIT",
|
|
23
|
+
"type": "credit",
|
|
24
|
+
"usage": "consumer",
|
|
25
|
+
"country": "GB",
|
|
26
|
+
"issuer": "DATATRANS"
|
|
27
|
+
},
|
|
28
|
+
"3D": {
|
|
29
|
+
"authenticationResponse": "D"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"history": [
|
|
33
|
+
{
|
|
34
|
+
"action": "init",
|
|
35
|
+
"source": "api",
|
|
36
|
+
"date": "2021-09-03T11:16:50Z",
|
|
37
|
+
"success": true,
|
|
38
|
+
"ip": "212.232.234.26"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"action": "authorize",
|
|
42
|
+
"source": "redirect",
|
|
43
|
+
"date": "2021-09-03T11:17:04Z",
|
|
44
|
+
"success": true,
|
|
45
|
+
"ip": "212.232.234.26"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"transactionId": "payment_authorized",
|
|
3
|
+
"type": "payment",
|
|
4
|
+
"status": "authorized",
|
|
5
|
+
"currency": "CHF",
|
|
6
|
+
"refno": "MTExMTExMjIyMjI=",
|
|
7
|
+
"refno2": "user",
|
|
8
|
+
"paymentMethod": "VIS",
|
|
9
|
+
"detail": {
|
|
10
|
+
"authorize": {
|
|
11
|
+
"amount": 30000,
|
|
12
|
+
"acquirerAuthorizationCode": "131704"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"language": "de",
|
|
16
|
+
"card": {
|
|
17
|
+
"alias": "70119122433810042",
|
|
18
|
+
"masked": "424242xxxxxx4242",
|
|
19
|
+
"expiryMonth": "12",
|
|
20
|
+
"expiryYear": "21",
|
|
21
|
+
"info": {
|
|
22
|
+
"brand": "VISA CREDIT",
|
|
23
|
+
"type": "credit",
|
|
24
|
+
"usage": "consumer",
|
|
25
|
+
"country": "GB",
|
|
26
|
+
"issuer": "DATATRANS"
|
|
27
|
+
},
|
|
28
|
+
"3D": {
|
|
29
|
+
"authenticationResponse": "D"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"history": [
|
|
33
|
+
{
|
|
34
|
+
"action": "init",
|
|
35
|
+
"source": "api",
|
|
36
|
+
"date": "2021-09-03T11:16:50Z",
|
|
37
|
+
"success": true,
|
|
38
|
+
"ip": "212.232.234.26"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"action": "authorize",
|
|
42
|
+
"source": "redirect",
|
|
43
|
+
"date": "2021-09-03T11:17:04Z",
|
|
44
|
+
"success": true,
|
|
45
|
+
"ip": "212.232.234.26"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"transactionId": "payment_authorized",
|
|
3
|
+
"type": "payment",
|
|
4
|
+
"status": "authorized",
|
|
5
|
+
"currency": "CHF",
|
|
6
|
+
"refno": "MTExMTExMjIyMjI=",
|
|
7
|
+
"refno2": "user",
|
|
8
|
+
"paymentMethod": "VIS",
|
|
9
|
+
"detail": {
|
|
10
|
+
"authorize": {
|
|
11
|
+
"amount": 200,
|
|
12
|
+
"acquirerAuthorizationCode": "131704"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"language": "de",
|
|
16
|
+
"card": {
|
|
17
|
+
"alias": "70119122433810042",
|
|
18
|
+
"masked": "424242xxxxxx4242",
|
|
19
|
+
"expiryMonth": "12",
|
|
20
|
+
"expiryYear": "21",
|
|
21
|
+
"info": {
|
|
22
|
+
"brand": "VISA CREDIT",
|
|
23
|
+
"type": "credit",
|
|
24
|
+
"usage": "consumer",
|
|
25
|
+
"country": "GB",
|
|
26
|
+
"issuer": "DATATRANS"
|
|
27
|
+
},
|
|
28
|
+
"3D": {
|
|
29
|
+
"authenticationResponse": "D"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"history": [
|
|
33
|
+
{
|
|
34
|
+
"action": "init",
|
|
35
|
+
"source": "api",
|
|
36
|
+
"date": "2021-09-03T11:16:50Z",
|
|
37
|
+
"success": true,
|
|
38
|
+
"ip": "212.232.234.26"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"action": "authorize",
|
|
42
|
+
"source": "redirect",
|
|
43
|
+
"date": "2021-09-03T11:17:04Z",
|
|
44
|
+
"success": true,
|
|
45
|
+
"ip": "212.232.234.26"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"data": [
|
|
3
|
+
{
|
|
4
|
+
"amount": 30000,
|
|
5
|
+
"applicationFee": 0,
|
|
6
|
+
"createdAt": 1712144500,
|
|
7
|
+
"currency": "CHF",
|
|
8
|
+
"fields": [],
|
|
9
|
+
"hash": "8abaa0dd004e00ace22a85b93a2c5a3a",
|
|
10
|
+
"id": 15484649,
|
|
11
|
+
"invoices": [
|
|
12
|
+
{
|
|
13
|
+
"amount": 30000,
|
|
14
|
+
"currency": "CHF",
|
|
15
|
+
"discount": {
|
|
16
|
+
"amount": 0,
|
|
17
|
+
"code": null,
|
|
18
|
+
"percentage": null
|
|
19
|
+
},
|
|
20
|
+
"googleAnalyticProducts": [
|
|
21
|
+
{
|
|
22
|
+
"item_id": 18749023,
|
|
23
|
+
"item_name": "Unchained%20%23417c7af72c8e7579a5017397",
|
|
24
|
+
"price": 215.8,
|
|
25
|
+
"quantity": 1
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"number": "Unchained%20%23417c7af72c8e7579a5017397",
|
|
29
|
+
"paymentLink": {
|
|
30
|
+
"email": "",
|
|
31
|
+
"hash": "8abaa0dd004e00ace22a85b93a2c5a3a",
|
|
32
|
+
"referenceId": "1111112222"
|
|
33
|
+
},
|
|
34
|
+
"paymentRequestId": 15484649,
|
|
35
|
+
"products": [
|
|
36
|
+
{
|
|
37
|
+
"name": "Unchained%20%23417c7af72c8e7579a5017397",
|
|
38
|
+
"price": 30000,
|
|
39
|
+
"quantity": 1,
|
|
40
|
+
"sku": null,
|
|
41
|
+
"vatRate": null
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"referenceId": "1111112222",
|
|
45
|
+
"shippingAmount": null,
|
|
46
|
+
"test": 1,
|
|
47
|
+
"transactions": [
|
|
48
|
+
{
|
|
49
|
+
"amount": 30000,
|
|
50
|
+
"contact": {
|
|
51
|
+
"company": "",
|
|
52
|
+
"country": "",
|
|
53
|
+
"countryISO": "",
|
|
54
|
+
"date_of_birth": "",
|
|
55
|
+
"delivery_company": "",
|
|
56
|
+
"delivery_country": "",
|
|
57
|
+
"delivery_countryISO": "",
|
|
58
|
+
"delivery_firstname": "",
|
|
59
|
+
"delivery_lastname": "",
|
|
60
|
+
"delivery_place": "",
|
|
61
|
+
"delivery_street": "",
|
|
62
|
+
"delivery_title": "",
|
|
63
|
+
"delivery_zip": "",
|
|
64
|
+
"email": "",
|
|
65
|
+
"firstname": "",
|
|
66
|
+
"id": 7571542,
|
|
67
|
+
"lastname": "",
|
|
68
|
+
"phone": "",
|
|
69
|
+
"place": "",
|
|
70
|
+
"street": "",
|
|
71
|
+
"title": "",
|
|
72
|
+
"uuid": "b5b27055",
|
|
73
|
+
"zip": ""
|
|
74
|
+
},
|
|
75
|
+
"id": 14263484,
|
|
76
|
+
"lang": "de",
|
|
77
|
+
"metadata": [],
|
|
78
|
+
"mode": "TEST",
|
|
79
|
+
"pageUuid": null,
|
|
80
|
+
"payment": {
|
|
81
|
+
"brand": null
|
|
82
|
+
},
|
|
83
|
+
"payrexx_fee": 0,
|
|
84
|
+
"psp": "Reka",
|
|
85
|
+
"pspId": 23,
|
|
86
|
+
"referenceId": "1111112222",
|
|
87
|
+
"status": "confirmed",
|
|
88
|
+
"subscription": null,
|
|
89
|
+
"time": "2024-04-03 13:41:48",
|
|
90
|
+
"uuid": "58a18a83"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"link": "https://unchained-test.payrexx.com/?payment=8abaa0dd004e00ace22a85b93a2c5a3a",
|
|
96
|
+
"pm": [],
|
|
97
|
+
"preAuthorization": false,
|
|
98
|
+
"psp": [],
|
|
99
|
+
"referenceId": "1111112222",
|
|
100
|
+
"sku": null,
|
|
101
|
+
"status": "confirmed",
|
|
102
|
+
"vatRate": 0
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"status": "success"
|
|
106
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"data": [
|
|
3
|
+
{
|
|
4
|
+
"amount": 30000,
|
|
5
|
+
"applicationFee": 0,
|
|
6
|
+
"createdAt": 1712144500,
|
|
7
|
+
"currency": "CHF",
|
|
8
|
+
"fields": [],
|
|
9
|
+
"hash": "8abaa0dd004e00ace22a85b93a2c5a3a",
|
|
10
|
+
"id": 15484649,
|
|
11
|
+
"invoices": [],
|
|
12
|
+
"link": "https://unchained-test.payrexx.com/?payment=8abaa0dd004e00ace22a85b93a2c5a3a",
|
|
13
|
+
"pm": [],
|
|
14
|
+
"preAuthorization": false,
|
|
15
|
+
"psp": [],
|
|
16
|
+
"referenceId": "1111112222",
|
|
17
|
+
"requestId": 15551049,
|
|
18
|
+
"sku": null,
|
|
19
|
+
"status": "waiting",
|
|
20
|
+
"vatRate": 0
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"status": "success"
|
|
24
|
+
}
|