Webhook Topic Subscription

The Webhook Service allows clients to subscribe to various event types to receive near real-time event data. Based on the topics subscribed to, consumers can receive information regarding specific events originating from various sources, such as Passport. We support full-width Unicode characters commonly found in Japanese, Korean, etc. We also support Unicode emojis. Subscription endpoints are not publicly accessible, so adding a new subscription or modifying an existing subscription (e.g., to subscribe to new event types) would require assistance from accesso.

Table of Contents

  1. Passport Order Aggregation
  2. Ticketing Events
  3. Payment Events for Non-initial Transactions
  4. Bulk Events
  5. Verify Requests from Webhook Service

Passport Order Aggregation

Currently, subscribers can receive real-time data regarding multiple different event types that originate in Passport. These models are JSON bodies populated with relevant information about the different events. Clients can subscribe to any subset of the events below.

Some events have the rare possibility of producing payloads that are exceedingly large, such as those involved a bulk barcode scan. In those cases, a special bulk event is produced containing a URL to cloud storage to fetch the full payload. For security, a client-provided encryption key is required to fetch the payload from this URL. Please see the subsection titled “Bulk Events” for more details.

Note about received payloads

All webhook events received by accesso have some metadata ("id", "eventType", and "timestamp" fields) and a payload ("data" field). The events here document the data portion of the event, which represents the Passport event. Note that the metadata and payload both contain an "eventType" field which could have different values. The event type of the metadata may be ignored as it is for internal use only.

Click here for a JSON example snippet...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    "id": "99eb7362-a6d3-4d46-bca7-1b1c5cf5f795",
    "eventType": "NEW_ORDER_DETAILS",                           // eventType in metadata
    "timestamp": 1688972400000,
    "data": {
        "eventType": "NEW_ORDER",                               // eventType in payload
        "order": {
            "orderId": "string",
            "orderDate": "2022-03-03T17:21:24.380Z",
            "merchantId": "string",
            "merchantName": "string",
            ...
        }
        ...
    }
}

Ticketing Events

New Orders

Data model representing all information gathered pertaining to new orders made. The information includes things such as order date, merchant information, price breakdowns, customer details, and entitlements for the tickets.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
{
"eventType": "NEW_ORDER",
"order": [
  {
    "orderId": "string",
    "orderDate": "2022-03-03T17:21:24.380Z",
    "merchantId": "string",
    "merchantName": "string",
    "shipMethod": "string",
    "orderStatus": "string",
    "orderStatusCode": 0,
    "currency": "string",
    "updatedAt": "2022-03-03T17:21:24.380Z",
    "ticketBillingTotal": "string",
    "retailAmount": "string",
    "taxAmount": "string",
    "totalAmount": "string",
    "orderBilling": [
      {
        "authType": "string",
        "description": "string",
        "amount": "string"
      }
    ],
    "customer": [
      {
        "customerId": "string",
        "firstName": "string",
        "middleInitial": "string",
        "lastName": "string",
        "birthDate": "string",
        "street": "string",
        "city": "string",
        "stateProvince": "string",
        "zip": "string",
        "country": "string",
        "emailAddress": "string",
        "phoneNumber": "string",
        "identityUUID": "string",
        "optStatus": 0, // deprecated in favor of the opt-in fields below
        "te2OptStatus": 0,
        "optIn": 0,
        "optIn2": 0,
        "optIn3": 0
      }
    ],
    "tickets": [
      {
        "ticketId": "string",
        "barcode": "string",
        "parentBarcode": "string",
        "bundleParentTicketId": "string",
        "ticketStatus": "string",
        "ticketStatusCode": 0,
        "customerType": 0,
        "customerTypeName": "string",
        "promoCode": "string",
        "packageId": 0,
        "packageDesc": "string",
        "packageClass": "string",
        "rateId": 0,
        "glCode": "string",
        "glCodeDescription": "string",
        "ticketRetailCost": "string",
        "ticketTaxCost": "string",
        "ticketTotalCost": "string",
        "ticketValue": "string",
        "ticketFees": [
          {
            "feeTypeId": "string",
            "feeType": "string",
            "feeAmount": "string"
          }
        ],
        "vendor": [
          {
            "vendorId": "string",
            "ticketCode": "string",
            "plu": "string"
          }
        ],
        "event": [
          {
            "eventId": "string",
            "eventDesc": "string"
          }
        ],
        "qsmartRedemptionUrl": "string",
        "qsmartTokenId": "string",
        "qbotActivationCode": "string",
        "seasonPassNumber": "string",
        "passholderId": 0,
        "seasonPassExpirationDate": "2022-03-03T17:21:24.381Z",
        "passholderFirstName": "string", // (if non-null, else not present)
        "passholderLastName": "string", // (if non-null, else not present)
        "ticketEntitlements": [
          {
            "ticketEntitlementId": "string",
            "eventEntitlementId": "string",
            "entitlementRuleId": "string",
            "eventEntitlementName": "string",
            "data1": "string",
            "data2": "string",
            "value": "string",
            "entitlementStatus": "string",
            "validity": [
              {
                "daysOfWeek": [
                  "string"
                ],
                "startDateTime": "2022-03-03T17:21:24.381Z",
                "endDateTime": "2022-03-03T17:21:24.381Z",
                "dateBlacklist": [
                  "string"
                ]
              }
            ],
            "usageValue": "string",
            "usages": [
              {
                "usageId": "string",
                "usageTimestamp": "2022-03-03T17:21:24.381Z",
                "deviceId": "string",
                "agentId": "string",
                "accessPointId": "string",
                "usageStatus": "string",
                "usageValue": "string"
              }
            ]
          }
        ],
        "characs": [
          {
            "key": "string",
            "value": "string"
          }
        ],
        "wholesaleRetail": "string",
        "wholesaleTax": "string",
        "wholesaleGross": "string",
        "resellerRetail": "string",
        "resellerTax": "string",
        "resellerGross": "string"
      }
    ],
    "cartAdjustments": [
      {
        "retailAmount": "string",
        "taxAmount": "string",
        "value": "string",
        "refundable": true
      }
    ],
    "characs": [
      {
        "key": "string",
        "value": "string"
      }
    ],
    "reseller": {
      "resellerId": 0,
      "name": "string",
      "resellerLocationId": 0,
      "resellerLocationName": "string",
      "affiliateFlag": true
    },
    "resellerTotal": "string",
    "wholesaleTotal": "string"
  }]
}

