Introduction

Customers with iOS devices or Macs can use Apple Pay to make payments using their stored payment methods.

To enable eligible customers to use Apple Pay, merchants should display an Apple Pay button. Upon selection, customers are presented with a payment sheet or a QR code for an easy review of the order and payment details.

Apple Pay on the Web can now be used via Payone without the need to have your own Apple developer account, making the integration process simpler and removing additional maintenance and registration with the Apple Pay developer program.

Disclaimer

At the moment Session initiation request is only available in mode live. 

Test mode support will be available at a later time. We apologize for the inconvinience. 

---end

 

Overview

Apple Pay is currently not supported in all countries, please check with Apple Pay if it is available in your country/region. This specific version is not supported in Mainland China.

All currencies that Apple Pay supports are currently also supported by the PAYONE platform.

Supported Payment methods:

  • Visa
  • Mastercard
  • girocard

The Apple Pay token serves as a pseudo card PAN, resembling a credit card number, allowing third-party systems to utilize it without needing to adhere to PCI DSS requirements for storing card data. However This information is not available for the Merchant using Apple Pay without own developer account and can be accessed only by Payment Service Provider responsible for the Payment. 

Clearingtype / Clearingsubtype

clearingtype wallettype
wlt APL

 

Test Data

The test data that can be used is documented on the developer page of Apple Pay

LIABILITY SHIFT

Apple Pay supports liability shift globally for all the major Schemes, except for Visa.

The liability shift rules for Visa are defined as following:

  • For devices running iOS 16.2 and above, there is global support for all countries.
  • For devices running on versions below iOS 16.2, support is only available for cards issued in Europe region (as defined by Visa). 

Liability shift applies only to the Customer-Initiated Transactions (CITs). 
It is not available for Merchant-Initiated Transactions (MITs) since the cardholder is not present in-session for biometrics authentication. 

However in certain scenarios the liability can stay with a Merchant if it was indicated in the Apple Pay payload by providing a specific ECI value. 

Please make sure you only make payment methods available for Apple Pay which are part of your contract with us.

Sequence Diagram

Significantly simplified sequence diagram in order to present the implementation with Payone Server API showing a sample positive scenario of a Authorization request.

Apple Pay implementation is done on the Merchant side and is presented simplified with a focus on a Session retrieval and payment requests being sent. 

Compared to a regular credit card payment there is no 3ds flow and no redirect needed. 


Prerequisites

Opposed to the Apple pay integration with your own Apple Pay Developer Accounts, there is no need to create or have a Developer Account with Apple, but there are other requirements which should be followed.

In order to begin processing with Apple Pay you should contact our customer support, however first ensure that you have completed the Domain verification steps described below.

Domain Verification and server Setup

Prior to requesting the Apple Pay without Developer account with our Merchant Services team , prepare your website for registration (will be done by Payone) with Apple pay. Please see the same process should be completed each time you change any URL`s or would like to enable a new Merchant ID (MID) or Portal.

Step 1 - Put the following file to your web page to the dedicated URL defined below. 

Download domain verification file

Path where this file should be located on each your domain:

/.well-known/apple-developer-merchant-id-domain-association

Step 2 - Setup your Server and Web Page

Follow Apple guidelines for Server Setup. You should specifically allow Apple IP Addresses for Domain Verification and payment processing. 

Please ensure that domain has a valid SSL certificate. For future it is crucial to update the certificate not later than 7 days prior to it`s expiration to keep Apple Pay functional.    If not done in the mentioned time, contact our merchant service team to onboard you to Apple Pay again. 

Step 3 - Requesting a Merchant Identifier

Once all prerequisites are done, contact our Merchant Services team in order to be on-boarded and receive merchantIdentifier. You will need this identifier in order to begin payment processing with Apple Pay on the Web. 

You will be able to see your merchantIdentifier in the PMI for the onboarded Portal once the registration is completed. This can be found at the following path : CONFIGURATION/PAYMENT PORTALS - choose an onboarded Portal and go to Payment type configuration tab.

 

Apple Pay on Your Website

How Apple Pay Works

Similar to other payment buttons, Apple Pay is designed to bypass the typical checkout steps by displaying a comprehensive payment sheet to the customer.

source: Apple

Initiating The Payment Session

Apple Pay on the Web

Apple Pay on the Web utilizes JavaScript APIs integrated into Safari on both Mac and mobile devices.

In order to be able to process the transaction with Apple Pay without developer account, you will need to implement a session retrieval process for the onvalidatemerchant event, which would be done against Payone Endpoint  using a generic request.

