Developer
  • Getting started keyboard_arrow_down

    Discover

    • arrow_forward
      EV Charging

      Discover our unattended POS solution for the ev market

    Our solutions

    • arrow_forward
      CCV Terminal

      Integrate with a CCV Terminal

    • arrow_forward
      SoftPOS

      Turn your own device into a payment terminal

    • arrow_forward
      CCV Online Payments

      Accepting online payments in your platform without technical knowledge

    • arrow_forward

    • arrow_forward

    Connect to the CCV Platform

    Integrate our products into your software. Let's make payment happen together!

    Look at all the possibilities
  • Documentation
  • API Reference
menu
    • expand_less Payment API
      • expand_more General
        • Communication
        • Environments
        • Authentication
        • Idempotency
        • Transaction Types
        • Webhooks
        • Notifications
        • Error Handling
        • Security & Privacy
        • Return URL
      • expand_less Online Payments
        • expand_more Quick Start
          • Initial Setup
          • Create Payment
        • expand_more Basic Operations
          • Create A Payment
          • Refund A Payment
          • Authorise & Capture Payments
          • Query The Payment Status
        • expand_more Payment Features
          • expand_more 3D-Secure 2
            • SCA And 3D-Secure 2
            • Compliance Guide
            • Out Of Scope Transactions
            • Exemptions
          • Payment Links
          • Merchant Initiated Payments
          • Embedded Card Payments
          • Mandates
          • Customers & Loyalty
          • Partial Payment
        • expand_less Payment Methods
          • American Express
          • Apple Pay
          • Google Pay
          • expand_more Bancontact
            • Bancontact Walled Initiated Payments (WIP)
            • Bancontact Deferred Sales
          • Bancontact Mobile
          • Banktransfer
          • IDEAL
          • Klarna
          • Landingpage
          • Maestro
          • Mastercard
          • Payconiq
          • Paypal
          • Visa
        • expand_more Payouts
          • Split Payout
          • Test Payout
        • expand_more Developer Resources
          • Currencies
          • Languages
          • Payment Testing
          • Test Cards
      • expand_more In-person Payments
        • expand_more SoftPOS
          • expand_more General
            • Getting Started
            • Device Requirements
            • SoftPOS TerminalIds
            • SoftPOS Errors
            • Currencies
            • Languages
            • Network And Connectivity
            • Release Notes
          • expand_more Basic Operations
            • Install A Terminal
            • Make A Payment
            • Handling Receipts
          • expand_more API Reference
            • SoftPOS - API Reference
    • expand_more Board Your Merchants At CCV
      • expand_more General
        • Getting Started
        • Authentication
      • expand_more Boarding API
        • StartOrder
        • AddSalesPackage
        • AddProductPSPStandalone
        • AddProductPSPSubmerchant
        • AddTerminalPackage
        • SetShoppingCartPricingDetails
        • SubmitOrder
        • Boarding
      • API Reference
    • expand_more Android Rest Beta API
      • expand_more General
        • Getting Started
        • Brands
        • Supported Languages
      • expand_more Basic Operations
        • Make A Payment
        • Cancel A Payment
        • Handling Receipts
        • Show Display Messages
        • Recover A Payment
      • expand_more Payment Features
        • Authorise & Capture
        • Capture
      • expand_more Terminal Features
        • Transaction Overview
        • Brands
        • Period Closing
        • Terminal - Status
      • expand_more Tokenization
        • Tokenization - Get A Card Token
        • Read A Mifare Card
        • Custom Text On Terminal
      • expand_more API Reference
        • API Reference
    • expand_more Android SDK
      • expand_more General
        • Getting Started
        • Demo Application - Android SDK
        • Result States
        • Language Codes
        • Error Handling
        • Logging
        • EP2
        • Download SDK
        • Release Notes
      • expand_more Basic Operations
        • Make A Payment
        • Stop Ongoing Payment
        • Recover A Payment - Android SDK
      • expand_more Payment Features
        • Account Selection - Android SDK
        • Additional Receipt Text - Android SDK
        • Allow Or Deny Card Brands - Android SDK
        • Authorisation By Voice - Android SDK
        • Authorise - Android SDK
        • Capture - Android SDK
        • Card Detection - Android SDK
        • Card Detection Deprecated - Android SDK
        • Card Token - Android SDK
        • Card Validation - Android SDK
        • Customer Display - Android SDK
        • E-Receipt - Android SDK
        • Manual Card Information Entry - Android SDK
        • Payment Reversal - Android SDK
        • Refund - Android SDK
        • Request Transaction Information - Android SDK
        • Reservation - Android SDK
        • German Eichrecht - Android SDK
      • expand_more SDK Guides
        • Activate Terminal - Android SDK
        • Card Circuits - Android SDK
        • Card Reader Status - Android SDK
        • Card Reader Status - Android SDK
        • Check Password - Android SDK
        • Factory Reset - Android SDK
        • Get Config - Android SDK
        • Get Status - Android SDK
        • Mobile Phone Prepaid - Android SDK
        • Online Agent - Android SDK
        • Partial Period Closing - Android SDK
        • Period Closing - Android SDK
        • Possible Transaction Types - Android SDK
        • Retrieve Last Ticket - Android SDK
        • Retrieve Open Pre Authorisations - Android SDK
        • Startup - Android SDK
        • Taxfree - Android SDK
        • Terminal Administration - Android SDK
        • Terminal Discovery - Android SDK
        • Ticket Reprint Period Closing - Android SDK
        • Transaction Overview - Android SDK
        • Check Password - Android SDK
      • expand_more Hardware Access
        • Getting Started
        • NFC - Android SDK
        • Printing - Android SDK
        • QR And Barcode Scanner - Android SDK
      • expand_more API Reference
        • API Documentation
    • Android App Requirements
    • expand_more Certification
      • Introduction
      • expand_more Attended Certification Tests
        • expand_more Aborting
          • F1A - Regular Abort By Merchant
          • F1B - Failing Abort By Merchant
          • F1D - Hammering Abort By Merchant
        • expand_more Allowed Amounts
          • S1A - Transaction With Amount Of EUR 0,00
          • S1B - Transaction With Negative Amount
          • S1C - Transaction With Highest Possible Amount
          • S1D - Over-Amount Transaction
        • expand_more Connection Lost
          • Q1B - Manual Transaction Recovery
          • Q1C - Ethernet Connection With ITS Fails
          • Q1F - Device Unavailable
          • Q1G - Terminal Not Responding
          • T1A - Automatic Transaction Recovery
        • expand_more E Journal
          • M1A - Store E-Journal
          • M2A - ECR/POS Print Journal Receipts
          • M3A - ECR/POS Storing Journal Receipts
        • expand_more Reprint Ticket
          • L1A - Reprint Ticket
          • L1B - Reprint Ticket Declined Transaction
          • L2A - Reprint Ticket No Printer Available
          • L2B - Reprint Ticket Declined Transaction No Printer Available
        • expand_more Tickets
          • U1A - Request For Identification
          • U1B - Request For Signature
          • U1C - Request For Signature And Identification
          • U1D - Failing Transaction No Receipt
          • U1E - Split Payment
        • expand_more Time Out
          • R1A - Time Out On Presenting A Card
          • R1B - Time Out During Pin Entry
        • expand_more Transactions
          • C1A - Happy Flow
          • C1B - Happy Flow Contactless
          • C1D - Happy Flow Magnetic Stripe
          • C1E - Declined Transaction By Host
          • C1E - Transaction Aborted By Cardholder
          • C1F - Absence Of Thousand Separator
          • C1G - Cashier Display Messages
        • expand_more Validation
          • H1A - Too Many Fingers
          • H1B - Not Removing Card
          • H2A - Power Loss Or Closing Of ECR/POS During Transaction
      • expand_more Unattended Certification Tests
        • expand_more User Guidance
          • C1 - Successful Payment
          • C2 - Next Cardholder
          • C3 - Abort On PIN Entry
          • C4 - Time Out During PIN Entry
          • C5 - No Amount Entered
          • C6 - Language Selection
          • C7 - Amount To Authorise
          • C8 - Available Funds
        • expand_more Device Selection
          • D1 - Device Selection
          • D2 - Invalid Device
          • D3 - Charger Selection Abort
          • D4 - No Charger Selected
          • D5 - Authorisation With No Free Devices
        • expand_more Product Delivery
          • E1 - Product Selection
          • E2 - Enabled Products
          • E3 - Invalid Product Entered
          • E4 - Product Selection Aborted
          • E5 - No Product Selected
          • E6 - Max Delivery Time
          • E7 - Abort Session
          • E7 - Abort By POS
          • E9 - Not Started Charging In Time
          • E10 - Take More Fuel Than AVF
          • E10 - Multiple Sessions Mixed
          • E12 - Postpone Card Financial Advice On New Cardholder Card
          • E13 - Abort Session On Card Reinsert
        • expand_more Receipts
          • F1 - Cardholder Retrieve Receipt Info
          • F2 - Cardholder Receipt Retrieval
          • F3 - Reprint Ticket
          • F4 - F8 - Ticket Printing And Content
          • F9 - TrackingToken Deleted
          • F10 - Printer Paper Low
          • F11 - CardPayment Erased From Storage
          • F12 - E-Receipt Received By Cardholder
          • F13 - E-Receipt Failure
        • expand_more Transaction Limit Handeling Maestro
          • G1 - Maestro CardPayment 1 Euro
          • G2 - Maestro CardPayment 30 Euro
          • G3 - Maestro CardPayment 60 Euro
          • G4 - Maestro CardPayment 500 Euro
        • expand_more Transaction Limit Handeling Mastercard
          • H1 - Mastercard CardPayment 1 Euro
          • H2 - Mastercard CardPayment 30 Euro
          • H3 - Mastercard CardPayment 60 Euro
          • H4 - Mastercard CardPayment 500 Euro
        • expand_more Mifare Handling
          • I1 - Happy Flow Mifare
          • I2 - Unknown Mifare Card
          • I3 - No Mifare Card Presented
          • I4 - Mastercard Presented
        • expand_more Card Circuits
          • L1 - Available Card Circuits
        • expand_more Reconciliation
          • M1 - Reconciliation As Function
          • M2 - Reconciliation By New Shiftnumber
          • M3 - POS Auto Triggers Reconciliation With Closure
        • expand_more Journal
          • N1 - Journal Accessible By Authorized Employees
          • N2 - Journal Cannot Be Altered
        • expand_more Exception Flows
          • O1 - Unknown Card Session
          • O2 - Maximum Time Out
          • O3 - Device Unavailable
          • O4 - Time Out Card-Type Fallback
          • O5 - Time Out On Presenting Card
          • O6 - App Stability
          • O7 - Automatic Startup
          • O8 - Sleep Mode Not Supported
          • O8 - Sleep Mode Supported
        • expand_more Recovery
          • X1 - Recovery After Communication Failure
          • X2 - Recovery After CCV Component Update
          • X3 - Recovery After 24 Hour Reboot
          • X4 - Recovery After CCV-Fusion Client Restart
          • Y1 - Recovery After Power Failure With No Battery Backup
          • Y2 - Recovery After Power Failure With Battery Backup
      • expand_more SoftPOS Certification Tests
        • expand_more Success Scenarios
          • Installation Success - SoftPOS Certification Test
          • Payment Success - SoftPOS Certification Test
        • expand_more Failed Scenarios
          • Installation Failed - CCV SoftPOS App Not Installed - SoftPOS Certification Test
          • Payment Failed - Declined - SoftPOS Certification Test
          • Payment Failed - CCV SoftPOS App Is Closed During Payment - SoftPOS Certification Test
          • Payment Failed -CCV SoftPOS App Is Killed During Payment - SoftPOS Certification Test
          • Payment Failed - SoftPOS App Not Installed Anymore - SoftPOS Certification Test
        • expand_more Other Scenarios
          • Other Scenario - Data Cleared Of The CCV SoftPOS App - SoftPOS Certification Test
    • expand_more Development Kits
      • SoftPOS Dev Kit
      • IM30 Dev Kit
    • Glossary

