Forte gateway guide

Adding a Forte gateway

To add a Forte gateway:

curl https://core.spreedly.com/v1/gateways.xml \
  -u 'C7cRfNJGODKh4Iu5Ox3PToKjniY:4UIuWybmdythfNGPqAqyQnYha6s451ri0fYAo4p3drZUi7q2Jf4b7HKg8etDtoKJ' \
  -H 'Content-Type: application/xml' \
  -d '<gateway>
        <gateway_type>forte</gateway_type>
        <api_key>Your Forte API Access ID</api_key>
        <secret>Your Forte API Secure Key</secret>
        <location_id>Your location id</location_id>
        <account_id>Your account id</account_id>
      </gateway>'
<gateway>
  <token>KUq5DHdmsrsKq1UmMPdCHxnp9C3</token>
  <gateway_type>forte</gateway_type>
  <name>Forte</name>
  <description nil="true"/>
  <api_key>Your Forte API Access ID</api_key>
  <location_id>Your location id</location_id>
  <account_id>Your account id</account_id>
  <characteristics>
    <supports_purchase type="boolean">true</supports_purchase>
    <supports_authorize type="boolean">true</supports_authorize>
    <supports_capture type="boolean">true</supports_capture>
    <supports_credit type="boolean">true</supports_credit>
    <supports_general_credit type="boolean">true</supports_general_credit>
    <supports_void type="boolean">true</supports_void>
    <supports_adjust type="boolean">false</supports_adjust>
    <supports_verify type="boolean">true</supports_verify>
    <supports_reference_purchase type="boolean">false</supports_reference_purchase>
    <supports_purchase_via_preauthorization type="boolean">false</supports_purchase_via_preauthorization>
    <supports_offsite_purchase type="boolean">false</supports_offsite_purchase>
    <supports_offsite_authorize type="boolean">false</supports_offsite_authorize>
    <supports_3dsecure_purchase type="boolean">false</supports_3dsecure_purchase>
    <supports_3dsecure_authorize type="boolean">false</supports_3dsecure_authorize>
    <supports_3dsecure_2_mpi_purchase type="boolean">false</supports_3dsecure_2_mpi_purchase>
    <supports_3dsecure_2_mpi_authorize type="boolean">false</supports_3dsecure_2_mpi_authorize>
    <supports_store type="boolean">false</supports_store>
    <supports_remove type="boolean">false</supports_remove>
    <supports_fraud_review type="boolean">false</supports_fraud_review>
    <supports_network_tokenization type="boolean">false</supports_network_tokenization>
  </characteristics>
  <credentials>
    <credential>
      <name>api_key</name>
      <value>Your Forte API Access ID</value>
    </credential>
    <credential>
      <name>location_id</name>
      <value>Your location id</value>
    </credential>
    <credential>
      <name>account_id</name>
      <value>Your account id</value>
    </credential>
  </credentials>
  <gateway_settings>
  </gateway_settings>
  <gateway_specific_fields>
    <gateway_specific_field>sec_code</gateway_specific_field>
    <gateway_specific_field>service_fee_amount</gateway_specific_field>
    <gateway_specific_field>xdata</gateway_specific_field>
  </gateway_specific_fields>
  <payment_methods>
    <payment_method>credit_card</payment_method>
    <payment_method>bank_account</payment_method>
  </payment_methods>
  <state>retained</state>
  <redacted type="boolean">false</redacted>
  <sandbox type="boolean">false</sandbox>
  <created_at type="dateTime">2021-04-05T21:58:42Z</created_at>
  <updated_at type="dateTime">2021-04-05T21:58:42Z</updated_at>
</gateway>

Gateway specific fields

For ACHs transactions, Forte recommends passing sec_code to indicate the standard-entry class code of the transaction. Visit Forte’s documentation for additional details, including available values for this parameter. If you do not specify a value, ‘PPD’ will be sent.