New Apple Pay on the web without a developer account special parameters 
API PARAMETER REQUIRED Definition
add_paydata[action]="init_applepay_session" YES Generic action
add_paydata[display_name]="testStore" YES Merchant Display Name
add_paydata[domain_name]="aTestDomain"' YES

Merchant Domain Name

Sample Session initiation request

Please use the following generic request to retrieve a session against Payone Server API

request="genericpayment"
mid="1234"
aid="1235"
portalid="2013224"
key="123456789abcdefghij"
mode="live"
clearingtype="wlt"
wallettype="APL"
currency: "EUR"
add_paydata[action]="init_applepay_session"
add_paydata[display_name]="testStore"
add_paydata[domain_name]="aTestDomain"
Sample Session initiation Response
"status": "OK",
"workorderid": "PP2AADH3T16XW53W",
"add_paydata[applepay_payment_session]": "BASE64_encoded_STRING"

You will have to decode the session data from BASE64 and use it `as is` to identify yourself with Apple Pay 

Apple Pay Button display 

"For information on displaying the buttons and initiating the payment session, please refer to the Apple documentation: https://developer.apple.com/documentation/apple_pay_on_the_web/displaying_apple_pay_buttons and https://developer.apple.com/documentation/apple_pay_on_the_web/apple_pay_js_api/creating_an_apple_pay_session

Visit https://applepaydemo.apple.com for a comprehensive overview and some demo code.

Ensure that your payment request is configured correctly to align with your merchant account capabilities. For instance, a basic request for a merchant who can process Mastercard, Visa, and girocard in live mode might look like this:

{
  "countryCode": "DE",
  "currencyCode": "EUR",
  "merchantCapabilities": [
    "supports3DS" // mandatory
  ],
  "supportedNetworks": [
    "visa",
    "masterCard",
    "girocard"
  ],
  "total": {
    "label": "Demo (Card is not charged)",
    "type": "final",
    "amount": "1.99"
  }
}

Handling of Co-Badged Cards

Starting with iOS 15.4, the Apple Pay APIs will honor the order in which the supportedNetworks array is listed. If both networks of a co-badged card are supported by the merchant and the customer’s default card is co-badged, the pre-selected network will be chosen based on the listed order of the networks. This preference affects only the user’s default card (if it’s co-badged), as merchants cannot change the default card selection. However the customer can choose what network he will use.

For Mastercard co-badged Girocards, you can specify the preferred network order like this:

optional parameters


"supportedNetworks": [
    "girocard",
    "masterCard",
    "visa"
  ],
optional parameters


"supportedNetworks": [
    "masterCard",
    "girocard",
    "visa"
  ],

Apple Pay In-App

Apple Pay in the App is not supported without Developer Account as this a limitation from Apple. You will need to have your own developer account and implement the regular version of the Apple Pay available from Payone. 

Forwarding the  Token Data to the Payone API

After the customer completes the payment sheet and authenticates using biometric methods (such as Touch ID or Face ID), you'll receive an Apple Pay object like this:

Apple Pay Object
{
   "token":{
      "paymentData":{
         "version":"EC_v1",
         "data":"3+f4oOTwPa6f1UZ6tG...CE=",
         "signature":"MIAGCSqGSIb3DQ...AAAA==",
         "header":{
            "ephemeralPublicKey":"MFkwEK...Md==",
            "publicKeyHash":"l0CnXdMv...D1I=",
            "transactionId":"32b...4f3"
         }
      },
      "paymentMethod":{
         "displayName":"Visa 1234",
         "network":"Visa",
         "type":"debit"
      },
      "transactionIdentifier":"32b...4f3"
   },
   "billingContact":{
      "addressLines":[
         "1 Street",
         ""
      ],
      "administrativeArea":"",
      "country":"United Kingdom",
      "countryCode":"GB",
      "familyName":"Appleseed",
      "givenName":"John",
      "locality":"London",
      "postalCode":"AB12 3CD",
      "subAdministrativeArea":"",
      "subLocality":""
   },
   "shippingContact":{
      "addressLines":[
         "1 Street",
         ""
      ],
      "administrativeArea":"",
      "country":"United Kingdom",
      "countryCode":"GB",
      "familyName":"Appleseed",
      "givenName":"John",
      "locality":"London",
      "postalCode":"AB12 3CD",
      "subAdministrativeArea":"",
      "subLocality":"",
      "phoneNumber":"01234 567890",
      "emailAddress":"john.appleseed@apple.com"
   }
}

