LogoLogo
BlogLogin
English
English
  • An Introduction to Saferpay
    • Licensing
      • Legacy licensing
    • Reconciliation
    • Acquirers & Payment Methods
    • Web Shop Plugins and certified partners
      • ePages Beyond
      • ePages NOW
      • Magento 2
      • Odoo
      • PrestaShop
        • PrestaShop User Guide
      • Salesforce Commerce Cloud
      • SAP Commerce Cloud
      • Shopware 6
        • Shopware 6 User Guide - German
        • Shopware 6 User Guide - English
      • WordPress WooCommerce
      • Shopify
    • Supported Languages
    • Common Saferpay terms - Glossary
  • News
    • Changes for transactions without customer presence
    • Changes for the Saferpay Hosted Forms, Fields and Payment Page
  • Quick Links
    • Web Shop Plugins and certified partners
    • Secure PayGate
    • User Administration
    • Payment Page Configuration
    • Risk Management
    • API Authentication
  • Interfaces
    • Payment API (aka JSON API)
    • Management API
    • Backoffice
      • The Home screen
      • Batch Processing
      • Transactions
        • Transaction Details
        • Batch Close
        • Declined transactions
        • Pending authorizations
        • Analytics
        • SEPA Refunds Export
        • Authorization & Payment
        • Credit
      • Risk Management
      • Secure PayGate / Payment Links
      • Secure Card Data
        • Secure Card Data Details
      • Settings
        • JSON API basic/Client Certificate authentication
        • User Administration
        • Payment Page Configuration
      • Online Support
      • User Profile
    • Saferpay OnSite
    • Feedback
  • Integration Guide
    • Integrating Saferpay
    • General Information
      • Data Security and PCI DSS
      • Versioning
      • 3-D Secure
      • Payment Service Directive 2 - PSD2
      • Dynamic Currency Conversion
      • Iframe Integration and CSS
    • Ways of integration
      • Payment Page
        • Payment Page checklist
      • Transaction Interface
        • Recurring Payments
        • Refunds
          • SEPA Refunds
      • Capture and Daily Closing
        • Partial Captures
          • Marketplace
      • Secure Card Data - Tokenization
      • Saferpay Fields
      • Inquire Interfaces
      • Mobile Integration
      • Omni-Channel
      • Fraud Intelligence
        • Silver
        • Fraud Intelligence Integration
      • Mail Phone Order
      • Error Handling
      • API Health Check
      • Saferpay API Specification
    • Payment Methods & Wallets
      • General and special cases
      • Account-to-Account Payments
      • Alipay+
      • Apple Pay
      • American Express
      • Bancontact
      • Billie
      • blik
      • Click to Pay
      • Diners Club International & Discover Card
      • eps
      • giropay
      • Google Pay
      • iDEAL 2.0
      • JCB
      • Klarna Payments
      • Maestro International
      • Mastercard
      • paydirekt
      • PayPal
      • PostFinance Pay
      • Przelewy24
      • Reka
      • SEPA Direct Debit
      • Sofort by Klarna
      • TWINT
      • UnionPay
      • Visa & V PAY
      • WeChat Pay
      • WL Crypto Payments
    • Testing
    • Go-Live
    • Frequently Asked Questions
    • Saferpay Demo
      • Saferpay Demo Environment
      • Saferpay Demo Shop
    • Support
    • Changelog
Powered by GitBook
On this page
  • General requirements
  • Technical requirements
  • Supported features
  • TWINT User on file
  • Requirements
  • Registration via the Payment Page
  • Standalone Registration
  • Web View Web-to-App switch
  • Testing

Was this helpful?

  1. Integration Guide
  2. Payment Methods & Wallets

TWINT

PreviousSofort by KlarnaNextUnionPay

Last updated 3 months ago

Was this helpful?

This chapter will handle all specifics involved with the integration of the payment method TWINT.

General requirements

  • A and thus a valid identification with a username and password for the Saferpay system.

  • At least one active Saferpay terminal via which payment can be carried out and the associated Saferpay TerminalId.

  • A valid TWINT contract

For Twint activation on the Saferpay terminal, please contact your account manager, or our .

Technical requirements

