Site Tools


guides:ws_transaction

This is an old revision of the document!


Transaction

The transaction web service is a REST structured service that derives its functionality based on syntax used when calling the web service. There are two parameters required to uniquely identify a transaction, submitter_id and primary_reference. An additional optional parameter can be supplied to instruct the web service to include the transaction history along with the transaction details.


Purpose: Get Transaction Status And History

Request Endpoint

Method URL
GET https://apex-prd.certna.org/APEX/Service/APEXPublicServer.svc/transaction?submitter_id={submitter_id}&primary_reference={primary_reference}&include_history={true or false}

Arguments:

Variable Usage Description
{submitter_id} Required Submitter ID number.
{primary_reference} Required Primary_Reference for the transaction.
{include_history} Optional True or False

Request Body

N/A

Request Headers

Key Value
access_token {soft-token}

JSON Request Parameters

N/A

Notes:

Any condition that results in an unsuccessful call to the payloads web service will produce a JSON formatted response with a code and message property populated.

Sample Request - No History

Endpoint:

https://apex-prd.certna.org/APEX/Service/APEXPublicServer.svc/transaction?submitter_id=35&primary_reference=TESTAGENT1-202007140415-00013.1.1

Sample Response

Status Code: 200

{
    "result": {
        "TRANSACTION_ID": 4256051,
        "PRIMARY_REFERENCE": "TESTAGENT1-202007140415-00013.1.1",
        "SECONDARY_REFERENCE": "3453453453",
        "COUNTY_NAME": "TestCountyCER1",
        "SUBMITTER_ID": 35,
        "AGENT_ID": 6,
        "CREATOR_USER_NAME": "apexsvc65",
        "CREATED": "2020-07-23T14:23:56",
        "LAST_MODIFIED": "2020-07-23T15:14:46",
        "TRANSACTION_STATUS_ID": 32,
        "TRANSACTION_STATUS": "Archived"
    }
}

OR

Status Code: 500 (When an error occurs.)

{
    "Exception": {
        "Code": "Undefined",
        "Message": "Submitter ID and Primary Reference must not be empty or null."
    }
}

Sample Request - With History

Endpoint:

https://apex-prd.certna.org/APEX/Service/APEXPublicServer.svc/transaction?submitter_id=35&primary_reference=TESTAGENT1-202007140415-00013.1.1&include_history=true

Sample Response

Status Code: 200

{
    "result": {
        "TRANSACTION_ID": 4256051,
        "PRIMARY_REFERENCE": "TESTAGENT1-202007140415-00013.1.1",
        "SECONDARY_REFERENCE": "3453453453",
        "COUNTY_NAME": "TestCountyCER1",
        "SUBMITTER_ID": 35,
        "AGENT_ID": 6,
        "CREATOR_USER_NAME": "apexsvc65",
        "CREATED": "2020-07-23T14:23:56",
        "LAST_MODIFIED": "2020-07-23T15:14:46",
        "TRANSACTION_STATUS_ID": 32,
        "TRANSACTION_STATUS": "Archived",
        "TRANSACTION_STATUS_HISTORY": [
            {
                "TRANSACTION_STATUS_ID": 1,
                "TRANSACTION_STATUS": "Draft",
                "TIMESTAMP": "2020-07-23T14:23:56"
            },
            {
                "TRANSACTION_STATUS_ID": 128,
                "TRANSACTION_STATUS": "Submitting",
                "TIMESTAMP": "2020-07-23T14:23:57"
            },
            {
                "TRANSACTION_STATUS_ID": 2,
                "TRANSACTION_STATUS": "Submitted",
                "TIMESTAMP": "2020-07-23T14:23:58"
            },
            {
                "TRANSACTION_STATUS_ID": 512,
                "TRANSACTION_STATUS": "RetrievingByCounty",
                "TIMESTAMP": "2020-07-23T14:30:35"
            },
            {
                "TRANSACTION_STATUS_ID": 4,
                "TRANSACTION_STATUS": "RetrievedByCounty",
                "TIMESTAMP": "2020-07-23T14:30:40"
            },
            {
                "TRANSACTION_STATUS_ID": 2048,
                "TRANSACTION_STATUS": "ReturningByCounty",
                "TIMESTAMP": "2020-07-23T14:53:31"
            },
            {
                "TRANSACTION_STATUS_ID": 8,
                "TRANSACTION_STATUS": "ReturnedByCounty",
                "TIMESTAMP": "2020-07-23T14:53:32"
            },
            {
                "TRANSACTION_STATUS_ID": 8192,
                "TRANSACTION_STATUS": "RetrievingBySubmitter",
                "TIMESTAMP": "2020-07-23T15:14:41"
            },
            {
                "TRANSACTION_STATUS_ID": 32,
                "TRANSACTION_STATUS": "Archived",
                "TIMESTAMP": "2020-07-23T15:14:46"
            }
        ]
    }
}

