Skip to main content

FinDock Payment API (v2)

The FinDock Payment API is a REST API used to initiate online transactions and/or submit recurring payments to the FinDock application residing in a Salesforce Org. The API aims to abstract away both Salesforce and FinDock configuration details for specific payment processors and methods. The API instead provides several informational resources to retrieve environment-specific parameters of a particular Salesforce implementation. These resources can be used to make the front-end application environment and configuration agnostic.

Getting Started

If you are just starting to work with the API, please see:

Salesforce Objects, RecordTypes and Fields

Since our API is created for Salesforce implementations, there are some Salesforce-specific things to take into account. Alongside the primitive datatypes such as String, the Payment API uses several datatypes that might be unknown to you if you are not familiar with Salesforce or the Force.com platform. The data types that are only applied in Salesforce contexts are Salesforce Objects (sObjects) and Record Types and fields.

sObjects

sObjects are objects that can be stored in the (Sales)Force.com platform database. They are representations of data that persists in the Salesforce database. Some API resources accept, or even require, sObjects. The Payer object, for example, requires sObjects such as Contact and Account. The API allows you to define these objects in requests, as shown below, where both a Contact and an Account sObject are defined. FinDock objects like PaymentProfile can be used in the same way, but require you to specify the fields as salesforce fields.

Example body of a request for creating a Contact and an Account sObject:

{
  "SuccessURL":"http://success.com",
  "FailureURL":"http://failure.com",
  "Payer":{
    "Contact":{
      "SalesforceFields":{
        "FirstName":"Eric",
        "LastName":"Johnson",
        "Email":"eric@johnson.com",
        "MailingStreet":"Rocket Rd",
        "MailingCity":"Hawthorne0",
        "MailingPostalCode":"CA 90250",
        "MobilePhone":"98989898"
      }
    },
    "Account":{
      "RecordTypeName: "Business",
      "SalesforceFields":{
        "Name":"Johnson Family",
        "Website":"www.spacex.com",
        "BillingStreet":"Rocket Rd",
        "BillingCity":"Hawthorne",
        "BillingPostalCode":"CA 90250"
      }
    }
  }
}

Record Types

Record types let Salesforce administrators offer different business processes, picklist values, and page layouts to different users. Organizations can, for example, differentiate between Account objects in Salesforce by assigning them either to the Record Type of Organization or Household. This facilitates the application of different types of page layouts or possible field values based on what Record Type an Account is. Your Salesforce Administrator can tell you more about the Record Types used in the Salesforce org.

Please note: when the Person Accounts feature is enabled in the environment Record Types are especially important. More information on Person Accounts can be found below.

Accounts, Contacts, Person Accounts

Salesforce provides two objects to indicate a Payer:

  • Account: usually an organisation
  • Contact: an individual

A Person Account stores information about individual people by combining certain account and contact fields into a single record. It is not its own object, but can be stored as an Account with a specific Record Type (see above). Some features of Salesforce - for instance Fundraising as used in a.o. NonProfit Cloud (NPC) - require an Account to be available. This means that when you have an individual payer you need to send a Person Account instead of a Contact. These features will only work with a Contact object when an Account object is also sent.

Make sure to always check with your Salesforce admin whether they are enabled and / or used!

To send Person Accounts to the FinDock API use an Account object with a RecordTypeName (API name) of a Record Type that is of the type Person Account. By default this is PersonAccount but there is a high chance this was customised or an environment has multiple Person Account Record Types, so always consult your Salesforce admin.

{
  "Account":{
    "RecordTypeName: "<a-person-account-record-type>",
    "SalesforceFields":{
      "Name":"Johnson Family",
      "Website":"www.spacex.com",
      "BillingStreet":"Rocket Rd",
      "BillingCity":"Hawthorne",
      "BillingPostalCode":"CA 90250"
    }
  }
}

Salesforce Fields

Next to the out-of-the-box Salesforce data model, Salesforce allows administrators to add custom fields to objects in Salesforce. All fields can be seen in the Salesforce Object Manager of the Salesforce org setup. Also, different implementations of Salesforce can use different fields for a value like email. The API allows you to send Salesforce fields, and their corresponding values, as attributes in requests to the API.

