BankTransferWithdrawal (Callpay)

The BankTransferWithdrawal method supports real time EFT bank transfer payouts through provider Callpay in South Africa.

The following method IDs are covered in this section:

IDNameCredit/Debit State
24BankTransferWithdrawalWithdrawnByProvider (20)

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

Supported currency: only ZAR

Flow

In order to test error states, please refer to the testing section below.

Redirect Integration

Currently not supported.

Backend2BackendIntegration

The following parameters can be provided in initiatePaymentRequest.specificPaymentAccountData:

key (value type, account type, required)value
accountOwner (string, required)Bank account owner
bankname (string, required)Bank name. Valid names include ABSA, Nedbank, Capitec, FNB, Standard, Investec
BankCountryCode2 (string, required)ZA by default
branchcode (string, required)fnb => 250655
absa => 632005
standard => 051001
nedbank => 198765
capitec => 470010
investec => 580105
mercantile => 450105
bidvest => 462005
tyme => 678910
windhoek => 483872
afribank => 430000
oldmutual => 462005
discovery => 679000
grindrod => 584000
ubank => 431010
imperial => 39001
firstrand => 201419
hsbc => 587000
sasfin => 683000
access => 410506
stdchartered => 730020

Data passed in this field will not be validated by PXP, but it is validated by Callpay. Please contact Callpay for details.
accountnumber (string, required)account number
accountType (string, required/optionalAccount type may be required for some banks. Possible values include cheque, savings, transmission. Subject to change, please contact Callpay.

Data sent in below request are validated by provider Callpay.

📘

Usage of payment account

A mix of paymentaccountID and paymentaccountdetails is not allowed.

When the payment account has missing payment account details, the merchant is responsible to collect those and pass them in specificPaymentAccountData, but the payment account should not be passed.

❗️

Communication Error

If a bank transfer withdrawal payment goes to communication error state, the payment has to be checked manually in the callpay backoffice. A lookup API has not be provided by Callpay.

Example initiatePaymentRequest - with account details:

<initiatePaymentRequest xmlns=http://www.cqrpayments.com/PaymentProcessing xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema>
    <merchantID>B2BTestMerchant</merchantID>
    <shopID>CallpayMockShop</shopID>
    <merchantTransactionID>MP_Callpay_151</merchantTransactionID>
    <paymentMethodID>24</paymentMethodID>
    <amount currencyCode="zar">22.5</amount>
    <userID>MaxCallpay002</userID>
    <userData>
        <username>MaxCallpay001</username>
        <firstname>John</firstname>
        <lastname>Doe</lastname>
        <email>[email protected]</email>        
        <dateOfBirth>2000-01-01T00:00:00</dateOfBirth>        
    </userData>
    <userIP>80.121.151.158</userIP>
    <userSessionID>t02d03hwaxkrl5gmabcypwmm</userSessionID>
    <creationTypeID>1</creationTypeID>
    <specificPaymentData>        
        <data xsi:type="keyStringValuePair">
            <key>PaymentDescription</key>
            <value>test</value>
        </data>                
    </specificPaymentData>
    <paymentAccount>
        <specificPaymentAccountData>
          <data xsi:type="keyStringValuePair">
            <key>accountowner</key>
            <value>New holder</value>
          </data>
          <data xsi:type="keyStringValuePair">
            <key>bankname</key>
            <value>SomeBank</value>
          </data>
          <data xsi:type="keyStringValuePair">
            <key>BankCountryCode2</key>
            <value>AT</value>
          </data>
          <data xsi:type="keyStringValuePair">
            <key>BankCode</key>
            <value>12311</value>
          </data>
          <data xsi:type="keyStringValuePair">
            <key>accountnumber</key>
            <value>11223344556677</value>
          </data>
          <data xsi:type="keyStringValuePair">
            <key>AccountType</key>
            <value>current</value>
          </data>
        </specificPaymentAccountData>
      </paymentAccount>
</initiatePaymentRequest>

Example initiatePaymentResponse with paymentaccount and account details:

<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>CallpayMockShop</shopID>
        <paymentMethod>
            <key>24</key>
            <value>BankTransferWithdrawal</value>
        </paymentMethod>
        <merchantTransactionID>MP_Callpay_150</merchantTransactionID>
        <paymentID>3bdc9e20-5af2-406e-9dbf-7580f5eadd2c</paymentID>
        <userID>MaxCallpay002</userID>
        <paymentProvider>
            <key>206</key>
            <value>Callpay</value>
        </paymentProvider>
        <amount currencyCode="ZAR">22.5</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>80.121.151.158</userIP>
        <state>
            <id>dd31c59f-4b4e-4c08-abf6-1c24782722db</id>
            <definition>
                <key>20</key>
                <value>WithdrawnByProvider</value>
            </definition>
            <createdOn>2023-08-31T08:59:49.1429904Z</createdOn>
            <paymentStateDetails xsi:nil="true"></paymentStateDetails>
        </state>
        <isExecuted>true</isExecuted>
        <baseAmount currencyCode="EUR">1.7</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ExternalReference</key>
                <value>1435466002</value>
            </detail>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderTransactionID</key>
                <value>1435466002384961</value>
            </detail>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>14069</value>
            </detail>
        </paymentDetails>
        <paymentAccount>
            <paymentAccountID>ff4ffdc6-25d8-4b54-8f83-a8c6aad7618a</paymentAccountID>
            <details>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountNumber</key>
                    <value>11223344556677</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankName</key>
                    <value>SomeBank</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankCountryCode2</key>
                    <value>ZA</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountOwner</key>
                    <value>test holder</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountType</key>
                    <value>cheque</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankCode</key>
                    <value>12311</value>
                </detail>
            </details>
        </paymentAccount>
    </payment>
</initiatePaymentResponse>

On payments going to state WithdrawnByProvider PXP returns a payment account in the initiatePaymentResponse. The payment account can be used for future withdrawals.

A payment account is only returned if the payment data was validated successfully at provider Callpay.

Example initiatePaymentResponse with error RefusedByProvider (CDV invalid):

<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>CallpayMockShop</shopID>
        <paymentMethod>
            <key>24</key>
            <value>BankTransferWithdrawal</value>
        </paymentMethod>
        <merchantTransactionID>MP_Callpay_152</merchantTransactionID>
        <paymentID>413407de-199a-4de0-8f99-2f2999d0c358</paymentID>
        <userID>MaxCallpay002</userID>
        <paymentProvider>
            <key>206</key>
            <value>Callpay</value>
        </paymentProvider>
        <amount currencyCode="ZAR">22.11</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>80.121.151.158</userIP>
        <state>
            <id>2bcf344f-6b58-434d-8f0b-f3eab67e43e8</id>
            <definition>
                <key>100</key>
                <value>RefusedByProvider</value>
            </definition>
            <createdOn>2023-08-31T11:40:38.5489952Z</createdOn>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderResponseMessage</key>
                    <value>CDV invalid</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">1.67</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderTransactionID</key>
                <value>4041546109969239</value>
            </detail>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>14085</value>
            </detail>
        </paymentDetails>
    </payment>
</initiatePaymentResponse>

Payments will go to RefusedByProvider as the data is validated by Callpay.
On an error PXP returns the detail ProviderResponseMessage.

Example initiatePaymentResponse with error RefusedByProvider (ERROR in transaction not present):

<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>CallpayMockShop</shopID>
        <paymentMethod>
            <key>24</key>
            <value>BankTransferWithdrawal</value>
        </paymentMethod>
        <merchantTransactionID>MP_Callpay_153</merchantTransactionID>
        <paymentID>b793bbf0-4e74-48d0-bb61-bf636af992b6</paymentID>
        <userID>MaxCallpay002</userID>
        <paymentProvider>
            <key>206</key>
            <value>Callpay</value>
        </paymentProvider>
        <amount currencyCode="ZAR">22.12</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>80.121.151.158</userIP>
        <state>
            <id>f27d13dd-f167-430c-b3b3-9a5a31286eb3</id>
            <definition>
                <key>100</key>
                <value>RefusedByProvider</value>
            </definition>
            <createdOn>2023-08-31T11:44:16.7097838Z</createdOn>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderResponseMessage</key>
                    <value>ERROR in transaction not present</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">1.67</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderTransactionID</key>
                <value>5657036846144643</value>
            </detail>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>14086</value>
            </detail>
        </paymentDetails>
    </payment>
</initiatePaymentResponse>

The payment will go to state WithdrawErrorReportedByProvider if the amount returned does not match with the amount of the payment.

Example initiatePaymentResponse with error WithdrawErrorReportedByProvider:

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>CallpayMockShop</shopID>
        <paymentMethod>
            <key>24</key>
            <value>BankTransferWithdrawal</value>
        </paymentMethod>
        <merchantTransactionID>MP_Callpay_154</merchantTransactionID>
        <paymentID>1702e9af-7453-4154-a5f8-9b1ed71f3523</paymentID>
        <userID>MaxCallpay002</userID>
        <paymentProvider>
            <key>206</key>
            <value>Callpay</value>
        </paymentProvider>
        <amount currencyCode="ZAR">22.13</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>80.121.151.158</userIP>
        <state>
            <id>d612ad6b-c4c9-4985-bc45-2284b6c5e7a6</id>
            <definition>
                <key>21</key>
                <value>WithdrawErrorReportedByProvider</value>
            </definition>
            <createdOn>2023-08-31T11:45:15.492238Z</createdOn>
            <description>Amount returned by the provider is not equal to ChannelAmount of the payment</description>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">1.67</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderTransactionID</key>
                <value>2008013650358952</value>
            </detail>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>14087</value>
            </detail>
        </paymentDetails>
        <paymentAccount>
            <paymentAccountID>ff4ffdc6-25d8-4b54-8f83-a8c6aad7618a</paymentAccountID>
            <details>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountNumber</key>
                    <value>11223344556677</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankName</key>
                    <value>SomeBank</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankCountryCode2</key>
                    <value>ZA</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountOwner</key>
                    <value>test holder</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountType</key>
                    <value>cheque</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankCode</key>
                    <value>12311</value>
                </detail>
            </details>
        </paymentAccount>
    </payment>
</initiatePaymentResponse>

The payment will go to state WithdrawCommunicationErrorOccurred if there is no response or an empty response from provider.

Example initiatePaymentResponse with error WithdrawCommunicationErrorOccurred (empty response):

<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>CallpayMockShop</shopID>
        <paymentMethod>
            <key>24</key>
            <value>BankTransferWithdrawal</value>
        </paymentMethod>
        <merchantTransactionID>MP_Callpay_155</merchantTransactionID>
        <paymentID>219ffcff-847f-4499-bf41-2ca0f59f7904</paymentID>
        <userID>MaxCallpay002</userID>
        <paymentProvider>
            <key>206</key>
            <value>Callpay</value>
        </paymentProvider>
        <amount currencyCode="ZAR">22.14</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>80.121.151.158</userIP>
        <state>
            <id>00199573-c1ad-4066-a71b-b33e4216a885</id>
            <definition>
                <key>576</key>
                <value>WithdrawCommunicationErrorOccurred</value>
            </definition>
            <createdOn>2023-08-31T11:54:03.4094231Z</createdOn>
            <description>Empty response</description>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">1.68</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>14088</value>
            </detail>
        </paymentDetails>
        <paymentAccount>
            <paymentAccountID>fc2a6a25-c1e7-4469-bf41-5943e1ac1123</paymentAccountID>
            <details>
                <detail xsi:type="keyStringValuePair">
                    <key>BankName</key>
                    <value>SomeBank</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankCountryCode2</key>
                    <value>AT</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountOwner</key>
                    <value>New holder</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountType</key>
                    <value>current</value>
                </detail>
            </details>
        </paymentAccount>
    </payment>
</initiatePaymentResponse>


Note: the payment account is the Example initiatePaymentResponse with error WithdrawCommunicationErrorOccurred (An internal server error occurred):

<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>CallpayMockShop</shopID>
        <paymentMethod>
            <key>24</key>
            <value>BankTransferWithdrawal</value>
        </paymentMethod>
        <merchantTransactionID>MP_Callpay_156</merchantTransactionID>
        <paymentID>fdc2f95b-d974-4266-a1ce-1f00626f5982</paymentID>
        <userID>MaxCallpay002</userID>
        <paymentProvider>
            <key>206</key>
            <value>Callpay</value>
        </paymentProvider>
        <amount currencyCode="ZAR">22.15</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>80.121.151.158</userIP>
        <state>
            <id>9e2bbfad-f898-40c7-8278-8ff278fa8aa5</id>
            <definition>
                <key>576</key>
                <value>WithdrawCommunicationErrorOccurred</value>
            </definition>
            <createdOn>2023-08-31T11:56:24.1935839Z</createdOn>
            <paymentStateDetails>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderErrorResponseCode</key>
                    <value>0</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>ProviderErrorResponseMessage</key>
                    <value>An internal server error occurred.</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>PaymentStateReasonID</key>
                    <value>1</value>
                </detail>
            </paymentStateDetails>
        </state>
        <isExecuted>false</isExecuted>
        <baseAmount currencyCode="EUR">1.68</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>14089</value>
            </detail>
        </paymentDetails>
        <paymentAccount>
            <paymentAccountID>fc2a6a25-c1e7-4469-bf41-5943e1ac1123</paymentAccountID>
            <details>
                <detail xsi:type="keyStringValuePair">
                    <key>BankName</key>
                    <value>SomeBank</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>BankCountryCode2</key>
                    <value>AT</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountOwner</key>
                    <value>New holder</value>
                </detail>
                <detail xsi:type="keyStringValuePair">
                    <key>AccountType</key>
                    <value>current</value>
                </detail>
            </details>
        </paymentAccount>
    </payment>
</initiatePaymentResponse>

Notifications

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

Example handlePaymentStateChangedNotificationRequest (WithdrawnByProvider):

<?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>
    <payment
        xmlns=http://www.cqrpayments.com/PaymentProcessing xsi:type="paymentWithPaymentAccount">
        <merchantID>B2BTestMerchant</merchantID>
        <shopID>CallpayMockShop</shopID>
        <paymentMethod>
            <key>24</key>
            <value>BankTransferWithdrawal</value>
        </paymentMethod>
        <merchantTransactionID>hc-20230315-160711</merchantTransactionID>
        <paymentID>ba96e6ba-afa5-4e4e-a59c-b0e1f8447ab3</paymentID>
        <userID>CallpayExistingBAccMissingBC</userID>
        <paymentProvider>
            <key>206</key>
            <value>Callpay</value>
        </paymentProvider>
        <amount currencyCode="ZAR">1.0000</amount>
        <creationType>
            <key>1</key>
            <value>User</value>
        </creationType>
        <userIP>80.121.151.158</userIP>
        <state>
            <id>d507f0ea-b2fb-4500-a836-46df8e5625b3</id>
            <definition>
                <key>20</key>
                <value>WithdrawnByProvider</value>
            </definition>
            <createdOn>2023-03-15T15:07:29.85</createdOn>
            <paymentStateDetails xsi:nil="true" />
        </state>
        <isExecuted>true</isExecuted>
        <baseAmount currencyCode="EUR">0.0800</baseAmount>
        <paymentDetails>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderExternalID</key>
                <value>919</value>
            </detail>
            <detail xsi:type="keyStringValuePair">
                <key>ProviderTransactionID</key>
                <value>0894681467015093</value>
            </detail>
        </paymentDetails>
        <paymentAccount>
            <paymentAccountID>2683400c-728f-4312-af33-e57434a15ab6</paymentAccountID>
        </paymentAccount>
    </payment>
</handlePaymentStateChangedNotificationRequest>

BankTransfer Withdrawal Return

A banktransferwithdrawal return is created when a return webhook is received from Callpay.

The paymentID is copied from the original payment.
PXP is processing only 1 return - it is highly unlikely that more than one return webhook is received from Callpay.

<<?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">
	<payment xmlns="http://www.cqrpayments.com/PaymentProcessing"
	         xsi:type="paymentWithPaymentAccount">
		<merchantID>B2BTestMerchant</merchantID>
		<shopID>CallpayMockShop</shopID>
		<paymentMethod>
			<key>240</key>
			<value>BankTransferWithdrawalReturn</value>
		</paymentMethod>
		<merchantTransactionID>de9c6305-c2c2-438d-a1a6-c840d79d6bee</merchantTransactionID>
		<paymentID>87098268-6753-481f-a53b-58735a8065fc</paymentID>
		<userID>a5dc645d-428d-4d87-a573-f5e61d</userID>
		<paymentProvider>
			<key>206</key>
			<value>Callpay</value>
		</paymentProvider>
		<amount currencyCode="ZAR">20.5500</amount>
		<creationType>
			<key>6</key>
			<value>Provider</value>
		</creationType>
		<state>
			<id>5b754d2c-def2-482f-b3e5-f4586d7a2c32</id>
			<definition>
				<key>279</key>
				<value>ReturnedByProvider</value>
			</definition>
			<createdOn>2023-03-24T16:21:28.723</createdOn>
			<paymentStateDetails>
				<detail xsi:type="keyStringValuePair">
					<key>ProviderResponseMessage</key>
					<value>Incorrect Account Code</value>
				</detail>
			</paymentStateDetails>
		</state>
		<isExecuted>true</isExecuted>
		<baseAmount currencyCode="EUR">1.5500</baseAmount>
		<paymentDetails>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderExternalID</key>
				<value>9cba879e-298a-487d-ac87-591a6cc42897</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentID</key>
				<value>ceb5d0f1-d4b9-4041-8d29-dcd58ea7262d</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentMerchantTransactionID</key>
				<value>de9c6305-c2c2-438d-a1a6-c840d79d6bee</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentMethodID</key>
				<value>24</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentMethodName</key>
				<value>BankTransferWithdrawal</value>
			</detail>
		</paymentDetails>
		<paymentAccount>
			<paymentAccountID>8140c561-476d-4fb0-9062-9268e87d0294</paymentAccountID>
		</paymentAccount>
	</payment>
</handlePaymentStateChangedNotificationRequest>
merchantID>B2BTestMerchant</merchantID>
		<shopID>CallpayMockShop</shopID>
		<paymentMethod>
			<key>240</key>
			<value>BankTransferWithdrawalReturn</value>
		</paymentMethod>
		<merchantTransactionID>de9c6305-c2c2-438d-a1a6-c840d79d6bee</merchantTransactionID>
		<paymentID>87098268-6753-481f-a53b-58735a8065fc</paymentID>
		<userID>a5dc645d-428d-4d87-a573-f5e61d</userID>
		<paymentProvider>
			<key>206</key>
			<value>Callpay</value>
		</paymentProvider>
		<amount currencyCode="ZAR">20.5500</amount>
		<creationType>
			<key>6</key>
			<value>Provider</value>
		</creationType>
		<state>
			<id>5b754d2c-def2-482f-b3e5-f4586d7a2c32</id>
			<definition>
				<key>279</key>
				<value>ReturnedByProvider</value>
			</definition>
			<createdOn>2023-03-24T16:21:28.723</createdOn>
			<paymentStateDetails>
				<detail xsi:type="keyStringValuePair">
					<key>ProviderResponseMessage</key>
					<value>Incorrect Account Code</value>
				</detail>
			</paymentStateDetails>
		</state>
		<isExecuted>true</isExecuted>
		<baseAmount currencyCode="EUR">1.5500</baseAmount>
		<paymentDetails>
			<detail xsi:type="keyStringValuePair">
				<key>ProviderExternalID</key>
				<value>9cba879e-298a-487d-ac87-591a6cc42897</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentID</key>
				<value>ceb5d0f1-d4b9-4041-8d29-dcd58ea7262d</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentMerchantTransactionID</key>
				<value>de9c6305-c2c2-438d-a1a6-c840d79d6bee</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentMethodID</key>
				<value>24</value>
			</detail>
			<detail xsi:type="keyStringValuePair">
				<key>OriginalPaymentMethodName</key>
				<value>BankTransferWithdrawal</value>
			</detail>
		</paymentDetails>
		<paymentAccount>
			<paymentAccountID>8140c561-476d-4fb0-9062-9268e87d0294</paymentAccountID>
		</paymentAccount>
	</payment>
</handlePaymentStateChangedNotificationRequest>

Provider Testing

Provider testing of bank transfer withdrawal returns is not supported. Only mock testing is possible.

Mock Testing

The states RefusedByProvider, WithdrawErrorReportedByProvider and WithdrawCommunicationErrorOccurred may be tested with the merchant mock - see the instructions below.

All other states should be tested with provider.

22.11 => RefusedByProvider (CDV invalid)
22.12 => RefusedByProvider (ERROR in transaction not present)
22.13 => WithdrawErrorReportedByProvider (Amount returned by provider not equal to ChannelAmount of the payment)
22.14 => WithdrawCommunicationErrorOccurred (empty response)
22.15 => WithdrawCommunicationErrorOccurred (An internal server error occurred)