OR

Status Code: 500 (When an error occurs.)

{
    "Exception": {
        "Code": "DatabaseError",
        "Message": "Not Authorized To Access This Transaction."
    }
}

Comment 2:

Following is a C# / .NET sample code snippet that shows how to call the StoreChecksum web service. Your code will supply the values for the various parameters based on the following:

Parameter Source
checksum The Base64 encoded value of the SHA384 binary checksum that was calculated for the DOCUMENT string.
private void btnGetStatus_Click(object sender, RoutedEventArgs e)
{
    RestClient client = null;
    RestRequest request = null;
    IRestResponse response = null;
 
    ResetTransactionPanels();
 
    string strURL = "https://apex-prd.certna.org/APEX/Service/APEXPublicServer.svc/user/login";
 
    // Password has to be hashed.
    // New convention uses a Salt value from the user record
    // See login web service for more detail.
 
    string strSalt = GetSalt(tbUserName.Text);
    string strPassword = tbPassword.Password.ToString();
 
    string strHashedPassword = HashPassword(strPassword, strSalt);
 
    string strParms = "{\n\t\"user_name\" : \"";
    strParms += tbUserName.Text;
    strParms += "\",\n\t\"password\" : \"";
    strParms += strHashedPassword;
    strParms += "\"\n}";
 
    client = new RestClient(strURL);
    request = new RestRequest(Method.POST);
 
    request.AddHeader("Cache-Control", "no-cache");
    request.AddHeader("Content-Type", "application/json");
 
    request.AddParameter("Login", strParms, ParameterType.RequestBody);
    response = client.Execute(request);
 
    if (response.IsSuccessful)
    {
        var jsonResult1 = JsonConvert.DeserializeObject<dynamic>(response.Content);
        string token = jsonResult1.access_token;
 
        if (chkTransactionHistory.IsChecked == true)
        {
            strURL = "https://" + getHost() + "/APEX/Service/APEXPublicServer.svc/transaction?submitter_id=" + tbSubmitterID.Text + "&primary_reference=" + tbPrimaryReference.Text + "&include_history=true";
        }
        else
        {
            strURL = "https://apex-prd.certna.org/APEX/Service/APEXPublicServer.svc/transaction?submitter_id=" + tbSubmitterID.Text + "&primary_reference=" + tbPrimaryReference.Text + "&include_history=false";
        }
 
        client = new RestClient(strURL);
        request = new RestRequest(Method.GET);
 
        request.AddHeader("Cache-Control", "no-cache");
        request.AddHeader("access_token", token);
        response = client.Execute(request);
 
        if (response.IsSuccessful)
        {
            if (chkTransactionHistory.IsChecked == true)
            {
                panelTranDetails.Visibility = Visibility.Visible;
                panelTranHistory.Visibility = Visibility.Visible;
            }
            else
            {
                panelTranDetails.Visibility = Visibility.Visible;
                panelTranHistory.Visibility = Visibility.Hidden;
            }
 
            var jsonResult2 = JsonConvert.DeserializeObject<dynamic>(response.Content);
 
            tbTransactionID.Text = jsonResult2.result.TRANSACTION_ID;
            tbPrimaryRef.Text = jsonResult2.result.PRIMARY_REFERENCE;
            tbSecondaryRef.Text = jsonResult2.result.SECONDARY_REFERENCE;
            tbCountyName.Text = jsonResult2.result.COUNTY_NAME;
            tbSubID.Text = jsonResult2.result.SUBMITTER_ID;
            tbAgentID.Text = jsonResult2.result.AGENT_ID;
            tbCreatorUserName.Text = jsonResult2.result.CREATOR_USER_NAME;
            tbDateCreated.Text = jsonResult2.result.CREATED;
            tbLastModified.Text = jsonResult2.result.LAST_MODIFIED;
            tbStatusID.Text = jsonResult2.result.TRANSACTION_STATUS_ID;
            tbStatusName.Text = jsonResult2.result.TRANSACTION_STATUS;
 
            if (chkTransactionHistory.IsChecked == true)
            {
                JObject joResponse = JObject.Parse(response.Content);
                JArray jaHistory = (JArray)joResponse["result"]["TRANSACTION_STATUS_HISTORY"];
 
                // Load the grid
 
                historyGrid.Children.Clear();
                historyGrid.RowDefinitions.Clear();
 
                historyGrid.RowDefinitions.Add(new RowDefinition());
 
                if (jaHistory.Count == 0)
                {
                    tbMessageLine.Text = "*** No Transaction History Available ***";
                }
                else
                {
                    TextBlock[] txtStatusCode = new TextBlock[jaHistory.Count + 1];
                    TextBlock[] txtStatusName = new TextBlock[jaHistory.Count + 1];
                    TextBlock[] txtTimeStamp = new TextBlock[jaHistory.Count + 1];
 
                    // Header row
 
                    txtStatusCode[0] = new TextBlock();
                    txtStatusCode[0].Padding = new Thickness(0, 5, 25, 5);
                    txtStatusCode[0].Text = "Code";
                    Grid.SetRow(txtStatusCode[0], 0);
                    Grid.SetColumn(txtStatusCode[0], 0);
                    historyGrid.Children.Add(txtStatusCode[0]);
                    txtStatusName[0] = new TextBlock();
                    txtStatusName[0].Padding = new Thickness(0, 5, 25, 5);
                    txtStatusName[0].Text = "Status";
                    Grid.SetRow(txtStatusName[0], 0);
                    Grid.SetColumn(txtStatusName[0], 1);
                    historyGrid.Children.Add(txtStatusName[0]);
                    txtTimeStamp[0] = new TextBlock();
                    txtTimeStamp[0].Padding = new Thickness(0, 5, 25, 5);
                    txtTimeStamp[0].Text = "Timestamp";
                    Grid.SetRow(txtTimeStamp[0], 0);
                    Grid.SetColumn(txtTimeStamp[0], 2);
                    historyGrid.Children.Add(txtTimeStamp[0]);
 
                    for (int i = 1; i <= jaHistory.Count; i++)
                    {
                        historyGrid.RowDefinitions.Add(new RowDefinition());
 
                        txtStatusCode[i] = new TextBlock();
                        txtStatusCode[i].Padding = new Thickness(0, 5, 25, 5);
                        txtStatusCode[i].Text = (String)jaHistory[i - 1]["TRANSACTION_STATUS_ID"];
                        Grid.SetRow(txtStatusCode[i], i);
                        Grid.SetColumn(txtStatusCode[i], 0);
                        historyGrid.Children.Add(txtStatusCode[i]);
                        txtStatusName[i] = new TextBlock();
                        txtStatusName[i].Padding = new Thickness(0, 5, 25, 5);
                        txtStatusName[i].Text = (String)jaHistory[i - 1]["TRANSACTION_STATUS"];
                        Grid.SetRow(txtStatusName[i], i);
                        Grid.SetColumn(txtStatusName[i], 1);
                        historyGrid.Children.Add(txtStatusName[i]);
                        txtTimeStamp[i] = new TextBlock();
                        txtTimeStamp[i].Padding = new Thickness(0, 5, 25, 5);
                        txtTimeStamp[i].Text = (String)jaHistory[i - 1]["TIMESTAMP"];
                        Grid.SetRow(txtTimeStamp[i], i);
                        Grid.SetColumn(txtTimeStamp[i], 2);
                        historyGrid.Children.Add(txtTimeStamp[i]);
                    }
                }
            }
        }
        else
        {
            var jsonResult2 = JsonConvert.DeserializeObject<dynamic>(response.Content);
            string strMessage = jsonResult2.Exception.Message;
            tbMessageLine.Text = strMessage;
        }
    }
    else
    {
        var jsonResult2 = JsonConvert.DeserializeObject<dynamic>(response.Content);
        tbMessageLine.Text = jsonResult2.ToString();
    }
    return;
 
}
guides/ws_transaction.1598284369.txt.gz · Last modified: by brett.zamora