If a merchant is configured to use service fees, then service_fee_amount can be included as a parameter in the request. For more information and to view example requests and example responses, visit Forte’s documentation.

The xdata object supports up to 9 fields of extra data, labeled xdata_1 through xdata_9. Each field can contain up to 80 characters. Values within this field cannot contain double quotation characters (i.e., “text”). For more information, visit Forte’s documentation.

Example

curl https://core.spreedly.com/v1/gateways/LlkjmEk0xNkcWrNixXa1fvNoTP4/purchase.xml \
-u 'C7cRfNJGODKh4Iu5Ox3PToKjniY:4UIuWybmdythfNGPqAqyQnYha6s451ri0fYAo4p3drZUi7q2Jf4b7HKg8etDtoKJ' \
-H 'Content-Type: application/xml' \
-d '<transaction>
  <payment_method_token>VX0ackf05WGJwvjkl0epp1852CL</payment_method_token>
  <amount>100</amount>
  <currency_code>USD</currency_code>
  <gateway_specific_fields>
    <forte>
      <sec_code>WEB</sec_code>
      <service_fee_amount>.50</service_fee_amount>
      <xdata>
        <xdata_1>customer metadata</xdata_1>
        <xdata_2>customer metadata</xdata_2>
        <xdata_3>customer metadata</xdata_3>
        <xdata_4>customer metadata</xdata_4>
        <xdata_5>customer metadata</xdata_5>
        <xdata_6>customer metadata</xdata_6>
        <xdata_7>customer metadata</xdata_7>
        <xdata_8>customer metadata</xdata_8>
        <xdata_9>customer metadata</xdata_9>
      </xdata>
    </forte>
  </gateway_specific_fields>