Payment API

  • General
    • Communication
    • Environments
    • Authentication
    • Idempotency
    • Transaction Types
    • Webhooks
    • Notifications
    • Error Handling
    • Security & Privacy
    • Return URL
  • Online Payments
    • Quick Start expand_more
      • Initial Setup
      • Create Payment
    • Basic Operations expand_more
      • Create A Payment
      • Refund A Payment
      • Authorise & Capture Payments
      • Query The Payment Status
    • Payment Features expand_more
      • 3D-Secure 2 expand_more
        • SCA And 3D-Secure 2
        • Compliance Guide
        • Out Of Scope Transactions
        • Exemptions
      • Payment Links
      • Merchant Initiated Payments
      • Embedded Card Payments
      • Mandates
      • Customers & Loyalty
      • Partial Payment
    • Payment Methods
      • American Express
      • Apple Pay
      • Google Pay
      • Bancontact expand_more
        • Bancontact Walled Initiated Payments (WIP)
        • Bancontact Deferred Sales
      • Bancontact Mobile
      • Banktransfer
      • IDEAL
      • Klarna
      • Landingpage
      • Maestro
      • Mastercard
      • Payconiq
      • Paypal
      • Visa
    • Payouts expand_more
      • Split Payout
      • Test Payout
    • Developer Resources expand_more
      • Currencies
      • Languages
      • Payment Testing
      • Test Cards
  • In-person Payments
    • SoftPOS expand_more
      • General expand_more
        • Getting Started
        • Device Requirements
        • SoftPOS TerminalIds
        • SoftPOS Errors
        • Currencies
        • Languages
        • Network And Connectivity
        • Release Notes
      • Basic Operations expand_more
        • Install A Terminal
        • Make A Payment
        • Handling Receipts
      • API Reference expand_more
        • SoftPOS - API Reference

