@unchainedshop/plugins 3.0.0-rc5 → 3.0.0-rc7

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 (57) hide show
  1. package/lib/events/node-event-emitter.js +1 -1
  2. package/lib/events/node-event-emitter.js.map +1 -1
  3. package/lib/files/gridfs/gridfs-adapter.d.ts +7 -1
  4. package/lib/files/gridfs/gridfs-adapter.d.ts.map +1 -1
  5. package/lib/files/gridfs/gridfs-adapter.js +2 -3
  6. package/lib/files/gridfs/gridfs-adapter.js.map +1 -1
  7. package/lib/files/gridfs/gridfs-webhook.js +2 -2
  8. package/lib/files/gridfs/gridfs-webhook.js.map +1 -1
  9. package/lib/files/gridfs/index.d.ts +1 -0
  10. package/lib/files/gridfs/index.d.ts.map +1 -1
  11. package/lib/files/minio/minio-adapter.d.ts.map +1 -1
  12. package/lib/files/minio/minio-adapter.js +6 -23
  13. package/lib/files/minio/minio-adapter.js.map +1 -1
  14. package/lib/payment/apple-iap/adapter.js +1 -1
  15. package/lib/payment/apple-iap/adapter.js.map +1 -1
  16. package/lib/payment/datatrans-v2/api/makeFetcher.d.ts.map +1 -1
  17. package/lib/payment/datatrans-v2/api/makeFetcher.js +5 -9
  18. package/lib/payment/datatrans-v2/api/makeFetcher.js.map +1 -1
  19. package/lib/payment/payrexx/api/makeFetcher.d.ts.map +1 -1
  20. package/lib/payment/payrexx/api/makeFetcher.js +7 -12
  21. package/lib/payment/payrexx/api/makeFetcher.js.map +1 -1
  22. package/lib/payment/stripe/stripe.js +1 -1
  23. package/lib/worker/email.d.ts.map +1 -1
  24. package/lib/worker/email.js +17 -14
  25. package/lib/worker/email.js.map +1 -1
  26. package/package.json +19 -16
  27. package/src/events/node-event-emitter.ts +1 -1
  28. package/src/files/gridfs/gridfs-adapter.ts +14 -7
  29. package/src/files/gridfs/gridfs-webhook.ts +2 -2
  30. package/src/files/gridfs/index.ts +2 -0
  31. package/src/files/minio/minio-adapter.ts +7 -26
  32. package/src/payment/apple-iap/adapter.ts +1 -1
  33. package/src/payment/datatrans-v2/api/makeFetcher.ts +8 -11
  34. package/src/payment/payrexx/api/makeFetcher.ts +10 -13
  35. package/src/payment/stripe/stripe.ts +1 -1
  36. package/src/worker/email.ts +19 -14
  37. package/tests/mock/datatrans/v1/secure-fields.json +4 -0
  38. package/tests/mock/datatrans/v1/transactions/authorize.json +48 -0
  39. package/tests/mock/datatrans/v1/transactions/card_check_authorized.json +47 -0
  40. package/tests/mock/datatrans/v1/transactions/payment_alias_authorized/settle.json +1 -0
  41. package/tests/mock/datatrans/v1/transactions/payment_alias_authorized.json +48 -0
  42. package/tests/mock/datatrans/v1/transactions/payment_authorized/cancel.json +1 -0
  43. package/tests/mock/datatrans/v1/transactions/payment_authorized/settle.json +1 -0
  44. package/tests/mock/datatrans/v1/transactions/payment_authorized.json +48 -0
  45. package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount/cancel.json +1 -0
  46. package/tests/mock/datatrans/v1/transactions/payment_authorized_low_amount.json +48 -0
  47. package/tests/mock/datatrans/v1/transactions/validate.json +1 -0
  48. package/tests/mock/datatrans/v1/transactions.json +4 -0
  49. package/tests/mock/payrexx/Gateway/1000001.json +106 -0
  50. package/tests/mock/payrexx/Gateway.json +24 -0
  51. package/tests/mock/payrexx/transaction_example1.json +65 -0
  52. package/tests/mock/payrexx/transaction_example2.json +65 -0
  53. package/tests/mock/payrexx/transaction_example3.json +94 -0
  54. package/lib/payment/datatrans-v2/generateSignature copy.d.ts +0 -11
  55. package/lib/payment/datatrans-v2/generateSignature copy.d.ts.map +0 -1
  56. package/lib/payment/datatrans-v2/generateSignature copy.js +0 -19
  57. package/lib/payment/datatrans-v2/generateSignature copy.js.map +0 -1