Custom fields for standard Salesforce objects like Contact and Account are passed with "__c" at the end. For illustration, we have added the standard fields FirstName and LastName and the custom field TwitterHandle to the Salesforce Contact object.

TwitterHandle | TwitterHandle__c | Text(50)

{
  "Payer":{
    "Contact":{
      "SalesforceFields":{
        "FirstName":"Eric",
        "LastName":"Johnson",
        "TwitterHandle__c": "@EricJohnsonSalesforce"
      }
    }          
  }
}

Custom fields for custom FinDock objects like Installment and Recurring Payment can also be passed in a SalesforceFields object. SalesforceFields passed in the OneTime object are copied to the Installment record in Salesforce and SalesforceFields passed in the Recurring object are copied to the Recurring object in Salesforce. What Recurring object the values are stored to depends on whether you use a Source Connector.

{
  "OneTime":{
    "Amount": 10.0,
    "SalesforceFields": {
      "Sales_Invoice__c": "a506E0000009TfL"
    }
  }
}

Exceptions

For Person Accounts the following exceptions for (custom) field notations apply:

  • Standard Account Fields can be passed as regular fields: "BillingStreet":"Rocket Rd".
  • Custom Account Fields can be passed with the regular __c suffix: "Custom_Street__c":"Rocket Rd".
  • Standard Contact Fields need to be prefixed with Person, with the exception of FirstName, LastName, Salution which can be passed as regular fields: "PersonEmail" : "test@test.com".
  • Custom Contact Fields need to be suffixed with __pc: "Custom_email__pc":"test@test.com"

The fields and their correct notations can be found in the Salesforce Setup > Object Manager for Account.

Example:

{
  "Account":{
    "RecordTypeName: "PersonAccount",
    "SalesforceFields":{
      "FirstName":"John",
      "LastName":"Johnson",
      "PersonEmail":"test@test.com",
      "Website":"www.spacex.com",
      "BillingStreet":"Rocket Rd",
      "Custom_account_field__c":"Rocket Rd",
      "Custom_contact_field__pc":"Don't forget the P"
    }
  }
}

For the FinDock for Fundraising Source Connector used in a.o. NonProfit Cloud (NPC), the following exception applies: Since the "Recurring" object (Gift Commitment) is split in two objects (Gift Commitment & Gift Commitment Schedule), a prefix GiftCommitment is required to set SalesforceFields on this object. Fields without prefix are assumed to be set on the Gift Commitment Schedule object. Example: GiftCommitment.GiftVehicle.

You can check which Source Connectors are available in the environment by performing a GET operation on the Source Connector endpoint.

Authentication

Authentication is accomplished through an Oauth2.0 authorization flow. Each Salesforce environment requires its own token. A refresh token can be used to acquire a new access token if the current token has expired. Read more on how to authenticate to Salesforce in the Salesforce developer guide. Both client_id and client_secret can be acquired from the Salesforce 'Setup' from a 'Connected App'.

  • The Authorization token can be passed as a Bearer token in the request Header.
  • To Acquire a new Authorization token with the returned Refresh token, please make sure to pass the right grant_type, client_id, client_secret and refresh_token as specified in the Salesforce documentation referenced above. To get up and running quickly, use the (unofficial-but-provided-by) Salesforce Postman Collection, as explained in this blog and look for the 'auth' folder.

Error and Response Codes

When the API was not called successfully, you will receive a HTTP Status Code 4xx or 500. Specifically a 422 code is returned when the message was well-formed, but could not be processed because of - for instance - wrong data. In the response you will find additional information on how to prevent or handle the error through an array of Errors with an error_code and error_message.

Example of a successful request (to the SourceConnector Provisioning API):

{
  "SourceConnectors": [
    {
      "Name": "PaymentHub",
      "PrettyName": "PaymentHub",
      "IsDefault": false
    }
  ]
}

Example of an error that is returned whenever an incorrect request is sent:

{
  "Errors": [
    {
      "error_message": "Amount can't be 0 or negative",
      "error_code": "020"
    }
  ]
}