What's on this page

  • Bancontact Mobile Payments
  • Definitions
  • Typical Transaction Flow
    • Pay with QR code
    • Pay with a URL Intent
  • CCV Pay
    • Payment initiation
    • Integration using the CCV Online Payments PayUrl
    • Integration using the direct rendering of the QR code
      • Return to shop
    • Integration using the URL intent link
    • Integration Considerations
      • Edge case: Customer does not return to you app
      • Edge case: ReturnURL is a standard HTML / HTTPS link
      • Edge case: CCV PayUrl is opened inside a webview instead of default browser or direct deeplinking
    • Technical implementation
      • Live transactions
      • Test transactions
  • Mobile Payment Apps
    • Android
    • iOS
  • Sources
Online Payments / Payment Methods / Bancontact Mobile

Bancontact Mobile Payments

Definitions

  • BEP: Bancontact E&M-Commerce Protocol
  • Bancontact App: the official Bancontact mobile payment app or any other mobile payment app that supports the BEP protocol like a mobile banking app
  • App2App / InApp: A payment flow where a merchant mobile app opens the Bancontact App using a URL intent

Typical Transaction Flow

  1. Merchant initiates a new payment
  2. PSP creates a new BEP Transaction ID
  3. PSP returns transaction response including BEP Transaction ID
  4. The merchant can choose to render a QR code or launch a mobile payment app with a URL intent
  5. The customer completes the authentication with the Bancontact App
  6. PSP sends an authorization and clearing to Bancontact
  7. Customer is informed of transaction result