The general integration of TWINT can be done via the -However other features require a different path. See further down in this chapter- and requires the following things to be noted:

  • JSON API Version 1.7 or later.

  • Unlike normal credit card transactions, where a could be attempted after the normal reservation time, TWINT does only offer a maximum timeframe of 7 days! After that the transaction will be discarded and a will not initiate the money-transfer with the next batch-close, so make sure, to your transactions within this time limit!

    • In justified cases, this period can be extended to 30 days. Please inform our sales department and for more information.

  • Saferpay does support. However, one of the available options must be explicitly activated on our side. For more information about different "Pay later" options and their configuration, please contact our sales department.

  • The parameter OrderId is limited to 50 characters.

  • Due to processing limitations, a refund can fail, if it is executed earlier than two hours after the initial transaction. The initial transaction needs to be processed first, until a refund can be executed, which happens within said two hours!

  • The notification URLs, inside theNotification container are mandatory, in order to avoid missing payment successes. See the for further information.

Supported features

Feature

Support

✅

Multipart Captures

❌

Secure Card Data

✅

✅

Recurring Payments

✅

3D Secure

❌

Dynamic Currency Conversion (DCC)

❌

Mail Phone Order

❌

✅

✅

TWINT User on file

Requirements

The following requirements are to be met, if Twint User on File is to be used, aside the normal requirements:

  • JSON API Version 1.14 or later

Registration via the Payment Page

Standalone Registration

{
  "RegisterAlias": {
    "IdGenerator": "RANDOM_UNIQUE"
  },
  "Type": "TWINT",
  "LanguageCode": "en",
  "RequestHeader": {
    "SpecVersion": "[CURRENT SPEC_VERSION]",
    "CustomerId": "242225",
    "RequestId": "5f543be575b3f3ecff3214257ac6978a",
    "RetryIndicator": 0,
    "ClientInfo": {
      "ShopInfo": "My Shop",
      "OsInfo": "Windows Server 2013"
    }
  },
  "ReturnUrls": {
    "Success": "https://www.myshop.com/success",
    "Fail": "https://www.myshop.com/fail",
    "Abort": "https://www.myshop.com/abort"
  }
}
{
  "ResponseHeader": {
    "SpecVersion": "[CURRENT SPEC_VERSION]",
    "RequestId": "5f543be575b3f3ecff3214257ac6978a"
  },
  "Token": "y6678qfw3dm9pule1inqkpr1o",
  "Expiration": "2019-11-15T14:39:16.642+01:00",
  "Redirect": {
    "RedirectUrl": "https://test.saferpay.com/vt2/api/register/twint/242225/y6678qfw3dm9pule1inqkpr1o",
    "PaymentMeansRequired": true
  }
}

Redirect to TWINT

The RedirectUrl then needs to be opened inside an iFrame, as a redirect, or lightbox. Saferpay will then present the following screen.

Redirect to Shop

Once this process is done, the user gets redirected towards one of the previously defined ReturnUrls, depending on the outcome.

Alias Assert Insert

{
  "Token": "67tdpr8keb3ky3y6728kqv4gk",
  "RequestHeader": {
    "SpecVersion": "[CURRENT SPEC_VERSION]",
    "CustomerId": "242225",
    "RequestId": "22c449e9cb06a227491c0f18532d9ef1",
    "RetryIndicator": 0,
    "ClientInfo": {
      "ShopInfo": "My Shop",
      "OsInfo": "Windows Server 2013"
    }
  }
}
{
  "ResponseHeader": {
    "SpecVersion": "[CURRENT SPEC_VERSION]",
    "RequestId": "22c449e9cb06a227491c0f18532d9ef1"
  },
  "Alias": {
    "Id": "a2f4d6390bdf5ba4ed9d0c0f2318bc2b",
    "Lifetime": 1000
  },
  "PaymentMeans": {
    "Brand": {
      "PaymentMethod": "TWINT",
      "Name": "TWINT"
    },
    "Twint": {
      "CertificateExpirationDate": "2020-12-15T13:18:08.000+01:00"
    }
  }
}

One speciality with Twint User on File is, the Twint.CertificateExpirationDate parameter. Each registered Twint payment mean, will have its own expiration date within the Twint system, which does not correspond with the Saferpay Alias Lifetime! The parameter will return the expiration date of this registration certificate. Once it has passed, the Twint alias becomes invalid.

Furthermore note, that using RANDOM_UNIQUE will always return the already existing alias, even if it is expired on Twint side. While it can serve as a mean to filter out already existing customers and thus help preventing double-registrations, you must keep this in mind. Should you get a rejection saying, that the alias has expired on Twint side, you must first delete the old alias, before your customer can re-register.

Using the Alias

Web View Web-to-App switch