Many contents of this object can be mapped to existing Server API parameters.

Apple Pay Object
"billingContact":{
      "addressLines":[
         "1 Street",
         ""
      ],
      "administrativeArea":"",
      "country":"United Kingdom",
      "countryCode":"GB",
      "familyName":"Appleseed",
      "givenName":"John",
      "locality":"London",
      "postalCode":"AB12 3CD",
      "subAdministrativeArea":"",
      "subLocality":""
   },
PAYONE Server API
country=GB
        lastname=Appleseed
        firstname=John
        street=1 Street
        city=London
        zip=AB12 3CD

However, the payment component of the object is encrypted and must be sent to the PAYONE API using specific parameters.

Please note that the token generated by Apple has a limited lifespan of 5 minutes. In live mode (mode=live), PAYONE is required to reject expired tokens. 

Apple Pay Specific Error Messages

Error Description Suggested Activity

  apple-pay-technical-error

Your domain is no longer activated. This could have happened due to the loss of registration with Apple. Main reason for it is a failure to update the SSL certificate on time.
Other reason can be that the domain verification file was removed or corrupted. 
Additionally, if you are trying to use the same credentials for a new domain name, which was not registered with Apple. 

Contact our Merchant services team to enable yourself again with Apple Pay

   validation-error - missing-domain-name

Provide the domain name in the API Request

   validation-error - missing-display-name

Provide the display name in the API Request

2700

Request amount differs from apple pay token amount.

Make sure to use the same amount as in your Apple Pay payment sheet

2701

Request currency differs from apple pay token amount.

Make sure to use the same currency as in your Apple Pay payment sheet

2702

Failed to decrypt apple pay token

Check whether your Payment Processing Certificate is valid and uploaded to our merchant backend

2703

Certificate service declined request because of validation errors.

2704

Required parameter in apple pay token is missing or empty

Check if all required parameters for the Apple Pay token are set

Integrations

The API request below describe only Apple Pay on the web without  specific Payment requests.

Standard request such as Capture, Debit, Refund should be done as for creditcard with defining a clearingtype="wlt" and wallettype="APL"

POST Genericpayment
Account Parameters
request
required
Fixed Value: preauthorization
mid
required
your merchant ID, 5-digit numeric
aid
required
your subaccount ID, 5-digit numeric
portalId
required
your Portal ID, 7-digit numeric
key
required
your key value, alpha-numeric
Techical DATA Parameters

mode

required
Format CHAR(2..50)

Payment mode - can be test or live.

  Only live mode is supported at the moment. Test mode will be available later this year.

---end

 

clearingtype

required

Should be set as wlt as for other walllet based payment methods

wallettype

required
Should be set as APL for Apple Pay
Currency
required
Format ISO 4217 3-letter codes
example: EUR
add_paydata PARAMETERS
add_paydata[action]
required
Format STRING
init_applepay_session
add_paydata[display_name]
required

Format STRING

Will be displayed to the Endconsumer in the Apple UI

add_paydata[domain_name]
required
Format STRING
Your domain name that uses Apple Pay
status
Permitted Values
OK
ERROR
Response Parameter (Approved)
txid
Format NUMERIC(9..12)

The txid specifies the payment process within the PAYONE platform

userid
Format NUMERIC(9..12)

PAYONE User ID, defined by PAYONE

Response Parameter (Error)
errorcode
Format NUMERIC(1..6)

In case of error the PAYONE Platform returns an error code for your internal usage.

errormessage
Format CHAR(1..1024)

In case of error the PAYONE Platform returns an error message for your internal usage.

customermessage
Format CHAR(1..1024)

The customermessage is returned to your system in order to be displayed to the customer.