Pay with QR code

When the merchant shop and Bancontact App are on different devices, the shop can present a QR code to the customer. The code can be scanned with the Bancontact App which then asks for customer authentication.

Pay with a URL Intent

A URL intent allows communication between apps using messages that are encoded as URL’s. The Bancontact App supports URL’s that have a specific namespace. There are several ways to use these, one of the most simple ways being a link or redirect in a browser.

Depending on the mobile OS you are developing for, you must open the Bancontact App with an

  • Android Intent
  • iOS URL Resource

CCV Pay

CCV Pay is Bancontact Certified including support for Mobile Payments using the BEP protocol. The next sections will describe how this functionality can be used within your shop or app.

Payment initiation

Before you can render a QR code or use a URL intent to launch the Bancontact App, you’ll need to initiate a new payment. The PSP responds with the required data to use mobile payments.

Important: because this is Bancontact specific functionality, you must specify the brand bcmc in the request.

Request

{
    "method": "card",
    "brand": "bcmc",
    "language": "nld",
    "currency": "eur",
    "returnUrl": "http://httpbin.org",
    "amount": "0.1"
}

The required input data is limited. Based on your use-case, the returnUrl can be a web shop payment confirmation page, some generic landing page, your own mobile app… Anything that conforms to a URL can be used for redirecting the customer back to you.