Full list of possible response codes:

ResponseCode Description
010 Malformed request: missing one or more mandatory core parameter(s)
011 Malformed request: missing one or more mandatory Payment Processor parameters
012 Malformed request: missing one or more mandatory SourceConnector parameters
200 Invalid data: the supplied data is incorrect (e.g. an invalid e-mail address)
201 Sort code or bank account invalid (Bacs Direct Debit)
202 IBAN is not a valid
203 Provided IBAN is not in SEPA zone geographical scope
204 BIC is required to collect SEPA Direct Debit from a non-EAA country bank account.
205 Street, Housename or Number, Zip code and City are required to collect SEPA Direct Debit from a non-EEA country bank account.
206 Clearing number and/or bank account invalid (Sweden)
098 An object is missing and no default is specified
999 Error without specific category: consult the error_message for details

For more information on errors and response codes and debugging the API, please read our Troubleshooting the Payment API article.

Webhook events / notifications

To receive updates on payments created with the /PaymentIntent endpoint:

  • pass an endpoint URL in the WebhookURL parameter in the request body.
  • add your URL to the Remote Site Setting of the Salesforce environment.

FinDock sends you notifications for the following events around your API call:

Event Description
paymentIntent.created When the processing of your API call has started in the Salesforce environment.
paymentIntent.processed When the processing of your API call has finished successfully. Note: this does not mean that the payment has been collected!
paymentIntent.in_review When the processing of your API call has stalled and manual intervention from Salesforce side has been requested. Note: this will not stop the customer from completing the payment flow!
paymentIntent.failed When the processing of your API call has failed and needs to be handled in the Salesforce environment. Note: this will not stop the customer from completing the payment flow!
installment.created When an Installment (expected one-time payment) is created.
installment.status_change If the status of the One Time Payment (Installment record in Salesforce) changes, either by an update from a PSP or manually

No specific events are sent around Recurring payments other than the paymentIntent which contains the Salesforce Id of the Recurring record.

For more information about the processing of online payments, please visit our Processing online payments article.

Webhook content

For paymentIntent you will receive notifications with the following body. Each event contains a type and a data object with further details. Check out the PaymentIntent object description for definitions.

{
  "type": "paymentIntent.processed",
  "data": {
    "Status": "Matched",
    "Recurring": {
      "Url": "/services/data/v48.0/sobjects/cpm__Recurring_Payment__c/a0V3X00000S7b5YUAR",
      "Type": "cpm__Recurring_Payment__c",
      "Id": "a0V3X00000S7b5YUAR"
    },
    "Payer": {
      "Contact": {
        "Url": "/services/data/v48.0/sobjects/Contact/0033X00003H9uZPQAZ",
        "Type": "Contact",
        "Id": "0033X00003H9uZPQAZ",
        "Name": "Eric Johnson"
      },
      "Account": {
        "Url": "/services/data/v48.0/sobjects/Account/0013X00002bZPGIQA4",
        "Type": "Account",
        "Id": "0013X00002bZPGIQA4",
        "Name": "Johnson Family"
      }
    },
    "OneTime": {
      "Url": "/services/data/v48.0/sobjects/cpm__Installment__c/a083X00001mFTBAQA4",
      "Type": "cpm__Installment__c",
      "Id": "a083X00001mFTBAQA4",
      "Status": "Pending"
    },
    "Id": "pi_6cazikr7625yqt9mf"
  }
}

For installment you will receive a notification with the following body.

{
  "type": "installment",
  "data": {
    "Url": "/services/data/v48.0/sobjects/cpm__Installment__c/a083X00001kJynLQAS",
    "Type": "cpm__Installment__c",
    "Id": "a083X00001kJynLQAS",
    "Target": "Adyen1",
    "Status": "Collected",
    "RecordTypeName": "Receivable",
    "PayUrl": "https://link.dev.findock.com/pay/3xxxxmuai2/8897b4da-e48a-7ff3-90dd-ecb65094802c",
    "Payments": [
      {
        "Url": "/services/data/v48.0/sobjects/cpm__Payment__c/a0R3X00000V1sutUAB",
        "Type": "cpm__Payment__c",
        "Id": "a0R3X00000V1sutUAB",
        "PaymentProcessor": "PaymentHub-Adyen",
        "PaymentMethod": "CreditCard",
        "CollectionDate": "2020-11-26",
        "Amount": 15
      }
    ],
    "PaymentProcessor": "PaymentHub-Adyen",
    "PaymentMethod": "CreditCard",
    "PaymentIntentId": "pi_5jthokq7z8som0w6o",
    "AmountOpen": 0,
    "Amount": 15
  }
}

