Aircash Withdrawal

When the Aircash withdrawal is started, the customer will be redirect to the Aircash Frame and will have to enter his mobile phone number. Aircash will remember the user´s phone number after the first entry and will prefill the page on sequent payments.

Based on the customer´s mobile phone number, Aircash will detect which wallet is used. If everything is OK, the user will see a message that the payment is initiated.

Aircash will create a withdrawal transaction and notify PXP.

Once the merchant is ready to release the funds, the merchant should call executePaymentAction to finalize the payment. Aircash will then top up the user´s balance. The user can then choose how to use the funds in the Aircash wallet - cash them out at an ATM, use his Mastercard card to make payment, top up his merchant´s account, etc.

The following method IDs are covered in this section:

IDNameCredit/Debit State
442Aircash WithdrawalWithdrawnByProvider (20)

Payment method interaction type: Redirection to External Payment Provider (see Interaction Types).

Flow

Redirect Integration

Currently not supported.

Backend2BackendIntegration

The following parameters can be provided in initiatePaymentRequest.specificPaymentData:

key (value type, account type, required)value
SuccessPageUrl
(string, >optional)
URL to redirect for successful payments
CancelPageUrl (string, optional)URL to redirect if payment is cancelled
RefusedPageUrl (string, optional)URL to redirect in case of a declined transaction
HomepageUrl (string, optional)Home page URL from the merchant.
CultureInfo (string, optional)Language Identifier (RFC 3066) in the form "en-US" (will be further described once implementation is completed)
PaymentProviderID (string, optional)Payment provider ID 209.

📘

URLs

If the Aircash SDK is used with SDK Window Checkout mandatory parameters are the HomepageUrl.

If the SDK Redirect Checkout is used, mandatory parameters are the RefusedPageUrl, SuccessPageUrl and CancelPageUrl.

If the merchant is using it´s own method to open Aircash Frame window, then mandatory parameters are SuccessPageUrl, RefusedPageUrl and CancelPageUrl.

The following parameters can be provided in InitiatePaymentRequest.UserData:

key (value type, account type, required)value
FirstNameuser´s first name
Lastnameuser´s last name
DateOfBirthuser´s date of birth

FirstName, LastName and DateOfBirth will be send for matching purposes at Aircash. PXP will only send these fields if all of the are provided. Matching functionality also needs to be activated at Aircash.

For territories with AML regulations (i.e. Germany) that are requesting identity validation and verification, it needs to be ensured that the person on the merchant side is the same one on the Aircash side. This can be achieved by comparing the following parameters: First name, Last name and date of birth. So if the result of the personal data match is false, then the transaction should be declined.

In case of mismatch, the following will be presented to the user on the Aircash frame:

When a mismatch occurs, payment will go to state RefusedByProvider.

There is no other parameter for the merchant to see if matching personal data has failed, only that the payment will go to state RefusedByProvider. Exact failure reasons will be provided in a subsequent implementation.

Example initiatePaymentRequest:

<initiatePaymentRequest xmlns:xsi"=http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cqrpayments.com/PaymentProcessing">
    <merchantID>{{merchant}}</merchantID>
    <shopID>{{shop}}</shopID>
    <merchantTransactionID>{{merchantTransactionID}}</merchantTransactionID>
    <paymentMethodID>442</paymentMethodID>
    <amount currencyCode="EUR">100.10</amount>
    <userID>{{newUserID}}</userID>
    <userData>
        <username>{{newUserName}}</username>
        <firstname>höchünkä</firstname>
        <lastname>käöü</lastname>
        <currencyCode>EUR</currencyCode>
        <languageCode>EN</languageCode>
        <email>{{newUserEmail}}</email>
        <address>
            <street>Marxergasse</street>
            <houseNumber>1b</houseNumber>
            <postalCode>1030</postalCode>
            <city>Vienna</city>
            <countryCode2>AT</countryCode2>
            <telephoneNumber>00437778889999</telephoneNumber>
        </address>
        <dateOfBirth>1980-10-10T00:00:00</dateOfBirth>
        <gender>Male</gender>
    </userData>
  <userIP>127.0.0.1</userIP>
    <userSessionID>bc0cd72c-8c03-40c0-8847-275d61dbd8ea</userSessionID>
    <creationTypeID>1</creationTypeID>
    <specificPaymentData>
        <data xsi:type="keyStringValuePair">
            <key>CultureInfo</key>
            <value>de_AT</value>
      </data>
        <data xsi:type="keyStringValuePair">
            <key>SuccessPageUrl</key>
            <value>http://merchant.com/result?status=success&amp;ref=1</value>
        </data>
        <data xsi:type="keyStringValuePair">
            <key>CancelPageUrl</key>
            <value>http://merchant.com/result?status=cancel&amp;ref=1</value>
        </data>
        <data xsi:type="keyStringValuePair">
            <key>ErrorPageUrl</key>
            <value>http://merchant.com/result?status=error&amp;ref=1</value>
        </data>
    </specificPaymentData>