Refunds

Data model representing all relevant information for refunds made via Passport, including the type of refund (such as refunds to shipping or full order refunds) and refunded amounts, broken down by ticket.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
    "eventType": "REFUND_PROCESSED",
    "refund": [
        {
          "refundType": "string",
          "orderId": "string",
          "merchantId": "string",
          "totalRefundedAmount": "string",
          "refundedItems": [
           {
            "ticketId": "string",
            "action": "string",
            "type": "string",
            "refundedRetailAmount": "string",
            "refundedTaxAmount": "string",
            "refundDateTime": "2022-03-03T18:12:33.824Z",
            "ticketCancelled": true
            }
          ]
        }
    ]
}

Tickets Used

Data model representing all details around ticket scans resulting in usage, represented as an entitlement usage. Will include details such as the usage time and the access point performing the scan.

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"eventType": "TICKET_USED",
"ticketEntitlementUsage": {
    "usageId": "string",
    "ticketId": "string",
    "usageTimestamp": "2022-03-03T18:14:26.060Z",
    "deviceId": "string",
    "agentId": "string",
    "accessPointId": "string",
    "usageStatus": "string",
    "usageValue": "string"
  }
}

Order Cancellations

An aggregation of information regarding any order cancellations made in Passport. Includes information such as reason codes, agent IDs, and any potential refunded payments.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"eventType": "ORDER_CANCELED",
"orderCanceled": {
  "orderId": "string",
  "reasonCode": "string",
  "agentId": "string",
  "status": "string",
  "lastUpdate": "string",
  "canceledTickets": [
      {
        "ticketId": "string",
        "barcode": "string",
        "status": "string",
        "statusDesc": "string",
        "packageId": "string",
        "packageName": "string",
        "retailAmount": "string",
        "feeAmount": "string",
        "taxAmount": "string",
        "value": "string",
        "lastUpdated": "string"
      }
    ]
  }
}

Ticket Cancellations

An aggregation of information regarding any ticket cancellations made in Passport. Includes information such as reason codes, agent IDs, and any potential refunded payments for a particular ticket.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"eventType": "CANCELED_TICKETS",
"canceledTickets": {
  "orderId": "string",
  "reasonCode": "string",
  "agentId": "string",
  "canceledTickets": [
      {
        "ticketId": "string",
        "barcode": "string",
        "status": "string",
        "statusDesc": "string",
        "packageId": "string",
        "packageName": "string",
        "retailAmount": "string",
        "feeAmount": "string",
        "taxAmount": "string",
        "value": "string",
        "lastUpdated": "string"
      }
    ]
  }
}

Ticket Event Date Changed