Payment Intent

The /PaymentIntent endpoint allows for Payments to be initiated through a configured Salesforce environment and updates Salesforce data accordingly. The PaymentIntent API requires a Payment Method, Payment Processor and Source Connector to perform a successful request. The available Payment Method, Processors and Source Connectors for a specific Salesforce environment can be queried through their specific endpoints. Some Payment Methods enable or require further Package Actions. Be sure to include these in the request. It is also possible to perform Payments on existing Installments.

The Payment Intent object

Id
string

The Payment Intent Id. Can also be found on the Inbound Report record in Salesforce.

Status
string
Enum: "New" "Processing" "Guided Review" "Matched" "Failed"

The Payment Intent Status.

IdempotencyKey
string (IdempotencyKey)

The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response. An idempotency key is a unique value generated by the client which the server uses to recognize subsequent retries of the same request. How you create unique keys is up to you, but we suggest using V4 UUIDs, or another random string with enough entropy to avoid collisions.

SuccessURL
string <url> (SuccessURL)

The URL the user will be redirected to when a transaction has been completed successfully.

FailureURL
string <url> (FailureURL)

The URL the user will be redirected to when a transaction has failed or has been cancelled.

WebhookURL
string <url> (WebhookURL)

URL where you want to receive notifications on the status of the Payment request on. More information on the Webhook can be found here.

Origin
string (Origin)

The origin of the payment, e.g. Webform-1. This information can be used when building customized follow-up logic in Salesforce.

CampaignId
string (CampaignId)

Id of a Campaign in Salesforce. When a valid value is passed, the Campaign will be linked to the Installment or Recurring payment in Salesforce.

object (Payer)

Data on the paying party. Can be an existing or new Account and/or Contact.

object (OneTime)

Data on new or existing Single Payment. Stored Installment record in Salesforce.

object (Recurring)

Data on new Recurring Payment.

object (PaymentIntentPaymentMethod)

Data on how the Payment will be performed. Includes a.o. the Payment Method, Payment Processor, Target and additional Parameters required to perform the Payment.

object (PaymentIntentSettings)

Data on how the Payment should be processed in Salesforce. Includes the Source Connector and additional Parameters like ProcessingType that can be used for Guided Matching settings.

SalesforceFields
object (InboundReportSalesforceFields)

The SalesforceFields block is used to pass Salesforce Fields and values that have been created on the object in Salesforce. To find out which Salesforce Fields have been configured, check the 'Object Manager' in the Salesforce Setup.

Array of objects (PackageAction) [ items ]

A list of additional actions to be performed when making this request. More information about Package Actions can - if available - be found in our Extension and Source Connector documentation.

{
  • "Id": "pi_1hubybk7nh45rvbt6",
  • "Status": "Matched",
  • "IdempotencyKey": "1hubybk7nh45rvbt6",
  • "WebhookURL": "www.findock.com/api/endpoint",
  • "Origin": "Webform",
  • "CampaignId": "7013X000001mAZbQAM",
  • "Payer": {
    },
  • "OneTime": {
    },
  • "Recurring": {
    },
  • "PaymentMethod": {
    },
  • "Settings": {
    },
  • "SalesforceFields": {
    },
  • "PackageActions": [
    ]
}

Initiate a new payment

