Skip to content

Commit 9e36e9c

Browse files
Merge pull request #1126 from Adyen/automation/release
Release v21.4.0
2 parents ba706cf + fdf5905 commit 9e36e9c

File tree

95 files changed

+9593
-1543
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+9593
-1543
lines changed

Diff for: .github/workflows/codeql-analysis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313

1414
steps:
1515
- name: Checkout repository
16-
uses: actions/checkout@v3
16+
uses: actions/checkout@v4
1717
with:
1818
# We must fetch at least the immediate parents so that if this is
1919
# a pull request then we can checkout the head.

Diff for: .github/workflows/coveralls.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
runs-on: ubuntu-latest
99

1010
steps:
11-
- uses: actions/checkout@v3
11+
- uses: actions/checkout@v4
1212
- name: Set up JDK 11
1313
uses: actions/setup-java@v3
1414
with:

Diff for: .github/workflows/javaci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
matrix:
1010
java: [ '11', '17', '20' ]
1111
steps:
12-
- uses: actions/checkout@v3
12+
- uses: actions/checkout@v4
1313
- name: Set up JDK ${{ matrix.Java }}
1414
uses: actions/setup-java@v3
1515

Diff for: .github/workflows/models.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
runs-on: ubuntu-latest
88
name: Generate Models
99
steps:
10-
- uses: actions/checkout@v3
10+
- uses: actions/checkout@v4
1111
- run: make models
1212
- name: Set PR variables
1313
id: vars

Diff for: .github/workflows/publish.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
build:
99
runs-on: ubuntu-latest
1010
steps:
11-
- uses: actions/checkout@v3
11+
- uses: actions/checkout@v4
1212
- name: Set up JDK 11
1313
uses: actions/setup-java@v3
1414
with:

Diff for: .github/workflows/services.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
runs-on: ubuntu-latest
88
name: Generate Models + Services
99
steps:
10-
- uses: actions/checkout@v3
10+
- uses: actions/checkout@v4
1111
- run: make services
1212
- name: Set PR variables
1313
id: vars

Diff for: README.md