An aggregation of information regarding any ticket event date changes made in Passport. Includes information such as the new start date and time, the event ID, the agent IDs and the ticket IDs for which the changes apply.

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"eventType": "TICKET_EVENT_DATE_CHANGED",
"ticketEventDateChanged": {
  "orderId": "string",
  "newStartDate": "string",
  "newStartTime": "string",
  "eventId": "string",
  "agentId": "string",
  "ticketIdList": [
      "string"
    ]
  }
}

Ticket Status Changed

An aggregation of information regarding any ticket status changes made in Passport, for example a ticket upgraded or processed. Includes information such as the list of tickets whose statuses were changed, as well as the ticket ID and new and previous statuses for each of those tickets.

1
2
3
4
5
6
7
8
9
10
11
{
"eventType": "TICKET_STATUS_CHANGED",
"orderId": "string",
"changedTickets": [
    {
      "ticketId": "string",
      "status": "string",
      "previousStatus": "string"  
    }
  ]  
}

Season Pass Updated

An aggregation of order data corresponding to an update for a seasonpass. Includes information about the order, including passholder data.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
{
"eventType": "SEASONPASS_UPDATED",
"order": [
  {
    "orderId": "string",
    "orderDate": "2022-03-03T17:21:24.380Z",
    "merchantId": "string",
    "merchantName": "string",
    "shipMethod": "string",
    "orderStatus": "string",
    "orderStatusCode": 0,
    "currency": "string",
    "updatedAt": "2022-03-03T17:21:24.380Z",
    "ticketBillingTotal": "string",
    "retailAmount": "string",
    "taxAmount": "string",
    "totalAmount": "string",
    "orderBilling": [
      {
        "authType": "string",
        "description": "string",
        "amount": "string"
      }
    ],
    "customer": [
      {
        "customerId": "string",
        "firstName": "string",
        "middleInitial": "string",
        "lastName": "string",
        "birthDate": "string",
        "street": "string",
        "city": "string",
        "stateProvince": "string",
        "zip": "string",
        "country": "string",
        "emailAddress": "string",
        "phoneNumber": "string",
        "identityUUID": "string",
        "optStatus": 0,
        // deprecated in favor of the opt-in fields below
        "te2OptStatus": 0,
        "optIn": 0,
        "optIn2": 0,
        "optIn3": 0
      }
    ],
    "tickets": [
      {
        "ticketId": "string",
        "barcode": "string",
        "parentBarcode": "string",
        "bundleParentTicketId": "string",
        "ticketStatus": "string",
        "ticketStatusCode": 0,
        "customerType": 0,
        "customerTypeName": "string",
        "promoCode": "string",
        "packageId": 0,
        "packageDesc": "string",
        "packageClass": "string",
        "rateId": 0,
        "glCode": "string",
        "glCodeDescription": "string",
        "ticketRetailCost": "string",
        "ticketTaxCost": "string",
        "ticketTotalCost": "string",
        "ticketValue": "string",
        "ticketFees": [
          {
            "feeTypeId": "string",
            "feeType": "string",
            "feeAmount": "string"
          }
        ],
        "vendor": [
          {
            "vendorId": "string",
            "ticketCode": "string",
            "plu": "string"
          }
        ],
        "event": [
          {
            "eventId": "string",
            "eventDesc": "string"
          }
        ],
        "seasonPassHolder": {
          "firstName": "string",
          "middleInitial": "string",
          "lastName": "string",
          "address": "string",
          "city": "string",
          "state": "string",
          "zip": "string",
          "homePhone": "string",
          "alternatePhone": "string",
          "email": "string",
          "sex": "string",
          "birthDate": "string",
          "country": "string"
        },
        "ticketEntitlements": [
          {
            "ticketEntitlementId": "string",
            "eventEntitlementId": "string",
            "entitlementRuleId": "string",
            "eventEntitlementName": "string",
            "data1": "string",
            "data2": "string",
            "value": "string",
            "entitlementStatus": "string",
            "validity": [
              {
                "daysOfWeek": [
                  "string"
                ],
                "startDateTime": "2022-03-03T17:21:24.381Z",
                "endDateTime": "2022-03-03T17:21:24.381Z",
                "dateBlacklist": [
                  "string"
                ]
              }
            ],
            "usageValue": "string",
            "usages": [
              {
                "usageId": "string",
                "usageTimestamp": "2022-03-03T17:21:24.381Z",
                "deviceId": "string",
                "agentId": "string",
                "accessPointId": "string",
                "usageStatus": "string",
                "usageValue": "string"
              }
            ]
          }
        ],
        "qsmartRedemptionUrl": "string",
        "qsmartTokenId": "string",
        "qbotActivationCode": "string",
        "seasonPassNumber": "string",
        "passholderId": 0,
        "seasonPassExpirationDate": "2022-03-03T17:21:24.381Z",
        "characs": [
          {
            "key": "string",
            "value": "string"
          }
        ],
        "wholesaleRetail": "string",
        "wholesaleTax": "string",
        "wholesaleGross": "string",
        "resellerRetail": "string",
        "resellerTax": "string",
        "resellerGross": "string"
      }
    ],
    "cartAdjustments": [
      {
        "retailAmount": "string",
        "taxAmount": "string",
        "value": "string",
        "refundable": true
      }
    ],
    "characs": [
      {
        "key": "string",
        "value": "string"
      }
    ],
    "reseller": {
      "resellerId": 0,
      "name": "string",
      "resellerLocationId": 0,
      "resellerLocationName": "string",
      "affiliateFlag": true
    },
    "resellerTotal": "string",
    "wholesaleTotal": "string"
  }]
}