@@ -1,7 +1,5 @@
1
- import https from 'https';
2
- import http, { OutgoingHttpHeaders } from 'http';
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 stream = await createHttpDownloadStream(fileLink, headers);
215
- const type = mimeType.lookup(fileName) || stream.headers['content-type'];
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
- stream,
205
+ readable,
225
206
  undefined,
226
207
  metaData,
227
208
  );
@@ -63,7 +63,7 @@ const fixPeriods = async (
63
63
  orderId: transaction.transaction_id === transactionId ? orderId : null,
64
64
  };
65
65
  })
66
- .sort((left, right) => {
66
+ .toSorted((left, right) => {
67
67
  return left.end.getTime() - right.end.getTime();
68
68
  });
69
69
 
@@ -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 (DATATRANS_API_MOCKS_PATH) {
11
+ if (MOCK_APIS) {
18
12
  return async (path): Promise<Response> => {
19
13
  try {
20
- const filePath = resolve(process.env.PWD, DATATRANS_API_MOCKS_PATH, `.${path}.json`);
21
- const content = await readFile(filePath);
22
- const json = JSON.parse(content.toString());
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 readFile = util.promisify(fs.readFile);
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 (PAYREXX_API_MOCKS_PATH) {
12
+ if (MOCK_APIS) {
18
13
  return async (path): Promise<Response> => {
19
14
  try {
20
- const filePath = resolve(process.env.PWD, PAYREXX_API_MOCKS_PATH, `${path}.json`);
21
- const content = await readFile(filePath);
22
- const textData = content.toString();
23
- const jsonData = JSON.parse(textData);
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 () => textData,
27
- ok: !jsonData?.error,
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-11-20.acacia',
21
+ apiVersion: '2024-12-18.acacia',
22
22
  });
23
23
  return stripe;
24
24
  };
@@ -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="${isAbsolute(path) ? path : join(process.cwd(), path)}">${filename}</a>`;
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
- const filename = `${Date.now()}.html`;
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:&nbsp;</b>${options.replyTo}<br/>
41
41
  <br/>
42
42
  <b>subject:&nbsp;</b>${options.subject}<br/>
43
- <b>attachments:&nbsp;</b>${(options.attachments || []).map(buildLink).join(',&nbsp;')}<br/>
43
+ <b>attachments:&nbsp;</b>${attachmentLinks.join(',&nbsp;')}<br/>
44
44
  <hr/>
45
45
  ${messageBody}
46
46
  </body>
47
47
  </html>`;
48
48
 
49
- const folder = await mkdtemp(join(tmpdir(), 'email-'));
50
- const fileName = `${folder}/${filename}`;
51
- await writeFile(fileName, content);
52
- return open(fileName);
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 { success: true, result: { intercepted: true } };
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,4 @@
1
+ {
2
+ "location": "https://pay.sandbox.datatrans.com/v1/start/new-transaction-secure-fields",
3
+ "transactionId": "new-transaction-secure-fields"
4
+ }
@@ -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,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,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,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,4 @@
1
+ {
2
+ "location": "https://pay.sandbox.datatrans.com/v1/start/new-transaction",
3
+ "transactionId": "new-transaction"
4
+ }
@@ -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
+ }