The FinDock Payment API supports both one-time and recurring payments. To perform recurring payments, a 'Recurring' block replaces the 'OneTime' block in the request. Some Payment Service Providers (PSPs) require an initial payment AND recurring payment in the same request for authorization of the transaction. You can find out whether this is the case for a specific Payment Processor through the GET /PaymentMethod and GET /PaymentProcessors endpoints. Please see the specific Payment Extension documentation on the details of performing a one-time and/or recurring payment. To perform payments on an existing Installment, simply remove the Payer block and add the Id of the Installment to the OneTime block.

Request Body schema: application/json
One of
required
object (NewPaymentRequest)

Create a new one-time Payment.

SuccessURL
required
string <url> (SuccessURL)

The URL the user will be redirected to when a transaction has been completed successfully.

FailureURL
required
string <url> (FailureURL)

The URL the user will be redirected to when a transaction has failed or has been cancelled.

required
object (PayerRequest)

Specifies the Payer of the Payment. You can either pass Contact and / or Account fields like FirstName and LastName or a SalesforceId of an existing Contact and / or Account as Id. Contacts and Accounts can be deduplicated with Salesforce deduplication rules. If an Id of an existing Salesforce Installment record is provided in the OneTime object, this object is no longer required in the request. FinDock will instead the Contact and / or Account from the provided record.

object (PaymentMethodRequest)

Data on how the Payment will be performed.

Responses

Request samples

Content type
application/json
Example
{
  • "OneTime": {
    },
  • "Payer": {
    },
  • "PaymentMethod": {
    }
}

Response samples

Content type
application/json
{}

Retrieve payment status

Returns the status of a specific payment. Response will contain data on what One-time or Recurring payments have been created. For One-time payments, further information can be retrieved by performing a GET request on the /Installment endpoint with the Id of the One-time object of type cpm__Installment__c provided in the response. If Payer data like Contact and Account was created or found in Salesforce, this data is also provided.

path Parameters
ID
required
string
Example: pi_1hubybk7nh45rvbt6

The Id of the PaymentIntent to retrieve.

Responses

Response samples

Content type
application/json
Example
{
  • "Id": "pi_1hubybk7nh45rvbt6",
  • "Status": "Matched",
  • "Payer": {
    },
  • "OneTime": {
    }
}

Installment

The /Installment endpoint allows you to retrieve detailed information on an Installment. Installments are the FinDock data-in-Salesforce equivalent of a One-time payment. All One-time payments created through the API become Installments, however Installments can also be created through other channels. These non-API Installments can also be queried through this endpoint. The response includes a list of all Payments (cash movements) that have been performed in relation to this Installment. An Installment can be collected through several payments with different processors and payment methods.

The Installment object

Id
string

The Salesforce record Id of the Installment.

GUID
string

The Salesforce GUID of the Installment.

Url
string

The Salesforce URL of the Installment.

Type
string

The Salesforce object type.

Status
string
Enum: "New" "Partially paid" "Failed" "Pending recollection" "Pending" "Refunded" "Cancelled" "Outstanding" "Rejected" "Reversed" "Collected"

The status of the installment. For more information on Installment statuses, please visit the documentation.

Amount
number (Amount)

The amount to be collected.

AmountOpen
number

The amount that is still to be collected: represents initial amount substracted by amount paid.

Target
string

The name of the target that has been configured in Salesforce. A target can be a bank account or an account with a PSP.

RecordTypeName
string

The Salesforce 'Installment' RecordType. e.g. 'Receivable' for positive and 'Payable' for negative payments in a standard FinDock implementation.

PayUrl
string

URL that can be used to pay this Installment. This can be a PayLinks or Tikkie URL. Read more about PayLinks here.

PaymentProcessor
string

The name of the Payment Processor.

PaymentMethod
string

The name of the Payment Method, e.g. Direct Debit, CreditCard, Ideal.

PaymentIntentId
string

The Payment Intent Id. Can also be found on the Inbound Report record in Salesforce.

