Wero
Description
Wero is a new pan-European digital wallet and payment system created by the European Payments Initiative (EPI) to enable instant, account-to-account transfers across Europe. It allows users to send and receive money in seconds using a mobile number or email address, working both online and in stores.
Availability
Wero is for ecommerce in Germany available. Belgium, France, Luxembourg and Netherlands will follow soon.
Transaction Types
The following transaction types are currently available:
Integration Types
The following integration type is currently available:
Payment Flow
Example of Wero Payment Redirect On Mobile
API Implementation
Required value for payment_type parameter: wero
Payment Page Redirect
Redirect the customer to the Wero payment page.
Implementation flow:
- Make a Payment API request.
- Receive API response with
client_action. - Redirect your customer to the
payment pageURL inaction_data. - Customer is redirected to
success_urlorerror_url. - Receive asynchronous postback notifications to
postback_urlabout transaction status.
Payment API Request
payment_typeStringrequiredweroorder_idStringrequiredamountFloatrequiredcurrencyStringrequiredmerchant_referenceStringrequiredadditional_transaction_dataStringpostback_url as part of the postback data.postback_urlStringrequiredsuccess_urlStringrequirederror_urlStringrequiredPOST /rest/payment
Authorization: Basic <base64(api_key:api_password)>
Content-Type: application/json
{
"payment_type": "wero",
"order_id": "12345678",
"amount": "15.90",
"currency": "EUR",
"merchant_reference": "12345678 - Test Shop",
"additional_transaction_data": "customer_id=123ABC, billing_info=12345678",
"postback_url": "https://your-postback.url.com",
"success_url": "https://your-success.url.com",
"error_url": "https://your-error.url.com"
}
Payment API Response
transaction_idStringpayment_typeStringstatus_codeIntegerstatusStringorder_idStringmessageStringadditional_transaction_dataStringpostback_url as part of the postback data.amountFloatincluded_feesStringerror_codeIntegerclient_actionStringurl in action_data) or postform (build and submit a POST form using the data in action_data). When not returned, no client-side action is required.action_dataObjectclient_action is specified. Contains: url (target URL of the action) and, in case of a postform, fields (key/value pairs of the data to be posted).{
"transaction_id": "d1bf9fdf-7268-406f-9e08-8d5a9540ab97",
"payment_type": "wero",
"status_code": 1,
"status": "started",
"order_id": "12345678",
"message": null,
"additional_transaction_data": "customer_id=12345678, billing_info=12345678",
"amount": 15.9,
"included_fees": "0.00",
"error_code": 0,
"client_action": "redirect",
"action_data": {
"url": "https://testapi.betterpayment.de/payment/d1bf9fdf-7268-406f-9e08-8d5a9540ab97"
}
}
Refund API Request
transaction_idStringrequiredmerchant_referenceStringmerchant_reference from original transaction. Maximum 35 characters. Valid characters: a-zA-Z0-9/-?():.,'+ and spaceamountFloatcommentStringPOST /rest/refund
Authorization: Basic <base64(api_key:api_password)>
Content-Type: application/json
{
"transaction_id": "d1bf9fdf-7268-406f-9e08-8d5a9540ab97",
"merchant_reference": "12345678 - Test Shop",
"amount": "10.00",
"comment": "RETURNED_GOODS"
}
Refund API Response
The response is attributed to the Refund object — not the transaction. Thus, the status_code and status will differ from transaction values.
transaction_idStringrefund_idStringstatusStringstatus_codeIntegererror_codeInteger{
"transaction_id": "d1bf9fdf-7268-406f-9e08-8d5a9540ab97",
"refund_id": "2ce3297b-1bda-4637-9375-ecf224cdefc7",
"status_code": 1,
"status": "successful",
"error_code": 0
}
Postbacks
For the full list of payment postback fields, see the Payment API. For refund postbacks, see the Refund API. For retry policy and signature verification, see Postbacks.
Test Data
Please request access to the Wero UAT mobile app for iOS or Android from your onboarding manager to make test transactions.
Test Scenarios for Payment Methods
The following test scenarios are required for Wero Go Live certification. Each scenario must be executed successfully in the UAT environment. Scenarios marked as Required must be completed for certification; Optional scenarios are recommended but not mandatory.
Required Scenarios
TC-CONSENT-GRANTED-01 — Happy Case: Consumer approves consent
Description: Consumer approves consent in Wero UAT app without errors or declines.
Steps:
- Create payment: POST
/rest/payment - Open
redirect_urland approve consent with Wero UAT app.
Pass Criteria: Verify expected status in postback received: completed
Evidence Requirement: transaction_id from postback
TC-CONSENT-DENIED-01 — Unhappy Case: Consumer denies consent
Description: Consumer denies consent in Wero UAT app.
Steps:
- Create payment: POST
/rest/payment - Open
redirect_urland deny consent with Wero UAT app.
Pass Criteria: Verify expected status in postback received: canceled
Evidence Requirement: transaction_id from postback
Client Evidence: Screenshot of error page including error message
TC-AUTH-FAILED-1 — Unhappy Case: Technical failure during authorisation
Description: Technical failure during authorisation.
Steps:
- Create payment with
1993.62as amount: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app.
Pass Criteria: Verify expected status in postback received: error
Evidence Requirement: transaction_id from postback
Client Evidence: Screenshot of error page including error message
TC-AUTH-REJECTED-01 — Unhappy Case: Decline with reason code
Description: Decline with reason code. Possible reason codes:
- AM04: Consumer does not have sufficient funds in their account
- AM02: Transaction amount is greater than the maximum allowed for the consumer's account
- AM21: Transaction amount exceeds limits agreed between consumer's bank and consumer
- AC03: Merchant's IBAN did not pass validity checks
- AC05: The consumer's account is closed
- AC06: Consumer/merchant's account is blocked
- AG01: Limitation on consumer/merchant's account
Steps:
- Create payment with one of the amounts below: POST
/rest/payment - Open
redirect_urland approve consent with Wero UAT app.
Possible amounts:
1993.63for reason_code "AM04" (Insufficient funds)1993.64for reason_code "AM02" (Invalid amount)1993.65for reason_code "AM21" (Limit exceeded)1993.66for reason_code "AC03" (Invalid creditor account)1993.67for reason_code "AC05" (Closed debtor account)1993.87for reason_code "AC06" (Blocked account)1993.88for reason_code "AG01" (Transaction forbidden)
Pass Criteria: Verify expected status in postback received: declined
Evidence Requirement: transaction_id from postback
TC-R-VOP-01 — Happy Case: Refund Settled & VoP Match
Description: Refund Settled & VoP Match.
Steps:
- Create payment with
<corporate-id-vop-mtch>asshop_id: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected refund_status_code in refund postback received: 1 (Successful)
Evidence Requirement: transaction_id from postback
TC-R-VOP-03 — Unhappy Case: Refund Rejected in case of VoP Close Match
Description: Refund Rejected in case of VoP Close Match.
Steps:
- Create payment with
<corporate-id-sepa-mock-cmtc-1>asshop_id: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected refund_status_code in refund postback received: 5 (Declined)
Evidence Requirement: transaction_id from postback
TC-R-VOP-05 — Unhappy Case: Refund fails when VoP is Not Applicable (NOAP)
Description: Refund fails when VoP is Not Applicable (NOAP).
Steps:
- Create payment with
<corporate-id-vop-noap>asshop_id: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected refund API response error_message received: Name match: Not applicable
Evidence Requirement: transaction_id from postback
TC-R-VOP-06 — Unhappy Case: Refund fails in case of Payee Mismatch (NMTC)
Description: Refund fails in case of Payee Mismatch (NMTC).
Steps:
- Create payment with
<corporate-id-vop-nmtc>asshop_id: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected refund API response error_message received: Name match: No match
Evidence Requirement: transaction_id from postback
TC-R-ERR-01 — Unhappy Case: Refund a non-settled payment
Description: Refund a non-settled payment.
Steps:
- Create payment with
1993.73as amount: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected refund API response error_message received: Capture with id(s) "<transaction_id>" not found.
Evidence Requirement: transaction_id from postback
Optional Scenarios
TC-CONSENT-ERR-01 — Unhappy Case: Missing required field
Description: Missing required field.
Steps:
- Create payment with missing required field (e.g. amount): POST
/rest/payment
Pass Criteria: Verify error_message in API response: Field 'paymentPlan.amount' is invalid.
TC-CONSENT-ERR-02 — Unhappy Case: Invalid Data Type
Description: Invalid Data Type.
Steps:
- Create payment with invalid data type (e.g. amount as text "abc"): POST
/rest/payment
Pass Criteria: Verify error_message in API response: Field 'paymentPlan.amount' is invalid.
TC-CAP-PENDING-01 — Processing Case: Capture Pending
Description: Capture Pending.
Steps:
- Create payment with
1993.73as amount: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app.
Pass Criteria: Verify expected status in postback received: pending
Evidence Requirement: transaction_id from postback
TC-CAP-REJECTED-01 — Unhappy Case: Capture Rejected
Description: Capture Rejected.
Steps:
- Create payment with
1993.74as amount: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app.
Pass Criteria: Verify expected status in postback received: declined
Evidence Requirement: transaction_id from postback
TC-CAP-FAILED-01 — Unhappy Case: Capture Failed
Description: Capture Failed.
Steps:
- Create payment with
1993.75as amount: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app.
Pass Criteria: Verify expected status in postback received: error
Evidence Requirement: transaction_id from postback
TC-R-VOP-02 — Unhappy Case: Refund rejects in case of VoP Match
Description: Refund rejects in case of VoP Match.
Steps:
- Create payment with
<corporate-id-sepa-mock-mtch-1>asshop_id: POST/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected refund_status_code in refund postback received: 2 (Error)
Evidence Requirement: transaction_id from postback
TC-R-ERR-02 — Unhappy Case: Refund Amount Exceeds Capture Amount
Description: Refund Amount Exceeds Capture Amount.
Steps:
- Create payment: POST
/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment and higher amount than the payment: POST/rest/refund
Pass Criteria: Verify expected API response error_message received: The refunded amount cannot exceed the original amount.
TC-R-ERR-04 — Unhappy Case: Refund a capture that has already been fully refunded
Description: Refund a capture that has already been fully refunded.
Steps:
- Create payment: POST
/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create refund using the
transaction_idfrom payment: POST/rest/refund - Create refund again using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected API response error_message received: The refunded amount cannot exceed the original amount.
TC-R-ERR-05 — Unhappy Case: Multiple partial refunds exceeding original capture amount
Description: Multiple partial refunds on a captured payment, where the final refund attempt causes the total refunded amount to exceed the original capture amount.
Steps:
- Create payment: POST
/rest/payment - Open
redirect_urland approve consent with Wero UAT app. - Create partial refund using the
transaction_idfrom payment and lower amount than the payment: POST/rest/refund - Create refund again using the
transaction_idfrom payment: POST/rest/refund
Pass Criteria: Verify expected API response error_message received: The refunded amount cannot exceed the original amount.