Payment Events for Non-initial Transactions

Data model with different eventType and actionType possibilities which represent instances of activity for memberships or deferred payment products. This information includes things such as the change of payment card on file, the termination of a membership, and all billing attempts whether successful or unsuccessful.

There are three different events:

Each event has further actionType possibilities that represent different scenarios; see each subsection below for their details.

Regardless of event, each are of the following form, containing information about the action as well as related tickets and characs. Note the orderAction.actionType field.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{
  "address": {
    "addressId": "string",
    "street": "string",
    "city": "string",
    "stateProvince": "string",
    "zip": "string",
    "country": "string"
  },
  "tickets": [
    {
      "ticketId": "string",
      "barcode": "string",
      "parentBarcode": "string",
      "bundleParentTicketId": "string",
      "ticketStatus": "string",
      "ticketStatusCode": 0,
      "customerType": 0,
      "customerTypeName": "string",
      "promoCode": "string",
      "packageId": 0,
      "packageDesc": "string",
      "packageClass": "string",
      "rateId": 0,
      "glCode": "string",
      "glCodeDescription": "string",
      "ticketRetailCost": "string",
      "ticketTaxCost": "string",
      "ticketTotalCost": "string",
      "ticketValue": "string",
      "ticketFees": [
        {
          "feeTypeId": "string",
          "feeType": "string",
          "feeAmount": "string"
        }
      ],
      "vendor": [
        {
          "vendorId": "string",
          "ticketCode": "string",
          "plu": "string"
        }
      ],
      "event": [
        {
          "eventId": "string",
          "eventDesc": "string"
        }
      ],
      "seasonPassNumber": "string",
      "passholderId": 0,
      "seasonPassExpirationDate": "2022-03-03T17:21:24.381Z",
      "passholderFirstName": "string",
      "passholderLastName": "string",
      "ticketEntitlements": [
        {
          "ticketEntitlementId": "string",
          "eventEntitlementId": "string",
          "entitlementRuleId": "string",
          "eventEntitlementName": "string",
          "data1": "string",
          "data2": "string",
          "value": "string",
          "entitlementStatus": "string",
          "validity": [
            {
              "daysOfWeek": [
                "string"
              ],
              "startDateTime": "2022-03-03T17:21:24.381Z",
              "endDateTime": "2022-03-03T17:21:24.381Z",
              "dateBlacklist": [
                "string"
              ]
            }
          ],
          "usageValue": "string",
          "usages": [
            {
              "usageId": "string",
              "usageTimestamp": "2022-03-03T17:21:24.381Z",
              "deviceId": "string",
              "agentId": "string",
              "accessPointId": "string",
              "usageStatus": "string",
              "usageValue": "string"
            }
          ]
        }
      ],
      "qsmartRedemptionUrl": "string",
      "qsmartTokenId": "string",
      "qbotActivationCode": "string",
      "characs": [
        {
          "key": "string",
          "value": "string"
        }
      ],
      "wholesaleRetail": "string",
      "wholesaleTax": "string",
      "wholesaleGross": "string",
      "resellerRetail": "string",
      "resellerTax": "string",
      "resellerGross": "string"
    }
  ],
  "characs": [
    {
      "key": "string",
      "value": "string"
    }
  ],
  "eventType": "string",
  "orderAction": {
    "orderId": 0,
    "actionType": "string",
    "paymentplanType": "string",
    "transactionTime": "2022-03-03T17:21:24.380Z",
    "actionDetail": {
      "transactionAmount": "string",
      "transactionPaymentMerchantId": "string",
      "transactionReferenceId": "string",
      "subsequentPaymentAttemptHeaderId": "string",
      "paymentStatus": "string",
      "declineDayOffset": "string",
      "cardType": "string",
      "nextRetry": "2022-03-03T17:21:24.380Z",
      "additionalData": "string"
    }
  }
}