+197-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ You can use Maven and add this dependency to your project's POM:
5858
<dependency>
5959
<groupId>com.adyen</groupId>
6060
<artifactId>adyen-java-api-library</artifactId>
61-
<version>21.3.0</version>
61+
<version>21.4.0</version>
6262
</dependency>
6363
```
6464

@@ -224,6 +224,202 @@ System.setProperty("https.proxyUser", "squid");
224224
System.setProperty("https.proxyPassword", "ward");
225225
~~~~
226226

227+
## Using the Cloud Terminal API Integration
228+
In order to submit In-Person requests with [Terminal API over Cloud](https://docs.adyen.com/point-of-sale/design-your-integration/choose-your-architecture/cloud/) you need to initialize the client in a similar way as the steps listed above for Ecommerce transactions, but make sure to include `TerminalCloudAPI`:
229+
``` java
230+
// Step 1: Import the required classes
231+
import com.adyen.Client;
232+
import com.adyen.enums.Environment;
233+
import com.adyen.service.TerminalCloudAPI;
234+
import com.adyen.model.nexo.*;
235+
import com.adyen.model.terminal.*;
236+
237+
// Step 2: Initialize the client object
238+
Client client = new Client("Your YOUR_API_KEY", Environment.TEST);
239+
240+
// Step 3: Initialize the API object
241+
TerminalCloudAPI terminalCloudApi = new TerminalCloudAPI(client);
242+
243+
// Step 4: Create the request object
244+
String serviceID = "123456789";
245+
String saleID = "POS-SystemID12345";
246+
String POIID = "Your Device Name(eg V400m-123456789)";
247+
248+
// Use a unique transaction for every other transaction you perform
249+
String transactionID = "TransactionID";
250+
TerminalAPIRequest terminalAPIRequest = new TerminalAPIRequest();
251+
SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
252+
253+
MessageHeader messageHeader = new MessageHeader();
254+
messageHeader.setMessageClass(MessageClassType.SERVICE);
255+
messageHeader.setMessageCategory(MessageCategoryType.PAYMENT);
256+
messageHeader.setMessageType(MessageType.REQUEST);
257+
messageHeader.setProtocolVersion("3.0");
258+
messageHeader.setServiceID(serviceID);
259+
messageHeader.setSaleID(saleID);
260+
messageHeader.setPOIID(POIID);
261+
262+
saleToPOIRequest.setMessageHeader(messageHeader);
263+
264+
com.adyen.model.nexo.PaymentRequest paymentRequest = new com.adyen.model.nexo.PaymentRequest();
265+
SaleData saleData = new SaleData();
266+
TransactionIdentification transactionIdentification = new TransactionIdentification();
267+
transactionIdentification.setTransactionID("001");
268+
XMLGregorianCalendar timestamp = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
269+
transactionIdentification.setTimeStamp(timestamp);
270+
saleData.setSaleTransactionID(transactionIdentification);
271+
272+
SaleToAcquirerData saleToAcquirerData = new SaleToAcquirerData();
273+
ApplicationInfo applicationInfo = new ApplicationInfo();
274+
CommonField merchantApplication = new CommonField();
275+
merchantApplication.setVersion("1");
276+
merchantApplication.setName("Test");
277+
applicationInfo.setMerchantApplication(merchantApplication);
278+
saleToAcquirerData.setApplicationInfo(applicationInfo);
279+
saleData.setSaleToAcquirerData(saleToAcquirerData);
280+
281+
PaymentTransaction paymentTransaction = new PaymentTransaction();
282+
AmountsReq amountsReq = new AmountsReq();
283+
amountsReq.setCurrency("EUR");
284+
amountsReq.setRequestedAmount(BigDecimal.valueOf(1000));
285+
paymentTransaction.setAmountsReq(amountsReq);
286+
287+
paymentRequest.setPaymentTransaction(paymentTransaction);
288+
paymentRequest.setSaleData(saleData);
289+
290+
saleToPOIRequest.setPaymentRequest(paymentRequest);
291+
292+
terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
293+
294+
// Step 5: Make the request
295+
TerminalAPIResponse terminalAPIResponse = terminalCloudApi.sync(terminalAPIRequest);
296+
```
297+
298+
### Optional: perform an abort request
299+
300+
To perform an [abort request](https://docs.adyen.com/point-of-sale/basic-tapi-integration/cancel-a-transaction/) you can use the following example:
301+
``` java
302+
TerminalAPIRequest terminalAPIRequest = new TerminalAPIRequest();
303+
SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
304+
305+
MessageHeader messageHeader = new MessageHeader();
306+
messageHeader.setMessageClass(MessageClassType.SERVICE);
307+
messageHeader.setMessageCategory(MessageCategoryType.ABORT);
308+
messageHeader.setMessageType(MessageType.REQUEST);
309+
messageHeader.setProtocolVersion("3.0");
310+
messageHeader.setServiceID("Different service ID");
311+
messageHeader.setSaleID(saleID);
312+
messageHeader.setPOIID(POIID);
313+
314+
AbortRequest abortRequest = new AbortRequest();
315+
abortRequest.setAbortReason("MerchantAbort");
316+
MessageReference messageReference = new MessageReference();
317+
messageReference.setMessageCategory(MessageCategoryType.PAYMENT);
318+
messageReference.setSaleID(saleID);
319+
messageReference.setPOIID(POIID);
320+
// Service ID of the payment you're aborting
321+
messageReference.setServiceID(serviceID);
322+
abortRequest.setMessageReference(messageReference);
323+
324+
saleToPOIRequest.setAbortRequest(abortRequest);
325+
saleToPOIRequest.setMessageHeader(messageHeader);
326+
327+
terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
328+
329+
TerminalAPIResponse terminalAPIResponse = terminalCloudApi.sync(terminalAPIRequest);
330+
```
331+
332+
### Optional: perform a status request
333+
334+
To perform a [status request](https://docs.adyen.com/point-of-sale/basic-tapi-integration/verify-transaction-status/) you can use the following example:
335+
```java
336+
TerminalAPIRequest terminalAPIRequest = new TerminalAPIRequest();
337+
SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
338+
339+
MessageHeader messageHeader = new MessageHeader();
340+
messageHeader.setMessageClass(MessageClassType.SERVICE);
341+
messageHeader.setMessageCategory(MessageCategoryType.TRANSACTION_STATUS);
342+
messageHeader.setMessageType(MessageType.REQUEST);
343+
messageHeader.setProtocolVersion("3.0");
344+
messageHeader.setServiceID("Different service ID");
345+
messageHeader.setSaleID(saleID);
346+
messageHeader.setPOIID(POIID);
347+
348+
TransactionStatusRequest transactionStatusRequest = new TransactionStatusRequest();
349+
transactionStatusRequest.setReceiptReprintFlag(true);
350+
transactionStatusRequest.getDocumentQualifier().add(DocumentQualifierType.CASHIER_RECEIPT);
351+
transactionStatusRequest.getDocumentQualifier().add(DocumentQualifierType.CUSTOMER_RECEIPT);
352+
MessageReference messageReference = new MessageReference();
353+
messageReference.setMessageCategory(MessageCategoryType.PAYMENT);
354+
messageReference.setSaleID(saleID);
355+
// serviceID of the transaction you want the status update from
356+
messageReference.setServiceID(serviceID);
357+
transactionStatusRequest.setMessageReference(messageReference);
358+
359+
saleToPOIRequest.setTransactionStatusRequest(transactionStatusRequest);
360+
saleToPOIRequest.setMessageHeader(messageHeader);
361+
362+
terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
363+
364+
TerminalAPIResponse terminalAPIResponse = terminalCloudApi.sync(terminalAPIRequest);
365+
```
366+
367+
## Using the Local Terminal API Integration
368+
The request and response payloads are identical to the Cloud Terminal API, however, additional encryption details are required to perform the requests.
369+
```java
370+
// Step 1: Import the required classes
371+
import com.adyen.service.TerminalLocalAPI;
372+
import com.adyen.model.nexo.*;
373+
import com.adyen.model.terminal.*;
374+
375+
// Step 2: Add your Certificate Path and Local Endpoint to the config path. Install the certificate from [here](https://docs.adyen.com/point-of-sale/choose-your-architecture/local#protect-communications).
376+
Client client = new Client();
377+
client.getConfig().setTerminalApiLocalEndpoint("The IP of your terminal (eg https://192.168.47.169)");
378+
client.getConfig().setEnvironment(Environment.TEST);
379+
client.getConfig().setTerminalCertificate("YOUR_CERTIFICATE_PATH");
380+
381+
// Step 3: Setup a security password for you terminal in CA, and import the security key object:
382+
SecurityKey securityKey = new SecurityKey();
383+
securityKey.setKeyVersion(1);
384+
securityKey.setAdyenCryptoVersion(1);
385+
securityKey.setKeyIdentifier("keyIdentifier");
386+
securityKey.setPassphrase("passphrase");
387+
388+
// Step 4 Initialize the API object
389+
TerminalLocalAPI terminalLocalAPI = new TerminalLocalAPI(client, securityKey);
390+
391+
// Step 5: Create the request object
392+
TerminalAPIRequest terminalAPIRequest = ///....same as the one used for Cloud API ;
393+
394+
// Step 6: Make the request
395+
TerminalAPIResponse terminalAPIResponse = terminalLocalApi.request(terminalAPIRequest);
396+
```
397+
398+
## Using the Local Terminal API Integration without Encryption (Only on TEST)
399+
If you wish to develop the Local Terminal API integration parallel to your encryption implementation, you can opt for the unencrypted version. Be sure to remove any encryption details from the CA terminal config page.
400+
```java
401+
// Step 1: Import the required classes
402+
import com.adyen.service.TerminalLocalAPIUnencrypted;
403+
import com.adyen.model.nexo.*;
404+
import com.adyen.model.terminal.*;
405+
406+
// Step 2: Add your Certificate Path and Local Endpoint to the config path.
407+
Client client = new Client();
408+
client.getConfig().setTerminalApiLocalEndpoint("The IP of your terminal (eg https://192.168.47.169)");
409+
client.getConfig().setEnvironment(Environment.TEST);
410+
client.getConfig().setTerminalCertificate("YOUR_CERTIFICATE_PATH");
411+
412+
// Step 3 Initialize the client and the API objects;
413+
TerminalLocalAPIUnencrypted terminalLocalAPIUnencrypted = new TerminalLocalAPIUnencrypted(client);
414+
415+
// Step 4: Create the request object
416+
TerminalAPIRequest terminalAPIPaymentRequest = ///....same as the one used in the other examples;
417+
418+
// Step 5: Make the request
419+
TerminalAPIResponse terminalAPIResponse = terminalLocalAPIUnencrypted.request(terminalAPIPaymentRequest);
420+
```
421+
422+
227423
### Example integrations
228424

229425
For a closer look at how our Java library works, you can clone one of our example integrations:

Diff for: pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<groupId>com.adyen</groupId>
55
<artifactId>adyen-java-api-library</artifactId>
66
<packaging>jar</packaging>
7-
<version>21.3.0</version>
7+
<version>21.4.0</version>
88
<name>Adyen Java API Library</name>
99
<description>Adyen API Client Library for Java</description>
1010
<url>https://github.com/adyen/adyen-java-api-library</url>
@@ -104,7 +104,7 @@
104104
<configuration>
105105
<source>8</source>
106106
</configuration>
107-
<version>3.5.0</version>
107+
<version>3.6.0</version>
108108
<executions>
109109
<execution>
110110
<id>attach-javadocs</id>
@@ -230,7 +230,7 @@
230230
<dependency>
231231
<groupId>io.swagger.core.v3</groupId>
232232
<artifactId>swagger-annotations</artifactId>
233-
<version>2.2.15</version>
233+
<version>2.2.16</version>
234234
<scope>compile</scope>
235235
</dependency>
236236
<dependency>

Diff for: src/main/java/com/adyen/Client.java

+1-21
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,3 @@
1-
/*
2-
* ######
3-
* ######
4-
* ############ ####( ###### #####. ###### ############ ############
5-
* ############# #####( ###### #####. ###### ############# #############
6-
* ###### #####( ###### #####. ###### ##### ###### ##### ######
7-
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
8-
* ###### ###### #####( ###### #####. ###### ##### ##### ######
9-
* ############# ############# ############# ############# ##### ######
10-
* ############ ############ ############# ############ ##### ######
11-
* ######
12-
* #############
13-
* ############
14-
*
15-
* Adyen Java API Library
16-
*
17-
* Copyright (c) 2021 Adyen B.V.
18-
* This file is open source and available under the MIT license.
19-
* See the LICENSE file for more info.
20-
*/
211
package com.adyen;
222

233
import com.adyen.enums.Environment;
@@ -31,7 +11,7 @@ public class Client {
3111
private ClientInterface httpClient;
3212
private Config config;
3313
public static final String LIB_NAME = "adyen-java-api-library";
34-
public static final String LIB_VERSION = "21.3.0";
14+
public static final String LIB_VERSION = "21.4.0";
3515
public static final String TERMINAL_API_ENDPOINT_TEST = "https://terminal-api-test.adyen.com";
3616
public static final String TERMINAL_API_ENDPOINT_LIVE = "https://terminal-api-live.adyen.com";
3717

Diff for: src/main/java/com/adyen/Config.java

-20
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,3 @@
1-
/*
2-
* ######
3-
* ######
4-
* ############ ####( ###### #####. ###### ############ ############
5-
* ############# #####( ###### #####. ###### ############# #############
6-
* ###### #####( ###### #####. ###### ##### ###### ##### ######
7-
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
8-
* ###### ###### #####( ###### #####. ###### ##### ##### ######
9-
* ############# ############# ############# ############# ##### ######
10-
* ############ ############ ############# ############ ##### ######
11-
* ######
12-
* #############
13-
* ############
14-
*
15-
* Adyen Java API Library
16-
*
17-
* Copyright (c) 2018 Adyen B.V.
18-
* This file is open source and available under the MIT license.
19-
* See the LICENSE file for more info.
20-
*/
211
package com.adyen;
222

233
import com.adyen.enums.Environment;

0 commit comments

Comments
 (0)