Requirements: 4D Payments SDK
Contents
Getting Started
The FDMS Rapid Connect components connect to the First Data Merchant Services (FDMS) processor, by way of the Datawire VXN transaction transport network. Transactions originating with these components go through Datawire, to the FDMS processor where the transaction is authorized. The result is then returned back through Datawire and received by the component.
A test account for FDMS Rapid Connect and Datawire must be obtained before using the components. Once you have a test account you must register and activate your account with Datawire. FDMS Rapid Connect will provide you with the following values:
- MerchantId
- MerchantTerminalNumber
- GroupId
The FDMSRegister component must be used to first perform a ServiceDiscovery request to obtain the SRS XML Service Url necessary to complete the Registration and Activation process.
After a successful ServiceDiscovery call, URL will be populated with the service url required to provision your merchant account. Once you acquire the DatawireId and receive your transaction URLs through Register, you need to save these parameters permanently so that they can be reloaded and configured when necessary and are never lost due to power outages. After a successful registration you need to Activate the merchant in order to be able to send transactions using Datawire. For instance:
FDMSRegister.MerchantNumber = "000000999990";
FDMSRegister.MerchantTerminalNumber = "555555";
FDMSRegister.Config("GroupId=10001");
FDMSRegister.TransactionNumber = "0000121VRC1234"; //any unique number will do. Follow the format explained in TransactionNumber property
FDMSRegister.ServiceDiscovery("https://prod.dw.us.fdcnet.biz/sd/srsxml.rc");
FDMSRegister.ApplicationId = "RAPIDCONNECTSRS";
FDMSRegister.TransactionNumber = "0000122VRC1234";
FDMSRegister.Register();
FDMSRegister.TransactionNumber = "0000123VRC1234";
FDMSRegister.Activate();
Retail Transactions
The FDMSRcRetail component supports submitting card present transactions (including EMV) for the following industry types:
- Retail
- Restaurant
Set the IndustryType property to specify the industry type.
Retail Quickstart
To being processing transactions first set the required merchant values. For instance:
retail.IndustryType = FdmsrcretailIndustryTypes.fitRetail;
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
Next specify transaction specific information. These values uniquely identify the transaction to Datawire and FDMS.
retail.STAN = "112";
retail.TransactionNumber = "1234";
retail.OrderNumber = "123";
retail.ReferenceNumber = "123";
Then specify customer card and address information along with the transaction amount:
retail.Card.MagneticStripe = "B4012000033330026^FDCS TEST CARD /VISA^170410054321000000000000000 150 A";
retail.Card.EntryDataSource = EntryDataSources.edsTrack1;
retail.TransactionAmount = "1200"; //$12.00
Finally, submit the transaction by calling the Sale method.
retail.Sale();
string responseCode = retail.Response.Code;
The Response.Code field indicates the result of the transaction. A code of 000 indicates success. For all other values please see the Response Codes section of the help file. Additional Response properties such as ApprovalCode, AuthorizedAmount, Text, AVSResult, CVVResult, and more, provide further details about the transaction response.
To perform subsequent operations on a transaction, such as calling Reverse to reverse a Sale, or calling Capture to capture a previous AuthOnly transaction the GetDetailAggregate method must be used to get details about the original transaction. This aggregate must be stored securely, it will contain cardholder information that is required for subsequent transactions. For instance:
retail.AuthOnly();
//Save the detail aggregate to use with Capture
string aggregate = retail.GetDetailAggregate();
//The aggregate must then be stored securely.
//At a later time the aggregate is retrieved in order to perform a capture.
//Capture
retail = new Fdmsrcretail();
...
//Specify the detail aggregate from the original transaction
retail.SetDetailAggregate(aggregate);
retail.Capture();
Retail Transaction Types
The FDMSRcRetail component supports the following transaction types:
Transaction Type | Description |
---|---|
AuthOnly | An authorization that must be Captured later. |
BalanceInquiry | Inquire about available balance. (Swiped MasterCard only) |
Capture | Captures a previous AuthOnly transaction for settlement. |
Credit | Credits funds to the cardholder. This is not based on a previous transaction. |
Reverse | Reverse a previous transaction. This is also used for timeout reversals. |
Sale | A basic sale, no other steps are required to complete the payment. |
VerifyCard | Verifies that a card is valid. |
Note: FDMS Rapid Connect is a host capture system. No explicit calls are needed to settle or otherwise manage the batch.
Below are notes on each supported transaction type.
Retail AuthOnly
This method performs an authorization request. This transaction places a hold on the funds. To capture the funds the Capture method must be called.
After calling this method call GetDetailAggregate to generate a detail aggregate. The detail aggregate should be saved for use with Capture or Reverse later.
When ready to Capture or Reverse the transaction call SetDetailAggregate to the previously stored detail aggregate before calling the method.
After this method returns check the value of Code to determine if the transaction was successful.
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.IndustryType = FdmsrcretailIndustryTypes.fitRetail;
retail.STAN = "112";
retail.TransactionNumber = "1234";
retail.OrderNumber = "123";
retail.TransactionAmount = "1200";
retail.ReferenceNumber = "123";
retail.Card.MagneticStripe = "B4012000033330026^FDCS TEST CARD /VISA^170410054321000000000000000 150 A";
retail.Card.EntryDataSource = EntryDataSources.edsTrack1;
retail.AuthOnly();
Retail BalanceInquiry
This methods allows you to perform a Balance Inquiry Request using the specified Card data. The balance amount will be returned via Response.Balance. Note that Balance Inquiries do not place a hold on a cardholder’s funds and are not captured.
Note: This method is only applicable to swiped MasterCards.
Retail Capture
This method captures a previously authorized transaction. Before calling this method call SetDetailAggregate to specify the detail aggregate from the original AuthOnly transaction.
After this method returns check the value of Code to determine if the transaction was successful.
FDMS Recommendations: Vendors/Gateways, who systematically send all Capture transactions during their end of day processing or at a specific time for their entire chain, must configure/program their systems to send the Capture transactions for all locations or merchants varying times of day based on the MerchantId or MerchantTerminalNumber (whichever provides a more random value).
To assist with implementing this logic, FDMS Rapid Connect recommends sending the Capture transactions based on the MerchantTerminalNumber in each location. For example If the last digit of the MerchantTerminalNumber is 0, set the time for the Capture transactions to be sent as xx:00 (xx=hh:00=mm). The time for the MerchantTerminalNumber ending with 1 would be xx:05. The time for the MerchantTerminalNumber ending with 2 would be xx:10. All remaining MerchantTerminalNumbers would follow this same logic. This logic would be applied across the entire chain or merchant base, to ensure that all Captures for all merchants are not systematically sent to First Data at the same time. FDMS recommends that the software calculate the offset of time based on the MerchantId or MerchantTerminalNumber, and not rely on a user to specify the time as noted above.
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.IndustryType = FdmsrcretailIndustryTypes.fitRetail;
retail.STAN = "112";
retail.TransactionNumber = "1234";
retail.OrderNumber = "123";
retail.ReferenceNumber = "123456";
retail.TransactionAmount = "1200";
retail.Card.MagneticStripe = "B4012000033330026^FDCS TEST CARD /VISA^170410054321000000000000000 150 A";
retail.Card.EntryDataSource = EntryDataSources.edsTrack1;
retail.AuthOnly();
string aggregate = retail.GetDetailAggregate();
//Capture
retail = new Fdmsrcretail();
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.IndustryType = FdmsrcretailIndustryTypes.fitRetail;
retail.STAN = "113";
retail.TransactionNumber = "1235";
retail.ReferenceNumber = "123457";
retail.SetDetailAggregate(aggregate);
//The TransactionAmount is populated when SetDetailAggregate is called.
//TransactionAmount may be set to a different amount when capturing,
//for instance to include Gratuity.
retail.TransactionAmount = "1600";
retail.Capture();
Retail Credit
This method credits funds to the card. This is not based on a previous transaction. This may be used to return funds to a card if a previous transaction has already been settled. To void or cancel a transaction before it has been settled call Reverse instead.
After this method returns check the value of Response.Code to determine if the transaction was successful.
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.IndustryType = FdmsrcretailIndustryTypes.fitRetail;
retail.STAN = "112";
retail.TransactionNumber = "1234";
retail.OrderNumber = "123";
retail.ReferenceNumber = "123";
retail.TransactionAmount = "1200";
retail.Card.MagneticStripe = "B4012000033330026^FDCS TEST CARD /VISA^170410054321000000000000000 150 A";
retail.Card.EntryDataSource = EntryDataSources.edsTrack1;
retail.Credit();
Retail Reverse
This method reverses a transaction that has not been settled.
To void/reverse a Sale or AuthOnly transaction first set ReversalTransactionType to specify the type of original transaction that is being reversed. Next set ReversalType to frtFullReversal and call this method.
If the previous transaction did not receive a response and the state of the transaction is uncertain you may perform a Timeout Reversal. To perform a timeout reversal set ReversalTransactionType to specify the type of original transaction that is being reversed. Next set ReversalType to frtTimeoutReversal and call this method.
Timeout Reversals are applicable to the following transaction types:
- AuthOnly
- Capture
- Credit
- Sale
Full Reversals are applicable to the following transaction types:
- AuthOnly
- Sale
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.IndustryType = FdmsrcretailIndustryTypes.fitRetail;
retail.STAN = "112";
retail.TransactionNumber = "1234";
retail.OrderNumber = "123";
retail.ReferenceNumber = "123";
retail.TransactionAmount = "1200";
retail.Card.MagneticStripe = "B4012000033330026^FDCS TEST CARD /VISA^170410054321000000000000000 150 A";
retail.Card.EntryDataSource = EntryDataSources.edsTrack1;
retail.Sale();
string aggregate = retail.GetDetailAggregate();
//Reverse
retail = new Fdmsrcretail();
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.STAN = "113";
retail.TransactionNumber = "1235";
retail.ReferenceNumber = "123457";
retail.SetDetailAggregate(aggregate);
retail.Reverse();
Retail Sale
This method performs a sale transaction. Once a sale is performed no further action is needed, the funds will automatically be captured by FDMS.
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.IndustryType = FdmsrcretailIndustryTypes.fitRetail;
retail.STAN = "112";
retail.TransactionNumber = "1234";
retail.OrderNumber = "123";
retail.ReferenceNumber = "123";
retail.TransactionAmount = "1200";
retail.Card.MagneticStripe = "B4012000033330026^FDCS TEST CARD /VISA^170410054321000000000000000 150 A";
retail.Card.EntryDataSource = EntryDataSources.edsTrack1;
retail.Sale();
Retail VerifyCard
This method performs a card verification without charging any funds. This can be used to simply verify if the card is valid, or perform AVS and CVV checks without actually charging any funds to the card.
When calling this method TransactionAmount must be set to 0. Set either CustomerAddress or CustomerZip to perform AVS checks. Set CVVData to perform CVV checks.
retail.TPPID = "AAA000";
retail.MerchantTerminalNumber = "00000001";
retail.MerchantId = "1234";
retail.GroupId = "20001";
retail.DatawireId = "00011122233344455566";
retail.ApplicationId = "RAPIDCONNECTVXN";
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.IndustryType = FdmsrcretailIndustryTypes.fritRetail;
retail.URL = "https://stg.dw.us.fdcnet.biz/rc";
retail.STAN = "112";
retail.TransactionNumber = "1234";
retail.ReferenceNumber = "123";
retail.TransactionAmount = "0";
retail.CustomerZip = "11747";
//Card data must be manually keyed
retail.Card.Number = "373953123443227";
retail.Card.ExpMonth = 12;
retail.Card.ExpYear = 2018;
retail.Card.EntryDataSource = EntryDataSources.edsManualEntryTrack1Capable;
retail.VerifyCard();
EMV Transactions
Retail EMV transactions are supported via the EMVData property. After obtaining the EMV data from the EMV card reader pass this information to the component before submitting the transaction.
See the EMV Support in 4D Payments SDK article for more details.
Gratuity for Restaurant Transactions
In order to add gratuity the transaction may be authorized using AuthOnly and then Captured for a different amount that includes the tip. Gratuity cannot be added later to a Sale transaction. Consult FDMS for any applicable limits on the additional amount being captured.
ECommerce Transactions
The FDMSRcECommerce component supports submitting card not present transactions for the following industry types:
- ECommerce
- MOTO (Mail Order/Telephone Order)
Set the IndustryType property to specify the industry type.
ECommerce Quickstart
To being processing transactions first set the required merchant values. For instance:
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.MerchantURL = "mywebsite"; //Required for ECommerce transactions
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
Next specify transaction specific information. These values uniquely identify the transaction to Datawire and FDMS.
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "120013";
fdmsrcecommerce.OrderNumber = "12000503";
fdmsrcecommerce.ReferenceNumber = "123";
Then specify customer card and address information along with the transaction amount:
fdmsrcecommerce.Card.Number = "36185900055556";
fdmsrcecommerce.Card.ExpMonth = 4;
fdmsrcecommerce.Card.ExpYear = 2016;
fdmsrcecommerce.Card.CVVData = "123";
fdmsrcecommerce.CustomerAddress = "1307 Broad Hollow Road";
fdmsrcecommerce.CustomerZip = "11747";
fdmsrcecommerce.TransactionAmount = "1200"; //$12.00
Finally, submit the transaction by calling the Sale method.
fdmsrcecommerce.Sale();
The Response.Code field indicates the result of the transaction. A code of 000 indicates success. For all other values please see the Response Codes section. Additional Response properties such as ApprovalCode, AuthorizedAmount, Text, AVSResult, CVVResult, and more, provide further details about the transaction response.
To perform subsequent operations on a transaction, such as calling Reverse to reverse a Sale, or calling Capture to capture a previous AuthOnly transaction the GetDetailAggregate method must be used to get details about the original transaction. This aggregate must be stored securely, it will contain cardholder information that is required for subsequent transactions. For instance:
fdmsrcecommerce.AuthOnly();
//Save the detail aggregate to use with Capture
string aggregate = fdmsrcecommerce.GetDetailAggregate();
//The aggregate must then be stored securely.
//At a later time the aggregate is retrieved in order to perform a capture.
//Capture
fdmsrcecommerce = new Fdmsrcecommerce();
...
//Specify the detail aggregate from the original transaction
fdmsrcecommerce.SetDetailAggregate(aggregate);
fdmsrcecommerce.Capture();
ECommerce Transaction Types
The FDMSRcECommerce component supports the following transaction types:
Transaction Type | Description |
---|---|
AuthOnly | An authorization that must be Captured later. |
Capture | Captures a previous AuthOnly transaction for settlement. |
Credit | Credits funds to the cardholder. This is not based on a previous transaction. |
Reverse | Reverse a previous transaction. This is also used for timeout reversals. |
Sale | A basic sale, no other steps are required to complete the payment. |
VerifyCard | Verifies that a card is valid. |
Note: FDMS Rapid Connect is a host capture system. No explicit calls are needed to settle or otherwise manage the batch.
Below are notes on each supported transaction type.
ECommerce AuthOnly
This method performs an authorization request. This transaction places a hold on the funds. To capture the funds the Capture method must be called.
After calling this method call GetDetailAggregate to generate a detail aggregate. The detail aggregate should be saved for use with Capture or Reverse later.
When ready to Capture or Reverse the transaction call SetDetailAggregate to the previously stored detail aggregate before calling the method.
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "120013";
fdmsrcecommerce.OrderNumber = "12000503";
fdmsrcecommerce.ReferenceNumber = "123";
fdmsrcecommerce.Card.Number = "36185900055556";
fdmsrcecommerce.Card.ExpMonth = 4;
fdmsrcecommerce.Card.ExpYear = 2016;
fdmsrcecommerce.Card.CVVData = "123";
fdmsrcecommerce.TransactionAmount = "272000";
fdmsrcecommerce.CustomerAddress = "1307 Broad Hollow Road";
fdmsrcecommerce.CustomerZip = "11747";
fdmsrcecommerce.AuthOnly();
//Save the detail aggregate to use with Capture or Reverse later
string aggregate = fdmsrcecommerce.GetDetailAggregate();
ECommerce Capture
This method captures a previously authorized transaction. Before calling this method call SetDetailAggregate to specify the detail aggregate from the original AuthOnly transaction.
FDMS Recommendations: Vendors/Gateways, who systematically send all Capture transactions during their end of day processing or at a specific time for their entire chain, must configure/program their systems to send the Capture transactions for all locations or merchants varying times of day based on the MerchantId or MerchantTerminalNumber (whichever provides a more random value).
To assist with implementing this logic, FDMS Rapid Connect recommends sending the Capture transactions based on the MerchantTerminalNumber in each location. For example If the last digit of the MerchantTerminalNumber is 0, set the time for the Capture transactions to be sent as xx:00 (xx=hh:00=mm). The time for the MerchantTerminalNumber ending with 1 would be xx:05. The time for the MerchantTerminalNumber ending with 2 would be xx:10. All remaining MerchantTerminalNumbers would follow this same logic. This logic would be applied across the entire chain or merchant base, to ensure that all Captures for all merchants are not systematically sent to First Data at the same time. FDMS recommends that the software calculate the offset of time based on the MerchantId or MerchantTerminalNumber, and not rely on a user to specify the time as noted above.
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.MerchantURL = "mywebsite";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "120013";
fdmsrcecommerce.OrderNumber = "12000503";
fdmsrcecommerce.ReferenceNumber = "123";
fdmsrcecommerce.Card.Number = "36185900055556";
fdmsrcecommerce.Card.ExpMonth = 4;
fdmsrcecommerce.Card.ExpYear = 2016;
fdmsrcecommerce.Card.CVVData = "123";
fdmsrcecommerce.TransactionAmount = "272000";
fdmsrcecommerce.CustomerAddress = "1307 Broad Hollow Road";
fdmsrcecommerce.CustomerZip = "11747";
fdmsrcecommerce.AuthOnly();
//Save the detail aggregate to use with Capture
string aggregate = fdmsrcecommerce.GetDetailAggregate();
//Capture
fdmsrcecommerce = new Fdmsrcecommerce();
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.MerchantURL = "4DPayments"; //Required for capture
fdmsrcecommerce.STAN = "113";
fdmsrcecommerce.TransactionNumber = "120014";
fdmsrcecommerce.SetDetailAggregate(aggregate);
fdmsrcecommerce.Capture();
ECommerce Credit
This method credits funds to the card. This is not based on a previous transaction. This may be used to return funds to a card if a previous transaction has already been settled. To void or cancel a transaction before it has been settled call Reverse instead.
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "120013";
fdmsrcecommerce.OrderNumber = "12000503";
fdmsrcecommerce.ReferenceNumber = "123";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "123";
fdmsrcecommerce.ReferenceNumber = "123456";
fdmsrcecommerce.OrderNumber = "1234";
fdmsrcecommerce.Card.Number = "36185900055556";
fdmsrcecommerce.Card.ExpMonth = 4;
fdmsrcecommerce.Card.ExpYear = 2016;
fdmsrcecommerce.TransactionAmount = "1200";
fdmsrcecommerce.Credit();
ECommerce Reverse
This method reverses a transaction that has not been settled.
To void/reverse a Sale or AuthOnly transaction first set ReversalTransactionType to specify the type of original transaction that is being reversed. Next set ReversalType to frtFullReversal and call this method.
If the previous transaction did not receive a response and the state of the transaction is uncertain you may perform a Timeout Reversal. To perform a timeout reversal set ReversalTransactionType to specify the type of original transaction that is being reversed. Next set ReversalType to frtTimeoutReversal and call this method.
Timeout Reversals are applicable to the following transaction types:
- AuthOnly
- Capture
- Credit
- Sale
Full Reversals are applicable to the following transaction types:
- AuthOnly
- Sale
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.MerchantURL = "mywebsite";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "123";
fdmsrcecommerce.ReferenceNumber = "123456";
fdmsrcecommerce.OrderNumber = "1234";
fdmsrcecommerce.Card.Number = "36185900055556";
fdmsrcecommerce.Card.ExpMonth = 4;
fdmsrcecommerce.Card.ExpYear = 2016;
fdmsrcecommerce.Card.CVVData = "123";
fdmsrcecommerce.CustomerAddress = "1307 Broad Hollow Road";
fdmsrcecommerce.CustomerZip = "11747";
fdmsrcecommerce.TransactionAmount = "1200";
fdmsrcecommerce.Sale();
string aggregate = fdmsrcecommerce.GetDetailAggregate();
//Reverse
fdmsrcecommerce = new Fdmsrcecommerce();
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "123";
fdmsrcecommerce.ReferenceNumber = "123456";
fdmsrcecommerce.OrderNumber = "1234";
//Provide the detail aggregate from the sale.
fdmsrcecommerce.SetDetailAggregate(aggregate);
fdmsrcecommerce.ReversalTransactionType = FdmsrcecommerceReversalTransactionTypes.frttSale;
fdmsrcecommerce.ReversalType = FdmsrcecommerceReversalTypes.fertFullReversal;
fdmsrcecommerce.Reverse();
ECommerce Sale
This method performs a sale transaction. Once a sale is performed no further action is needed, the funds will automatically be captured by FDMS.
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.MerchantURL = "mywebsite";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "120013";
fdmsrcecommerce.OrderNumber = "12000503";
fdmsrcecommerce.ReferenceNumber = "123";
fdmsrcecommerce.Card.Number = "36185900055556";
fdmsrcecommerce.Card.ExpMonth = 4;
fdmsrcecommerce.Card.ExpYear = 2016;
fdmsrcecommerce.Card.CVVData = "123";
fdmsrcecommerce.CustomerAddress = "1307 Broad Hollow Road";
fdmsrcecommerce.CustomerZip = "11747";
fdmsrcecommerce.TransactionAmount = "1200";
fdmsrcecommerce.Sale();
//Save the detail aggregate to use with Capture or Reverse later
string aggregate = fdmsrcecommerce.GetDetailAggregate();
ECommerce VerifyCard
This method performs a card verification without charging any funds. This can be used to simply verify if the card is valid, or perform AVS and CVV checks without actually charging any funds to the card.
When calling this method TransactionAmount must be set to 0. Set either CustomerAddress or CustomerZip to perform AVS checks. Set CVVData to perform CVV checks.
fdmsrcecommerce.IndustryType = FdmsrcecommerceIndustryTypes.fitEcommerce;
fdmsrcecommerce.TPPID = "AAA000";
fdmsrcecommerce.MerchantTerminalNumber = "00000001";
fdmsrcecommerce.MerchantId = "1234";
fdmsrcecommerce.GroupId = "20001";
fdmsrcecommerce.DatawireId = "00011122233344455566";
fdmsrcecommerce.ApplicationId = "RAPIDCONNECTVXN";
fdmsrcecommerce.URL = "https://stg.dw.us.fdcnet.biz/rc";
fdmsrcecommerce.STAN = "112";
fdmsrcecommerce.TransactionNumber = "1234";
fdmsrcecommerce.ReferenceNumber = "1212";
fdmsrcecommerce.OrderNumber = "123";
fdmsrcecommerce.Card.Number = "5424181111112236";
fdmsrcecommerce.Card.ExpMonth = 4;
fdmsrcecommerce.Card.ExpYear = 2016;
fdmsrcecommerce.Card.CVVData = "123";
fdmsrcecommerce.TransactionAmount = "0";
fdmsrcecommerce.CustomerAddress = "1307 Broad Hollow Road";
fdmsrcecommerce.CustomerZip = "11747";
fdmsrcecommerce.VerifyCard();
Debit Transactions
The FDMSRcDebit component supports submitting card not present transactions for the following industry types:
- Retail
- Restaurant
Set the IndustryType property to specify the industry type.
Debit Quickstart
To being processing transactions first set the required merchant values. For instance:
debit.TPPID = "AAA000";
debit.MerchantTerminalNumber = "00000001";
debit.MerchantId = "1234";
debit.GroupId = "20001";
debit.DatawireId = "00011122233344455566";
debit.ApplicationId = "RAPIDCONNECTVXN";
debit.URL = "https://stg.dw.us.fdcnet.biz/rc";
Next specify transaction specific information. These values uniquely identify the transaction to Datawire and FDMS.
debit.STAN = "112";
debit.TransactionNumber = "1234";
debit.ReferenceNumber = "1212";
debit.OrderNumber = "123";
Then specify customer card and address information along with the transaction amount:
debit.Card.MagneticStripe = "4003010001234572=17041011234567440";
debit.EncryptedPIN = "7BD8948B328B21E5";
debit.KSN = "876543210F008400029";
debit.TransactionAmount = "1200"; //$12.00
Finally, submit the transaction by calling the Sale method.
debit.Sale();
The Response.Code field indicates the result of the transaction. A code of 000 indicates success. For all other values please see the Response Codes section. Additional Response properties such as ApprovalCode, AuthorizedAmount, Text, AVSResult, CVVResult, and more, provide further details about the transaction response.
To perform subsequent operations on a transaction, such as calling Reverse to reverse a Sale, or calling Capture to capture a previous AuthOnly transaction the GetDetailAggregate method must be used to get details about the original transaction. This aggregate must be stored securely, it will contain cardholder information that is required for subsequent transactions. For instance:
debit.Sale();
//Save the detail aggregate to use with Reverse
string aggregate = debit.GetDetailAggregate();
//The aggregate must then be stored securely.
//At a later time the aggregate is retrieved in order to perform a reversal.
//Reverse
debit = new Fdmsrcdebit();
...
//Specify the detail aggregate from the original transaction
debit.SetDetailAggregate(aggregate);
debit.ReversalTransactionType = FdmsrcdebitReversalTransactionTypes.frttSale;
debit.ReversalType = FdmsrcdebitReversalTypes.fdrtFullReversal;
debit.Reverse();
Debit Transaction Types
The FDMSRcDebit component supports the following transaction types:
Transaction Type | Description |
---|---|
BalanceInquiry | Inquire about available balance. |
Credit | Credits funds to the cardholder. This is not based on a previous transaction. |
Reverse | Reverse a previous transaction. This is also used for timeout reversals. |
Sale | A basic sale, no other steps are required to complete the payment. |
Note: FDMS Rapid Connect is a host capture system. No explicit calls are needed to settle or otherwise manage the batch.
Below are notes on each supported transaction type.
Debit BalanceInquiry
This methods allows you to perform a Balance Inquiry Request using the specified Card data. The balance amount will be returned via Response.Balance.
Note that Balance Inquiries do not place a hold on a cardholder’s funds and are not captured.
Debit Credit
This method credits funds to the card. This is not based on a previous transaction. This may be used to return funds to a card if a previous transaction has already been settled. To void or cancel a transaction before it has been settled call Reverse instead.
debit.TPPID = "AAA000";
debit.MerchantTerminalNumber = "00000001";
debit.MerchantId = "1234";
debit.GroupId = "20001";
debit.DatawireId = "00011122233344455566";
debit.ApplicationId = "RAPIDCONNECTVXN";
debit.URL = "https://stg.dw.us.fdcnet.biz/rc";
debit.STAN = "112";
debit.TransactionNumber = "1234";
debit.ReferenceNumber = "1212";
debit.OrderNumber = "123";
debit.Card.MagneticStripe = "4003010001234572=17041011234567440";
debit.EncryptedPIN = "7BD8948B328B21E5";
debit.KSN = "876543210F008400029";
debit.TransactionAmount = "1200";
debit.Credit();
Debit Reverse
This method reverses a transaction that has not been settled.
To void/reverse a Sale or AuthOnly transaction first set ReversalTransactionType to specify the type of original transaction that is being reversed. Next set ReversalType to frtFullReversal and call this method.
If the previous transaction did not receive a response and the state of the transaction is uncertain you may perform a Timeout Reversal. To perform a timeout reversal set ReversalTransactionType to specify the type of original transaction that is being reversed. Next set ReversalType to frtTimeoutReversal and call this method.
Timeout Reversals are applicable to the following transaction types:
- Credit
- Sale
Full Reversals are applicable to the following transaction types:
- Sale
debit.TPPID = "AAA000";
debit.MerchantTerminalNumber = "00000001";
debit.MerchantId = "1234";
debit.GroupId = "20001";
debit.DatawireId = "00011122233344455566";
debit.ApplicationId = "RAPIDCONNECTVXN";
debit.URL = "https://stg.dw.us.fdcnet.biz/rc";
debit.STAN = "112";
debit.TransactionNumber = "1234";
debit.ReferenceNumber = "1212";
debit.OrderNumber = "123";
debit.Card.MagneticStripe = "4003010001234572=17041011234567440";
debit.EncryptedPIN = "7BD8948B328B21E5";
debit.KSN = "876543210F008400029";
debit.TransactionAmount = "1200";
debit.Sale();
//Store the aggregate for use later
string aggregate = debit.GetDetailAggregate();
//Later, reverse the transaction
debit.TPPID = "AAA000";
debit.MerchantTerminalNumber = "00000001";
debit.MerchantId = "1234";
debit.GroupId = "20001";
debit.DatawireId = "00011122233344455566";
debit.ApplicationId = "RAPIDCONNECTVXN";
debit.URL = "https://stg.dw.us.fdcnet.biz/rc";
debit.STAN = "113";
debit.TransactionNumber = "120014";
debit.ReferenceNumber = "123457";
debit.SetDetailAggregate(aggregate);
debit.ReversalTransactionType = FdmsrcdebitReversalTransactionTypes.frttSale;
debit.ReversalType = FdmsrcdebitReversalTypes.fdrtFullReversal;
debit.Reverse();
Debit Sale
This method performs a sale transaction. Once a sale is performed no further action is needed, the funds will automatically be captured by FDMS.
debit.TPPID = "AAA000";
debit.MerchantTerminalNumber = "00000001";
debit.MerchantId = "1234";
debit.GroupId = "20001";
debit.DatawireId = "00011122233344455566";
debit.ApplicationId = "RAPIDCONNECTVXN";
debit.URL = "https://stg.dw.us.fdcnet.biz/rc";
debit.STAN = "112";
debit.TransactionNumber = "1234";
debit.ReferenceNumber = "1212";
debit.OrderNumber = "123";
debit.Card.MagneticStripe = "4003010001234572=17041011234567440";
debit.EncryptedPIN = "7BD8948B328B21E5";
debit.KSN = "876543210F008400029";
debit.TransactionAmount = "1200";
debit.Sale();
Get Support
You can find out more about 4D Payments SDK by visiting its product page. Additional information is available in the 4D Payments Credit Card Processing FAQ. You will also find the code examples above in the ready-to-compile demo applications included with 4D Payments SDK. Before you can go live, you will need to create a merchant account that supports FDMS with your bank.
If you have any questions please contact our support team and we will be happy to help.