Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a56994f
Refactor builder architecture and modernize core infrastructure for v…
buckaroo-shu Apr 15, 2026
8b10194
feat: add usage examples for common payment methods
buckaroo-shu Apr 15, 2026
acf98cf
refactor: simplify iDEAL payment example flow
buckaroo-shu Apr 15, 2026
ee3c85a
refactor: standardize codebase with Ruff, expand builders, and add co…
ShuCh3n Apr 23, 2026
4119d13
refactor: modernize builder API and streamline transaction execution
ShuCh3n Apr 23, 2026
492600c
refactor: streamline transaction execution and simplify follow-up API
ShuCh3n Apr 28, 2026
8038268
Merge pull request #6 from buckaroo-it/develop
vildanbina Jun 30, 2026
e2e6a2d
Merge branch 'master' into BTI-27
ShuCh3n Jul 15, 2026
149a5fd
Merge branch 'develop' into BTI-27
ShuCh3n Jul 15, 2026
b1fc420
refactor: clean up imports, format code, and improve API robustness
ShuCh3n Jul 15, 2026
b7e0d19
```
ShuCh3n Jul 15, 2026
89bc353
Merge branch 'BTI-27' into BTI-977
ShuCh3n Jul 15, 2026
3f3ab9e
feat(BTI-977): add Point of Sale (POS) payment method
ShuCh3n Jul 16, 2026
09bf6d7
Merge branch 'develop' into BTI-977
ShuCh3n Jul 16, 2026
6090020
refactor(BTI-977): Remove unused CombinableService import
ShuCh3n Jul 16, 2026
cdbb2cb
feat(BTI-977): add method to merge supplementary services
ShuCh3n Jul 16, 2026
bf5728e
chore: prepare v1.0.0 release for PyPI publish
ShuCh3n Jul 20, 2026
e7622ba
Merge branch 'BTI-977' into BTI-1166
ShuCh3n Jul 20, 2026
2f725df
feat(BTI-977): add Point of Sale (POS) payment method
ShuCh3n Jul 20, 2026
d5d6204
chore(BTI-1166): apply consistent code formatting and style
ShuCh3n Jul 20, 2026
19218df
chore(BTI-1166): set release version to 0.2.0
vildanbina Jul 22, 2026
efcbdfe
test(BTI-1166): update version assertions to 0.2.0
vildanbina Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ htmlcov/
.DS_Store
__pycache__/
*.pyc
__pycache__/
*.pyo

# local environment
.env
.venv/
venv/

# logs
*.log

# type checking
.mypy_cache/
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@ All notable changes to this project will be documented in this file.

## [Released]

## [0.2.0]
- BTI-977 Add Point of Sale (POS) payment method
- BTI-22 Add Credit Management solution
- BTI-16 Add Split Payments (Marketplaces) solution
- BTI-23 Add eMandate solution (B2C + B2B)
- BTI-21 Implement instant refunds for iDEAL and Payconiq
- BTI-20 Add iDIN verification method (identify, verify, login)
- BTI-17 Add PayPerEmail example and feature test
- BTI-584 Update Klarna MOR to DataRequestKey flow
- BTI-1077 Add In3 authorize/capture flow
- BTI-721 Add Banking service (PaymentOrder payout)
- BTI-978 Add In3 route param for ABN-AMRO Achteraf Betalen

## [0.1.1]
- BTI-1091 Send the culture code as the `Culture` request header
- Add PayPerEmail builder for PaymentInvitation
Expand Down
37 changes: 37 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
- [eMandate](#emandate)
- [Split Payments](#split-payments)
- [Credit Management](#credit-management)
- [Point of Sale (POS)](#point-of-sale-pos)
- [Contribute](#contribute)
- [Versioning](#versioning)
- [Additional information](#additional-information)
Expand Down Expand Up @@ -442,6 +443,42 @@ top-level, `originalInvoiceNumber` and `Debtor` as service parameters),
See [`examples/credit_management.py`](examples/credit_management.py) for a
runnable demo of the main actions.

### Point of Sale (POS)

POS transactions are PIN-based in-store payments processed through a physical payment terminal.
You initiate the transaction via API with the terminal's unique `TerminalID`; Buckaroo routes the
request to that terminal, which prompts the customer to complete payment there. There's no
redirect flow, every request is sent with a fixed `Channel: "Web"`, set internally by the SDK.

The immediate response carries a pending/awaiting status. The final result, plus the printable
`Ticket` receipt text for the customer, arrives later via push notification.

```python
response = payments.create_payment("pospayment", {
"currency": "EUR",
"amount": 0.01,
"invoice": "TestFactuur01",
}).terminal_id("50000001").pay()

print("key:", response.key)
print("pending:", response.is_pending())
```

Parsing the push notification once the terminal completes the transaction push bodies wrap the
transaction under a `Transaction` key, so unwrap it before handing it to `PaymentResponse`:

```python
from buckaroo.models.payment_response import PaymentResponse

transaction = push_json["Transaction"] # raw body your webhook endpoint received
response = PaymentResponse({"data": transaction})

ticket = response.get_service_parameter("Ticket") # printable receipt text
```

See [`examples/pos_payment.py`](examples/pos_payment.py) for a runnable demo of both the `Pay`
action and push-notification parsing.

### Contribute

We really appreciate it when developers contribute to improve the Buckaroo plugins.
Expand Down
9 changes: 8 additions & 1 deletion buckaroo/_buckaroo_client.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import logging
from typing import Optional
from .exceptions._authentication_error import AuthenticationError
from .config.buckaroo_config import BuckarooConfig, create_config_from_mode
Expand Down Expand Up @@ -118,7 +119,13 @@ def confirm_credential(self) -> bool:
try:
response = self.http_client.get("/json/Transaction/Specification/ideal")
return response.success
except Exception:
except Exception as e:
logging.warning(
"confirm_credential: unexpected error during credential check "
"(network issue or unexpected API response): %s",
e,
exc_info=True,
)
return False

def get_config_info(self) -> dict:
Expand Down
2 changes: 1 addition & 1 deletion buckaroo/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION = "0.1.1"
VERSION = "0.2.0"
Loading
Loading