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; }
