Skip to main content

Third Party Gateway Payment Flow

You can use the Third Party Gateway Payment Flow to integrate any compatible gateway with the system. After obtaining payment authorizations with the gateway, simply provide the gateway response and payment details along with any additional specifics you may need.

Below is an illustrative example of how to implement this flow.

Authorization of Payment with from a Third Party Gateway

Upon performing the authorization (with capture), the gateway will provide a response similar to the one outlined below:

{
"respstat": "A",
"token": "9601616143390000",
"retref": "984736263847",
"respcode": "00",
"resptext": "Approved",
"avsresp": "Z",
"cvvresp": "M",
"authcode": "728255",
"respproc": "FNOR",
"emv": "8A000030910A97E91E681E2734AC0012",
"binInfo": {
"country": "USA",
"product": "D",
"bin": "601101",
"cardusestring": "True credit, No PIN/Signature capability",
"gsa": false,
"corporate": false,
"fsa": false,
"subtype": "Consumer Credit - Rewards",
"purchase": false,
"prepaid": false,
"issuer": " ",
"binlo": "601100XXX",
"binhi": "601102XXX"
}
}

Create an External Payment in the Platform

The /external_payments endpoint is where you can inform us about successful payments. When making requests to this endpoint, include the payment amount, payment method details, and the gateway response. It's important to include a created_at timestamp in the gateway_response, which should match the authorization time from your gateway, even if not directly provided by them. This timestamp is crucial for matching settlement records to payments during the settlement process. Additionally, make sure to map authcode to auth_code and retref to retrieval_reference within the gateway_response object.

Below is a cURL example for recording an external authorization in our system, using the example authorization response mentioned. Take note of how the authcode (728255) and retref (984736263847) values are mapped in the external payments request body.

curl --location 'https://api.getfwd.com/external_payments' \
--header 'x-account-id: acct_2TXMC34dvHW8LkSN87DN4oiO69l' \
--header 'x-api-key: key_123456789' \
--header 'Content-Type: application/json' \
--data '{
"payment_intent": {
"amount": 4999
},
"payment_method": {
"payment_method_type": "card",
"source_type": "external",
"card": {
"token": "external",
"last_four_digits": "2311",
"first_six_digits": "424223",
"brand": "visa",
"exp_month": "1",
"exp_year": "2024"
}
},
"gateway_response": {
"auth_code" : "728255",
"retrieval_reference": "984736263847",
"created_at": "2023-08-25T19:34:51.815Z",
"raw_response":"{\\"respstat\\":\\"A\\",\\"token\\":\\"9601616143390000\\",\\"retref\\":\\"984736263847\\",\\"respcode\\":\\"00\\",\\"resptext\\":\\"Approved\\",\\"avsresp\\":\\"Z\\",\\"cvvresp\\":\\"M\\",\\"authcode\\":\\"728255\\",\\"respproc\\":\\"FNOR\\"}"
}
}'

Making this call will create a payment intent, and it's crucial to retain the id of this payment intent within your database. This id will serve as a reference for executing future actions, like initiating a refund (as outlined below).

{
"id": "pi_2UURIXJ5jxdHJ6ksdM07thFcFvp",
"entity": "payment_intent",
"status": "captured",
"amount": 4999,
"amount_authorized": 169,
"amount_captured": 169,
"amount_refunded": 0,
"amount_voided": 0,
"amount_disputed": 0,
"tax_amount": 0,
"tip_amount": 0,
"surcharge_amount": 0,
"payment_splits": [],
"capture": true,
"currency": "USD",
"latest_payment": {
"id": "pmt_2UURIXTthG1QOyPwrvEs3Nd9QQl",
"entity": "payment",
"status": "captured",
"amount": 4999,
"amount_authorized": 4999,
"amount_captured": 4999,
"amount_refunded": 0,
"amount_voided": 0,
"amount_disputed": 0,
"payment_intent_id": "pi_2UURIXJ5jxdHJ6ksdM07thFcFvp",
"payment_method_id": "pm_2UUNSAZqtzNQP05w7jZyGMrN6oP",
"payment_method": {
"id": "pm_2UUNSAZqtzNQP05w7jZyGMrN6oP",
"entity": "payment_method",
"created_at": "2023-08-25T19:03:16.855Z",
"updated_at": "2023-08-25T19:03:16.855Z",
"payment_method_type": "card",
"source_type": "card_pointe",
"card": {
"last_four_digits": "2311",
"first_six_digits": "424223",
"brand": "visa",
"exp_month": "01",
"exp_year": "2024"
}
},
"auth_code": "728255",
"external": true,
"created_at": "2023-08-25T19:34:52.342Z",
"updated_at": "2023-08-25T19:34:52.342Z",
"account_id": "acct_2TXMC34dvHW8LkSN87DN4oiO69l",
"settlement_status": "unsettled"
},
"external": true,
"partner_id": "part_1234",
"business_id": "bus_2OafJPlpPB5WZdp9GYaoeR9pCmC",
"account_id": "acct_2TXMC34dvHW8LkSN87DN4oiO69l",
"created_at": "2023-08-25T19:34:52.231Z",
"updated_at": "2023-08-25T19:34:52.344Z",
"captured_at": "2023-08-25T19:34:52.343Z",
"settlement_status": "unsettled"
}

Refund an external payment

Similarly, as with the third party gateway capture process detailed earlier, we offer the /external_refunds endpoint that enables developers to inform our system about refunds conducted for payments authorized externally.

To initiate this, you should first call your gateway API and generate a refund. See the following cURL command for an example of how this might be done.

curl --location 'https://my-gateway.com/refund' \
--header 'Content-Type: application/json' \
--data '{
"original_transaction_id": "984736263847",
"amount": 1000
}'

Making this call will produce a response similar to the following:

{
"amount": 1000,
"result": "Approval",
"transaction_id": "288010185243"
}

You then needt to inform our system of the completed refund using the following request to the /external_refunds endpoint.

curl --location 'https://api.getfwd.com/external_refunds' \
--header 'x-account-id: acct_2TXMC34dvHW8LkSN87DN4oiO69l' \
--header 'x-api-key: key_123456789' \
--header 'Content-Type: application/json' \
--data '{
"payment_intent_id": "pi_2UURIXJ5jxdHJ6ksdM07thFcFvp",
"gateway_response": {
"created_at": "2023-08-25T19:41:23.403Z",
"raw_response":"{\\"amount\\":1000,\\"result\\":\\"Approval\\",\\"transaction_id\\":\\"288010185243\\"}"
}
}'