</initiatePaymentRequest>

Example initiatePaymentResponse:

initiatePaymentResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <payment xsi:type="paymentWithPaymentAccount">
        <merchantID>B2BTestMerchant</merchantID>
        <shopID>AircashProviderShop</shopID>
        <paymentMethod>
            <key>442</key>
            <value>Aircash Withdrawal</value>
        </paymentMethod>
        <merchantTransactionID>hc-20230704-180556</merchantTransactionID>
        <paymentID>f3712319-dc3a-4605-8e70-9e3d5c4a098f</paymentID>
        <userID>hc20230704180556</userID>
        <paymentProvider>
            <key>209</key>
            <value>Aircash</value>
        </paymentProvider>
        <amount currencyCode="EUR">100.10</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>127.0.0.1</userIP>
        <state>
            <id>d58f6843-7975-4520-a3f7-3c44d3dd469e</id>
            <definition>
                <key>30</key>
                <value>RedirectURLCreated</value>
            </definition>
            <createdOn>2023-07-04T16:05:57.5140977Z</createdOn>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>RedirectionUrl</key>
                    <value>https://stage-frame.aircash.eu/76ea76c5-95f4-4125-b8f5-e1e2bdd8f831</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">100.1</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderTransactionID</key>
                <value>76ea76c5-95f4-4125-b8f5-e1e2bdd8f831</value>
            </detail>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>1077</value>
            </detail>
        </paymentDetails>
    </payment>
</initiatePaymentResponse>

Example initiatePaymentResponse with error InitiateErrorReportedByProvider:

<initiatePaymentResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <payment xsi:type="paymentWithPaymentAccount">
        <merchantID>B2BTestMerchant</merchantID>
        <shopID>AircashProviderShop</shopID>
        <paymentMethod>
            <key>442</key>
            <value>Aircash Withdrawal</value>
        </paymentMethod>
        <merchantTransactionID>hc-20230704-181533</merchantTransactionID>
        <paymentID>dbcfc1f7-b383-4399-a7ad-240b58dc5c99</paymentID>
        <userID>hc20230704181533</userID>
        <paymentProvider>
            <key>209</key>
            <value>Aircash</value>
        </paymentProvider>
        <amount currencyCode="GBP">100.10</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>127.0.0.1</userIP>
        <state>
            <id>327638c6-92f5-4c4e-9e76-7364431ec97a</id>
            <definition>
                <key>4</key>
                <value>InitiateErrorReportedByProvider</value>
            </definition>
            <createdOn>2023-07-04T16:15:34.0882168Z</createdOn>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderErrorResponseCode</key>
                    <value>1</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderErrorResponseMessage</key>
                    <value>Invalid signature or partner id.</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">115.8</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>1079</value>
            </detail>
        </paymentDetails>
    </payment>
</initiatePaymentResponse>

Example initiatePaymentResponse with error InitiateRequestProviderCommunicationErrorOccurred:

<initiatePaymentResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <payment xsi:type="paymentWithPaymentAccount">
        <merchantID>B2BTestMerchant</merchantID>
        <shopID>AircashProviderShop</shopID>
        <paymentMethod>
            <key>442</key>
            <value>Aircash Withdrawal</value>
        </paymentMethod>
        <merchantTransactionID>hc-20230707-173711</merchantTransactionID>
        <paymentID>02d2bd32-7318-4d78-951b-e3837004e4b5</paymentID>
        <userID>hc20230707173711</userID>
        <paymentProvider>
            <key>209</key>
            <value>Aircash</value>
        </paymentProvider>
        <amount currencyCode="EUR">100.10</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>127.0.0.1</userIP>
        <state>
            <id>47de3744-3240-4b42-9882-ac5792b334c9</id>
            <definition>
                <key>325</key>
                <value>InitiateRequestProviderCommunicationErrorOccurred</value>
            </definition>
            <createdOn>2023-07-07T15:37:53.3603193Z</createdOn>
            <description>Error occurred while processing payment communication for Payment[ID='47662579'].</description>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">100.1</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>1560</value>
            </detail>
        </paymentDetails>
    </payment>
</initiatePaymentResponse>

Example initiatePaymentResponse with error InitiateRefusedByProvider:

<initiatePaymentResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <payment xsi:type="paymentWithPaymentAccount">
        <merchantID>B2BTestMerchant</merchantID>
        <shopID>AircashProviderShop</shopID>
        <paymentMethod>
            <key>442</key>
            <value>Aircash Withdrawal</value>
        </paymentMethod>
        <merchantTransactionID>hc-20230704-181419</merchantTransactionID>
        <paymentID>163375eb-d093-4503-949a-548818b8a2e1</paymentID>
        <userID>hc20230704181419</userID>
        <paymentProvider>
            <key>209</key>
            <value>Aircash</value>
        </paymentProvider>
        <amount currencyCode="GBP">100.10</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>127.0.0.1</userIP>
        <state>
            <id>75bf60f4-2164-4ba3-afa4-c3e369552369</id>
            <definition>
                <key>550</key>
                <value>InitiateRefusedByProvider</value>
            </definition>
            <createdOn>2023-07-04T16:14:21.7751655Z</createdOn>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderErrorResponseCode</key>
                    <value>3000</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderErrorResponseMessage</key>
                    <value>Invalid currency.</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">115.8</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>1078</value>
            </detail>
        </paymentDetails>
    </payment>
</initiatePaymentResponse>

Payment Initiation

The redirect page will display only the phone number as it is the main parameter for withdrawals. When the user enters the phone number and all prerequisites are being met (user exists, personal data is matched), Aircash will send a notification to PXP. PXP will update the state of the payment and send the following notification to merchant:

Example handlePaymentStateChangedNotificationRequest (ConfirmedByCustomer):

<?xml version="1.0" encoding="utf-16"?>
<handlePaymentStateChangedNotificationRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.cqrpayments.com/PaymentProcessing">
	<payment xsi:type="paymentWithPaymentAccount">
		<merchantID>B2BTestMerchant</merchantID>
		<shopID>AircashProviderShop</shopID>
		<paymentMethod>
			<key>442</key>
			<value>Aircash Withdrawal</value>
		</paymentMethod>
		<merchantTransactionID>hc-20230705-105501</merchantTransactionID>
		<paymentID>2488b161-0ee9-4d61-9cd0-fd0283567079</paymentID>
		<userID>hc20230705105501</userID>
		<paymentProvider>
			<key>209</key>
			<value>Aircash</value>
		</paymentProvider>
		<amount currencyCode="EUR">100.1000</amount>
		<creationType>
			<key>1</key>
			<value>User</value>
		</creationType>
		<userIP>127.0.0.1</userIP>
		<state>
			<id>5eb9d2ff-ed35-4807-b299-d309be2182a6</id>
			<definition>
				<key>517</key>
				<value>ConfirmedByCustomer</value>
			</definition>
			<createdOn>2023-07-05T08:55:15.203</createdOn>
			<paymentStateDetails>
				<detail xsi:type="keyStringValuePair">
					<key>ProviderStatusCode</key>
					<value>4</value>
				</detail>
				<detail xsi:type="keyIntValuePair">
					<key>PaymentStateReasonID</key>
					<value>1</value>
				</detail>
			</paymentStateDetails>
		</state>
		<isExecuted>false</isExecuted>
		<baseAmount currencyCode="EUR">100.1000</baseAmount>
		<paymentDetails>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderExternalID</key>
				<value>1117</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderTransactionID</key>
				<value>c04a8155-c9e5-4147-a1eb-01506072c678</value>
			</detail>
		</paymentDetails>
	</payment>