If you are integrating Twint inisde a web-view, you may have to specifically configure your view, in order for the Twint app to open.

Here is example-code on how this is achieved.

This code has been directly provided by Twint. If you have any questions, please ask Twint for help.

// In the UIViewController that embed the Payment Layer, you have to register a delegate that will detect the Twint Actions and will open the correct URL.
-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSURL * srcURL = [NSURL URLWithString:@"https://yourApp.ch/webShop"];// Use your url for loading remote or local
    [self.webView loadRequest:[NSURLRequest requestWithURL:srcURL]];
    [self.webView setNavigationDelegate:self];
}
  
// Inform Payment layer about compatibility
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    [webView evaluateJavaScript:@"window.twintHookActivated=true;window.refreshUI()" completionHandler:^(id idOf, NSError *  error) {
    }];
}
// Detect Twint Actions and open using [UIApplication sharedApplication] openURL
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    if ([[navigationAction.request.URL absoluteString] hasPrefix:@"twint-"]) {
        [[UIApplication sharedApplication] openURL:navigationAction.request.URL options:nil completionHandler:^(BOOL success) {
            if(!success){
                [webView evaluateJavaScript:@"if(typeof appNotInstalled!='undefined') appNotInstalled()" completionHandler:^(id idOf, NSError *  error) {
                }];
            }
        }];
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }else{
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView web =(WebView)findViewById(R.id.webView);
    WebSettings webSettings =web.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    web.loadUrl("https://yourApp.ch/webShop");
    web.setWebViewClient(new WebViewClient() {
        @Override
        // Inform Payment layer about compatibility
        public void onPageFinished(WebView view, String url)
        {
            view.loadUrl("javascript:window.twintHookActivated=true;");
            view.loadUrl("javascript:window.refreshUI()");
        }
        // Detect Twint Actions and open custom Intent
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            // do your handling codes here, which url is the requested url
            // probably you need to open that url rather than redirect:
            if(url.contains("ch.twint.action.TWINT_PAYMENT")){
                String action ="ch.twint.action.TWINT_PAYMENT";
                String token = url.substring(url.indexOf("S.code=")+7,url.length());
  
  
                token = token.substring(0,token.indexOf(";"));
                Intent intent = new Intent();
                intent.setAction(action);
  
                intent.putExtra("code",token);
                intent.putExtra("startingOrigin","EXTERNAL_WEB_BROWSER");
  
                startActivity(intent);
                return true ;
            }else if(url.contains("ch.twint.action.TWINT_UOF_REGISTRATION")){
                String action ="ch.twint.action.TWINT_UOF_REGISTRATION";
                String token = url.substring(url.indexOf("S.code=")+7,url.length());
  
  
                token = token.substring(0,token.indexOf(";"));
                Intent intent = new Intent();
                intent.setAction(action);
  
                intent.putExtra("code",token);
                intent.putExtra("startingOrigin","EXTERNAL_WEB_BROWSER");
  
                startActivity(intent);
                return true ;
            }  
            view.loadUrl(url);
            return true;
        }
    });
}

Testing

/

Twint User on File saves Twint payment means inside the , allowing you to execute subsequent/recurring transactions on a users Twint account.

A valid license with access to the .

One of the ways to register a Twint account into Secure Card Data, is via the . Simply follow the standard flow there.

A Twint user can reject the User On File registration during a payment. If that is the case, Saferpay will return a successful transaction, but a failed registration. Please make sure, that you are able to.

The Standalone Registration is done via the . Within the , you need to specify the parameter Type with the value TWINT, which signals, that you want to save Twint payment means.

The merchant system then needs to execute the , in order to gather the alias and other important payment mean details.

Once you have obtained the alias, you can go ahead and execute your recurring/subsequent transaction using the . The alias is set within the PaymentMeans.Alias container, but remember, that this transaction, like all Twint transactions, also must be for the money to flow.

Please refer to , if you want to test TWINT.

Saferpay Secure Card Data Store
Payment API and Secure Card Data
Alias Assert Insert Request
Transaction AuthorizeDirect request
captured
Refunds
Omni-Channel
Needs attention!
Needs attention!
Needs attention!
Needs attention!
Testing
corresponding license
Payment Page
capture
capture
capture
contact Twint
"Pay later" solution offered by Twint
sales team
Alias Insert Request
Capture
Payment Page process
Cancel
Payment Page
handle this case accordingly
Saferpay Alias Store
this chapter
(click to enlarge)