// Example Program: T_APSAL
// Description:
// This is a test program to illustrate how to call the CTI_Run()
// subprocedure to perform the AltPay Sale Service operation for PayPal.
//
// To achieve this, generate a unique ID with CTI_NextUniqueId(), and
// then populate and write a record to CTIWSHDR and to CTIWSAHDR.
// Then, call CTI_Run() passing in your unique ID as well as the other
// parameters shown.
//
// CTI_Run() will return *On if no error was encountered, or *Off
// if an error occurred. If an error occurred, you should look at
// the fields in ErrorDS to retrieve information about the error.
//
// Otherwise, you can perform a CHAIN against the CTIWSRSP and
// CTIWSARSP physical files, and retrieve the result fields.
Ctl-Opt ActGrp(*Caller) BndDir('CTIBND') Option(*NoDebugIO);
Dcl-F CTIWSHDR Disk(*Ext) Keyed Qualified Usage(*Input:*Output);
Dcl-F CTIWSRSP Disk(*Ext) Keyed Qualified Usage(*Input);
Dcl-F CTIWSITM Disk(*Ext) Keyed Qualified Usage(*Input:*Output);
Dcl-F CTIWSAHDR Disk(*Ext) Keyed Qualified Usage(*Input:*Output);
Dcl-F CTIWSARSP Disk(*Ext) Keyed Qualified Usage(*Input);
Dcl-Ds HDR ExtName('CTIWSHDR':*Output) Qualified End-Ds;
Dcl-Ds RSP ExtName('CTIWSRSP':*Input) Qualified End-Ds;
Dcl-Ds ITM ExtName('CTIWSITM':*Output) Qualified End-Ds;
Dcl-Ds AHDR ExtName('CTIWSAHDR':*Output) Qualified End-Ds;
Dcl-Ds ARSP ExtName('CTIWSARSP':*Input) Qualified End-Ds;
/COPY QRPGLECPY,CTICB
// This is included for demo output purposes.
Dcl-Pr WriteToJobLog Int(10) Extproc('Qp0zLprintf');
pString Pointer Value Options(*String);
End-Pr;
Dcl-C NewLine x'15';
// This stores the unique ID for this API call
Dcl-S UniqueId Like(CTI_UniqueId_t) Inz;
// This holds any error information returned by the API call
Dcl-Ds ErrorDS LikeDS(CTI_ErrorDS_t) Inz(*LikeDS);
// Modify this field to use your merchant ID
Dcl-S MerchantId Like(CTI_MerchantId_t) Inz('ikrengel');
reset ErrorDS;
// Each API call requires a unique ID
UniqueId = CTI_NextUniqueId();
// CTIWSHDR and CTIWSAHDR need to be populated with transaction data.
// CTIWSAHDR will be populated with AltPay-specific data
clear HDR;
HDR.UID = UniqueId;
HDR.CRTDT = %Timestamp();
HDR.MCHID = MerchantId;
HDR.MCHREFCD = 'MYREFCD134';
HDR.PTGNDAMT = '145.20';
HDR.PTCUR = 'USD';
clear AHDR;
AHDR.UID = UniqueId;
AHDR.SALRUN = CTI_TRUE;
AHDR.BILLAGID = '566...010';
AHDR.FUNDINGSRC = 'UNRESTRICTED';
AHDR.APPMTTYP = 'PPL';
AHDR.SALORDRQID = '5665905509546923804010';
AHDR.STFNAME = 'Sylvester';
AHDR.STLNAME = 'Abbing';
AHDR.STSTREET1 = '145 E. Main St.';
AHDR.STCITY = 'Mankato';
AHDR.STSTATE = 'MN';
AHDR.STCNTRY = 'US';
AHDR.STPOSTCD = '56002';
clear ITM;
ITM.PID = UniqueId;
ITM.UID = CTI_NextUniqueId();
ITM.CRTDT = %Timestamp();
ITM.PRDNAM = 'Doodad Door';
ITM.QTY = 2;
ITM.UNTPRC = '20.08';
ITM.TAXAMT = '1.26';
ITM.UNITTAXAM = '0.63';
write CTIWSITM.CTIWSITMR ITM;
clear ITM;
ITM.PID = UniqueId;
ITM.UID = CTI_NextUniqueId();
ITM.CRTDT = %Timestamp();
ITM.PRDNAM = 'Stoppable Force';
ITM.QTY = 1;
ITM.UNTPRC = '0.75';
ITM.TAXAMT = '0.05';
ITM.UNITTAXAM = '0.05';
write CTIWSITM.CTIWSITMR ITM;
write CTIWSHDR.CTIWSHDRR HDR;
write CTIWSAHDR.CTIWSAHDRR AHDR;
if not CTI_Run( UniqueId : ErrorDS : *Omit : *Omit : MerchantId );
// If CTI_Run() returns *Off then an error occured.
// You should check ErrorDS subfields for info:
// ErrorDS.Subproc = Name of CTI subprocedure that threw error
// ErrorDS.MessageId = Message ID of the error message
// ErrorDS.Message = Error message description
// ErrorDS.LogFile = Path to a log file created in the IFS that can
// be used for troubleshooting. Log files are generated
// automatically whenever an error occurs. You can also force log
// files to generate by modifying the value of the LOGALL field in
// CTICFGMCH for the provided Merchant ID.
// ErrorDS.Source =
// - CTI_SOURCE_INTERNAL is a general product error.
// This could be due to issues with input data, or the
// inability to access physical files, etc.
//
// - CTI_SOURCE_TRANSMIT is a product error that specifically
// occurred during HTTPS communication with the CyberSource
// webservice. This could be due to issues with your network
// configuration, proxy setup, internet connection, etc.
//
// - CTI_SOURCE_REMOTE is an error message provided by CyberSource.
WriteToJobLog( 'Error Message Id: ' + ErrorDS.MessageId + NewLine );
WriteToJobLog( 'Error Message: ' + ErrorDS.Message + NewLine );
WriteToJobLog( 'Error Source: ' + ErrorDS.Source + NewLine );
// All error information is also written to the file CTIERR.
else;
// If CTI_Run() returned *On the request was successful. You can
// access the results in the CTIWSRSP file using the same UniqueID
// that was used to create the request record in CTIWSRSP.
chain UniqueId CTIWSRSP.CTIWSRSPR RSP;
if %Found(CTIWSRSP);
chain UniqueId CTIWSARSP.CTIWSARSPR ARSP;
if not %Found(CTIWSARSP);
// TODO: error, no AP data in response
endif;
// For this sample code we're writing the response data to the job
// log, but generally you would extract the data and pass it into
// your own data tables. The CTIWSHDR, CTIWSAHDR, CTIWSARSP, and
// CTIWSRSP files should not be used for long-term data storage and
// should instead be considered short-term transactional files.
WriteToJobLog( 'SALAMT: ' + ARSP.SALAMT + NewLine );
WriteToJobLog( 'SALPMTSTS: ' + ARSP.SALPMTSTS + NewLine );
WriteToJobLog( 'SALPRCRSP: ' + ARSP.SALPRCRSP + NewLine );
WriteToJobLog( 'FUNDINGSRC: ' + ARSP.FUNDINGSRC + NewLine );
WriteToJobLog( 'SALPRCTFEE: ' + ARSP.CAPPRCTFEE + NewLine );
WriteToJobLog( 'SALPRCTID: ' + ARSP.CAPPRCTID + NewLine );
WriteToJobLog( 'SALRSNCD: ' + %Char(ARSP.ATHRSNCD) + NewLine );
WriteToJobLog( 'SALRECID: ' + ARSP.ATHRECID + NewLine );
WriteToJobLog( 'REQID: ' + RSP.REQID + NewLine );
WriteToJobLog( 'REQTK: ' + RSP.REQTK + NewLine );
WriteToJobLog( 'DCN: ' + RSP.DCN + NewLine );
WriteToJobLog( 'RSNCD: ' + %Char(RSP.RSNCD) + NewLine );
endif;
endif;
// Write unique ID to job log for easy reference
WriteToJobLog( 'T_APSAL Unique ID: ' + %Char(UniqueId) + NewLine );
*INLR = *On;
return;