</handlePaymentStateChangedNotificationRequest>

After the merchant has been notified, the payment will go to state PendingOnMerchant waiting for the merchant to take action.

Final approval or abort by merchant

When the merchant is ready to execute the payment and pass the funds to the users wallet, the merchant should call executePaymentAction with action 95030 (accept) or with action 8 (MoveToRefusedByMerchantState).

There is no certain time span for calling executePaymentAction to finalize the payment.

As the payment has been initiated when payment went to ConfirmedByCustomer state, the merchant is expected to reserve funds on the user´s wallet. Once the merchant approves the withdrawal, the merchant should call executePaymentAction with either action 95030 for approval, or if the merchant decides to abort the payment, he should use action 8.

sample executePaymentAction request with actionID 95030

<executePaymentActionRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cqrpayments.com/PaymentProcessing">
      <merchantID>{{merchant}}</merchantID>
    <shopID>{{shop}}</shopID>
    <paymentID>{{originalPaymentUniqueID}}</paymentID>
    <actionID>95030</actionID>
    <remark>Approved</remark>
</executePaymentActionRequest>

sample executePaymentAction response for actionID 95030 (successful, WithdrawnByProvider)

<executePaymentActionResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>
    <statusCode>0</statusCode>
    <actionResults>
        <result xsi:type="keyStringValuePair">
            <key>lastStateDefinition</key>
            <value>20</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>ProviderTransactionID</key>
            <value>8c969c4f-1e9d-474e-bfcf-f8194e2f817a</value>
        </result>
    </actionResults>
</executePaymentActionResponse>

sample executePaymentAction response for action 95030 (failed, WithdrawCommunicationErrorOccurred)

executePaymentActionResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <statusCode>1</statusCode>
    <actionResults>
        <result xsi:type="keyStringValuePair">
            <key>lastStateDefinition</key>
            <value>576</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>ProviderTransactionID</key>
            <value>9aeacd88-d8c4-4c1e-9546-de71ce9a2b62</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>PaymentStateReasonID</key>
            <value>1</value>
        </result>
    </actionResults>
</executePaymentActionResponse>

The payment can go to the following states when executePaymentAction with action 95030 (Accept) is called.

StateDescription
WithdrawCommunicationErrorOccurredNo response from provider has been received.
RefusedByProviderPayout has been refused by the provider. ProviderResponseCode and ProviderResponseMessage have ben stored and will be provided in the executePaymentAction response.
WithdrawErrorReportedByProviderAn error response was returned by the provider. ProviderResponseCode and ProviderResponseMessage (if available) will be returned in the executePaymentAction response.
WithdrawnByProviderA successful response has been received by provider.

sample executePaymentAction response (WithdrawErrorReportedByProvider):

<executePaymentActionResponse xmlns="http://www.cqrpayments.com/PaymentProcessing"
                              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<statusCode>0</statusCode>
	<actionResults>
		<result xsi:type="keyStringValuePair">
			<key>lastStateDefinition</key>
			<value>21</value>
		</result>
		<result xsi:type="keyStringValuePair">
			<key>ProviderTransactionID</key>
			<value>bac1ebd7-ca69-4909-9cb5-9b68a91b91cd</value>
		</result>
		<result xsi:type="keyStringValuePair">
			<key>ProviderErrorResponseCode</key>
			<value>1</value>
		</result>
		<result xsi:type="keyStringValuePair">
			<key>ProviderErrorResponseMessage</key>
			<value>Invalid signature or partner id.</value>
		</result>
		<result xsi:type="keyStringValuePair">
			<key>PaymentStateReasonID</key>
			<value>1</value>
		</result>
	</actionResults>
