Client SDK So API
Client SDK So API
Client SDK So API
Copyright
© 2020. CyberSource Corporation. All rights reserved. CyberSource Corporation ("CyberSource") furnishes this
document and the software described in this document under the applicable agreement between the reader of
this document ("You") and CyberSource ("Agreement"). You may use this document and/or software only in
accordance with the terms of the Agreement. Except as expressly set forth in the Agreement, the information
contained in this document is subject to change without notice and therefore should not be interpreted in any way
as a guarantee or warranty by CyberSource. CyberSource assumes no responsibility or liability for any errors
that may appear in this document. The copyrighted software that accompanies this document is licensed to You
for use only in strict accordance with the Agreement. You should read the Agreement carefully before using the
software. Except as permitted by the Agreement, You may not reproduce any part of this document, store this
document in a retrieval system, or transmit this document, in any form or by any means, electronic, mechanical,
recording, or otherwise, without the prior written consent of CyberSource.
Trademarks
Authorize.Net, eCheck.Net, and The Power of Payment are registered trademarks of CyberSource Corporation.
CyberSource, CyberSource Payment Manager, CyberSource Risk Manager, CyberSource Decision Manager,
and CyberSource Connect are trademarks and/or service marks of CyberSource Corporation. Visa, Visa
International, CyberSource, the Visa logo, and the CyberSource logo are the registered trademarks of Visa
International in the United States and other countries. All other trademarks, service marks, registered marks, or
registered service marks are the property of their respective owners.
2
CONTENTS
Contents
Chapter 1 Introduction 15
Going Live 24
CyberSource Essentials Merchants 24
CyberSource Advanced Merchants 25
Updating the Client to Use a Later API Version 25
C/C++ API for the Client 26
CybsMap Structure 26
Available Functions 26
cybs_load_config() 26
cybs_create_map() 27
cybs_destroy_map() 27
cybs_set_add_behavior() 27
cybs_get() 28
cybs_get_first() 29
cybs_get_next() 29
cybs_get_count() 30
cybs_create_map_string() 30
cybs_destroy_map_string() 30
cybs_run_transaction() 31
Using Name-Value Pairs 36
Requesting CyberSource Services 36
Sample Code 36
Creating and Sending Requests 36
Adding the Use Statement 36
Loading the Configuration Settings 37
Creating the Empty Request and Reply 37
Adding the Merchant ID 37
Adding Services to the Request Structure 37
Requesting a Sale 37
Adding Service-Specific Fields to the Request 38
Sending the Request 38
Interpreting Replies 39
Handling the Return Status 39
Processing the Reason Codes 42
Handling Decision Manager Reviews 44
Requesting Multiple Services 45
Retrying When System Errors Occur 45
Using XML 46
Requesting CyberSource Services 46
Sample Code 47
Creating a Request Document 47
Creating an Empty Request 48
Adding the Merchant ID 48
Adding Services to the Request 48
Requesting a Sale 49
XML Client 76
Using Name-Value Pairs 76
Requesting CyberSource Services 76
Creating and Sending the Request 77
Creating a New Visual Studio .NET Project 77
Importing the Client Classes 77
Creating an Empty Request 77
Adding the Merchant ID 77
Adding Services to the Request 78
Requesting a Sale 78
Adding Service-Specific Fields to the Request 78
Sending the Request 79
Interpreting the Reply 79
Using the Decision and Reason Code 81
For CyberSource Advanced Merchants: Handling Decision Manager Reviews 83
Requesting Multiple Services 84
Retrying When System Errors Occur 85
Creating an Application Settings File 85
Using XML 86
Requesting CyberSource Services 86
Creating a Request Document 87
Creating an Empty Request 87
Adding the Merchant ID 88
Adding Services to the Request 88
Requesting a Sale 88
Adding Service-Specific Fields to the Request 89
Sending the Request 89
Creating a New Visual Studio .NET Project 89
Importing the Client Classes 90
Sending the Request 90
Interpreting the Reply 91
Using the Decision and Reason Code 93
For CyberSource Advanced Merchants: Handling Decision Manager Reviews 95
Requesting Multiple Services 96
Retrying When System Errors Occur 97
Creating an Application Settings File 97
Using SOAP 98
Requesting CyberSource Services 98
Creating and Sending the Request 98
Creating a New Visual Studio .NET Project 98
Importing the Client Classes 99
Creating an Empty Request 99
Adding the Merchant ID 99
Adding Services to the Request 99
Release Changes
July 2020 Added endpoints for merchants in India.
September 2019 Deprecated and deleted Perl and ASP sections and removed ASP and Perl
section references from About this Guide and Introduction sections.
April 2019 Updated .NET 4.0 to .NET 4.0 or later.
Updated the types of endpoints:
C/C++: "Using Alternate Server Configuration Settings," page 60
Java: "Using Alternate Server Properties," page 143
PHP: "Using Alternate Server Configuration Settings," page 190
Updated the following sections in the .NET 4.0 or Later chapter:
"Installing the Client," page 66
"Testing the Client," page 70
Updated the following sections in the Java chapter:
"Installing the Client," page 119
"Testing the Client," page 122
September 2015 Updated the production server URL and the test server URL.
September 2014 Added the new .NET 4.0 client chapter. See ".NET 4.0 or Later Client,"
page 62.
April 2013 Noted that all of the Simple Order API clients except the .NET 4.0 client are
supported only on 32-bit operating systems.
Combined all Simple Order API client documents into this developer guide,
which covers all supported programming languages.
Audience
This guide is written for application developers who want to use the CyberSource Simple
Order API client to integrate the following CyberSource services into their order
management system:
CyberSource Essentials
CyberSource Advanced
Using the Simple Order API client SDK requires programming skills in one of the following
programming languages:
C, C++
Java/Cold Fusion
.NET
PHP
To use these SDKs, you must write code that uses the API request and reply fields to
integrate CyberSource services into your existing order management system.
Purpose
This guide describes tasks you must complete to install, test, and use the CyberSource
Simple Order API client software.
Scope
This guide describes how to install, test, and use all available Simple Order API clients. It
does not describe how to implement CyberSource services with the Simple Order API. For
information about how to use the API to implement CyberSource services, see "Related
Documents," page 14.
Conventions
The Simple Order API was originally referred to as the Web Services API in
CyberSource documentation. References to the Web Services API may still
appear in some locations.
Related Documents
If you use other CyberSource services, the documentation can be found on the
CyberSource Essentials or CyberSource Advanced (Global Payment Services) sections
of the CyberSource web site.
Customer Support
For support information about any CyberSource service, visit the Support Center:
http://www.cybersource.com/support
Only the .NET 4.0 or later client for the Simple Order API is supported on both
32-bit and 64-bit operating systems. All of the other Simple Order API clients
are supported on 32-bit operating systems only.
The CyberSource Simple Order API enables you to access CyberSource services using
name-value pairs, XML, or the Simple Object Access Protocol (SOAP). The Simple Order
API SDKs provide the client software for the following programming languages:
C, C++
.NET version 1.1 and version 2.0
Java
PHP
The C/C++ client for the Simple Order API is supported on 32-bit operating systems
only.
If you are building an application to sell to others, see Appendix A, "Using the Client
Application Fields," on page 192. This appendix has a list of API fields you can use
in your request that describe the application, its version, and its user. If you use
these fields in your request, you can view their values in the Transaction Search
Details window of the Business Center.
API Variation
With this client package, you can use either of these variations of the Simple Order API:
Name-value pairs, which are simpler to use than XML
XML, which requires you to create and parse XML documents
The test that you run immediately after installing the client uses name-value pairs.
Client Versions
CyberSource updates the Simple Order API on a regular basis to introduce new API fields
and functionality. To identify the latest version of the API, go to:
https://ics2wsa.ic3.com/commerce/1.x/transactionProcessor
This represents the version of the server-side code for the CyberSource services.
The Simple Order API Client for C/C++ also has a version, but it is not the same as the
API version. The client version represents the version of the client-side code that you use
to access the CyberSource services.
When configuring the client, you indicate which version of the API you want to use. When
setting this parameter, do not use the current version of the client; use the current version
of the API.
Sample Code
The client contains two sets of sample code, one for using name-value pairs and one for
using XML. See "Testing the Client," page 23, or see the README file for more
information about using the sample code to test the client.
XML: We suggest that you examine the name-value pair sample code listed above
before implementing your code to process XML requests.
#include "cybersource.h"
pRequest = cybs_create_map();
// Handle the reply. See "Handling the Return Status," page 39.
For Linux
Linux kernel 2.2, LibC6 on an Intel processor
GNU GCC compiler (with C++ enabled)
For Windows
Windows XP, 2000, or newer
Microsoft Visual Studio 6.0
Failure to configure your client API host to a unique, public IP address will
cause inconsistent transaction results.
The client API request ID algorithm uses a combination of IP address and system time,
along with other values. In some architectures this combination might not yield unique
identifiers.
You must generate two transaction security keys—one for the CyberSource
production environment and one for the test environment. For information
about generating and using security keys, see Creating and Using Security
Keys (PDF | HTML).
The Simple Order API client for C/C++ package includes the ca-bundle.crt, a bundle
of certificate files. The client expects to find the ca-bundle.crt file in the same directory
as your security keys. If you decide to move it elsewhere, use the sslCertFile configuration
parameter to specify the file’s location (see the description of "sslCertFile," page 22).
You must protect your security key to ensure that your CyberSource account is
not compromised.
Step 2 Download the latest client package, and save it in any directory.
Step 5 Test the client. See "Testing the Client," page 23.
You have installed and tested the client. You are ready to create your own code for
requesting CyberSource services. Finish reading this section, and then move on to either
"Using Name-Value Pairs," page 36, if you plan to use name-value pairs, or "Using XML,"
page 46, if you plan to use XML.
If you have multiple merchant IDs, or if you are a reseller handling multiple merchants, you
can use different configuration settings depending on the merchant ID. See "Configuring
for Multiple Merchant IDs," page 61, for more information.
Setting Description
merchantID Merchant ID. This client uses this value if you do not specify a merchant
ID in the request itself.
keysDirectory Location of the merchant’s security keys for the production and the test
environments. The client includes a keys directory that you can use.
Note CyberSource recommends that you store your key locally for faster
request processing.
sendToProduction Flag that indicates whether the transactions for this merchant should be
sent to the production server. Use one of these values:
false: Do not send to the production server; send to the test server
(default setting).
true: Send to the production server.
targetAPIVersion Version of the Simple Order API to use, for example: 1.18. Do not set
this property to the current version of the client; set it to an available API
version. See "Client Versions," page 16, for more information.
Go to https://ics2wsa.ic3.com/commerce/1.x/transactionProcessor to see
a current list of the available versions. For transactions in India, go to
https://ics2ws.in.ic3.com/commerce/1.x/transactionProcessor.
Note See the Simple Order API Release Notes, for information about
what has changed in each version.
keyFilename Name of the security key filename for the merchant in the format
<key_fileName>.p12.
serverURL Alternate server URL to use. See "Using Alternate Server Configuration
Settings," page 60, for more information. Give the complete URL because
it will be used exactly as you specify here.
namespaceURI Alternate namespace URI to use. See "Using Alternate Server
Configuration Settings," page 60, for more information. Give the complete
namespace URI, as it will be used exactly as you specify here.
Setting Description
enableLog Flag directing the client to log transactions and errors. Possible values:
false: Do not enable logging (default setting).
true: Enable logging.
Important Logging can cause very large log files to accumulate.
Therefore, CyberSource recommends that you use logging only when
troubleshooting problems. To comply with all Payment Card Industry (PCI)
and Payment Application (PA) Data Security Standards regarding the
storage of credit card and card verification number data, the logs that are
generated contain only masked credit card and card verification number
data (CVV, CVC2, CVV2, CID, CVN).
Follow these guidelines:
Use debugging temporarily for diagnostic purposes only.
If possible, use debugging only with test credit card numbers.
Never store clear text card verification numbers.
Delete the log files as soon as you no longer need them.
Never send email to CyberSource containing personal and account
information, such as customers' names, addresses, card or check
account numbers, and card verification numbers.
For more information about PCI and PABP requirements, see
www.visa.com/cisp.
logDirectory Directory to which to write the log file. Note that the client will not create
this directory for you; you must specify an existing directory.The client
includes a logs directory that you can use.
logFilename Log file name. The client uses cybs.log by default.
logMaximumSize Maximum size in megabytes for the log file. The default value is "10".
When the log file reaches the specified size, it is archived into
cybs.log.<yyyymmddThhmmssxxx> and a new log file is started.
The xxx indicates milliseconds.
sslCertFile The location of the bundled file of CA Root Certificates
(ca-bundle.crt) which is included in the client download package.
The client automatically looks for the file in the directory where your
security keys are stored (specified by keysDirectory). If you move the file
so it does not reside in keysDirectory, use this configuration setting to
specify the full path to the file, including the file name.
timeout Length of timeout in seconds. The default is 110.
proxyServer Proxy server to use. Allowable formats include:
<http://>server<:port>
<http://>IP address<:port>
The http:// and port are optional.
Note The default port is 1080. If your proxy server is listening on another
port, you must specify a port number.
Setting Description
proxyUsername Username used to authenticate against the proxy server, if required. If the
proxy server requires the domain name during authentication, add the
domain name and a backslash: <domain>\<username>
proxyPassword Password used to authenticate against the proxy server, if required.
Step 3 If the test still fails, look at the error message and find the return status value (a numeric
value from 0 to 8).
Step 4 See the descriptions of the status values in "Possible Return Status Values," page 32, and
follow any instructions given there for the error you received.
Going Live
When you have completed all of your system testing and are ready to accept real
transactions from your customers, your deployment is ready to go live.
You must also configure your client so that it sends transactions to the
production server and not the test server. See the description of the
sendToProduction setting in Table 2, page 21.
After your deployment goes live, use real card numbers and other data to test every card
type you support. Because these are real transactions in which you are buying from
yourself, use small monetary amounts to do the tests. Process an authorization, then
capture the authorization, and later refund the money. Use your bank statements to verify
that money is deposited into and withdrawn from your merchant bank account as
expected. If you have more than one CyberSource merchant ID, test each one separately.
When your deployment goes live, your CyberSource account is updated so that you can
send transactions to the CyberSource production server. If you have not already done so,
you must provide your banking information to CyberSource so that your processor can
deposit funds to your merchant bank account.
After CyberSource confirms that your deployment is live, make sure that you update your
system so that it can send requests to the production server (ics2wsa.ic3.com or
ics2ws.in.ic3.com in India) using your security keys for the production environment.
The test server (ics2wstesta.ic3.com) cannot be used for real transactions. For more
information about sending transactions to the production server, see the description of the
configuration setting "sendToProduction," page 21.
After your deployment goes live, use real card numbers and other data to test every card
type, currency, and CyberSource application that your integration supports. Because
these are real transactions in which you are buying from yourself, use small monetary
amounts to do the tests. Use your bank statements to verify that money is deposited into
and withdrawn from your merchant bank account as expected. If you have more than one
CyberSource merchant ID, test each one separately.
To update the client to use a later API version, update the value for the
targetAPIVersion configuration parameter. For example, to use the 1.18 version of the
API, set the property to 1.18.
CybsMap Structure
CybsMap is the structure that contains your configuration settings, your request, and the
reply. You use the functions described in the next section to manipulate the structure,
which includes adding the configuration settings, adding either name-value pairs or an
XML document for the request, sending the request, and retrieving the corresponding
reply.
Available Functions
The client API includes the functions described in these sections:
cybs_load_config()
Table 3 cybs_load_config()
cybs_create_map()
Table 4 cybs_create_map()
cybs_destroy_map()
Table 5 cybs_destroy_map()
cybs_set_add_behavior()
Table 6 cybs_set_add_behavior()
cybs_add()
Table 7 cybs_add()
Syntax int cybs_add( CybsMap *pRequest, const char *szName, const char
*szValue )
Description Adds a name-value pair to the specified message structure.The function will do nothing if
pRequest, szName, or szValue is null. With this function you can add name-value pairs for
API fields or for configuration settings.
Returns Returns 0 on success or -1 on failure.
Parameters pRequest: The CybsMap structure to add the name-value pairs to.
szName: The name to add.
szValue: The value to add.
cybs_remove()
Table 8 cybs_remove()
cybs_get()
Table 9 cybs_get()
cybs_get_first()
Table 10 cybs_get_first()
cybs_get_next()
Table 11 cybs_get_next()
cybs_get_count()
Table 12 cybs_get_count()
cybs_create_map_string()
Table 13 cybs_create_map_string()
cybs_destroy_map_string()
Table 14 cybs_destroy_map_string()
cybs_run_transaction()
Table 15 cybs_run_transaction()
_fault_code: The fault code, which indicates where the fault originated
The sample code (when run from a command prompt) displays a numeric value
for the return status, which is listed in the first column.
Numeric
Value (for
Value Description
Sample
Code)
0 CYBS_S_OK Critical: No
Result: The client successfully received a reply.
Keys in **ppReply: For name-value pair users, **ppReply has the reply
name-value pairs for the services that you requested.
For XML users, **ppReply contains the _xml_document key, with the
response in XML format.
Manual action to take: None
1 CYBS_S_ Critical: No
PRE_SEND_
Result: An error occurred before the request could be sent. This usually
ERROR
indicates a configuration problem with the client.
Keys in **ppReply: _error_info
Manual action to take: Fix the problem described in the error information.
2 CYBS_S_ Critical: No
SEND_
Result: An error occurred while sending the request.
ERROR
Keys in **ppReply: _error_info
Manual action to take: None
Note A typical send error that you might receive when testing occurs if the
ca-bundle.crt file is not located in the same directory as your security
key. See the description of the sslCertFile configuration parameter in Table 2,
"Configuration Settings," for information about how to fix the problem.
Numeric
Value (for
Value Description
Sample
Code)
3 CYBS_S_ Critical: Yes
RECEIVE_
Result: An error occurred while waiting for or retrieving the reply.
ERROR
Keys in **ppReply:
_error_info
_raw_reply
Manual action to take: Check the Transaction Search screens on the
Business Center to verify that the request was processed, and if so, whether
it succeeded. Update your transaction database appropriately.
4 CYBS_S_ Critical: Yes
POST_
Result: The client received a reply or a fault, but an error occurred while
RECEIVE_
processing it.
ERROR
Keys in **ppReply:
_error_info
_raw_reply
Manual action to take: Examine the value of _raw_reply. If you cannot
determine the status of the request, then check the Transaction Search
screens on the Business Center to verify that the request was processed, and
if so, whether it succeeded. Update your transaction database appropriately.
5 CYBS_S_ Critical: Yes
CRITICAL_
Result: The server returned a fault with _fault_code set to
SERVER_
CriticalServerError.
FAULT
Keys in **ppReply:
_error_info
_fault_document
_fault_code
_fault_string
_fault_request_id
Manual action to take: Check the Transaction Search screens on the
Business Center to verify that the request succeeded. When searching for the
request, use the request ID provided by _fault_request_id.
Numeric
Value (for
Value Description
Sample
Code)
6 CYBS_S_ Critical: No
SERVER_
Result: The server returned a fault with _fault_code set to ServerError,
FAULT
indicating a problem with the CyberSource server.
Keys in **ppReply:
_error_info
_fault_document
_fault_code
_fault_string
Manual action to take: None
7 CYBS_S_ Critical: No
OTHER_
Result: The server returned a fault with _fault_code set to a value other
FAULT
than ServerError or CriticalServerError. Indicates a possible problem with
merchant status or the security key. Could also indicate that the message was
tampered with after it was signed and before it reached the CyberSource
server.
Keys in **ppReply:
_error_info
_fault_document
_fault_code
_fault_string
Manual action to take: Examine the value of the _fault_string and fix
the problem. You might need to generate a new security key, or you might
need to contact Customer Support if there are problems with your merchant
status. For more information, see Creating and Using Security Keys (PDF |
HTML).
Note A typical error that you might receive occurs if your merchant ID is
configured for “test” mode but you send transactions to the production server.
See the description of the sendToProduction configuration parameter in
Table 2, "Configuration Settings," for information about fixing the problem.
Numeric
Value (for
Value Description
Sample
Code)
8 CYBS_S_ Critical: No
HTTP_
Result: The server returned an HTTP status code other than 200 (OK) or 504
ERROR
(gateway timeout). Note that if a 504 gateway timeout occurs, then the
status=3.
Keys in **ppReply:
_error_info
_raw_reply (contains the HTTP response body, or if none was returned,
the literal "(no response available)").
Manual action to take: None.
The figure below summarizes the reply information you receive for each status value.
The instructions in this section explain how to use C/C++ to request CyberSource
services. For a list of API fields to use in your requests, see "Related Documents,"
page 14.
Sample Code
The code in this section's example is incomplete. For a complete sample program, see the
authCaptureSample.c file in the <installation directory>/samples/nvp
directory.
The example that is developed in the following sections shows basic code for requesting
CyberSource services. In this example, Jane Smith is buying an item for 29.95.
#include "cybersource.h"
You could instead create an empty CybsMap structure and add each configuration setting
separately. You could also use a combination of the two methods: You could read the
settings from a file and then add new settings using the cybs_add() function to override
the settings read from the file.
pRequest = cybs_create_map();
pReply = cybs_create_map();
Requesting a Sale
You can request multiple services by adding additional fields to the request. For example,
if you fulfill the order immediately, you can request credit card authorization and capture
together (referred to as a “sale”):
The example above shows only a partial list of the fields you must send. Refer to
"Requesting CyberSource Services," page 36, for information about the guides that list all
of the fields for the services that you are requesting.
Interpreting Replies
// See "Processing the Reason Codes," page 42 for how to process the
// reasonCode from the reply.
} else {
handleError( status, pRequest, pReply );
}
//---------------------
//---------------------
// handleError shows how to handle the different errors that can occur.
case CYBS_S_PRE_SEND_ERROR :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Notify appropriate internal resources of the error.
break;
case CYBS_S_SEND_ERROR :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
break;
case CYBS_S_RECEIVE_ERROR :
// Critial error.
// Tell customer the order could not be completed and to try again later.
// Notify appropriate internal resources of the error.
// See the sample code for more information about handling critical errors.
break;
case CYBS_S_POST_RECEIVE_ERROR :
// Critical error.
// Tell customer the order could not be completed and to try again later.
// Look at _raw_reply in pReply for the raw reply.
// Notify appropriate internal resources of the error.
// See the sample code for more information about handling critical errors.
break;
// CriticalServerError fault
case CYBS_S_CRITICAL_SERVER_FAULT :
// Critial error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the pReply.
// Notify appropriate internal resources of the fault.
// See the sample code for more information about reading fault details and
// handling a critical error.
break;
// ServerError fault
case CYBS_S_SERVER_FAULT :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the pReply.
// See the sample code for information about reading fault details.
break;
// Other fault
case CYBS_S_OTHER_FAULT :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from pReply.
// Notify appropriate internal resources of the fault.
// See the sample code for information about reading fault details.
break;
// HTTP error
case CYBS_S_HTTP_ERROR :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Look at _raw_reply in pReply for the raw reply.
break;
default :
// Unknown error
}
}
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to customers. Instead, present an
appropriate response that tells customers the result.
Because CyberSource may add reply fields and reason codes at any time, you
should parse the reply data according to the names of the fields instead of their
order in the reply.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
CyberSource reserves the right to add new reason codes at any time. If your
error handler receives a reason code that it does not recognize, it should use
the decision to interpret the reply.
// Insufficient funds
// add other reason codes here that you must handle specifically
else {
// For all other reason codes, return NULL, in which case, you should display
// a generic message appropriate to the decision value you received.
}
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
For example, in the case of a sale (a credit card authorization and a capture requested
together), if the authorization service fails, CyberSource will not process the capture
service. The reply you receive only includes reply fields for the authorization.
Many CyberSource services include “ignore” fields that tell CyberSource to ignore the
result from the first service when deciding whether to run the subsequent services. In the
case of the sale, even though the issuing bank gives you an authorization code,
CyberSource might decline the authorization based on the AVS or card verification results.
Depending on your business needs, you might choose to capture these types of declined
authorizations anyway. You can set the businessRules_ignoreAVSResult field to “true”
in your combined authorization and capture request:
This tells CyberSource to continue processing the capture even if the AVS result causes
CyberSource to decline the authorization. In this case you would then get reply fields for
both the authorization and the capture in your reply.
You are charged only for the services that CyberSource performs.
Instead, CyberSource recommends that you retry sending the request only two or three
times with successively longer periods of time between each retry. For example, after the
first system error response, wait 30 seconds and then retry sending the request. If you
receive the same error a second time, wait one minute before you send the request again.
Depending on the situation, you may decide you can retry sending the request after a
longer time period. Determine what is most appropriate for your business situation.
If after several retry attempts you are still receiving a system error, it is possible that the
error is actually being caused by a processor rejection and not a CyberSource system
error. In that case, we suggest that you either:
Search for the transaction in the Business Center, look at the description of the error
on the Transaction Detail page, and call your processor to determine if and why they
are rejecting the transaction.
Contact CyberSource Customer Support to confirm whether your error is truly caused
by a CyberSource system issue.
If TSYS Acquiring Solutions is your processor, you may want to follow the first suggestion
as there are several common TSYS Acquiring Solutions processor responses that are
returned to you as system errors and that only TSYS Acquiring Solutions can address.
Using XML
This section describes how to request CyberSource services using XML.
The instructions in this section explain how to use C/C++ to request CyberSource
services. For a list of API fields to use in your requests, see "Related Documents,"
page 14.
Sample Code
We suggest that you examine the name-value pair sample code provided in
authCaptureSample.c before implementing your code to process XML requests. The
sample will give you a basic understanding of how to request CyberSource services. The
sample code file is located in the <installation directory>/samples/nvp
directory.
After examining that sample code, read this section to understand how to create code to
process XML requests. Note that the code in this section’s example is incomplete. For a
complete sample program, see the authSample.c file in the <installation
directory>/samples/xml directory.
The request document must validate against the XML schema for CyberSource
transactions. To view the schema, go to
https://ics2wsa.ic3.com/commerce/1.x/transactionProcessor
and look at the xsd file for the version of the Simple Order API you are using.
Make sure that the elements in your document appear in the correct order. If
they do not, your document will not validate, and your request will fail.
The example that is developed in the following sections shows a basic XML document for
requesting CyberSource services. In this example, Jane Smith is buying an item for 29.95.
The XML document in this example is incomplete. For a complete example, see the
auth.xml document in the samples/xml directory.
When you construct a request, you must indicate the correct namespace for the elements,
and the namespace must use the same API version that you specify in the configuration
settings file. For example, if targetAPIVersion=1.18 in the cybs.ini file, the
namespace must be urn:schemas-cybersource-com:transaction-data-1.18.
The XML document that you receive in the reply always uses a prefix of c: (for
example, xmlns:c="urn:schemas-cybersource-com:transaction-
data-1.18"). Make sure you use an XML parser that supports namespaces.
<requestMessage xmlns="urn:schemas-cybersource-com:transaction-data-
1.18">
<merchantID>infodev</merchantID>
</requestMessage>
<requestMessage xmlns="urn:schemas-cybersource-com:transaction-data-
1.18">
<merchantID>infodev</merchantID>
<ccAuthService run="true"/>
</requestMessage>
Requesting a Sale
You can request multiple services by adding additional elements. For example, if you fulfill
the order immediately, you can request a credit card authorization and capture together
(referred to as a “sale”):
<requestMessage xmlns="urn:schemas-cybersource-com:transaction-data-
1.18">
<merchantID>infodev</merchantID>
<ccAuthService run="true"/>
<ccCaptureService run="true"/>
</requestMessage>
<requestMessage xmlns="urn:schemas-cybersource-com:transaction-data-
1.18">
<merchantID>infodev</merchantID>
<billTo>
<firstName>Jane</firstName>
<lastName>Smith</lastName>
</billTo>
<item id="0">
<unitPrice>29.95</unitPrice>
</item>
<card>
<accountNumber>4111111111111111</accountNumber>
</card>
<ccAuthService run="true"/>
</requestMessage>
The example above shows only a partial list of the fields you must send. Refer to
"Requesting CyberSource Services," page 36, for information about the guides that list all
of the fields for the services that you are requesting.
Sending Requests
Once you have created an XML document, you use C/C++ to send the request to
CyberSource.
#include "cybersource.h"
You could instead create an empty CybsMap structure and add each configuration setting
separately. You could also use a combination of the two methods: You could read the
settings from a file and then add new settings using the cybs_add() function to override
the settings read from the file.
The namespace that you specify in the XML document must use the same API
version that you specify in the configuration settings file. For example, if
targetAPIVersion=1.18 in the file, the namespace must be
urn:schemas-cybersource-com:transaction-data-1.18. The
example code below retrieves the API version from the configuration settings
file and places it in the XML document.
pRequest = cybs_create_map();
pReply = cybs_create_map();
Interpreting Replies
// See "Processing the Reason Codes," page 42 for how to process the
// reasonCode from the reply.
} else {
//---------------------
void handleError( CybsStatus stat, CybsMap* preq, CybsMap* prpl )
//---------------------
// handleError shows how to handle the different errors that can occur.
case CYBS_S_PRE_SEND_ERROR :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Notify appropriate internal resources of the error.
break;
case CYBS_S_SEND_ERROR :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
break;
case CYBS_S_RECEIVE_ERROR :
// Critial error.
// Tell customer the order could not be completed and to try again later.
// Notify appropriate internal resources of the error.
// See the sample code for more information about handling critical errors.
break;
case CYBS_S_POST_RECEIVE_ERROR :
// Critical error.
// Tell customer the order could not be completed and to try again later.
// Look at _raw_reply in pReply for the raw reply.
break;
// CriticalServerError fault
case CYBS_S_CRITICAL_SERVER_FAULT :
// Critial error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the pReply.
// Notify appropriate internal resources of the fault.
// ServerError fault
case CYBS_S_SERVER_FAULT :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from pReply.
// See the sample code for information about reading fault details.
break;
// Other fault
case CYBS_S_OTHER_FAULT :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from pReply.
// Notify appropriate internal resources of the fault.
// See the sample code for information about reading fault details.
break;
// HTTP error
case CYBS_S_HTTP_ERROR :
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Look at _raw_reply in pReply for the raw reply.
break;
default :
// Unknown error
}
}
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to customers. Instead, present an
appropriate response that tells customers the result.
Because CyberSource may add reply fields and reason codes at any time, you
should parse the reply data according to the names of the fields instead of their
order in the reply.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
CyberSource reserves the right to add new reason codes at any time. If your
error handler receives a reason code that it does not recognize, it should use
the decision to interpret the reply.
// Success
// Insufficient funds
// add other reason codes here that you must handle specifically
else {
// For all other reason codes, return NULL, in which case, you should display a
// generic message appropriate to the decision value you received.
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
For example, in the case of a sale (a credit card authorization and a capture requested
together), if the authorization service fails, CyberSource will not process the capture
service. The reply you receive only includes reply fields for the authorization.
Many CyberSource services include “ignore” fields that tell CyberSource to ignore the
result from the first service when deciding whether to run the subsequent services. In the
case of the sale, even though the issuing bank gives you an authorization code,
CyberSource might decline the authorization based on the AVS or card verification results.
Depending on your business needs, you might choose to capture these types of declined
authorizations anyway. You can set the businessRules_ignoreAVSResult field to “true”
in your combined authorization and capture request:
<businessRules>
<ignoreAVSResult>true</ignoreAVSResult>
</businessRules>
This tells CyberSource to continue processing the capture even if the AVS result causes
CyberSource to decline the authorization. In this case you would then get reply fields for
both the authorization and the capture in your reply.
You are charged only for the services that CyberSource performs.
Instead, CyberSource recommends that you retry sending the request only two or three
times with successively longer periods of time between each retry. For example, after the
first system error response, wait 30 seconds and then retry sending the request. If you
receive the same error a second time, wait one minute before you send the request again.
Depending on the situation, you may decide you can retry sending the request after a
longer time period. Determine what is most appropriate for your business situation.
If after several retry attempts you are still receiving a system error, it is possible that the
error is actually being caused by a processor rejection and not a CyberSource system
error. In that case, we suggest that you either:
Search for the transaction in the Business Center, look at the description of the error
on the Transaction Detail page, and call your processor to determine if and why they
are rejecting the transaction.
Contact CyberSource Customer Support to confirm whether your error is truly caused
by a CyberSource system issue.
If TSYS Acquiring Solutions is your processor, you may want to follow the first suggestion
as there are several common TSYS Acquiring Solutions processor responses that are
returned to you as system errors and that only TSYS Acquiring Solutions can address.
For example, these are the server URLs and namespace URI for accessing the
CyberSource services using the Simple Order API version 1.18:
Namespace URI:
urn:schemas-cybersource-com:transaction-data-1.18.
If view the above URLs in a web browser, a list of the supported API versions
and the associated schema files are displayed.
If in the future CyberSource changes these conventions, but does not provide a new
version of the client, you can configure your existing client to use the new server and
namespace conventions required by the CyberSource server.
All of the properties except merchantID can be prefixed with "<merchantID>." to specify
the settings for a specific merchant.
If you have a merchant with merchant ID of merchant123, and you want enable logging
only for that merchant, you can set the enableLog parameter to true for all requests that
have merchant123 as the merchant ID:
merchant123.enableLog=true
enableLog=false
The .NET 4.0 or later client for the Simple Order API is supported on 32-bit and 64-
bit operating systems.
If you are building an application to sell to others, see Appendix A, "Using the Client
Application Fields," on page 192. This appendix has a list of API fields you can use
in your request that describe the application, its version, and its user. If you use
these fields in your request, you can view their values in the Transaction Search
Details window of the Business Center.
API Variation
With this client package, you can use any of the three variations of the Simple Order API:
Name-value pairs, which are simpler to use than XML
XML, which requires you to create and parse XML documents
SOAP (Simple Object Access Protocol) 1.1, which provides an object-oriented
interface
The test that you run immediately after installing the client uses name-value pairs.
Client Versions
CyberSource updates the Simple Order API on a regular basis to introduce new API fields
and functionality. To identify the latest version of the API, go to:
https://ics2wsa.ic3.com/commerce/1.x/transactionProcessor.
This represents the version of the server-side code for the CyberSource services.
If a new version of the API has been released, but CyberSource has not yet updated the
.NET client to use this new version, you can manually update the client to use a different
version. See "Updating the Client to Use a Later API Version," page 75.
using CyberSource.Soap;
using CyberSource.Soap.CyberSourceWS;
using System;
using System.Configuration;
using System.Net;
using System.Web.Services.Protocols;
namespace Sample {
class Sample {
static void Main(string[] args) {
RequestMessage request = new RequestMessage();
request.merchantID = "infodev";
Failure to configure your client API host to a unique, public IP address will
cause inconsistent transaction results.
The client API request ID algorithm uses a combination of IP address and system time,
along with other values. In some architectures this combination might not yield unique
identifiers.
You must generate two transaction security keys—one for the CyberSource
production environment and one for the test environment. For information
about generating and using security keys, see Creating and Using Security
Keys (PDF | HTML).
You must protect your security key to ensure that your CyberSource account is
not compromised.
Step 1 Download the latest zip file. The current version is cybersource-sdk-dotnet-1.0.0.zip.
Step 1 Replace the old DLLs with the ones from this package.
CyberSource.Clients
CyberSource.Clients.SoapWebReference
using CyberSource.Clients.
using CyberSource.Clients.SoapWebReference; /* for SOAP client
only */
Step 5 Follow the instructions for migrating from .NET Framework 2.X.
Step 1 Follow the installation instructions in "Installing the Client," page 66.
Step 2 Open your project in Visual Studio 2010. If necessary, use the conversion wizard to update
your project from Visual Studio 2005 to Visual Studio 2010.
Step 3 In your project properties, set the target framework to .NET Framework 4.
Step 4 Make sure that your reference to CyberSource.Clients points to the new .NET 4.0 or later
version of the DLL. You must use the DLLs that you installed in Step 1.
Step 5 Remove references to System.Web.Services and remove the following namespace from
your code:
using System.Web.Services.Protocols
Step 6 If your code contains catch statements that use SignException, change them to use
CryptographicException instead. Making this change requires that you add a
reference to System.Security and add the following namespace to your code:
using System.Security.Cryptography
Once you have tested the client, you are ready to create your own code to request the
CyberSource services. Depending on which API you are using, see:
"Using Name-Value Pairs," page 76.
"Using XML," page 86.
"Using SOAP," page 98.
The test applications and their source code are installed in the samples directory. The
bin subdirectory contains the pre-compiled binaries. The src subdirectory contains the
source code and Visual Studio project files.
Configuration settings supported by the latest 1.x.x version are still supported.
However, CyberSource recommends that you use the following new settings
for this and future versions.
Required/
Field Name Description
Optional
cybs.connectionLimit Maximum number of allowed concurrent connections between the Optional
client and CyberSource’s server. For more information on this field
and alternate ways to set the connection limits, see "Setting the
Connection Limit," page 108.
cybs.keysDirectory Directory that contains the pkcs12 security key file. For example: Required
c:\keys\
cybs.merchantID Your CyberSource merchant ID. You can override this value by Optional
providing the merchantID field in the request itself. The merchant ID
is case sensitive.
Required/
Field Name Description
Optional
cybs. sendToProduction Flag that indicates whether the transactions for this merchant Required
should be sent to the production server. Use one of these values:
false: Do not send to the production server; send to the test
server (default setting).
true: Send to the production server.
Note Make sure that if your merchant ID is configured to use the
test mode, you send requests to the test server.
cybs.keyFilename Name of the security key file name for the merchant in the format Optional
<security_key_filename>.p12.
cybs.serverURL Alternate server URL to use. For more information, see "Configuring Optional
Your Settings for Multiple Merchants," page 73. Give the complete
URL because it will be used exactly as you specify.
cybs.enableLog Flag directing the client to log transactions and errors. Use one of Optional
these values:
false: Do not enable logging (default setting).
true: Enable logging.
Important Logging can cause very large log files to accumulate.
Therefore, CyberSource recommends that you use logging only
when troubleshooting problems. To comply with all Payment Card
Industry (PCI) and Payment Application (PA) Data Security
Standards regarding the storage of credit card and card verification
number data, the logs that are generated contain only masked
credit card and card verification number data (CVV, CVC2, CVV2,
CID, CVN).
Follow these guidelines:
Use debugging temporarily for diagnostic purposes only.
If possible, use debugging only with test credit card numbers.
Never store clear text card verification numbers.
Delete the log files as soon as you no longer need them.
Never send email to CyberSource containing personal and
account information, such as customers' names, addresses, card
or check account numbers, and card verification numbers.
For more information about PCI and PABP requirements, see
www.visa.com/cisp.
cybs.logDirectory Directory to which to write the log file. Note that the client will not Required if
create this directory for you; you must specify an existing directory. cybs.
The client includes a logs directory that you can use. Include the enableLog
path. For example: is true
c:\simapi-net-2.0.0\logs.
cybs.logFilename Name of the log file. The client uses cybs.log by default. Optional
Required/
Field Name Description
Optional
cybs.logMaximumSize Maximum size in megabytes for the log file. The default value is 10. Optional
When the log file reaches the specified size, it is archived into
cybs.log.<yyyymmddThhmmssxxx> and a new log file is
started. The xxx indicates milliseconds.
cybs.timeout Length of time-out in seconds. The default is 130. Optional
cybs.proxyURL URL of a proxy server. For example: https:// Optional
proxy.example.com:4909
cybs.proxyUser User name for the proxy server. Optional
cybs.proxyPassword Password for the proxy server. Optional
To test applications:
Step 1 Decide which test application you want to run, such as SoapSample.exe.
Step 2 Using a text editor, open the settings file for the test application.
The settings file has the same name as the test application, with the extension config
appended to the name. For example, SoapSample.exe.config.
Step 3 Find the cybs.merchantID field and change its value to your CyberSource merchant ID.
Step 4 Find the cybs.keysDirectory field and change its value to the directory that contains
your security key.
See Table 17, "Fields in the Settings File," for a complete list.
To specify the settings for a specific merchant, prefix all settings, except for
cybs.merchantID and the cybs.proxy*, with <merchantID>. The cybs.proxy*
wildcard refers to the proxyURL, proxyUser, proxyPassword settings.
With the second line of the example, the client will send all other requests to the
production server.
Step 3 Type the name of the test application, then press Enter.
The test application requests an CyberSource service, interprets the reply, and prints
information about the result. If you receive a .NET exception, use the error message to
debug the problem.
Going Live
When you complete all of your system testing and are ready to accept real transactions
from consumers, your deployment is ready to go live.
After your deployment goes live, use real card numbers and other data to test
every card type you support. Because these are real transactions in which you
are buying from yourself, use small monetary amounts to do the tests. Process
an authorization, then capture the authorization, and later refund the money.
Use your bank statements to verify that money is deposited into and withdrawn
from your merchant bank account as expected. If you have more than one
CyberSource merchant ID, test each one separately.
You must also configure your client so that it sends transactions to the
production server and not the test server. See the description of the
configuration setting "cybs. sendToProduction," page 71.
When your deployment goes live, your CyberSource account is updated so that you can
send transactions to the CyberSource production server. If you have not already done so,
you must provide your banking information to CyberSource so that your processor can
deposit funds to your merchant bank account.
After CyberSource confirms that your account is live, make sure that you update your
system so that it can send requests to the production server (ics2wsa.ic3.com or
ics2ws.in.ic3.com in India) using your security key for the production environment.
The test server (ics2wstesta.ic3.com) cannot be used for real transactions. For more
information about sending transactions to the production server, see the description of the
configuration setting "cybs. sendToProduction," page 71.
Alternately, if a new client is available that works with the later API version, you can
download that new client.
The new client may have new functionality unrelated to the changes in the API.
Read the release notes in the CHANGES file to determine if the new client
contains new functionality that you want to use.
Step 4 Update the Address field with the New WSDL URL. Typically, only the version number at
the end of the URL needs to be updated.
SOAP Client
Step 4 Update the Address field with the New WSDL URL. Typically, only the version number at
the end of the URL needs to be updated.
Step 6 Save a copy of the original CyberSource.Clients.dll and then replace it with the
newly built CyberSource.Clients.dll.
XML Client
Updating the client is unnecessary. Start using the new namespace URI in your input XML
documents. The client automatically uses the specified version.
The instructions in this section explain how to write C# programs that request
CyberSource services. For a list of API fields to use in your requests, see "Related
Documents," page 14.
The example developed in the following sections shows basic code for requesting
CyberSource services. In this example, Jane Smith is buying an item for 29.95.
using CyberSource.Clients;
using System;
using System.Collections;
using System.Net;
using System.Security.Cryptography;
using System.ServiceModel;
using System.ServiceMode1.Security;
This value overrides any value you set with the merchantID configuration setting (see
Table 17, "Fields in the Settings File"). The merchant ID is case sensitive.
Requesting a Sale
You can request multiple services by adding additional fields to the request. For example,
if you fulfill the order immediately, you can request a credit card authorization and capture
together (also referred to as a “sale”):
The previous example shows only a partial list of the fields you must send. Refer to
"Requesting CyberSource Services," page 76, for information about the guides that list all
of the fields for the services that you are requesting.
try {
Hashtable reply = NVPClient.RunTransaction( request );
SaveOrderState();
// "Using the Decision and Reason Code," page 81 describes the ProcessReply
// method.
ProcessReply( reply );
} catch (CryptographicException ce) {
SaveOrderState();
Console.WriteLine( ce.ToString() );
} catch (WebException we) {
SaveOrderState();
/*
* Some types of WebException indicate that the transaction may have been
* completed by CyberSource. The sample code shows how to identify these
* exceptions. If you receive such an exception, and your request included a
* payment service, you should use the CyberSource transaction search screens to
* determine whether the transaction was processed.
*/
Console.WriteLine( we.ToString() );
}private static void SaveOrderState() {
/*
* This is where you store the order state in your system for post-transaction
* analysis. Be sure to store the consumer information, the values of the reply
* fields, and the details of any exceptions that occurred.
*/
}
In the preceding example, when an exception occurs, the exception is printed to the
console. Your web store should also display a message to the consumer indicating that
you were unable to process the order. The sample code for the name-value pair client
shows you how to provide feedback to the consumer.
Also, if the transaction fails, and the request did not include any payment services, you
may be able to resend the transaction. The sample code for the name-value pair client
shows you how to do this.
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to consumers. Instead, present
an appropriate response that tells consumers the result.
Because CyberSource may add reply fields and reason codes at any time, you
should parse the reply data according to the names of the fields instead of their
order in the reply.
decision: A one-word description of the results of your request. The decision is one of
the following:
ACCEPT if the request succeeded
REJECT if one or more of the services in the request was declined
REVIEW if you use CyberSource Decision Manager and it flags the order for
review. See "For CyberSource Advanced Merchants: Handling Decision Manager
Reviews," page 83, for more information.
ERROR if there was a system error. See "Retrying When System Errors Occur,"
page 85, for important information about handling retries in the case of system
errors.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
CyberSource reserves the right to add new reason codes at any time. If your
error handler receives a reason code that it does not recognize, it should use
the decision to interpret the reply.
// This example writes the message to the console. Choose an appropriate display
// method for your own application.
Console.WriteLine( template, content );
}
if ("ACCEPT".Equals( decision )) {
return( "The order succeeded.{0}" );
}
if ("REJECT".Equals( decision )) {
return( "Your order was not approved.{0}" );
}
case 101:
return( "\nThe following required fields are missing: " +
EnumerateValues( reply, "missingField" ) );
// Insufficient funds
case 204:
return( "\nInsufficient funds in the account. Please use a " +
"different card or select another form of payment." );
// Add additional reason codes here that you must handle more specifically.
default:
// For all other reason codes, such as unrecognized reason codes, or codes
// that do not require special handling, return an empty string.
return( String.Empty );
}
}
private static string EnumerateValues( Hashtable reply,
string fieldName ) {
System.Text.StringBuilder sb = new System.Text.StringBuilder();
string val = "";
for (int i = 0; val != null; ++i) {
val = (string) reply[fieldName + "_" + i];
if (val != null) {
sb.Append( val + "\n" );
}
}
return( sb.ToString() );
}
If you use CyberSource Decision Manager, you may also receive the REVIEW value in the
decision field. REVIEW means that Decision Manager has marked the order for review
based on how you configured the Decision Manager rules.
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
For example, in the case of a sale (a credit card authorization and a capture requested
together), if the authorization service fails, CyberSource will not process the capture
service. The reply you receive only includes reply fields for the authorization.
Many CyberSource services include “ignore” fields that tell CyberSource to ignore the
result from the first service when deciding whether to run the subsequent services. In the
case of the sale, even though the issuing bank gives you an authorization code,
CyberSource might decline the authorization based on the AVS or card verification results.
Depending on your business needs, you might choose to capture these types of declined
authorizations anyway. You can set the businessRules_ignoreAVSResult field to
"true" in your combined authorization and capture request:
This tells CyberSource to continue processing the capture even if the AVS result causes
CyberSource to decline the authorization. In this case you would then get reply fields for
both the authorization and the capture in your reply.
You are charged only for the services that CyberSource performs.
Instead, CyberSource recommends that you retry sending the request only two or three
times with successively longer periods of time between each retry. For example, after the
first system error response, wait 30 seconds and then retry sending the request. If you
receive the same error a second time, wait one minute before you send the request again.
Depending on the situation, you may decide you can retry sending the request after a
longer time period. Determine what is most appropriate for your business situation.
If after several retry attempts you are still receiving a system error, it is possible that the
error is actually being caused by a processor rejection and not a CyberSource system
error. In that case, CyberSource suggest that you either:
Search for the transaction in the Business Center (depending on which one you
normally use), look at the description of the error on the Transaction Detail page, and
call your processor to determine if and why they are rejecting the transaction.
Contact CyberSource Customer Support to confirm whether your error is truly caused
by a CyberSource system issue.
If TSYS Acquiring Solutions is your processor, you may want to follow the first suggestion
as there are several common TSYS Acquiring Solutions processor responses that are
returned to you as system errors and that only TSYS Acquiring Solutions can address.
See Table 17, "Fields in the Settings File," for a complete list of settings.
You can use the settings files that come with the sample applications as a starting point for
your own settings file. See "Configuring the Test Applications," page 70, for more
information.
Using XML
This section explains how to request CyberSource services by using XML.
The instructions in this section explain how to write C# programs that request
CyberSource services. For a list of API fields to use in your requests, see "Related
Documents," page 14.
The request document must validate against the XML schema for CyberSource
transactions. To view the schema, go to: https://ics2wsa.ic3.com/commerce/1.x/
transactionProcessor and look at the xsd file for the version of the Simple Order API you
are using.
For transactions in India, go to:
https://ics2ws.in.ic3.com/commerce/1.x/transactionProcessor
Make sure that the elements in your document appear in the correct order. If
they do not, your document will not validate, and your request will fail.
The example that is developed in the following sections shows a basic XML document for
requesting CyberSource services. In this example, Jane Smith is buying an item for 29.95.
The XML document in this example is incomplete. For complete examples, see
sample.xml in the client’s samples\bin directory.
Make sure that the API version specified at the end of the namespace is correct. For
example, to communicate with version 1.19, you must use the namespace
urn:schemas-cybersource-com:transaction-data-1.19. When you must
update the API version, see "Updating the Client to Use a Later API Version," page 75.
The XML document that you receive in the reply always has the prefix c:, for
example: xmlns:c="urn:schemas-cybersource-com:transaction-
data-1.17". Make sure you use an XML parser that supports namespaces.
This value overrides any value that you set with the merchantID configuration setting. For
more information about the merchantID configuration setting, see Table 17, "Fields in the
Settings File," on page 70. The merchant ID is case sensitive.
Requesting a Sale
You can request multiple services by creating additional elements. For example, if you
fulfill the order immediately, you can request a credit card authorization and capture
together (referred to as a “sale”):
The example above shows only a partial list of the fields you must send. Refer to "Related
Documents," page 14, for information about the guides that list all of the fields for the
services that you are requesting.
using CyberSource.Clients;
using System;
using System.Net;
using System.Xml;
using System.Security.Cryptography
try {
XmlDocument request = new XmlDocument();
request.Load( "MyXmlDocument.xml" );
In the preceding example, when an exception occurs, the exception is printed to the
console. Your web store should also display a message to the consumer indicating that
you were unable to process the order. The sample code for the XML client shows you how
to provide feedback to the consumer.
Also, if the transaction fails, and the request did not include any payment services, you
may be able to resend the transaction. The sample code for the XML client shows you
how to do this.
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to consumers. Instead, present
an appropriate response that tells consumers the result.
Because CyberSource may add reply fields and reason codes at any time, you
should parse the reply data according to the names of the fields instead of their
order in the reply.
decision: A one-word description of the results of your request. The decision is one of
the following:
ACCEPT if the request succeeded
REJECT if one or more of the services in the request was declined
REVIEW if you use CyberSource Decision Manager and it flags the order for
review. See "For CyberSource Advanced Merchants: Handling Decision Manager
Reviews," page 95, for more information.
ERROR if there was a system error. See "Retrying When System Errors Occur,"
page 97, for important information about handling retries in the case of system
errors.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
CyberSource reserves the right to add new reason codes at any time. If your
error handler receives a reason code that it does not recognize, it should use
the decision to interpret the reply.
XmlNode replyMessage
= reply.SelectSingleNode( "cybs:replyMessage", nsmgr);
// This example writes the message to the console. Choose an appropriate display
// method for your own application.
Console.WriteLine( template, content );
}
private static string GetTemplate( string decision ) {
// Retrieves the text that corresponds to the decision.
if ("ACCEPT".Equals( decision )) {
return( "The order succeeded.{0}" );
}
}
if ("REJECT".Equals( decision )) {
return( "Your order was not approved.{0}" );
}
// Add additional reason codes here that you must handle more specifically.
default:
// For all other reason codes (for example, unrecognized reason codes, or
// codes that do not require special handling), return an empty string.
return( String.Empty );
}
}
private static string EnumerateValues( XmlNodeList nodes ) {
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (XmlNode node in nodes) {
sb.Append( val + "\n" );
}
return( sb.ToString() );
}
If you use CyberSource Decision Manager, you may also receive the REVIEW value in the
decision field. REVIEW means that Decision Manager has marked the order for review
based on how you configured the Decision Manager rules.
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
For example, in the case of a sale (a credit card authorization and a capture requested
together), if the authorization service fails, CyberSource will not process the capture
service. The reply you receive only includes reply fields for the authorization.
Many CyberSource services include “ignore” fields that tell CyberSource to ignore the
result from the first service when deciding whether to run the subsequent services. In the
case of the sale, even though the issuing bank gives you an authorization code,
CyberSource might decline the authorization based on the AVS or card verification results.
Depending on your business needs, you might choose to capture these types of declined
authorizations anyway. You can set the businessRules_ignoreAVSResult field to
"true" in your combined authorization and capture request:
<businessRules>
<ignoreAVSResult>true</ignoreAVSResult>
</businessRules>
This tells CyberSource to continue processing the capture even if the AVS result causes
CyberSource to decline the authorization. In this case you would then get reply fields for
both the authorization and the capture in your reply.
You are charged only for the services that CyberSource performs.
Instead, CyberSource recommends that you retry sending the request only two or three
times with successively longer periods of time between each retry. For example, after the
first system error response, wait 30 seconds and then retry sending the request. If you
receive the same error a second time, wait one minute before you send the request again.
Depending on the situation, you may decide you can retry sending the request after a
longer time period. Determine what is most appropriate for your business situation.
If after several retry attempts you are still receiving a system error, it is possible that the
error is actually being caused by a processor rejection and not a CyberSource system
error. In that case, we suggest that you either:
Search for the transaction in the Business Center (depending on which one you
normally use), look at the description of the error on the Transaction Detail page, and
call your processor to determine if and why they are rejecting the transaction.
Contact CyberSource Customer Support to confirm whether your error is truly caused
by a CyberSource system issue.
If TSYS Acquiring Solutions is your processor, you may want to follow the first suggestion
as there are several common TSYS Acquiring Solutions processor responses that are
returned to you as system errors and that only TSYS Acquiring Solutions can address.
See Table 17, "Fields in the Settings File," for a complete list of settings.
You can use the settings files that come with the sample applications as a starting point for
your own settings file. See "Configuring the Test Applications," page 70, for more
information.
Using SOAP
This section explains how to request CyberSource services by using the Simple Object
Access Protocol (SOAP).
The instructions in this section explain how to write C# programs that request
CyberSource services. For a list of API fields to use in your requests, see "Related
Documents," page 14.
The example that is developed in the following sections shows basic code for requesting
CyberSource services. In this example, Jane Smith is buying an item for 29.95.
using System;
using System.Net;
using System.Security.Cryptography;
using System.ServiceModel;
using System.ServiceModel.Security;
using CyberSource.Clients;
using CyberSource.Clients.SoapWebReference;
request.merchantID = "infodev";
This value overrides any value you set with the merchantID configuration setting (see
Table 17, "Fields in the Settings File," on page 70). The merchant ID is case sensitive.
Requesting a Sale
You can request multiple services by creating additional objects. For example, if you fulfill
the order immediately, you can request a credit card authorization and capture together
(referred to as a “sale”):
The example above shows only a partial list of the fields you must send. Refer to "Related
Documents," page 14, for information about the guides that list all of the fields for the
services that you are requesting.
try {
ReplyMessage reply = SoapClient.RunTransaction( request );
SaveOrderState();
// "Using the Decision and Reason Code," page 81 describes the ProcessReply
// method.
ProcessReply( reply );
} catch (CryptographicException ce) {
SaveOrderState();
Console.WriteLine( ce.ToString() );
Console.WriteLine( sbe.ToString() );
} catch (WebException we) {
SaveOrderState();
/*
* Some types of WebException indicate that the transaction may have been
* completed by CyberSource. The sample code shows how to identify these exceptions.
* If you receive such an exception, and your request included a payment service,
* you should use the CyberSource transaction search screens to determine whether
* the transaction was processed.
*/
Console.WriteLine( we.ToString() );
}
private static void SaveOrderState() {
/*
* This is where you store the order state in your system for post-transaction
* analysis. Be sure to store the consumer information, the values of the reply
* fields, and the details of any exceptions that occurred.
*/
}
In the preceding example, when an exception occurs, the exception is printed to the
console. Your web store should also display a message to the consumer indicating that
you were unable to process the order. The sample code for the SOAP client shows you
how to provide feedback to the consumer.
Also, if the transaction fails, and the request did not include any payment services, you
may be able to resend the transaction. The sample code for the SOAP client shows you
how to do this.
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to consumers. Instead, present
an appropriate response that tells consumers the result.
Because CyberSource may add reply fields and reason codes at any time, you
should parse the reply data according to the names of the fields instead of their
order in the reply.
decision: A one-word description of the results of your request. The decision is one of
the following:
ACCEPT if the request succeeded
REJECT if one or more of the services in the request was declined
REVIEW if you use CyberSource Decision Manager and it flags the order for
review. See "For CyberSource Advanced Merchants: Handling Decision Manager
Reviews," page 105, for more information.
ERROR if there was a system error. See "Retrying When System Errors Occur,"
page 107, for important information about handling retries in the case of system
errors.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
CyberSource reserves the right to add new reason codes at any time. If your
error handler receives a reason code that it does not recognize, it should use
the decision to interpret the reply.
// This example writes the message to the console. Choose an appropriate display
// method for your own application.
Console.WriteLine( template, content );
}
case 102:
return( "\nThe following fields are invalid: " +
EnumerateValues( reply.invalidField ) );
// Insufficient funds
case 204:
return( "\nInsufficient funds in the account. Please use a " +
"different card or select another form of payment." );
// Add additional reason codes here that you must handle more specifically.
default:
// For all other reason codes, such as unrecognized reason codes or codes
// that do not require special handling, return an empty string.
return( String.Empty );
}
}
private static string EnumerateValues( string[] array ) {
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (string val in array) {
sb.Append( val + "\n" );
}
return( sb.ToString() );
}
If you use CyberSource Decision Manager, you may also receive the REVIEW value in the
decision field. REVIEW means that Decision Manager has marked the order for review
based on how you configured the Decision Manager rules.
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
For example, in the case of a sale (a credit card authorization and a capture requested
together), if the authorization service fails, CyberSource will not process the capture
service. The reply you receive only includes reply fields for the authorization.
Many CyberSource services include “ignore” fields that tell CyberSource to ignore the
result from the first service when deciding whether to run the subsequent services. In the
case of the sale, even though the issuing bank gives you an authorization code,
CyberSource might decline the authorization based on the AVS or card verification results.
Depending on your business needs, you might choose to capture these types of declined
authorizations anyway. You can set the businessRules_ignoreAVSResult field to
"true" in your combined authorization and capture request:
businessRules.ignoreAVSResult = "true";
request.businessRules = businessRules;
This tells CyberSource to continue processing the capture even if the AVS result causes
CyberSource to decline the authorization. In this case you would then get reply fields for
both the authorization and the capture in your reply.
You are charged only for the services that CyberSource performs.
Instead, CyberSource recommends that you retry sending the request only two or three
times with successively longer periods of time between each retry. For example, after the
first system error response, wait 30 seconds and then retry sending the request. If you
receive the same error a second time, wait one minute before you send the request again.
Depending on the situation, you may decide you can retry sending the request after a
longer time period. Determine what is most appropriate for your business situation.
If after several retry attempts you are still receiving a system error, the error may actually
be caused by a processor rejection, not a CyberSource system error. In that case, we
suggest one of these actions:
Search for the transaction in the Business Center (depending on which one you
normally use), look at the description of the error on the Transaction Detail page, and
call your processor to determine if and why the transaction was rejected.
Contact CyberSource Customer Support to confirm whether your error is truly caused
by a CyberSource system issue.
If TSYS Acquiring Solutions is your processor, you may want to follow the first suggestion
because several common TSYS Acquiring Solutions processor responses can be
returned as system errors, and only TSYS Acquiring Solutions can address these errors.
See Table 17, "Fields in the Settings File," for a complete list of settings. You can use the
settings files that come with the sample applications as a starting point for your own
settings file. See "Configuring the Test Applications," page 70, for more information.
By default, you can create only two simultaneous connections to an HTTP server. By
increasing the number of connections, you can avoid a backlog of requests during times of
very high transaction volume. Microsoft recommends for the connection limit a value that
is 12 times the number of CPUs. For example, if you have two CPUs, you can set the
connection limit to 24. To determine the optimum setting for your application, make sure to
run performance tests.
Examples
You can increase the number of connections in many ways, for example by using an
application- or server-specific configuration file where you can change the setting for a
single or for all hosts. The examples below describe briefly some of the methods that you
can use to increase connection limits.
cybs.connectionLimit
When set to a value other than -1, the cybs.connectionLimit setting in the client
increases the limit for the host where you are sending the request by executing these
statements on your behalf:
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
sp.ConnectionLimit = config.ConnectionLimit;
<connectionManagement>
You can set the connection limit by using .NET's <connectionManagement> tag. In this
example, the connection limit for CyberSource's test and production hosts is 12 while the
limit for all other hosts is 2:
<system.net>
<connectionManagement>
<add address = "https://ics2wstesta.ic3.com" maxconnection = "12" />
<add address = "https://ics2wsa.ic3.com" maxconnection = "12" />
<add address = "*" maxconnection = "2" />
</connectionManagement>
</system.net>
DefaultConnectionLimit
You can set the connection limit for all hosts to which your application is connected before
a connection is made by using the following line in your start-up code:
ServicePointManager.DefaultConnectionLimit = your_value_here;
References
For more information on these and other methods to increase the connection limits, see
the following Microsoft documentation:
Listing 1: web.config
<?xml version="1.0"?>
<configuration>
<appSettings>
<!-- Please refer to the Connection Limit section in the README for -->
<!-- details on this setting and alternate ways to set the -->
<!-- connection limit. When not specified or is set to -1, the -->
<!-- client will implicitly use the connection limit currently in -->
<!-- force, which would be 2 if none of the alternate methods are -->
<!-- used. -->
<add key="cybs.connectionLimit" value="-1"/>
</appSettings>
</configuration>
Listing 2: Checkout.aspx
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Name Value Pair - Order Page</title>
</head>
<body>
<form action="Checkout2.aspx" method="post">
Please confirm the information below and click the Submit button to perform the
authorization.
<br/>
<h3>Billing Information</h3>
First Name:<br/>
<input type="text" name="billTo_firstName" value="John"/>
<br/>Last Name:<br/>
<input type="text" name="billTo_lastname" value="Doe"/>
<br/>Street Address:<br/>
<input type="text" name="billTo_street1" value="1295 Charleston Road"/>
<br/>City:<br/>
<input type="text" name="billTo_city" value="Mountain View"/>
<br/>State:<br/>
<input type="text" name="billTo_state" value="CA"/>
<br/>Postal Code:<br/>
<input type="text" name="billTo_postalCode" value="94043"/>
<br/>Country:<br/>
<input type="text" name="billTo_country" value="US"/>
<br/>
<h3>Credit Card Information</h3>
Amount:<br/>
<input type="text" name="item_0_unitPrice" value="10.00"/>
<br/>Credit Card Number:<br/>
<input type="text" name="card_accountNumber" value="4111111111111111"/>
<br/>Expiration month (mm):<br/>
<input type="text" name="card_expirationMonth" value="12"/>
<br/>Expiration year (yyyy):<br/>
<input type="text" name="card_expirationYear" value="2010"/>
<br/>Email Address:<br/>
<input type="text" name="billTo_email" value="nobody@cybersource.com"/>
<br/><input type="submit" value="Submit"/>
</form>
</body>
</html>
Listing 3: Checkout.aspx.vb
Listing 4: Checkout2.aspx
</div>
</form>
</body>
</html>
Listing 5: Checkout2.aspx.vb
Imports CyberSource.Clients.NVPClient
End Class
The Java client for the Simple Order API is supported on 64-bit operating systems.
If you are building an application to sell to others, see Appendix A, "Using the Client
Application Fields," on page 192. This appendix has a list of API fields you can use
in your request that describe the application, its version, and its user. If you use
these fields in your request, you can view their values in the Transaction Search
Details window of the Business Center.
API Variations
Choose either of these options of the Simple Order API:
Name-value pairs: simpler to use. The test that you run immediately after installing the
client uses name-value pairs.
To introduce new API fields and features, CyberSource regularly updates the Simple
Order API. You can update your existing client to work with the new API version. For the
latest version of the server-side API for the CyberSource services, go to https://
ics2wsa.ic3.com/commerce/1.x/transactionProcessor. For transactions in India, go to
https://ics2ws.in.ic3.com/commerce/1.x/transactionProcessor. When configuring the
client, indicate the version of the API (not the current version of the client) you want to use
in the targetAPIVersion configuration property. For example, to use the 1.18 version of the
API, set the property to 1.18. For more information, see "targetAPIVersion,"
page 121.
Client Versions
The client version is the version of the client-side code that you use to access the
CyberSource services. This version is different from the API version.
A direct upgrade path from the 1.5.0 version of the Web Services Client for Java to the
most recent version of the client is not available because the client was redesigned
starting with the 2.0.0 release.
Sample Code
The client package contains two samples that you can use to test the client:
package com.cybersource.sample;
import java.util.*;
import com.cybersource.ws.client.*;
{
Properties props = Utility.readProperties( args );
HashMap request = new HashMap();
{
HashMap reply = Client.runTransaction( request, props );
}
catch (ClientException e) {
if (e.isCritical())
{
handleCriticalException( e, request );
}
}
catch (FaultException e) {
if (e.isCritical())
{
handleCriticalException( e, request );
}
}
}
}
The minimum Java SDK supported are Oracle or IBM Java SDK 1.6 or later.
Depending on the package that you choose, you also need one of these:
For Oracle Java SDK versions earlier than 1.4.0, you need the Java Secure
Socket Extension (JSSE) 1.0.3_02 or later (see http://java.sun.com/products/
jsse).
For IBM Java SDK, you need IBMJSEE 1.0.2 or later.
Maven 3 or later.
You must generate two transaction security keys—one for the CyberSource
production environment and one for the test environment. For information
about generating and using security keys, see Creating and Using Security
Keys (PDF | HTML).
You must protect your security key to ensure that your CyberSource account is
not compromised.
Maven
CyberSource recommends using the Maven Package Manager to install the Java SDK.
<dependency>
<groupId>com.cybersource</groupId>
<artifactId>cybersource-sdk-java</artifactId>
<version>6.0.1</version>
</dependency>
Gradle
Add the dependency to your build.gradle.
dependencies {
compile 'com.cybersource:cybersource-sdk-java:6.0.1'
}
Step 1 Download the latest jar file. The current version is cybersource-sdk-java-6.0.1.jar.
The client also includes additional property configuration capabilities. For example, you
can configure for multiple merchants or configure using system properties. For more
information, see "Advanced Configuration Information," page 143.
For Java SDK 1.4.x, the client sets the system properties https.proxyHost
and https.proxyPort to the values of the client properties proxyHost and
proxyPort. If these system properties are defined beforehand, possibly by
using the -D option in the command line, the system properties will take
precedence.
Property Description
merchantID This client uses this value if you do not specify a merchant ID in the request itself.
This value is case sensitive.
keysDirectory Location of the merchant’s security keys. Although UNC paths are allowed, for faster
request processing, CyberSource recommends that you store your key locally. You
must use forward slashes even in a Windows environment (for example: c:/
keys). The client includes a keys directory that you can use.
Property Description
sendToProduction Flag that indicates whether the transactions for this merchant should be sent to the
production server. Use one of these values:
false: Send to the test server. (default setting)
true: Send to the production server
targetAPIVersion Version of the Simple Order API to use, such as 1.18. For the list of available
versions, go to https://ics2wsa.ic3.com/commerce/1.x/transactionProcessor. For
transactions in India, go to https://ics2ws.in.ic3.com/commerce/1.x/
transactionProcessor. Changes in each version are described in the Simple Order
API Release Notes. Do not set this property to the current version of the client. See
"Client Versions," page 115, for more information.
keyFilename Name of the security key file name in the format <security_key_name>.p12.
serverURL Alternative server URL to use. For more information, see "Using Alternate Server
Properties," page 143. Give the complete URL because it will be used exactly as
specified here.
namespaceURI Alternative namespace URI to use. Give the complete namespace URI because it
will be used exactly as specified here. For more information, see "Using Alternate
Server Properties," page 143.
enableLog Flag directing the client to log transactions and errors. Use one of these values:
false: Do not enable logging (default setting)
true: Enable logging
Important Logging can cause very large log files to accumulate. Therefore,
CyberSource recommends that you use logging only when troubleshooting
problems. To comply with all Payment Card Industry (PCI) and Payment Application
(PA) Data Security Standards regarding the storage of credit card and card
verification number data, the logs that are generated contain only masked credit card
and card verification number data (CVV, CVC2, CVV2, CID, CVN).
Follow these guidelines:
Use debugging temporarily for diagnostic purposes only.
If possible, use debugging only with test credit card numbers.
Never store clear text card verification numbers.
Delete the log files as soon as you no longer need them.
Never send email to CyberSource containing personal and account information,
such as customers' names, addresses, card or check account numbers, and card
verification numbers.
For more information about PCI and PABP requirements, see www.visa.com/cisp.
logDirectory Directory to which to write the log file. UNC paths are allowed. You must use forward
slashes even in a Windows environment, for example: c:/logs. The client does
not create this directory; instead you must specify an existing directory. The client
includes a logs directory that you can use.
logFilename Log file name. The client uses cybs.log by default.
Property Description
logMaximumSize Maximum size in megabytes for the log file. The default value is "10". When the log
file reaches the specified size, it is archived into
cybs.log.<yyyymmddThhmmssxxx> and a new log file is started. The xxx
indicates milliseconds.
timeout Important Ignore this property. Instead set a specific amount of time that is
acceptable to your business.
Number of seconds to wait for reply before timing out. Default value is 130. This
property does not have an effect if useHttpClient is false and you are using
cybsclients14.jar.
useHttpClient Flag directing the client to use Apache HttpClient for the HTTPS communication.
Use one of these values:
false: (default setting) Do not use Apache HttpClient. Use built-in
HttpURLConnection. The timeout property does not have an effect if
useHttpClient is false and you are using cybsclients14.jar.
true: Use Apache HttpClient.
When useHttpClient is true, your CLASSPATH must include the three commons-
*.jar files shipped with the package.
proxyHost Optional host name or IP address of the HTTP proxy server.
proxyPort Port number of the proxy server. The default is 8080. This property is ignored if you
do not specify proxyHost.
proxyUser User name used to authenticate against the proxy server if required.
Step 2 Run mvn exec:java from samples directory (<main directory>/samples/nvp or xml).
Going Live
When you finish configuring and testing the client, your deployment is ready to go live.
Make sure that your client is set to send transactions to the production server,
not the test server. See the description of "sendToProduction,"
page 121.
You must also configure your client so that it sends transactions to the
production server and not the test server. See the description of the
sendToProduction property in Table 18, "Configuration Properties".
After your deployment goes live, use real card numbers and other data to test every card
type you support. Because these are real transactions in which you are buying from
yourself, use small monetary amounts to do the tests. Process an authorization, then
capture the authorization, and later refund the money. Use your bank statements to verify
that money is deposited into and withdrawn from your merchant bank account as
expected. If you have more than one CyberSource merchant ID, test each one separately.
When your deployment goes live, your CyberSource account is updated so that you can
send transactions to the CyberSource production server. If you have not already done so,
you must provide your banking information to CyberSource so that your processor can
deposit funds to your merchant bank account.
After CyberSource confirms that your account is live, make sure that you update your
system so that it can send requests to the production server (ics2wsa.ic3.com or
ics2ws.in.ic3.com in India) using your security keys for the production environment.
The test server (ics2wstesta.ic3.com) cannot be used for real transactions. For more
information about sending transactions to the production server. see the description of the
configuration property "sendToProduction," page 121.
After your deployment goes live, use real card numbers and other data to test every card
type, currency, and CyberSource application that your integration supports. Because
these are real transactions in which you are buying from yourself, use small monetary
amounts to do the tests. Use your bank statements to verify that money is deposited into
and withdrawn from your merchant bank account as expected. If you have more than one
CyberSource merchant ID, test each one separately.
For the list of API fields that you must add to your requests and will see in the replies, use
the guide that describes the service. See "Related Documents," page 14.
The code in this section’s example is incomplete. For a complete sample program, see the
AuthCaptureSample.java file in <main directory>/samples/nvp/src/com/
cybersource/sample directory.
import java.util.*;
import com.cybersource.ws.client.*;
Depending on your application, you might need to add more import statements.
The sample reads the configuration settings from the properties file specified in the
command line. If you do not specify a file, the sample looks for the file
cybs.properties in the current directory.
You can request multiple services by adding additional fields to the request. When you
request multiple services in one request, CyberSource processes the services in a
specific order. If a service fails, CyberSource does not process the subsequent services in
the request. You are charged only for the services that CyberSource performs.
For example, if you fulfill the order immediately, you can request a credit card
authorization and capture together, called a sale. If the authorization service fails,
CyberSource does not process the capture service. The reply you receive includes reply
fields only for the authorization:
Many CyberSource services include fields that tell CyberSource to ignore the result from
the first service when deciding whether to run the subsequent services. In the case of the
sale, even though the issuing bank gives you an authorization code, CyberSource may
decline the authorization based on the AVS or card verification results. Depending on your
business needs, you might choose to capture these declined authorizations. To do so, in
your combined authorization and capture request, set the businessRules_
ignoreAVSResult field to true:
This line tells CyberSource to process the capture even if the AVS result causes
CyberSource to decline the authorization. In this case, the reply would contain fields for
the authorization and the capture.
The example above shows only a partial list of the fields you must send. The developer
guides for the service you are using contains a complete list of API request and reply fields
available for that service.
try {
HashMap reply = Client.runTransaction( request, props );
//"Using the Decision and Reason Code Fields," page 129 illustrates how you
//might design a ProcessReply() method to handle the reply.
processReply( reply );
}
catch (FaultException e)
{
System.out.println( e.getLogString() );
}
catch (ClientException e)
{
System.out.println( e.getLogString() );
}
In the example above, when an exception occurs, the exception is printed to the console.
Your web store should also display to the customer a message indicating that you were
unable to process the order. "Using the Decision and Reason Code Fields," page 129,
shows how to provide feedback to the customer.
Interpreting Replies
After your request is processed by the CyberSource server, it sends a reply message that
contains information about the services you requested. You receive fields relevant to the
services that you requested and to the outcome of each service.
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to customers. Instead, present an
appropriate response that tells customers the result.
CyberSource may add reply fields and reason codes at any time. If your error
handler receives a reason code that it does not recognize, it should use the
decision to interpret the reply. Parse the reply data according to the names of
the fields instead of their order in the reply.
decision: A one-word description of the results of your request. The possible values
are as follows:
ACCEPT if the request succeeded.
REJECT if one or more of the services in the request was declined.
REVIEW (Advanced package only) if you use Decision Manager, and the order is
marked for review. For more information, see "Handling Decision Manager
Reviews (CyberSource Advanced Services Only)," page 131.
ERROR if a system error occurred. For more information, see "Handling System
Errors," page 131.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants
// ERROR
return( "Your order cannot be completed at this time.{0}" +
"\nPlease try again later." );
}
private static String getContent( HashMap reply )
throws ClientException {
/*
* Uses the reason code to retrieve more details to add to the template.
* The strings returned in this sample are meant to demonstrate how to retrieve
* the reply fields. Your application should display user-friendly messages.
*/
int reasonCode =
Integer.parseInt( (String) reply.get( "reasonCode" ) );
switch (reasonCode) {
// Success
case 100:
return( "\nRequest ID: " + (String) reply.get( "requestID" );
// Missing field or fields
case 101:
return( "\nThe following required field(s) are missing:\n" +
enumerateValues( reply, "missingField" ) );
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
You must design your transaction management system to correctly handle CyberSource
system errors, which occur when you successfully receive a reply, but the decision field is
ERROR. For more information about the decision, see "Interpreting Replies," page 128.
The error may indicate a valid CyberSource system error or a payment processor rejection
because of invalid data.
Offline Transactions
CyberSource recommends that you resend the request two or three times only, waiting a
longer period of time between each attempt. Determine what is most appropriate for your
business situation.
After the first system error response, wait a short period of time, perhaps 30 seconds,
before resending the request. If you receive the same error a second time, wait a longer
period of time, perhaps 1 minute, before resending the request. If you receive the same
error a third time, you may decide to try again after a longer period of time, perhaps 2
minutes.
If you are still receiving a system error after several attempts, the error may be caused by
a processor rejection instead of a CyberSource system error. In this case, CyberSource
recommends one of these options:
Find the transaction in the Business Center. After looking at the description of the
error on the transaction details page, call your processor to determine if and why the
transaction was rejected. If your processor is TSYS Acquiring Solutions, you may
want to follow this option because this processor can return several system errors that
only it can address.
Online Transactions
For online transactions, inform the customer that an error occurred and request that the
customer attempts to resubmit the order.
Using XML
This section explains how to write Java programs that request CyberSource services by
using XML.
For the list of API fields that you must add to your requests and will see in the replies, use
the guide that describes the service. See "Related Documents," page 14.
The code in this section’s example is incomplete. For a complete sample program, see the
AuthSample.java file in the <main directory>/samples/xml/src/com/
cybersource/sample directory.
If you make changes to the AuthSample.java sample, you must rebuild the
sample before using it by using the compileSample batch file or shell script
provided in the xmlsample directory.
Creating Requests
The client enables you to create an XML request document by using any application and
sending the request to CyberSource. For example, if you have a customer relationship
management (CRM) application that uses XML to communicate with other applications,
you can use your CRM to generate request documents.
You must validate the request document against the XML schema for CyberSource
transactions. To view the schema, look at the xsd file for your version of the Simple Order
API.
If the elements in your document do not appear in the correct order, your
document will not be validated, and your request will fail.
The example that is developed in the following sections shows a basic XML document for
requesting a credit card authorization. In this example, Jane Smith is buying an item for
29.95. The XML document in this example is incomplete. For a complete example, see the
auth.xml file in the samples/xml directory.
When you construct a request, indicate the namespace for the elements. The namespace
must use the same API version that you specify in the configuration settings.
Namespace: urn:schemas-cybersource-com:transaction-data-
1.18
You can request multiple services by creating additional elements. When you request
multiple services in one request, CyberSource processes the services in a specific order.
If a service fails, CyberSource does not process the subsequent services in the request.
You are charged only for the services that CyberSource performs.
If you fulfill orders immediately, you can request a credit card authorization and capture
together, called a sale. If the authorization service fails, CyberSource does not process the
capture service. The reply that you receive contains only authorization reply fields:
Many CyberSource services use fields that tell CyberSource to ignore the result from the
first service when deciding whether to run the subsequent services. In the case of the
sale, even though the issuing bank gives you an authorization code, CyberSource may
decline the authorization based on the address or card verification results. Depending on
your business needs, you might choose to capture these declined authorizations. To do
so, in your combined authorization and capture request, you must set the
businessRules_ignoreAVSResult field to true:
<businessRules>
<ignoreAVSResult>true</ignoreAVSResult>
</businessRules>
These lines tell CyberSource to process the capture even if the address verification result
causes CyberSource to decline the authorization. In this case, the reply would contain
fields for the authorization and the capture.
Sending Requests
Once you have created an XML request document, you can use Java to send the request
to CyberSource.
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import com.cybersource.ws.client.*;
Depending on your application, you might need to add more import statements.
The sample reads the configuration settings from the properties file specified in the
command line. If you do not specify a file, the sample looks for the file
cybs.properties in the current directory.
try {
Document request = readRequest( props, args );
// The sample reads the files specified in the command line, or if no files are
// specified, the sample looks for cybs.properties and auth.xml in the current
// directory.
Document reply = XMLClient.runTransaction( request, props );
// "Using the Decision and Reason Code Fields," page 129 illustrates how you might
// design a ProcessReply() method to handle the reply.
processReply( reply );
}
catch (FaultException e)
{
e.printStackTrace();
System.out.println( e.getLogString() );
}
catch (ClientException e)
{
e.getInnerException().printStackTrace();
System.out.println( e.getLogString() );
}
In the preceding example, when an exception occurs, the exception is printed to the
console. Your web store should also display a message to the customer indicating that
you were unable to process the order. "Using the Decision and Reason Code Fields,"
page 129, shows how to provide feedback to the customer.
Interpreting Replies
The XML document that you receive in the reply always uses a prefix of c:, for
example: xmlns:c="urn:schemas-cybersource-com:transaction-
data-1.18". Make sure you use an XML parser that supports namespaces.
After your request is processed by the CyberSource server, it sends a reply message that
contains information about the services you requested. You receive fields relevant to the
services that you requested and to the outcome of each service.
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to customers. Instead, present an
appropriate response that tells customers the result.
CyberSource may add reply fields and reason codes at any time. If your error
handler receives a reason code that it does not recognize, it should use the
decision to interpret the reply. Parse the reply data according to the names of
the fields instead of their order in the reply.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
if ("REJECT".equalsIgnoreCase( decision )) {
return( "Your order was not approved.{0}" );
}
// Insufficient funds
case 204:
return( "\nInsufficient funds in the account. Please use a " +
"different card or select another form of payment." );
// Add additional reason codes here that you must handle specifically.
default:
// For all other reason codes (for example, unrecognized reason codes, or
// codes that do not require special handling), return an empty string.
return( "" );
}
}
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
Offline Transactions
CyberSource recommends that you resend the request two or three times only, waiting a
longer period of time between each attempt. You should determine what is most
appropriate for your business situation.
Example After the first system error response, wait a short period of time,
perhaps 30 seconds, before resending the request. If you receive the
same error a second time, wait a longer period of time, perhaps 1
minute, before resending the request. If you receive the same error a
third time, you may decide to try again after a longer period of time,
perhaps 2 minutes.
If you are still receiving a system error after several attempts, the error may be caused by
a processor rejection instead of a CyberSource system error. In this case, CyberSource
recommends one of these options:
Find the transaction in the Business Center. After looking at the description of the
error on the transaction details page, call your processor to determine if and why the
transaction was rejected. If your processor is TSYS Acquiring Solutions, you may
want to follow this option because this processor can return several system errors that
only it can address.
Online Transactions
For online transactions, inform the customer that an error occurred and request that the
customer attempts to resubmit the order.
For example, these are the server URLs and namespace URI for accessing the
CyberSource services with the Simple Order API 1.18:
Namespace URI:
urn:schemas-cybersource-com:transaction-data-1.18.
If you view the above URLs in a web browser, a list of the supported API versions and the
associated schema files are displayed.
To specify the settings for a specific merchant, all the properties except merchantID can
be prefixed with "<merchantID>.". The merchant ID is case sensitive. To enable logging
only for merchant123, set the enableLog property to true for all requests that have
merchant123 as the merchant ID:
merchant123.enableLog=true
enableLog=false
To use System properties for merchant123, prefix each system property with cybs., for
example:
java -Dcybs.enableLog=false -Dcybs.merchant123.enableLog=true
myApplication
If you encounter the following exception message when testing the client, follow the
procedure for your SDK:
java.net.MalformedURLException: unknown protocol: https
Step 2 Extract the following files from the Oracle JSSE package:
jcert.jar
jnet.jar
jsse.jar
Step 3 Copy the jar files into your Java installation's jre/lib/ext directory.
Step 4 Open jre/lib/security/java.security and locate the following line with the
highest value for N:
security.provider.N=<some provider class name>
Step 1 Download the IBMJSSE from IBM’s web site or obtain it from your IBM development kit
CDs.
Step 4 Copy both jar files into your Java installation's jre/lib/ext directory.
Step 5 Open jre/lib/security/java.security and locate the following line with the
highest value for N:
security.provider.N=<some provider class name>
Step 1 At a command prompt, go to the main client directory where the entrust_ssl_ca.cer
file is located.
This chapter covers the Linux and Windows platforms and uses the Linux
convention of forward slashes when path names are listed.
The PHP client for the Simple Order API is supported on 32-bit operating systems
only.
If you are building an application to sell to others, see Appendix A, "Using the Client
Application Fields," on page 192. This appendix has a list of API fields you can use
in your request that describe the application, its version, and its user. If you use
these fields in your request, you can view their values in the Transaction Search
Details window of the Business Center.
To use the CyberSource Simple Order API client for PHP, you must register a PHP
extension in php.ini and modify the LD_LIBRARY_PATH (for Linux) or the system PATH
(for Windows) to include the lib directory of the CyberSource client. The CyberSource
binaries ensure that your transactions are secure while being sent to CyberSource. If you
use a hosted environment, you must check with your hosting provider (ISP) to make sure
that they support the addition of a PHP extension and editing of the path environment
variables.
If you cannot find any documentation related to your hosting provider's support of
extensions and new library locations, contact your hosting provider with this statement:
Because other merchants who use your hosting provider may also use CyberSource, your
hosting provider may have already installed the CyberSource PHP client. In that case, we
suggest that you verify with your hosting provider the version of the client they have
installed and registered. If the client you want to use is newer, ask them to replace the
libraries with the new ones.
If you have any questions regarding the above information or installation of the client,
please contact Customer Support. If you are a Business Center user, and you cannot
obtain the appropriate access from your ISP to install the client, consider using Secure
Acceptance instead of the PHP client. Secure Acceptance is available in two integration
types, both of which are available in the Business Center. See Secure Acceptance Hosted
Checkout Integration Guide and Secure Acceptance Checkout API Integration Guide.
API Variation
With this client package, you can use either of these variations of the Simple Order API:
Name-value pairs, which are simpler to use than XML
XML, which requires you to create and parse XML documents
The test that you run immediately after installing the client uses name-value pairs.
Client Versions
CyberSource regularly updates the Simple Order API to introduce new API fields and
functionality. To identify the latest version of the server-side API for the CyberSource
services, go to:
https://ics2wsa.ic3.com/commerce/1.x/transactionProcessor.
The Simple Order API Client for PHP also has a version, but it is not the same as the API
version. The client version represents the version of the client-side code that you use to
access the CyberSource services.
When configuring the client, you indicate the version of the API that you want to use.
When setting this parameter, do not use the current version of the client; use the current
version of the API.
Sample Code
The client contains sample scripts and sample PHP pages that you can use to test the
client.
// Send request
$reply = array();
$status = cybs_run_transaction( $config, $request, $reply );
// Handle the reply. See "Handling the Return Status," page 171.
Sample Scripts
The client contains two sample scripts, one for using name-value pairs and one for using
XML. See "Testing the Client," page 158, or see the README file for more information
about using the authCaptureSample.php script to test the client.
XML: We suggest that you examine the name-value pair sample code listed above
before implementing your code to process XML requests.
File Description
util.php Used by the other PHP pages in the directory.
checkout.php Displays the contents of the shopping basket and prompts for address
and payment information.
checkout2.php Authorizes the order and displays the result.
Step 1 If you have files in your web server’s root directory that have the same name as the files
listed in Table 19, "Files in sampleStore Directory," on page 150, back up those files.
You will be copying the sample store files into the root directory in the next step. For
Apache, the root directory is the one specified by DocumentRoot in httpd.conf.
Step 2 Copy all of the files in the <installation directory>/samples/store directory into
your web server’s root directory.
Step 3 Modify the cybs.ini file as appropriate. For more information, see "Configuring Client
Settings," page 156.
Use absolute paths for the directories in the cybs.ini file that you use with the
sample store, for example: keysDirectory=c:\keys.
If you encounter problems getting the sample PHP pages to work, you might
need to locate your cybs.ini file outside of the root directory.
Step 4 Open the checkout.php file in a text editor and locate the cybs_load_config()
function.
Step 5 Make sure that the parameter for the cybs.ini file passed to the function includes the
absolute path. For example, make sure the line reads:
$config = cybs_load_config( 'c:\cybs.ini' );
not this line:
$config = cybs_load_config( 'cybs.ini' );
For Linux
Linux kernel 2.2, LibC6 on an Intel processor (for RedHat users, this currently
corresponds to versions 7.1 and 7.2)
GNU GCC
For Windows
Windows XP, 2000, or newer
Failure to configure your client API host to a unique, public IP address will
cause inconsistent transaction results.
The client API request ID algorithm uses a combination of IP address and system time,
along with other values. In some architectures this combination might not yield unique
identifiers.
You must generate two transaction security keys—one for the CyberSource
production environment and one for the test environment. For information
about generating and using security keys, see Creating and Using Security
Keys (PDF | HTML).
The Simple Order API client for PHP package includes the ca-bundle.crt, a bundle of
certificate files. The client expects to find the ca-bundle.crt file in the same directory
as your security keys. If you move it elsewhere, use the sslCertFile configuration
parameter to specify the file location. For more information, see the description of the
parameter "sslCertFile," page 157.
You must protect your security key to ensure that your CyberSource account is
not compromised.
Step 2 Download the latest client package. You can save the file in any directory.
Step 4 Copy the phpN_cybersource.so file into the PHP extension directory, where the N is 4
if your PHP version is 4.x.x; 5 if your PHP version is 5.0.0-5.0.2; 503 if your PHP version is
5.0.3.; or 512 if your version is 5.1.0-5.1.2.
The extension directory is the one "extension_dir" is set to in the php.ini file. If you
do not already have "extension_dir" set to an explicit directory:
a Create an extension directory (outside of the client installation directory).
b Set "extension_dir" to that directory.
c Copy the phpN_cybersource.so file to that directory location.
Step 5 If you are using an Oracle database, go to "Special Installation Instructions for Oracle
Users," page 161, and follow the instructions.
Otherwise, in the php.ini file, locate the “Dynamic Extensions” section and add one of
the following lines anywhere before the next section in the file:
extension=php4_cybersource.so (if using PHP 4.x.x) or
extension=php5_cybersource.so (if using PHP 5.0.0-5.0.2)
extension=php503_cybersource.so (if using PHP 5.0.3) or
extension=php512_cybersource.so (if using PHP 5.1.0-5.1.2)
Step 7 Modify the environment variable LD_LIBRARY_PATH to include the lib directory of the
CyberSource client. For example:
export LD_LIBRARY_PATH=/baseDir/simapi-php-n.n.n/lib:$LD_LIBRARY_
PATH
where /baseDir is the directory where you untarred the CyberSource client package.
If the web server is running as the user "nobody", you must use ldconfig
instead of setting the LD_LIBRARY_PATH. In this case, update the /etc/
ld.so.conf file to include the library path (/baseDir/simapi-php-
n.n.n/lib), and run ldconfig to update the configuration.
Step 8 Configure the client. See "Configuring Client Settings," page 156, below.
Step 9 Test the client. See "Testing the Client," page 158.
Step 2 Download the latest client package. You can save the file in any directory.
Step 4 Copy the phpN_cybersource.dll file into the PHP extension directory, where the N is 4
if your PHP version is 4.x.x, or 5 if your PHP version is 5.x.x.
The extension directory is the one "extension_dir" is set to in the php.ini file. If you
do not already have "extension_dir" set to an explicit directory:
a Create an extension directory (outside of the client installation directory).
b Set "extension_dir" to that directory.
c Copy the phpN_cybersource.dll file to that directory location.
Step 5 In the php.ini file, locate the “Windows Extensions” section and add one of the following
lines anywhere before the next section in the file:
extension=php4_cybersource.dll (if using PHP 4.x.x) or
extension=php5_cybersource.dll (if using PHP 5.0.0–5.0.2)
extension=php503_cybersource.dll (if using PHP 5.0.3) or
extension=php512_cybersource.dll (if using PHP 5.1.0-5.1.2)
Step 7 Add the lib directory of the CyberSource client package to the system PATH. This makes
the DLLs included in the client package available to the CyberSource PHP extension.
The client is installed on your system.
Step 8 Configure the client. See "Configuring Client Settings," page 156, below.
Step 9 Test the client. See "Testing the Client," page 158.
If you have multiple merchant IDs, or if you are a reseller handling multiple merchants, you
can use different configuration settings depending on the merchant ID. See "Configuring
Your Settings for Multiple Merchant IDs," page 191, for more information.
Setting Description
merchantID Merchant ID. The client uses this value if you do not specify a merchant
ID in the request itself.
keysDirectory Location of the merchant’s security key. The client includes a keys
directory that you can use. Include the path, for example: ../keys, or
c:\simapi-php-1.0.0\keys.
Note We recommend that you store your key locally for faster request
processing.
sendToProduction Flag that indicates whether the transactions for this merchant should be
sent to the production server. Use one of these values:
false: Do not send to the production server; send to the test server
(default setting).
true: Send to the production server.
Note Make sure that if your merchant ID is configured to use the test
mode, you send requests to the test server.
targetAPIVersion Version of the Simple Order API to use.
Note For a current list of the available versions, go to https://
ics2wsa.ic3.com/commerce/1.x/transactionProcessor. For transactions
in India, go to https://ics2ws.in.ic3.com/commerce/1.x/
transactionProcessor. For information about what has changed in each
version, see the Simple Order API Release Notes.
keyFilename Name of the security key file name for the merchant in the format
<security_key_filename>.p12.
serverURL Alternate server URL to use. See "Using Alternate Server Configuration
Settings," page 190, for more information. Give the complete URL
because it will be used exactly as you specify here.
Setting Description
namespaceURI Alternate namespace URI to use. See "Using Alternate Server
Configuration Settings," page 190, for more information. Give the
complete namespace URI because it will be used exactly as you specify
here.
enableLog Flag directing the client to log transactions and errors. Use one of these
values:
false: Do not enable logging (default setting).
true: Enable logging.
Important Logging can cause very large log files to accumulate.
Therefore, CyberSource recommends that you use logging only when
troubleshooting problems. To comply with all Payment Card Industry
(PCI) and Payment Application (PA) Data Security Standards regarding
the storage of credit card and card verification number data, the logs that
are generated contain only masked credit card and card verification
number data (CVV, CVC2, CVV2, CID, CVN).
Follow these guidelines:
Use debugging temporarily for diagnostic purposes only.
If possible, use debugging only with test credit card numbers.
Never store clear text card verification numbers.
Delete the log files as soon as you no longer need them.
Never send email to CyberSource containing personal and account
information, such as customers' names, addresses, card or check
account numbers, and card verification numbers.
For more information about PCI and PABP requirements, see
www.visa.com/cisp.
logDirectory Directory to which to write the log file. Note that the client will not create
this directory for you; you must specify an existing directory.The client
includes a logs directory that you can use. Include the path, for
example: ../logs, or c:\simapi-php-1.0.0\logs.
logFilename Log file name. The client uses cybs.log by default.
logMaximumSize Maximum size in megabytes for the log file. The default value is 10.
When the log file reaches the specified size, it is archived into
cybs.log.<yyyymmddThhmmssxxx> and a new log file is started.
The xxx indicates milliseconds.
sslCertFile The location of the bundled file of CA Root Certificates
(ca-bundle.crt) which is included in the client download package.
The client automatically looks for the file in the directory where your
security key is stored (specified by keysDirectory). If you move the file so
it does not reside in keysDirectory, use this configuration setting to
specify the full path to the file, including the file name.
timeout Length of time-out in seconds. The default is 110.
Setting Description
proxyServer Proxy server to use. Allowable formats include:
<http://>server<:port>
<http://>IP address<:port>
where php is the command-line interface (CLI) version. Depending on the PHP version,
php may be in the main PHP directory, the sapi/cli directory, the cli directory, or it
may be named php-cli.exe or php.exe.
For example, for PHP 4.3.0 with Linux, you might have:
<PHP directory>/sapi/cli/php authCaptureSample.php
Step 3 If the test still fails, look at the error message and determine the return status value (a
numeric value from -1 to 8).
Step 4 See the descriptions of the status values in "Possible Return Status Values," page 164,
and follow any instructions given there for the error you received.
Step 2 For Windows, modify the cybs.ini in the folder with your settings (for Linux, make sure
the samples/cybs.ini file is set how you want it).
The client is installed and tested. You are ready to create your own code for requesting
CyberSource services. For information about creating requests, see "Using Name-Value
Pairs," page 168, if you plan to use name-value pairs, or "Using XML," page 178, if you
plan to use XML.
Going Live
When you complete all of your system testing and are ready to accept real transactions
from your customers, your deployment is ready to go live.
After your deployment goes live, use real card numbers and other data to test
every card type you support. Because these are real transactions in which you
are buying from yourself, use small monetary amounts to do the tests. Process
an authorization, then capture the authorization, and later refund the money.
Use your bank statements to verify that money is deposited into and withdrawn
from your merchant bank account as expected. If you have more than one
CyberSource merchant ID, test each one separately.
Configure your client so that it can send transactions to the production server
and not the test server. For more information, see the description of the
configuration setting "sendToProduction," page 156.
When your deployment goes live, your CyberSource account is updated so that you can
send transactions to the CyberSource production server. If you have not already done so,
you must provide your banking information to CyberSource so that your processor can
deposit funds to your merchant bank account.
After CyberSource has confirmed that your account is live, make sure that you update
your system so that it can send requests to the production server (ics2wsa.ic3.com or
ics2ws.in.ic3.com in India) using your security key for the production environment.
The test server (ics2wstesta.ic3.com) cannot be used for real transactions. For more
information about sending transactions to the production server, see the description of the
configuration setting "sendToProduction," page 156.
To update the client to use a later API version, update the value for the
targetAPIVersion configuration parameter in the cybs.ini file. For example, to use
the 1.18 version of the API, set the property to 1.18.
Step 3 Execute configure so that you are loading the Oracle extensions dynamically. To do
this, include “shared,” before the path to each Oracle extension. For example, you might
execute configure as follows:
./configure --prefix=<target PHP directory>
--with-apxs=/usr/local/apache_1.3.32/bin/apxs
--with-oracle=shared,/home/u01/app/oracle/product/8.1.7
--with-oci8=shared,/home/u01/app/oracle/product/8.1.7
--without-mysql
Step 5 In the “Dynamic Extensions” section of the php.ini file, add the CyberSource extension
before the Oracle extensions:
extension=phpN_cybersource.so (where N represents the version of PHP: 4, 5,
503, or 512)
extension = oracle.so
extension = oci8.so
Step 7 Continue with the original installation instructions (see Step 7 in "Installing the Client,"
page 153).
Summary of Functions
The client includes these functions:
cybs_load_config()
cybs_run_transaction()
cybs_load_config()
Table 21 cybs_load_config()
cybs_run_transaction()
Table 22 cybs_run_transaction()
The sample scripts display a numeric value for the return status, which is listed
in the first column.
Numeric
Value
Value Description
(for Sample
Scripts)
0 CYBS_S_OK Critical: No
Result: The client successfully received a reply.
For name-value pair users, the $reply array has the reply name-
value pairs for the services that you requested.
For XML users, the $reply array contains the response in XML
format.
Manual action to take: None
-1 CYBS_S_PHP_ Critical: No
PARAM_ERROR
Result: The request was not sent because there was a problem with
one or more of the parameters passed to the cybs_run_transaction()
function.
Manual action to take: Make sure the parameter values are correct.
1 CYBS_S_PRE_SEND_ Critical: No
ERROR
Result: An error occurred before the request could be sent. This
usually indicates a configuration problem with the client.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
Manual action to take: Fix the problem described in the error
information.
Numeric
Value
Value Description
(for Sample
Scripts)
2 CYBS_S_SEND_ Critical: No
ERROR
Result: An error occurred while sending the request.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
Manual action to take: None
Note A typical send error that you might receive when testing
occurs if the ca-bundle.crt file is not located in the same
directory as your security key. For information about how to fix the
problem, see the description of the configuration parameter
"sslCertFile," page 157.
3 CYBS_S_RECEIVE_ Critical: Yes
ERROR
Result: An error occurred while waiting for or retrieving the reply.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
$reply[CYBS_SK_RAW_REPLY]
Manual action to take: Check the Transaction Search screens on
the Business Center to verify that the request was processed, and if
so, whether it succeeded. Update your transaction database
appropriately.
4 CYBS_S_POST_ Critical: Yes
RECEIVE_ERROR
Result: The client received a reply or a fault, but an error occurred
while processing it.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
$reply[CYBS_SK_RAW_REPLY]
Manual action to take: Examine the value of $reply[CYBS_SK_
RAW_REPLY]. If you cannot determine the status of the request,
then check the Transaction Search screens on the Business Center
to verify that the request was processed, and if so, whether it
succeeded. Update your transaction database appropriately.
Numeric
Value
Value Description
(for Sample
Scripts)
5 CYBS_S_CRITICAL_ Critical: Yes
SERVER_FAULT
Result: The server returned a fault with $reply[CYBS_SK_
FAULT_CODE] set to CriticalServerError.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
$reply[CYBS_SK_FAULT_CODE]
$reply[CYBS_SK_FAULT_STRING]
$reply[CYBS_SK_FAULT_DOCUMENT]
$reply[CYBS_SK_FAULT_REQUEST_ID]
Manual action to take: Check the Transaction Search screens on
the Business Center to verify that the request succeeded. When
searching for the request, use the request ID provided by
$reply[CYBS_SK_FAULT_REQUEST_ID].
6 CYBS_S_SERVER_ Critical: No
FAULT
Result: The server returned a fault with $reply[CYBS_SK_
FAULT_CODE] set to ServerError, indicating a problem with the
CyberSource server.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
$reply[CYBS_SK_FAULT_CODE]
$reply[CYBS_SK_FAULT_STRING]
$reply[CYBS_SK_FAULT_DOCUMENT]
Manual action to take: None
Numeric
Value
Value Description
(for Sample
Scripts)
7 CYBS_S_OTHER_ Critical: No
FAULT
Result: The server returned a fault with $reply[CYBS_SK_
FAULT_CODE] set to a value other than ServerError or
CriticalServerError. Indicates a possible problem with merchant
status or the security key. Could also indicate that the message was
tampered with after it was signed and before it reached the
CyberSource server.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
$reply[CYBS_SK_FAULT_CODE]
$reply[CYBS_SK_FAULT_STRING]
$reply[CYBS_SK_FAULT_DOCUMENT]
Manual action to take: Examine the value of the $reply[CYBS_
SK_FAULT_STRING] and fix the problem. You might need to
generate a new security key, or you might need to contact Customer
Support if there are problems with your merchant status.
Note A typical error that you might receive occurs if your merchant
ID is configured for “test” mode but you send transactions to the
production server. For information about fixing the problem, see the
description of the configuration parameter "sendToProduction,"
page 156.
8 CYBS_S_HTTP_ Critical: No
ERROR
Result: The server returned an HTTP status code other than 200
(OK) or 504 (gateway timeout). Note that if a 504 gateway timeout
occurs, then the status=3.
Error information to read:
$reply[CYBS_SK_ERROR_INFO]
$reply[CYBS_SK_RAW_REPLY]
Value of varReply: CYBS_SK_RAW_REPLY contains the HTTP
response body, or if none was returned, the literal "(no response
available)".
Manual action to take: None.
Table 24 summarizes which reply information you receive for each status value.
The instructions in this section explain how to use PHP to request CyberSource services.
For a list of API fields to use in your requests, see "Related Documents," page 14.
To use any CyberSource service, you must create and send a request that includes the
required information for that service.
The example that is developed in the following sections shows the basic PHP code for
requesting CyberSource services. In this example, Jane Smith is buying an item for 29.95.
You could instead create an array and add each configuration setting separately. You
could also use a combination of the two methods: You could read the settings from a file
and then add new settings dynamically with the array to override the settings read from
the file.
$request = array();
$request['merchantID'] = 'infodev';
$request['ccAuthService_run'] = 'true';
Requesting a Sale
You can request multiple services by adding additional fields to the request. For example,
if you fulfill the order immediately, you can request credit card authorization and capture
together (referred to as a “sale”):
$request['ccAuthService_run'] = 'true';
$request['ccCaptureService_run'] = 'true';
$request['merchantReferenceCode'] = '3009AF229L7W';
$request['billTo_firstName'] = 'Jane';
$request['billTo_lastName'] = 'Smith';
$request['card_accountNumber'] = '4111111111111111';
$request['item_0_unitPrice'] = '29.95';
The example above shows only a partial list of the fields you must send. Refer to "Related
Documents," page 14, for information about the guides that list all of the fields for the
services that you are requesting.
$reply = array();
$status = cybs_run_transaction( $config, $request, $reply );
if ($status == 0)
// Read the value of the "decision" in the $reply array.
$decision = $reply['decision'];
// If decision=ACCEPT, indicate to the customer that the request was successful.
// If decision=REJECT, indicate to the customer that the order was not approved.
// If decision=ERROR, indicate to the customer that an error occurred and to try
// again later.
// Now get reason code results:
// $strContent = getReplyContent( $reply);
// See "Processing the Reason Codes," page 173 for how to process the
// reasonCode from the reply.
// Note that getReplyContent() is included in this document to help you
// understand how to process reason codes, but it is not included as part of the
// sample scripts or sample PHP pages.
else
{
handleError( $status, $request, $reply );
}
//---------------------
function handleError( $status, $request, $reply )
//---------------------
// handleError() shows how to handle the different errors that can occur.
{
switch ($status)
{
// There was a problem with the parameters passed to cybs_run_transaction()
case CYBS_S_PHP_PARAM_ERROR:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Notify appropriate internal resources of the error.
break;
break;
// CriticalServerError fault
case CYBS_S_CRITICAL_SERVER_FAULT:
// Critial error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the $reply.
// Notify appropriate internal resources of the fault.
// See the sample code for more information about reading fault details and
// handling a critical error.
break;
// ServerError fault
case CYBS_S_SERVER_FAULT:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the $reply.
// See the sample code for information about reading fault details.
break;
// Other fault
case CYBS_S_OTHER_FAULT:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the $reply.
// Notify appropriate internal resources of the fault.
// See the sample code for information about reading fault details.
break;
// HTTP error
Case CYBS_S_HTTP_ERROR:
// Non-critical error.
// Tell customer the order cannot be completed and to try again later.
// Look at CYBS_SK_RAW_REPLY in $reply for the raw reply.
break;
}
}
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to customers. Instead, present an
appropriate response that tells customers the result.
Because CyberSource may add reply fields and reason codes at any time, you
should parse the reply data according to the names of the fields instead of their
order in the reply.
decision: A one-word description of the results of your request. The decision is one of
the following:
ACCEPT if the request succeeded
REJECT if one or more of the services in the request was declined
REVIEW if you are a CyberSource Advanced merchant using CyberSource
Decision Manager and it flags the order for review. See "Handling Decision
Manager Reviews," page 175, for more information.
ERROR if there was a system error. See "Retrying When System Errors Occur,"
page 177, for important information about handling system errors.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
CyberSource reserves the right to add new reason codes at any time. If your
error handler receives a reason code that it does not recognize, it should use
the decision to interpret the reply.
// Add other reason codes here that you must handle specifically. For all
// other reason codes, return an empty string, in which case, you should
// display a generic message appropriate to the decision value you received.
default:
return ( '' );
}
}
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
For example, in the case of a sale (a credit card authorization and a capture requested
together), if the authorization service fails, CyberSource will not process the capture
service. The reply you receive only includes reply fields for the authorization.
Many CyberSource services include “ignore” fields that tell CyberSource to ignore the
result from the first service when deciding whether to run the subsequent services. In the
case of the sale, even though the issuing bank gives you an authorization code,
CyberSource might decline the authorization based on the AVS or card verification results.
Depending on your business needs, you might choose to capture these types of declined
authorizations anyway. You can set the businessRules_ignoreAVSResult field to “true”
in your combined authorization and capture request:
$request['businessRules_ignoreAVSResult'] = 'true';
This tells CyberSource to continue processing the capture even if the AVS result causes
CyberSource to decline the authorization. In this case you would then get reply fields for
both the authorization and the capture in your reply.
You are charged only for the services that CyberSource performs.
Instead, CyberSource recommends that you retry sending the request only two or three
times with successively longer periods of time between each retry. For example, after the
first system error response, wait 30 seconds and then retry sending the request. If you
receive the same error a second time, wait one minute before you send the request again.
Depending on the situation, you may decide you can retry sending the request after a
longer time period. Determine what is most appropriate for your business situation.
If after several retry attempts you are still receiving a system error, it is possible that the
error is actually being caused by a processor rejection and not a CyberSource system
error. In that case, we suggest that you either:
Search for the transaction in the Business Center, look at the description of the error
on the Transaction Detail page, and call your processor to determine if and why they
are rejecting the transaction.
Contact CyberSource Customer Support to confirm whether your error is truly caused
by a CyberSource system issue.
If TSYS Acquiring Solutions is your processor, you may want to follow the first suggestion
as there are several common TSYS Acquiring Solutions processor responses that are
returned to you as system errors and that only TSYS Acquiring Solutions can address.
Using XML
This section describes how to request CyberSource services using XML.
The instructions in this section explain how to write the code that requests these services.
For a list of API fields to use in your requests, see "Related Documents," page 14.
Sample Code
We suggest that you examine the name-value pair sample code provided in
authCaptureSample.php before implementing your code to process XML requests.
The sample will give you a basic understanding of how to request CyberSource services.
The sample code file is located in the <installation directory>/samples/nvp
directory.
After examining that sample code, read this section to understand how to create code to
process XML requests. Note that the code in this section’s example is incomplete. For a
complete sample program, see the authSample.php file in the <installation
directory>/samples/xml directory.
The request document must validate against the XML schema for CyberSource
transactions. To view the schema, go to
https://ics2wsa.ic3.com/commerce/1.x/transactionProcessor
and look at the XSD file for the version of the Simple Order API you are using.
Make sure that the elements in your document appear in the correct order. If
they do not, your document will not validate, and your request will fail.
The example developed in the following sections shows a basic XML document for
requesting CyberSource services. In this example, Jane Smith is buying an item for 29.95.
The XML document in this example is incomplete. For a complete example, see the
auth.xml document in the samples/xml directory.
When you construct a request, you must indicate the correct namespace for the elements,
and the namespace must use the same API version that you specify in the configuration
settings file. For example, if targetAPIVersion=1.18 in the cybs.ini file, the
namespace must be urn:schemas-cybersource-com:transaction-data-1.18.
The XML document that you receive in the reply always uses a prefix of c: (for
example, xmlns:c="urn:schemas-cybersource-com:transaction-
data-1.18"). Make sure you use an XML parser that supports namespaces.
Requesting a Sale
You can request multiple services by adding additional elements. For example, if you fulfill
the order immediately, you can request a credit card authorization and capture together
(referred to as a “sale”):
The example above shows only a partial list of the fields you must send. Refer to "Related
Documents," page 14, for information about the guides that list all of the fields for the
services that you are requesting.
The namespace that you specify in the XML document must use the same API
version that you specify in the configuration settings file. For example, if
targetAPIVersion=1.18 in the file, the namespace must be
urn:schemas-cybersource-com:transaction-data-1.18. The
example code below retrieves the API version from the configuration settings
file and places it in the XML document.
$request = array();
$request[CYBS_SK_XML_DOCUMENT] = $inputXML;
// send request
$reply = array();
$status = cybs_run_transaction( $config, $request, $reply );
if ($status == CYBS_S_OK)
// Read the value of the "decision" in the oReplyMessage.
// This code assumes you have a method called getField ()
// that retrieves the specified field from the XML document
// in $reply[CYBS_SK_XML_DOCUMENT].
$decision = getField( $reply, "decision" );
// If decision=ACCEPT, indicate to the customer that
// the request was successful.
// If decision=REJECT, indicate to the customer that the
' order was not approved.
' If decision=ERROR, indicate to the customer that there
// was an error and to try again later.
' Now get reason code results:
// $strContent = getReplyContent( $reply );
' See "Processing the Reason Codes," page 173 for how to process the reasonCode
' from the reply.
' Note that getReplyContent() is included in this document to help you understand
' how to process reason codes, but it is not included as part of the sample
' scripts or sample PHP pages.
else {
handleError( $status, $request, $reply );
}
//---------------------
function handleError( $status, $request, $reply )
//---------------------
{
switch ($status)
{
// There was a problem with the parameters passed to
// cybs_run_transaction()
case CYBS_S_PHP_PARAM_ERROR:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Notify appropriate internal resources of the error.
break;
case CYBS_S_PRE_SEND_ERROR:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Notify appropriate internal resources of the error.
break;
// An error occurred while sending the request.
case CYBS_S_SEND_ERROR:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
break;
// ServerError fault
case CYBS_S_SERVER_FAULT:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the $reply.
// See the sample code for information about reading fault details.
break;
// Other fault
case CYBS_S_OTHER_FAULT:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Read the various fault details from the $reply.
// Notify appropriate internal resources of the fault.
// See the sample code for information about reading fault details.
break;
// HTTP error
Case CYBS_S_HTTP_ERROR:
// Non-critical error.
// Tell customer the order could not be completed and to try again later.
// Look at CYBS_SK_RAW_REPLY in $reply for the raw reply.
break;
}
}
To use the reply information, you must integrate it into your system and any other system
that uses that data. For example, you can store the reply information in a database and
send it to other back office applications.
You must write an error handler to process the reply information that you receive from
CyberSource. Do not show the reply information directly to customers. Instead, present an
appropriate response that tells customers the result.
Because CyberSource may add reply fields and reason codes at any time, you
should parse the reply data according to the names of the fields instead of their
order in the reply. If your error handler receives a reason code that it does not
recognize, it should use the decision to interpret the reply.
decision: A one-word description of the results of your request. The decision is one of
the following:
ACCEPT if the request succeeded
REJECT if one or more of the services in the request was declined
REVIEW if you use CyberSource Decision Manager and it flags the order for
review. See "Handling Decision Manager Reviews," page 187, for more
information.
ERROR if there was a system error. See "Retrying When System Errors Occur,"
page 189 for important information about handling system errors.
reasonCode: A numeric code that provides more specific information about the
results of your request.
You also receive a reason code for each service in your request. You can use these
reason codes to determine whether a specific service succeeded or failed. If a service
fails, other services in your request may not run. For example, if you request a credit card
authorization and capture, and the authorization fails, the capture does not run. The
reason codes for each service are described in the Credit Card Services User Guide for
CyberSource Essentials merchants or in the service developer guide for CyberSource
Advanced merchants.
//----------------
//----------------
{
$reasonCode = $reply['reasonCode']
switch ($reasonCode)
{
// Success
case '100':
return( sprintf(
"Request ID: %s\nAuthorizedAmount:
%s\nAuthorization Code: %s,
getField( $reply, 'requestID' ), getField ($reply,
'ccAuthReply/amount' ),
getField( $reply, 'ccAuthReply/authorizationCode' ) ) );
break;
// Insufficient funds
case '204':
return( sprintf(
"Insufficient funds in account. Please use a different
card or select another form of payment." ) );
break;
// add other reason codes here that you must handle specifically. For all
// other reason codes, return an empty string, in which case, you should
// display a generic message appropriate to the decision value you received.
default:
return ( '' );
}
}
If you will be using Decision Manager, you have to determine how to handle the new
REVIEW value. Ideally, you will update your order management system to recognize the
REVIEW response and handle it according to your business rules. If you cannot update
your system to handle the REVIEW response, CyberSource recommends that you choose
one of these options:
If you authorize and capture the credit card payment at the same time, treat the
REVIEW response like a REJECT response. Rejecting any orders that are marked for
review may be appropriate if your product is a software download or access to a Web
site. If supported by your processor, you may also want to reverse the authorization.
If you approve the order after reviewing it, convert the order status to ACCEPT in your
order management system. You can request the credit card capture without
requesting a new authorization.
If you approve the order after reviewing it but cannot convert the order status to
ACCEPT in your system, request a new authorization for the order. When processing
this new authorization, you must disable Decision Manager. Otherwise the order will
be marked for review again. For details about the API field that disables Decision
Manager, see the Decision Manager Developer Guide Using the Simple Order API
(PDF | HTML) or the Decision Manager Developer Guide Using the SCMP Order API
(PDF | HTML).
Alternately, you can specify a custom business rule in Decision Manager so that
authorizations originating from a particular internal IP address at your company are
automatically accepted.
If supported by your processor, you may want to reverse the original authorization.
For example, in the case of a sale (a credit card authorization and a capture requested
together), if the authorization service fails, CyberSource will not process the capture
service. The reply you receive only includes reply fields for the authorization.
Many CyberSource services include “ignore” fields that tell CyberSource to ignore the
result from the first service when deciding whether to run the subsequent services. In the
case of the sale, even though the issuing bank gives you an authorization code,
CyberSource might decline the authorization based on the AVS or card verification results.
Depending on your business needs, you might choose to capture these types of declined
authorizations anyway. You can set the businessRules_ignoreAVSResult field to “true”
in your combined authorization and capture request:
<businessRules>
<ignoreAVSResult>true</ignoreAVSResult>
</businessRules>
This tells CyberSource to continue processing the capture even if the AVS result causes
CyberSource to decline the authorization. In this case you would then get reply fields for
both the authorization and the capture in your reply.
You are charged only for the services that CyberSource performs.
Instead, CyberSource recommends that you retry sending the request only two or three
times with successively longer periods of time between each retry. For example, after the
first system error response, wait 30 seconds and then retry sending the request. If you
receive the same error a second time, wait one minute before you send the request again.
Depending on the situation, you may decide you can retry sending the request after a
longer time period. Determine what is most appropriate for your business situation.
If after several retry attempts you are still receiving a system error, it is possible that the
error is actually being caused by a processor rejection and not a CyberSource system
error. In that case, we suggest that you either:
Search for the transaction in the Business Center, look at the description of the error
on the Transaction Detail page, and call your processor to determine if and why they
are rejecting the transaction.
Contact CyberSource Customer Support to confirm whether your error is truly caused
by a CyberSource system issue.
If TSYS Acquiring Solutions is your processor, you may want to follow the first suggestion
as there are several common TSYS Acquiring Solutions processor responses that are
returned to you as system errors and that only TSYS Acquiring Solutions can address.
For example, these are the server URLs and namespace URI for accessing the
CyberSource services using the Simple Order API version 1.18:
Namespace URI:
urn:schemas-cybersource-com:transaction-data-1.18.
If you view the above URLs in a web browser, a list of the supported API
versions and the associated schema files are displayed.
If in the future CyberSource changes these conventions, but does not provide a new
version of the client, you can configure your existing client to use the new server and
namespace conventions required by the CyberSource server.
All of the properties except merchantID can be prefixed with <merchantID>. to specify
the settings for a specific merchant.
If you have a merchant with merchant ID of merchant123, and you want enable logging
only for that merchant, you can set the enableLog parameter to true for all requests that
have merchant123 as the merchant ID:
merchant123.enableLog=true
enableLog=false
This appendix lists optional client application fields that you can include in your request to
describe your client application. Use these fields only if you are building an application to
sell to others. For example, a shopping cart application. Do not use the fields if you are
only integrating the client with your own web store.
Data Type
Field Name Description
and Length
clientApplication Application or integration that uses the String (50)
client: for example: ShoppingCart
Pro or Web Commerce Server. Do
not include a version number.
clientApplicationVersion Version of the application or integration, String (50)
for example: 5.0 or 1.7.3.
clientApplicationUser User of the application or integration, for String (30)
example: jdoe.
If you use these fields in your request, you can view their values in the Transaction Search
Details window of the Business Center.