@@ -58,7 +58,7 @@ You can use Maven and add this dependency to your project's POM:
58
58
<dependency>
59
59
<groupId>com.adyen</groupId>
60
60
<artifactId>adyen-java-api-library</artifactId>
61
- <version>21.3 .0</version>
61
+ <version>21.4 .0</version>
62
62
</dependency>
63
63
```
64
64
@@ -224,6 +224,202 @@ System.setProperty("https.proxyUser", "squid");
224
224
System . setProperty(" https.proxyPassword" , " ward" );
225
225
~~~~
226
226
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
+
227
423
### Example integrations
228
424
229
425
For a closer look at how our Java library works, you can clone one of our example integrations:
0 commit comments