Change Card

This event represents the action of a guest changing the card they have on file against their membership or deferred product order. The eventType for this event is CHANGE_CARD.

Allowed action types:

Membership Terminated

This event represents the action of a membership being temrinated by a guest or admin user. The eventType for this event is MEMBERSHIP_TERMINATED.

Allowed action types:

New Billing Attempt

This event represents the action of accesso’s billing service attempting to bill against a card on file and the subsequent result.

Allowed action types:

Bulk Events

Some events have the possibility of producing payloads that are exceedingly large, such as those resulting from bulk barcode scans. When this happens, a “bulk” event is produced on the webhook, which contains a URL to fetch the payload from cloud storage via an HTTP request.

Currently, bulk events can occur for new orders, season pass updates, and each of the three payment events.

For new orders and payment events, the schemas is the following:

1
2
3
4
5
{
   "eventType": "string",
   "orderId": "string",
   "payloadUrl": "string"
}

where eventType is one of

For season pass update events, the schema is the following:

1
2
3
4
5
6
{
   "eventType": "string",
   "orderId": "string",
   "seasonPassId": "string",
   "payloadUrl": "string"
}

where eventType is SEASONPASS_UPDATED_BULK.

Fetching payloads via the event URL

For protection of data in-flight, any request using the payload URL found in the events above requires a unique customer-provided encryption key. These are provided by accesso to clients. The following HTTP headers are required when making a GET request to the URL:

With these headers, the HTTP GET request can be made to the URL from the bulk event payload. This will fetch the full payload from the original NEW_ORDER or SEASONPASS_UPDATED event. A sample cURL request is below.

1
2
3
4
curl --location '<url>' \
--header 'x-amz-server-side-encryption-customer-algorithm: AES256' \
--header 'x-amz-server-side-encryption-customer-key: <encryption-key>' \
--header 'x-amz-server-side-encryption-customer-key-MD5: <md5-of-key>'

IMPORTANT NOTE: Due to AWS limitations, these URLs expire 12 hours after they are created; i.e., after the bulk event is sent on the webhook.

Verify Requests from Webhook Service

Webhook Service relies on signing secrets to guarantee that the requests being sent are authentic.

The sign is performed using a secret which is unique and shared for a client. So a client can verify requests from Webhook Service with confidence by verifying the signatures using its secret.

Each request sent by the Webhook Service contains an X-Accesso-Signature HTTP header. The signature is created by combining the shared secret with the properties of the body of the payload being sent using a standard HMAC-SHA256 key hash. The resulting signature is unique to each request since the request payload is used when generating the hash.

Steps to validate a request:

NOTE: This pseudocode example walks through validating a request. Nearly all modern programming languages can perform equivalent calculations with HMAC SHA256.

Grab the secret and the payload as a JSON string:

1
2
3
4
5
6
7
8
9
mySecret = "MY_SECRET";
json = "{\"id\":\"111cee3b-4632-4a53-b236-e350870b3294\",\"eventType\":\"CANCELED_TICKETS_DETAILS\"," +
        "\"timestamp\":1648473577324,\"data\":{\"eventType\":\"CANCELED_TICKETS\"," + 
        "\"canceledTickets\":{\"orderId\":\"32595\",\"reasonCode\":\"2\",\"agentId\":\"1\"," + 
        "\"status\":\"4\",\"lastUpdated\":\"2022-03-2809:19:35\"," + 
        "\"canceledTickets\":[{\"ticketId\":\"445212\",\"barcode\":\"445212032826737745\"," + 
        "\"status\":\"2\",\"packageId\":\"20552\",\"packageName\":\"PickaTime\"," + 
        "\"retailAmount\":\"17.79\",\"feeAmount\":\"0.00\",\"taxAmount\":\"1.25\"," + 
        "\"value\":\"19.04\"}]}}}";

Hash the body using the signing secret as a key:

1
String mySignature = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, mySecret).hmacHex(json);

Compare the resulting signature to the one being sent in the headers of the request:

NOTE: For best practice don’t compare directly the signatures for equality otherwise you could be vulnerable to timing attacks. The example below is using MessageDigest class for Java, you should use something like MessageDigest.isEqual in the language of your preference.

1
2
3
4
String accessoSignature = request.getHeader("X-Accesso-Signature");
if (MessageDigest.isEqual(mySignature.getBytes(), accessoSignature.getBytes()) {
  // deal with the request
}