</transaction>'
<transaction>
  <on_test_gateway type="boolean">true</on_test_gateway>
  <created_at type="dateTime">2021-03-10T20:36:53Z</created_at>
  <updated_at type="dateTime">2021-03-10T20:36:53Z</updated_at>
  <succeeded type="boolean">true</succeeded>
  <state>succeeded</state>
  <token>6V3G3GnlVgvtKXR12x6Jsio0398</token>
  <transaction_type>Purchase</transaction_type>
  <order_id nil="true"/>
  <ip nil="true"/>
  <description nil="true"/>
  <email nil="true"/>
  <merchant_name_descriptor nil="true"/>
  <merchant_location_descriptor nil="true"/>
  <gateway_specific_fields>
    <forte>
      <sec_code>WEB</sec_code>
      <service_fee_amount>.50</service_fee_amount>
      <xdata>
        <xdata_1>customer metadata</xdata_1>
        <xdata_2>customer metadata</xdata_2>
        <xdata_3>customer metadata</xdata_3>
        <xdata_4>customer metadata</xdata_4>
        <xdata_5>customer metadata</xdata_5>
        <xdata_6>customer metadata</xdata_6>
        <xdata_7>customer metadata</xdata_7>
        <xdata_8>customer metadata</xdata_8>
        <xdata_9>customer metadata</xdata_9>
      </xdata>
    </forte>
  </gateway_specific_fields>
  <gateway_specific_response_fields>
  </gateway_specific_response_fields>
  <gateway_transaction_id>55</gateway_transaction_id>
  <gateway_latency_ms type="integer">0</gateway_latency_ms>
  <stored_credential_initiator nil="true"/>
  <stored_credential_reason_type nil="true"/>
  <warning nil="true"/>
  <application_id nil="true"/>
  <amount type="integer">100</amount>
  <currency_code>USD</currency_code>
  <retain_on_success type="boolean">false</retain_on_success>
  <payment_method_added type="boolean">false</payment_method_added>
  <smart_routed type="boolean">false</smart_routed>
  <message key="messages.transaction_succeeded">Succeeded!</message>
  <gateway_token>T11bJAANtTWnxl36GYjKWvbNK0g</gateway_token>
  <gateway_type>test</gateway_type>
  <shipping_address>
    <name nil="true"/>
    <address1 nil="true"/>
    <address2 nil="true"/>
    <city nil="true"/>
    <state nil="true"/>
    <zip nil="true"/>
    <country nil="true"/>
    <phone_number nil="true"/>
  </shipping_address>
  <response>
    <success type="boolean">true</success>
    <message>Successful purchase</message>
    <avs_code nil="true"/>
    <avs_message nil="true"/>
    <cvv_code nil="true"/>
    <cvv_message nil="true"/>
    <pending type="boolean">false</pending>
    <result_unknown type="boolean">false</result_unknown>
    <error_code nil="true"/>
    <error_detail nil="true"/>
    <cancelled type="boolean">false</cancelled>
    <fraud_review nil="true"/>
    <created_at type="dateTime">2021-03-10T20:36:53Z</created_at>
    <updated_at type="dateTime">2021-03-10T20:36:53Z</updated_at>
  </response>
  <api_urls>
  </api_urls>
  <payment_method>
    <token>V0iJKfv2ykrcXtAg5aKB4vEY7Dc</token>
    <created_at type="dateTime">2021-03-10T20:36:52Z</created_at>
    <updated_at type="dateTime">2021-03-10T20:36:52Z</updated_at>
    <email nil="true"/>
    <data nil="true"/>
    <storage_state>cached</storage_state>
    <test type="boolean">true</test>
    <metadata nil="true"/>
    <callback_url nil="true"/>
    <full_name>Bob Smith</full_name>
    <bank_name>First Bank of Elbonia</bank_name>
    <account_type>checking</account_type>
    <account_holder_type>personal</account_holder_type>
    <routing_number_display_digits>021</routing_number_display_digits>
    <account_number_display_digits>3210</account_number_display_digits>
    <first_name>Bob</first_name>
    <last_name>Smith</last_name>
    <address1 nil="true"/>
    <address2 nil="true"/>
    <city nil="true"/>
    <state nil="true"/>
    <zip nil="true"/>
    <country nil="true"/>
    <phone_number nil="true"/>
    <company nil="true"/>
    <payment_method_type>bank_account</payment_method_type>
    <errors>
    </errors>
    <routing_number>021*</routing_number>
    <account_number>*3210</account_number>
  </payment_method>
  <attempt_3dsecure type="boolean">false</attempt_3dsecure>
</transaction>

Gateway specific response fields

Some responses from Forte gateway may contain an authorization_code field that contains the authorization code used when directly interacting with the Forte API. You can find this value in the gateway_specific_response_fields when present. For example, a transaction could have something like this:

<transaction>
  <token>LgpTNGjsWQs9DwdxcbreUVz0R8p</token>
  <transaction_type>Purchase</transaction_type>
  <gateway_specific_response_fields>
     <forte>
       <authorization_code>192837</authorization_code>
     </forte>
  </gateway_specific_response_fields>
</transaction>

To request any gateway_specific_fields or gateway_specific_response_fields, please contact Support with your request and the gateway documentation for the fields of interest.

Transaction sync

Forte inquire is supported by gateway transaction id. PATCH /v1/transactions/{token}.json with an empty transaction calls Forte GET /transactions/{transaction_id} and maps the status: approved statuses move the transaction to succeeded, and failed statuses move it to gateway_processing_failed.

A normal Forte purchase or authorize is approved in the same request and stored as succeeded, so the update API does not inquire it. Inquire runs for pending, processing, and gateway_processing_failed. An unknown or unreadable Forte status leaves the current state unchanged.

Verified with unit tests, a remote purchase then inquire (ready: TEST APPROVAL), and an unknown transaction id. In the local environment, a sandbox sale was moved to pending and then updated to succeeded. In production, purchase and authorize complete as succeeded, so that pending update path cannot be exercised there.


Did this page help you?