Important: Be aware that Bancontact sets a maximum amount limit of 1500 Euro for Bancontact QR payments (When creating a payment with an amount over 1500 Euro, no QR Code / Url Intent will be generated / showed. The customer alternatively needs to enter their card details on the payment page. The limit does not apply for manual card entry.). More information can be found here

Response

{
    "lastUpdate": 1540892561089,
    "returnUrl": "http://httpbin.org",
    "payUrl": "https://onlinepayments.ccv.eu/card/payment.html?reference=C181030104241082CB879161.1",
    "cancelUrl": "https://onlinepayments.ccv.eu/card/cancel/merchant?reference=C181030104241082CB879161.1",
    "details": {
        "qrCode": "BEP://1BEP.JFORCE.BE:3717/TMI$G45D3GRCEUGA6X2PPDE6T55N",
        "urlIntent": "BEPGenApp://DoTx?TransId=1BEP.JFORCE.BE:3717/TMI$G45D3GRCEUGA6X2PPDE6T55N"
    },
    "brand": "bcmc",
    "amount": 0.1,
    "reference": "C181030104241082CB879161.1",
    "created": 1540892561089,
    "language": "nld",
    "method": "card",
    "type": "sale",
    "currency": "eur",
    "status": "pending"
}

The response contains 2 important fields that allow a mobile payment, details.qrCode and details.urlIntent. In the following sections we’ll describe how they can be used.

Note: It is not required to use these fields. By redirecting the customer to the payUrl, they will also be able to complete the payment on a mobile device. The downside of this is a less seamless integration due to an extra redirect.

In short: You have 3 different options to integrate the bancontact mobile application inside your webshop or app:

  • Redirecting customer to payUrl where the customer can choose the option between using app or filling in card details.
  • Rendering of the QR code on your webshop or app itself.
  • Opening of the UrlIntent link directly from your webshop or app.

Integration using the CCV Online Payments PayUrl

You can choose to redirect the customer to the payUrl provided in the response of the initial payment request. The customer is redirected to a webpage hosted by CCV where the customer can

  • Scan the rendered QR code when browsing on a desktop environment
  • Click on an open the Bancontact app button on mobile devices
  • Fill in the card details on the form.

After Authentication using the Bancontact app, the customer is redirected back to the shop. The status of the transaction can then be polled, or you can await the webhook.

Advantage

  • As a merchant, you don’t have to implement deep linking or provide a QR code yourself.

Disadvantage

  • The customer user experience is not as seamless because they are redirected to another page where they have to click a button or scan a QR code.
  • When opening the payURL inside a webview, you should take note of the guidelines indicated in the edge case below.

Integration using the direct rendering of the QR code

A QR code payment can be used when the device that renders the QR code is not the device that the customer uses to complete the payment. A typical scenario is embedding the QR code in a checkout page of a web shop or render it on a mobile payment terminal.

The field details.qrCode contains the data that is required to render the QR code. In order to make it available to your customer, you must present this as a QR image that contains only the data from the response. Adding additional data may cause incorrect handling of the payment by the Bancontact App.

Example of the QR code rendered as an image

alt Bancontact QR

Return to shop

If you choose to render the QR code yourself (and not rely on our payment page), the returnUrl will not be triggered. The Bancontact App will complete the payment, but it will not redirect the customer on their mobile device to the returnUrl. We provide a webhook mechanism to inform you of payment status changes.

In case you use our payment page, the device that presents the QR-code will be redirected to the returnUrl once the customer completes the payment.

Integration using the URL intent link

A URL intent is an ideal solution when the integration between your own app and the Bancontact App should be as seamless as possible.

After completing the payment in the Bancontact App, the customer must be redirected back to your app. In order to achieve this, the payment initiation must provide a URL intent as returnUrl.

Request

{
    "method": "card",
    "brand": "bcmc",
    "language": "nld",
    "currency": "eur",
    "returnUrl": "merchantapp://ccvTx?orderId=XYZ",
    "amount": "0.1"
}

In this example, the Bancontact App will redirect the customer to the merchant app which registered the merchantapp:// DeepLink with iOS or Android OS and passes through the orderId XYZ.