</executePaymentActionResponse>

sample executePaymentAction error response (RefusedByProvider):

<executePaymentActionResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <statusCode>0</statusCode>
    <actionResults>
        <result xsi:type="keyStringValuePair">
            <key>lastStateDefinition</key>
            <value>100</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>ProviderTransactionID</key>
            <value>5fe3c6fe-a1fe-4f10-a29f-0db2bd606f7e</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>ProviderResponseCode</key>
            <value>3008</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>ProviderResponseMessage</key>
            <value>User reached transaction limit or user is blocked</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>PaymentStateReasonID</key>
            <value>1</value>
        </result>
    </actionResults>
</executePaymentActionResponse>

The payment can go to the following states when executePaymentAction with action 8 (MoveToRefusedByMerchantState) is called:

StateDescription
RefusedByMerchantThe payment was aborted by merchant.

sample executePaymentAction request with actionID 8

<executePaymentActionRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cqrpayments.com/PaymentProcessing">
      <merchantID>{{merchant}}</merchantID>
    <shopID>{{shop}}</shopID>
    <paymentID>{{originalPaymentUniqueID}}</paymentID>
    <actionID>8</actionID>
    <remark>Move To RefusedByMerchant state</remark>
</executePaymentActionRequest>

sample executePaymentAction response for actionID 8 (successful)

executePaymentActionResponse xmlns="http://www.cqrpayments.com/PaymentProcessing" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <statusCode>1</statusCode>
    <actionResults>
        <result xsi:type="keyStringValuePair">
            <key>lastStateDefinition</key>
            <value>342</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>ProviderTransactionID</key>
            <value>e113ed28-064b-49fa-9e66-78eb7300d2be</value>
        </result>
        <result xsi:type="keyStringValuePair">
            <key>PaymentStateReasonID</key>
            <value>1</value>
        </result>
    </actionResults>
</executePaymentActionResponse>

The state returned in this sample is RefusedByMerchant.

Notifications

The standard notification mechanism is used for notifying the merchant in the background (asynchronously) about payment state changes. For more information see PaymentStateChangedNotification.

When the payment goes to state RefusedByProvider, the handlePaymentStateChangedNotificationRequest will also include the exact refusal reasons in the detail ProviderLogs, if they are configured at provider.

Example handlePaymentStateChangedNotificationRequest (RefusedByProvider):

<?xml version="1.0" encoding="utf-16"?>
<handlePaymentStateChangedNotificationRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                              xmlns="http://www.cqrpayments.com/PaymentProcessing">
	<payment xsi:type="paymentWithPaymentAccount">
	<merchantID>B2BTestMerchant</merchantID>
	<shopID>AircashProviderShop</shopID>
	<paymentMethod>
		<key>442</key>
		<value>Aircash Withdrawal</value>
	</paymentMethod>
	<merchantTransactionID>hc-20230705-104507</merchantTransactionID>
	<paymentID>d3904e77-f80f-49d8-87fa-d4a8f8e9270c</paymentID>
	<userID>hc20230705104507</userID>
	<paymentProvider>
		<key>209</key>
		<value>Aircash</value>
	</paymentProvider>
	<amount currencyCode="EUR">100000.0000</amount>
	<creationType>
		<key>1</key>
		<value>User</value>
	</creationType>
	<userIP>127.0.0.1</userIP>
	<state>
		<id>2f63f84f-90b7-4e20-aaa2-b5a65251b2fc</id>
		<definition>
			<key>100</key>
			<value>RefusedByProvider</value>
		</definition>
		<createdOn>2023-07-05T08:45:38.7</createdOn>
		<paymentStateDetails>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderErrorResponseCode</key>
				<value>3008</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderErrorResponseMessage</key>
				<value>User reached transaction limit or user is blocked</value>
			</detail>
			<detail xsi:type="keyIntValuePair">
				<key>PaymentStateReasonID</key>
				<value>1</value>
			</detail>
		</paymentStateDetails>
	</state>
	<isExecuted>false</isExecuted>
	<baseAmount currencyCode="EUR">100000.0000</baseAmount>
	<paymentDetails>
		<detail xsi:type="keyStringValuePair">
			<key>ProviderExternalID</key>
			<value>1086</value>
		</detail>
		<detail xsi:type="keyStringValuePair">
			<key>ProviderTransactionID</key>
			<value>da08a7a8-8b7e-4ca4-bbef-46ead9ff5f68</value>
		</detail>
	</paymentDetails>
