This allows Adyen's POS terminals to be used in the POS. The architecture is as follows: Odoo <--> Adyen server <--> Adyen payment terminal It means we don't have to communicate directly with the terminal. Instead we send HTTP requests to Adyen's API and they take care of the rest. Therefore this integration doesn't require an IOTBox. Unfortunately this module is more complicated than it needed to be due to Adyen's API not supporting CORS. Because of this we can't directly call their API from JS. Instead we need to proxy requests through the Odoo backend. This complicates things further because this means we can't use their synchronous API. With this API an HTTP request remains open for the entire duration of a transaction. We can't afford to block an HTTP worker this long. So this implements their asynchronous API which calls us back when a transaction completes. In addition to the regular sale requests we also poll the status of the terminal using DiagnosisRequests while transactions are in progress. This is to handle cases where a payment terminal loses connection after a payment transaction is initiated. It also handles cases where a terminal was recently disconnected (<1 min). In this last case Adyen will process the payment request as usual, without notifying us the terminal is offline. It's important to notify the POS user to check the terminal, otherwise he'll have no idea something is wrong. We store the DiagnosisResponse's unique ID and every time the POS requests a status update we launch a new DiagnosisRequest. When we no longer receive DiagnosisResponse ID updates we can notify the user of this in the POS. To test this locally use something like ngrok so Adyen can call you back. API docs: https://docs.adyen.com/point-of-sale https://www.odoo.com/web#id=1981799&model=project.task&view_type=form&menu_id=
6 lines
139 B
Python
6 lines
139 B
Python
# coding: utf-8
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from . import models
|
|
from . import controllers
|