Deeplinking is a functionality provided by the mobile OS to register a URL for your app so that your app opens when someone clicks on a link with the deeplink associated. For example, the Messenger app Whatsapp links itself to the whatsapp:// Deeplink. Every time a user clicks on a whatsapp://xxxxx link, the app Whatsapp will open. They provide an action on their deeplink send with an optional parameter text to pass the message to the deeplink. So whatsapp://send?text=Hello will open the app Whatsapp and start a new text with the context Hello prefilled.

As a merchant you are free to design your app in any way so that CCV / The bancontact app can return to your app on a path which easily identifies the transaction inside your payment flow.

For Example, you can implement a return action specifically designed for when the customer returns to your app after using the bancontact app, so that you can acknowledge the flow and show some specific UX to the customer. merchantapp://ccvTx?orderId=XYZ can return the customer to a specific CCV page inside your app, where you can let the customer know OrderId XYZ was successfully acknowledged and processed.

Integration Considerations

Edge case: Customer does not return to you app

The return of the customer to the app is the best case scenario. There can be cases that the customer does not return to your app for some unknown reason. It is highly recommended that you don’t rely on the customer returning to the app. The actual transaction status is independent of whether the customer returns or not. You should always verify the status of the actual transaction with CCV to know if the payment succeeded or not. This could be done by using webhooks on the backend system or polling. You should not let your business logic depend on the return of the customer to the app.

Edge case: ReturnURL is a standard HTML / HTTPS link

If you provide a returnUrl, that the bancontact app can redirect the customer to, which is a standard HTTPS link instead of a deeplink app link, you should be aware that the bancontact app will redirect the customer to the default browser of the customer. You should not depend on the fact that the customer will return to the same browser that the payment was started on. Every session data your business logic depends on will be unusable if the customer returns in a different browser. You should be able to handle this difference.

Edge case: CCV PayUrl is opened inside a webview instead of default browser or direct deeplinking

When using the redirection to the payUrl inside a webview, you should take care to allow your app to open the BepGenApp URL Scheme. If you do not allow this, then the Bancontact app will not open. See the links below for more information

Android Documentation iOS Documentation Note: iOS has to be updated with the scheme Id so that the canOpenUrl function also supports BepGenApp.

Technical implementation

Due to the unavailability of an official Bancontact test App, different steps need to be followed for live and test transactions for the integration of the mobile payment flow.

Live transactions

Live transactions are initiated with an API key that has operating mode LIVE.

By starting a new intent, the Bancontact App will be launched from within the merchant app. Once the payment is completed, the Bancontact App redirects the customer back to the returnUrl which is most likely the merchant app.

Test transactions

Live transactions are initiated with an API key that has operating mode TEST.

The payment initiation response contains the same data for both a live and test transactions, however the qrCode and urlIntent have a different format. It is a plain web URL which leads to our Bancontact simulator.

Response

{
    "returnUrl": "merchantapp://ccvTx?orderId=XYZ",
    "details": {
        "qrCode": "https://shop-vpos-test.jforce.be/bep/authenticate.html?secureTransferId=ed71f3bd-6e36-4107-8be4-e0781743cba9&trm=50",
        "urlIntent": "https://shop-vpos-test.jforce.be/bep/authenticate.html?secureTransferId=ed71f3bd-6e36-4107-8be4-e0781743cba9&trm=51"
    },
    "brand": "bcmc"
}

Other fields omitted for brevity

Because we don’t have any test Bancontact App we use the browser as the mobile payment app. The intent is a plain web URL so any mobile device with an HTTP compliant browser can be used as test device.

By starting a new intent, the browser will be launched from within the merchant app. Once the payment is completed, the browser redirects the customer back to the returnUrl which is the merchant app.

Mobile Payment Apps

Android

  • Official Bancontact
  • KBC Mobile

iOS

  • Official Bancontact
  • KBC Mobile

Sources

  • Bancontact Rulebook 5203 - Deferred Sales on Mobile - February 2018
  • Bancontact Rulebook 46D1 - Mobile Payment App Functional Requirements - October 2017
  • Bancontact Rulebook 4621 - BEP Protocol V1.0 - September 2016

Go to

Home
Documentation




Cookies Privacy Statement