</payment>
</handlePaymentStateChangedNotificationRequest>

Example handlePaymentStateChangedNotificationRequest (AbortedByCustomer):

<?xml version="1.0" encoding="utf-16"?>
<handlePaymentStateChangedNotificationRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                              xmlns="http://www.cqrpayments.com/PaymentProcessing">
	<payment xsi:type="paymentWithPaymentAccount">
		<merchantID>B2BTestMerchant</merchantID>
		<shopID>AircashProviderShop</shopID>
		<paymentMethod>
			<key>442</key>
			<value>Aircash Withdrawal</value>
		</paymentMethod>
		<merchantTransactionID>hc-20230705-104339</merchantTransactionID>
		<paymentID>f2f228bf-da22-455f-81d3-83d509b44f83</paymentID>
		<userID>hc20230705104339</userID>
		<paymentProvider>
			<key>209</key>
			<value>Aircash</value>
		</paymentProvider>
		<amount currencyCode="EUR">10.1000</amount>
		<creationType>
			<key>1</key>
			<value>User</value>
		</creationType>
		<userIP>127.0.0.1</userIP>
		<state>
			<id>857f5392-ec09-4e1c-812e-c06de2d3d9c3</id>
			<definition>
				<key>101</key>
				<value>AbortedByCustomer</value>
			</definition>
			<createdOn>2023-07-05T08:43:52.223</createdOn>
			<paymentStateDetails>
				<detail xsi:type="keyStringValuePair">
					<key>ProviderStatusCode</key>
					<value>3</value>
				</detail>
				<detail xsi:type="keyIntValuePair">
					<key>PaymentStateReasonID</key>
					<value>1</value>
				</detail>
			</paymentStateDetails>
		</state>
		<isExecuted>false</isExecuted>
		<baseAmount currencyCode="EUR">10.1000</baseAmount>
		<paymentDetails>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderExternalID</key>
				<value>1084</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderTransactionID</key>
				<value>739b1e68-93ed-4b44-b091-5105d508041c</value>
			</detail>
		</paymentDetails>
	</payment>
</handlePaymentStateChangedNotificationRequest>

Mock Testing

In addition to provider testing we support mock testing. If necessary, please ask for this to be enable in TEST1.

Some states can be reached by passing a parameter ForcedProviderResponse in the initiatePayment call.

sample initiatePayment request to be added

Some states are also reachable by selecting an action in the redirection page - please see the description for Aircash Pay.

The following states are supported by the merchant mock:

Test caseInitiatePayment: ForceProviderResponseProvider Mock: Select Provider response
InitiateRequestProviderCommunicationErrorOccurredInitiateRequestProviderCommunicationErrorOccurred
InitiateRefusedByProviderInitiatePayOutRefused
InitiateErrorReportedByProviderInitiatePayOutError
WithdrawCommunicationErrorOccurredWithdrawalConfirmationCommunicationErrorCommunication Error
RefusedByProviderWithdrawalConfirmationRefusedRefused
WithdrawErrorReportedByProviderWithdrawalConfirmationErrorError

Provider testing

For provider testing, an app for Android or IOS has to be requested from Aircash. Once the user has been setup, it will need to be verified by the Aircash support team and added test funds.

On IOS developer mode, developer mode has to be enabled. See here.