(Language selection is based on the end customer's language, parameter "language")

Host: api.pay1.de
Content-Type: application/x-www-form-urlencoded    
request="genericpayment"
mid="1234"
aid="1235"
portalid="2013224"
key="123456789abcdefghij"
mode="live"
clearingtype="wlt"
wallettype="APL"
currency: "EUR"
add_paydata[action]="init_applepay_session"
add_paydata[display_name]="testStore"
add_paydata[domain_name]="aTestDomain"
RESPONSE

"status": "OK",
"workorderid": "PP2AADH3T16XW53W",
"add_paydata[applepay_payment_session]": "BASE64_encoded_STRING"

POST Request Pre- /Authorization
Account Parameters
request
required
Fixed Value: preauthorization
mid
required
your merchant ID, 5-digit numeric
aid
required
your subaccount ID, 5-digit numeric
portalId
required
your Portal ID, 7-digit numeric
key
required
your key value, alpha-numeric
PERSONAL DATA Parameters
firstname
optional
Format CHAR(1..50)

First name of customer; optional if company is used, i.e.: you may use "company" or "lastname" or "firstname" plus "lastname"

lastname
required
Format CHAR(2..50)

Last name of customer; optional if company is used, i.e.: you may use "company" or "lastname" or "firstname" plus "lastname"

company
optional
Format CHAR(2..50)

Company name, required for B2B transactions (if add_paydata[b2b] = “yes”)

street
optional
Format CHAR(1..50)

Street number and name (required: at least one character)

zip
optional
Format CHAR(2..50)
Permitted Symbols [0-9][A-Z][a-z][_.-/ ]

Postcode

city
optional
Format CHAR(2..50)

City of customer

country
required
Format LIST
Permitted values ISO 3166 2-letter-codes
Samples

DE

GB

US

Specifies country of address for the customer.

Some countries require additional information in parameter "state"
email
optional
Format CHAR(5..254)

Permitted Symbols RFC 5322

Special Remark email validation:

Max. length for email is 254 characters. Validation is set up in the following way:

Username = Max. 63 characters

Domain Name = Max. 63 characters
Domain Suffixes = Max. 4 suffixes with max. 124 characters 
Example: username[63]@domain_name[63].suffix[60].suffix[60].suffix[4]

"@" and "." is counted as a character as well; in case of a total of three suffixes, this would allow a total of 254 characters.

email-address of customer

birthday
optional
Format DATE(8), YYYYMMDD

Samples 20190101 / 19991231


Date of birth of customer

telephonenumber
optional

Telephone number

add_paydata PARAMETERS
add_paydata[paymentdata_token_version]
required
Format STRING

Sample EC_v1

add_paydata[paymentdata_token_data]
required

Sample rhHAQUrR118u[...]cwDw==

add_paydata[paymentdata_token_signature]
required
Format STRING

Sample MIAGCSqGSIb3DQEHAqCAMIACAQE[...]AAAAAAA==

add_paydata[paymentdata_token_ephemeral_publickey]
required

Sample MFkwEwYHKoZIzj0[...]Y2A==

add_paydata[paymentdata_token_publickey_hash]
required
Format STRING

Sample ilecVF58bpB8qio[...]l6eirw2Y1v1KU

add_paydata[paymentdata_token_transaction_id]
Format STRING

Sample be2e745845b31dfac7778c6e29[...]b658cbcca971c0e0

Response Parameters
status
Permitted Values
APPROVED
ERROR
Response Parameter (Approved)
txid
Format NUMERIC(9..12)

The txid specifies the payment process within the PAYONE platform

userid
Format NUMERIC(9..12)

PAYONE User ID, defined by PAYONE

Response Parameter (Error)
errorcode
Format NUMERIC(1..6)

In case of error the PAYONE Platform returns an error code for your internal usage.

errormessage
Format CHAR(1..1024)

In case of error the PAYONE Platform returns an error message for your internal usage.

customermessage
Format CHAR(1..1024)

The customermessage is returned to your system in order to be displayed to the customer.

(Language selection is based on the end customer's language, parameter "language")

Host: api.pay1.de
Content-Type: application/x-www-form-urlencoded    
Payload

add_paydata[paymentdata_token_data]=FpFyA6zSGkZC[...]xi8xeXCNbpGBpvlNXfcang==
add_paydata[paymentdata_token_ephemeral_publickey]=MFkwEwYHKoZIzj0CA[...]iXv34cYJ4lxZsjVgnsE0i6RX+mg==
add_paydata[paymentdata_token_publickey_hash]=tWOdQ0ARSRiQNsrS4[...]7X6KBxLLAa8=
add_paydata[paymentdata_token_signature]=MIAGCSqGSIb3DQEHAq[...]s9oHcqWMnolhsgAAAAAAAA
add_paydata[paymentdata_token_transaction_id]=12d7[...]d4eebc2e54109386
add_paydata[paymentdata_token_version]=EC_v1
aid=12345
amount=1000
api_version=3.11
cardtype=V
clearingtype=wlt
country=DE
currency=EUR
encoding=UTF-8
firstname=Demo
key=123456789abcdefghij
lastname=Dude
mid=12345
mode=test
portalid=123456
reference=013265464564654
request=preauthorization
wallettype=APL
RESPONSE

status=APPROVED
txid=123456789
userid=987654321