Array of objects (Payment) [ items ]
{
  • "Id": "a083X00001aUMCnQAO",
  • "GUID": "sdfasdf-asfads-242134-adsfadf-23423",
  • "Url": "/services/data/36.0/sobjects/a083X00001aUMCnQAO",
  • "Type": "cpm__Installment__c",
  • "Status": "Collected",
  • "Amount": 10,
  • "AmountOpen": 0,
  • "Target": "PRIMARY-BANK-ACCOUNT",
  • "RecordTypeName": "Receivable",
  • "PaymentProcessor": "PaymentHub-SEPA",
  • "PaymentMethod": "Direct Debit",
  • "PaymentIntentId": "pi_1hubybk7nh45rvbt6",
  • "Payments": [
    ]
}

Retrieve OneTime/Installment details

Returns detailed information - including status and underlying individual payments - of an Installment record in Salesforce. Installment records can be created by passing a OneTime object to the PaymentIntent endpoint.

path Parameters
ID
required
string
Example: a083X00001aUMCnQAO

The record Id or GUID of the Installment to retrieve.

Responses

Response samples

Content type
application/json
{
  • "Id": "a083X00001aUMCnQAO",
  • "GUID": "sdfasdf-asfads-242134-adsfadf-23423",
  • "Url": "/services/data/36.0/sobjects/a083X00001aUMCnQAO",
  • "Type": "cpm__Installment__c",
  • "Status": "Collected",
  • "Amount": 10,
  • "AmountOpen": 0,
  • "Target": "PRIMARY-BANK-ACCOUNT",
  • "RecordTypeName": "Receivable",
  • "PaymentProcessor": "PaymentHub-SEPA",
  • "PaymentMethod": "Direct Debit",
  • "PaymentIntentId": "pi_1hubybk7nh45rvbt6",
  • "Payments": [
    ]
}

Payment Methods

Informational resource that returns a list of all available and active payment methods, and the active processors that have those payment methods enabled. Payment Methods range from Direct Debit, to Credit Card and various Online payments through Payment Service Providers (PSPs).

The Payment Methods object

Name
string

The name of the Payment Method, e.g. Direct Debit, CreditCard, Ideal.

Array of objects (Processor) [ items ]

Which Payment Processors can be used to perform payments with this Payment Method.

{
  • "Name": "Direct Debit",
  • "Processors": [
    ]
}

Retrieve Payment Methods

Return a list of payment methods configured in the Salesforce environment and related Payment Processors.

Responses

Response samples

Content type
application/json
{
  • "PaymentMethods": {
    }
}

Source Connectors

Informational resource that returns the source connector used in a specific Salesforce environment. A source connector represents an application in Salesforce that will be used to ultimately store the transaction that is being initiated through the Payment API.

The Source Connector object

Name
string

The name of the Source Connector that will be used to register recurring payments and amounts receivable in Installments. e.g. 'PaymentHub', 'FinDock-for-NPSP', 'FinDock-for-Fundraising'. For a full list of available Source Connectors, visit the Source Connectors documentation.

PrettyName
string

The pretty name of the source package.

IsDefault
boolean

Whether this is the default Source Connector. If no Source Connector is passed in the request, this Source Connector is used.

{
  • "Name": "PaymentHub",
  • "PrettyName": "PaymentHub",
  • "IsDefault": "true"
}

Retrieve Source Connectors.

Return a list of Source Connectors configured in the Salesforce environment.

Responses

Response samples

Content type
application/json
{
  • "SourceConnectors": [
    ]
}

Package Actions

Informational resource that returns the package actions possible and/or required for a certain Salesforce environment. Package actions are additional actions that can be performed for a specific FinDock Extension, like a payment extension or source connector. Package Actions can be used to perform additional actions in Salesforce through FinDock while making a Payment Request, like creating a record.

If a Payment Methods or Source Connector has a Package Action, these can be found in the specific Extension or Source Connector documentation. The FinDock Gift Aid extension is an example of such a package.

The Package Actions object

PackageName
string

The name of the SourceConnector/Package for which the action is to be performed.

object

List of actions that can be performed.

{
  • "PackageName": "PaymentHub-GiftAid",
  • "actions": {
    }
}

Retrieve Package Actions.

Return a list of possible Package Actions for a specific Salesforce environment.

Responses

Response samples

Content type
application/json
{
  • "ResponseCode": "001",
  • "IsSuccess": true,
  • "PackageActions": [
    ]
}