@payware/mcp-server 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.env.example +0 -0
  2. package/MCP-SETUP.md +0 -0
  3. package/README.md +56 -17
  4. package/check-keys.js +0 -0
  5. package/keys/README.md +0 -0
  6. package/mcp-config.json +0 -0
  7. package/package.json +1 -1
  8. package/payware-mcp-config.json +0 -0
  9. package/src/auth/rsa-keys.js +0 -0
  10. package/src/auth/sandbox-setup.js +2 -2
  11. package/src/config/env.js +0 -0
  12. package/src/config/partner-types.js +0 -0
  13. package/src/core/auth/jwt-factory.js +4 -4
  14. package/src/core/auth/jwt-token.js +107 -66
  15. package/src/core/utils/json-serializer.js +5 -5
  16. package/src/core/utils/key-utils.js +0 -0
  17. package/src/index.js +0 -0
  18. package/src/isv/data/index.js +0 -0
  19. package/src/isv/deep-links/delete-product-link.js +0 -0
  20. package/src/isv/deep-links/delete-transaction-link.js +0 -0
  21. package/src/isv/deep-links/get-product-link.js +0 -0
  22. package/src/isv/deep-links/get-transaction-link.js +0 -0
  23. package/src/isv/deep-links/index.js +0 -0
  24. package/src/isv/index.js +0 -0
  25. package/src/isv/oauth2/create-token-simple.js +0 -0
  26. package/src/isv/oauth2/get-token-info.js +0 -0
  27. package/src/isv/oauth2/obtain-token.js +0 -0
  28. package/src/isv/oauth2/token-helper.js +0 -0
  29. package/src/isv/poi/cancel-price.js +0 -0
  30. package/src/isv/poi/get-poi.js +0 -0
  31. package/src/isv/poi/get-qrcode.js +0 -0
  32. package/src/isv/poi/get-status.js +0 -0
  33. package/src/isv/poi/index.js +0 -0
  34. package/src/isv/poi/list-pois.js +0 -0
  35. package/src/isv/poi/set-price.js +0 -0
  36. package/src/isv/products/audios.js +0 -0
  37. package/src/isv/products/create-product.js +0 -0
  38. package/src/isv/products/delete-product.js +0 -0
  39. package/src/isv/products/get-product-image.js +0 -0
  40. package/src/isv/products/get-product.js +0 -0
  41. package/src/isv/products/index.js +0 -0
  42. package/src/isv/products/list-products.js +0 -0
  43. package/src/isv/products/schedules.js +0 -0
  44. package/src/isv/products/update-product.js +0 -0
  45. package/src/isv/transactions/cancel-transaction.js +2 -2
  46. package/src/isv/transactions/create-transaction.js +2 -2
  47. package/src/isv/transactions/get-status.js +0 -0
  48. package/src/isv/transactions/process-transaction.js +2 -2
  49. package/src/isv/transactions/simulate-callback.js +2 -2
  50. package/src/isv/transactions/transaction-history.js +0 -0
  51. package/src/isv/utils/auth.js +2 -2
  52. package/src/mcp-proxy.js +0 -0
  53. package/src/merchant/data/export-report.js +0 -0
  54. package/src/merchant/data/generate-report.js +0 -0
  55. package/src/merchant/data/get-export-list.js +0 -0
  56. package/src/merchant/data/get-report-requests.js +0 -0
  57. package/src/merchant/data/get-report-status.js +0 -0
  58. package/src/merchant/data/index.js +0 -0
  59. package/src/merchant/data/list-reports.js +0 -0
  60. package/src/merchant/deep-links/delete-product-link.js +0 -0
  61. package/src/merchant/deep-links/delete-transaction-link.js +0 -0
  62. package/src/merchant/deep-links/get-product-link.js +0 -0
  63. package/src/merchant/deep-links/get-transaction-link.js +0 -0
  64. package/src/merchant/deep-links/index.js +0 -0
  65. package/src/merchant/index.js +0 -0
  66. package/src/merchant/products/audios.js +0 -0
  67. package/src/merchant/products/create-product.js +0 -0
  68. package/src/merchant/products/delete-product.js +0 -0
  69. package/src/merchant/products/get-product-image.js +0 -0
  70. package/src/merchant/products/get-product.js +0 -0
  71. package/src/merchant/products/index.js +0 -0
  72. package/src/merchant/products/list-products.js +0 -0
  73. package/src/merchant/products/schedules.js +0 -0
  74. package/src/merchant/products/update-product.js +0 -0
  75. package/src/merchant/transactions/cancel-transaction.js +6 -6
  76. package/src/merchant/transactions/create-transaction.js +13 -13
  77. package/src/merchant/transactions/get-status.js +1 -1
  78. package/src/merchant/transactions/process-transaction.js +6 -6
  79. package/src/merchant/transactions/simulate-callback.js +0 -0
  80. package/src/merchant/transactions/transaction-history.js +1 -1
  81. package/src/payment-institution/data/index.js +0 -0
  82. package/src/payment-institution/deep-links/delete-transaction-link.js +0 -0
  83. package/src/payment-institution/deep-links/get-transaction-link.js +0 -0
  84. package/src/payment-institution/deep-links/index.js +0 -0
  85. package/src/payment-institution/index.js +0 -0
  86. package/src/payment-institution/transactions/create-pi-transaction.js +4 -4
  87. package/src/payment-institution/transactions/finalize-transaction.js +3 -3
  88. package/src/payment-institution/transactions/get-transaction-history.js +1 -1
  89. package/src/payment-institution/transactions/get-transaction-status.js +1 -1
  90. package/src/payment-institution/transactions/process-pi-transaction.js +3 -3
  91. package/src/payment-institution/transactions/simulate-pi-callback.js +0 -0
  92. package/src/payment-institution/transactions/soundbite-transaction.js +3 -3
  93. package/src/proxy-server.js +0 -0
  94. package/src/shared/data/data-api.js +0 -0
  95. package/src/shared/deep-links/api.js +0 -0
  96. package/src/shared/index.js +0 -0
  97. package/src/shared/products/products-api.js +0 -0
  98. package/src/tools/advanced-code-generator.js +53 -53
  99. package/src/utils/code-examples/common/auth-examples.js +38 -38
  100. package/src/utils/code-examples/common/helpers.js +0 -0
  101. package/src/utils/code-examples/common/utils-examples.js +0 -0
  102. package/src/utils/code-examples/frameworks/examples.js +4 -4
  103. package/src/utils/code-examples/index.js +0 -0
  104. package/src/utils/code-examples/isv/oauth2.js +0 -0
  105. package/src/utils/code-examples/isv/products.js +8 -8
  106. package/src/utils/code-examples/isv/transactions.js +9 -9
  107. package/src/utils/code-examples/merchant/products.js +0 -0
  108. package/src/utils/code-examples/merchant/transactions.js +9 -9
  109. package/src/utils/code-examples/payment-institution/transactions.js +0 -0
  110. package/src/utils/code-examples/shared/data.js +0 -0
  111. package/src/utils/code-examples/shared/deep-links.js +0 -0
  112. package/src/utils/code-examples/shared/soundbites.js +0 -0
  113. package/src/utils/code-examples.js +24 -24
  114. package/src/utils/format-request.js +3 -3
  115. package/src/utils/json-formatter.js +20 -20
  116. package/src/utils/server-info.js +0 -0
@@ -158,14 +158,14 @@ def create_jwt_token(request_body=None, use_sandbox=True):
158
158
  'typ': 'JWT'
159
159
  }
160
160
 
161
- # Add content MD5 for requests with body
161
+ # Add content SHA-256 for requests with body
162
162
  body_string = None
163
163
  if request_body:
164
164
  body_string = create_minimized_json(request_body)
165
- content_md5 = base64.b64encode(
166
- hashlib.md5(body_string.encode('utf-8')).digest()
165
+ content_sha256 = base64.b64encode(
166
+ hashlib.sha256(body_string.encode('utf-8')).digest()
167
167
  ).decode('utf-8')
168
- header['contentMd5'] = content_md5
168
+ header['contentSha256'] = content_sha256
169
169
 
170
170
  # Create JWT payload
171
171
  payload = {
@@ -179,7 +179,7 @@ def create_jwt_token(request_body=None, use_sandbox=True):
179
179
  return token, body_string
180
180
 
181
181
  def create_minimized_json(data):
182
- """Create deterministic minimized JSON for MD5 calculation"""
182
+ """Create deterministic minimized JSON for SHA-256 calculation"""
183
183
  def sort_dict(obj):
184
184
  if isinstance(obj, dict):
185
185
  return {k: sort_dict(v) for k, v in sorted(obj.items())}
@@ -415,15 +415,15 @@ function createJWTToken(requestBody = null, useSandbox = true) {
415
415
  typ: 'JWT'
416
416
  };
417
417
 
418
- // Add content MD5 for requests with body
418
+ // Add content SHA-256 for requests with body
419
419
  let bodyString = null;
420
420
  if (requestBody) {
421
421
  bodyString = createMinimizedJSON(requestBody);
422
- const contentMd5 = crypto
423
- .createHash('md5')
422
+ const contentSha256 = crypto
423
+ .createHash('sha256')
424
424
  .update(bodyString, 'utf8')
425
425
  .digest('base64');
426
- header.contentMd5 = contentMd5;
426
+ header.contentSha256 = contentSha256;
427
427
  }
428
428
 
429
429
  // Create JWT payload
File without changes
File without changes
File without changes
@@ -2,7 +2,7 @@
2
2
  * Generate code examples for different programming languages
3
3
  *
4
4
  * PAYWARE REQUIREMENT: All examples must demonstrate using the EXACT same
5
- * compact JSON string for both JWT contentMd5 calculation and HTTP body.
5
+ * compact JSON string for both JWT contentSha256 calculation and HTTP body.
6
6
  *
7
7
  * Examples use deterministic serialization to guarantee this consistency.
8
8
  */
@@ -41,7 +41,7 @@ with open('private_key.pem', 'r') as f:
41
41
  def create_deterministic_json(data):
42
42
  """Create consistent compact JSON for payware API
43
43
 
44
- REQUIREMENT: The exact same string must be used for JWT contentMd5 and HTTP body.
44
+ REQUIREMENT: The exact same string must be used for JWT contentSha256 and HTTP body.
45
45
  SOLUTION: Sort keys to guarantee consistent output across all platforms.
46
46
  """
47
47
  # Sort keys recursively to ensure deterministic output
@@ -66,11 +66,11 @@ def create_jwt_token(request_body=None):
66
66
  'typ': 'JWT'
67
67
  }
68
68
 
69
- # Add content MD5 for POST requests
69
+ # Add content SHA-256 for POST requests
70
70
  if request_body:
71
71
  body_string = create_deterministic_json(request_body)
72
- content_md5 = base64.b64encode(hashlib.md5(body_string.encode('utf-8')).digest()).decode('utf-8')
73
- header['contentMd5'] = content_md5
72
+ content_sha256 = base64.b64encode(hashlib.sha256(body_string.encode('utf-8')).digest()).decode('utf-8')
73
+ header['contentSha256'] = content_sha256
74
74
 
75
75
  # JWT payload
76
76
  payload = {
@@ -106,8 +106,8 @@ def create_transaction():
106
106
  'Api-Version': '1'
107
107
  }
108
108
 
109
- # CRITICAL: Send the EXACT same string used for JWT contentMd5 calculation
110
- # This prevents ERR_INVALID_MD5 authentication errors
109
+ # CRITICAL: Send the EXACT same string used for JWT contentSha256 calculation
110
+ # This prevents ERR_INVALID_CONTENT_HASH authentication errors
111
111
  response = requests.post(f"{SANDBOX_URL}/transactions", data=deterministic_body, headers=headers)
112
112
  return response.json()
113
113
 
@@ -161,9 +161,9 @@ def create_jwt_token(request_body=None):
161
161
  'typ': 'JWT'
162
162
  }
163
163
 
164
- # Add content MD5 for requests with body
164
+ # Add content SHA-256 for requests with body
165
165
  if request_body:
166
- # PAYWARE REQUIREMENT: Same string for JWT MD5 and HTTP body
166
+ # PAYWARE REQUIREMENT: Same string for JWT SHA-256 and HTTP body
167
167
  # SOLUTION: Use deterministic serialization (sorted keys)
168
168
  def sort_dict(obj):
169
169
  if isinstance(obj, dict):
@@ -175,8 +175,8 @@ def create_jwt_token(request_body=None):
175
175
 
176
176
  sorted_data = sort_dict(request_body)
177
177
  body_string = json.dumps(sorted_data, separators=(',', ':'))
178
- content_md5 = base64.b64encode(hashlib.md5(body_string.encode('utf-8')).digest()).decode('utf-8')
179
- header['contentMd5'] = content_md5
178
+ content_sha256 = base64.b64encode(hashlib.sha256(body_string.encode('utf-8')).digest()).decode('utf-8')
179
+ header['contentSha256'] = content_sha256
180
180
 
181
181
  # JWT payload
182
182
  payload = {
@@ -233,7 +233,7 @@ def create_transaction(jwt_token):
233
233
  }
234
234
  }
235
235
 
236
- # PAYWARE REQUIREMENT: Same string for JWT MD5 and HTTP body
236
+ # PAYWARE REQUIREMENT: Same string for JWT SHA-256 and HTTP body
237
237
  # SOLUTION: Use deterministic serialization (sorted keys)
238
238
  def sort_dict(obj):
239
239
  if isinstance(obj, dict):
@@ -254,7 +254,7 @@ def create_transaction(jwt_token):
254
254
 
255
255
  return response.json()
256
256
 
257
- # Note: JWT token must include contentMd5 hash for the request body
257
+ # Note: JWT token must include contentSha256 hash for the request body
258
258
  # Use the auth_only example to create a proper token with body hash`;
259
259
 
260
260
  default:
@@ -290,7 +290,7 @@ const SANDBOX_URL = 'https://sandbox.payware.eu/api';
290
290
  const PRIVATE_KEY = fs.readFileSync('private_key.pem', 'utf8');
291
291
 
292
292
  function createDeterministicJSON(data) {
293
- // PAYWARE REQUIREMENT: Same compact JSON for JWT MD5 and HTTP body
293
+ // PAYWARE REQUIREMENT: Same compact JSON for JWT SHA-256 and HTTP body
294
294
  // SOLUTION: Sort keys to guarantee consistent output
295
295
  function sortObject(obj) {
296
296
  if (Array.isArray(obj)) {
@@ -318,12 +318,12 @@ function createJWTToken(requestBody = null) {
318
318
  typ: 'JWT'
319
319
  };
320
320
 
321
- // Add content MD5 for POST requests
321
+ // Add content SHA-256 for POST requests
322
322
  let deterministicBody = null;
323
323
  if (requestBody) {
324
324
  deterministicBody = createDeterministicJSON(requestBody);
325
- const contentMd5 = crypto.createHash('md5').update(deterministicBody, 'utf8').digest('base64');
326
- header.contentMd5 = contentMd5;
325
+ const contentSha256 = crypto.createHash('sha256').update(deterministicBody, 'utf8').digest('base64');
326
+ header.contentSha256 = contentSha256;
327
327
  }
328
328
 
329
329
  // JWT payload
@@ -361,8 +361,8 @@ async function createTransaction() {
361
361
  };
362
362
 
363
363
  try {
364
- // CRITICAL: Send the EXACT same string used for JWT contentMd5 calculation
365
- // This prevents ERR_INVALID_MD5 authentication errors
364
+ // CRITICAL: Send the EXACT same string used for JWT contentSha256 calculation
365
+ // This prevents ERR_INVALID_CONTENT_HASH authentication errors
366
366
  const response = await axios.post(\`\${SANDBOX_URL}/transactions\`, deterministicBody, {
367
367
  headers,
368
368
  // Tell axios to send the string as-is, don't serialize it again
@@ -429,9 +429,9 @@ function createJWTToken(requestBody = null) {
429
429
  typ: 'JWT'
430
430
  };
431
431
 
432
- // Add content MD5 for requests with body
432
+ // Add content SHA-256 for requests with body
433
433
  if (requestBody) {
434
- // PAYWARE REQUIREMENT: Same string for JWT MD5 and HTTP body
434
+ // PAYWARE REQUIREMENT: Same string for JWT SHA-256 and HTTP body
435
435
  // SOLUTION: Use deterministic serialization (sorted keys)
436
436
  function sortObject(obj) {
437
437
  if (Array.isArray(obj)) {
@@ -448,8 +448,8 @@ function createJWTToken(requestBody = null) {
448
448
 
449
449
  const sortedData = sortObject(requestBody);
450
450
  const bodyString = JSON.stringify(sortedData);
451
- const contentMd5 = crypto.createHash('md5').update(bodyString, 'utf8').digest('base64');
452
- header.contentMd5 = contentMd5;
451
+ const contentSha256 = crypto.createHash('sha256').update(bodyString, 'utf8').digest('base64');
452
+ header.contentSha256 = contentSha256;
453
453
  }
454
454
 
455
455
  // JWT payload
@@ -617,7 +617,7 @@ ${code}
617
617
  - Includes required \`Api-Version: 1\` header
618
618
  - Uses proper request body structure with \`trData\` and \`trOptions\`
619
619
  - JWT includes \`aud: 'https://payware.eu'\` claim
620
- - POST requests include \`contentMd5\` hash in JWT header
620
+ - POST requests include \`contentSha256\` hash in JWT header
621
621
  - Amount format uses decimal strings (e.g., '10.00')
622
622
  - Uses \`reasonL1\`/\`reasonL2\` instead of \`description\`
623
623
 
@@ -241,7 +241,7 @@ ${formatted.request.trData.reasonL2 ? `- Description L2: ${formatted.request.trD
241
241
  ${formatted.request.callbackUrl ? `- Callback URL: ${formatted.request.callbackUrl}` : ''}
242
242
 
243
243
  **Usage:**
244
- Use the minimized JSON format for API calls to ensure MD5 consistency:
244
+ Use the minimized JSON format for API calls to ensure SHA-256 consistency:
245
245
  \`\`\`javascript
246
246
  const response = await fetch('https://sandbox.payware.eu/api/transactions', {
247
247
  method: 'POST',
@@ -249,11 +249,11 @@ const response = await fetch('https://sandbox.payware.eu/api/transactions', {
249
249
  'Authorization': 'Bearer YOUR_JWT_TOKEN',
250
250
  'Content-Type': 'application/json'
251
251
  },
252
- body: '${minimizedJSON}' // Use pre-minimized string for MD5 consistency
252
+ body: '${minimizedJSON}' // Use pre-minimized string for SHA-256 consistency
253
253
  });
254
254
  \`\`\`
255
255
 
256
- **⚠️ Important:** Always use the minimized JSON format to ensure the MD5 hash in your JWT token matches the request body.
256
+ **⚠️ Important:** Always use the minimized JSON format to ensure the SHA-256 hash in your JWT token matches the request body.
257
257
 
258
258
  **Formatted:** ${formatted.formatted}
259
259
  **Timestamp:** ${formatted.timestamp}`
@@ -4,14 +4,14 @@
4
4
  */
5
5
 
6
6
  import { createDeterministicJSON, validateJSONConsistency } from '../core/utils/json-serializer.js';
7
- import { generateContentMd5 } from '../core/auth/jwt-token.js';
7
+ import { generateContentSha256 } from '../core/auth/jwt-token.js';
8
8
 
9
9
  /**
10
10
  * Format JSON with deterministic serialization tool
11
11
  */
12
12
  export const formatJSONDeterministicTool = {
13
13
  name: "payware_utils_format_json_deterministic",
14
- description: "Format JSON payload with deterministic key sorting for consistent MD5 calculation and payware API compliance",
14
+ description: "Format JSON payload with deterministic key sorting for consistent SHA-256 calculation and payware API compliance",
15
15
  inputSchema: {
16
16
  type: "object",
17
17
  properties: {
@@ -24,9 +24,9 @@ export const formatJSONDeterministicTool = {
24
24
  description: "Show comparison between standard and deterministic JSON",
25
25
  default: true
26
26
  },
27
- calculateMD5: {
27
+ calculateSHA256: {
28
28
  type: "boolean",
29
- description: "Calculate MD5 hash for JWT contentMd5 usage",
29
+ description: "Calculate SHA-256 hash for JWT contentSha256 usage",
30
30
  default: true
31
31
  },
32
32
  validateConsistency: {
@@ -43,7 +43,7 @@ export const formatJSONDeterministicTool = {
43
43
  const {
44
44
  payload,
45
45
  showComparison = true,
46
- calculateMD5 = true,
46
+ calculateSHA256 = true,
47
47
  validateConsistency = false
48
48
  } = args;
49
49
 
@@ -57,8 +57,8 @@ export const formatJSONDeterministicTool = {
57
57
  const prettyJson = JSON.stringify(payload, null, 2);
58
58
  const deterministicJson = createDeterministicJSON(payload);
59
59
 
60
- // Calculate MD5 hash
61
- const md5Hash = calculateMD5 ? generateContentMd5(payload) : null;
60
+ // Calculate SHA-256 hash
61
+ const sha256Hash = calculateSHA256 ? generateContentSha256(payload) : null;
62
62
 
63
63
  // Get key ordering information
64
64
  const originalKeys = Object.keys(payload);
@@ -115,27 +115,27 @@ ${isAlreadySorted ?
115
115
  '- ✅ Your object keys are already in sorted order' :
116
116
  `- ❌ Keys will be reordered: ${originalKeys.join(' → ')} becomes ${sortedKeys.join(' → ')}`}
117
117
  - ✅ Deterministic JSON ensures consistent serialization across platforms
118
- - ✅ Required for accurate MD5 hash calculation in JWT tokens
118
+ - ✅ Required for accurate SHA-256 hash calculation in JWT tokens
119
119
  ` : ''}
120
120
 
121
121
  ## ✅ **payware API Ready JSON**
122
122
 
123
- Use this exact JSON string for both JWT MD5 calculation and HTTP request body:
123
+ Use this exact JSON string for both JWT SHA-256 calculation and HTTP request body:
124
124
 
125
125
  \`\`\`json
126
126
  ${deterministicJson}
127
127
  \`\`\`
128
128
 
129
- ${calculateMD5 ? `## 🔒 **MD5 Hash for JWT**
129
+ ${calculateSHA256 ? `## 🔒 **SHA-256 Hash for JWT**
130
130
 
131
- **contentMd5**: \`${md5Hash}\`
131
+ **contentSha256**: \`${sha256Hash}\`
132
132
 
133
133
  **Usage in JWT Header**:
134
134
  \`\`\`json
135
135
  {
136
136
  "alg": "RS256",
137
137
  "typ": "JWT",
138
- "contentMd5": "${md5Hash}"
138
+ "contentSha256": "${sha256Hash}"
139
139
  }
140
140
  \`\`\`
141
141
  ` : ''}
@@ -187,22 +187,22 @@ ${consistencyTest ? `## 🧪 **Consistency Validation**
187
187
 
188
188
  **All Match**: ${consistencyTest.allMatch ? '✅ Consistent' : '❌ Inconsistent'}
189
189
 
190
- ${!consistencyTest.allMatch ? '⚠️ **Warning**: Inconsistent serialization detected. This could cause MD5 mismatches.' : ''}
190
+ ${!consistencyTest.allMatch ? '⚠️ **Warning**: Inconsistent serialization detected. This could cause SHA-256 mismatches.' : ''}
191
191
  ` : ''}
192
192
 
193
193
  ## ⚠️ **PAYWARE Critical Requirements**
194
194
 
195
- 1. **Same String Requirement**: The EXACT same compact JSON string must be used for both JWT contentMd5 and HTTP request body
195
+ 1. **Same String Requirement**: The EXACT same compact JSON string must be used for both JWT contentSha256 and HTTP request body
196
196
  2. **Compact Format**: No extra whitespace (spaces, newlines) in JSON
197
197
  3. **Consistent Serialization**: Use deterministic serialization to prevent variations
198
- 4. **MD5 Consistency**: Any difference will cause ERR_INVALID_MD5 authentication failures
198
+ 4. **SHA-256 Consistency**: Any difference will cause ERR_INVALID_CONTENT_HASH authentication failures
199
199
 
200
200
  Note: Sorted keys are our METHOD to guarantee requirement #1, not a payware requirement itself.
201
201
 
202
202
  ## 🔗 **Next Steps**
203
203
 
204
204
  1. Use the deterministic JSON above in your API request
205
- 2. Include the MD5 hash in your JWT header${calculateMD5 ? ` (\`${md5Hash}\`)` : ''}
205
+ 2. Include the SHA-256 hash in your JWT header${calculateSHA256 ? ` (\`${sha256Hash}\`)` : ''}
206
206
  3. Send the exact same JSON string in your HTTP request body
207
207
  4. Verify with \`payware_authentication_validate_jwt\` tool
208
208
 
@@ -211,7 +211,7 @@ Note: Sorted keys are our METHOD to guarantee requirement #1, not a payware requ
211
211
  - Tool: payware_utils_format_json_deterministic
212
212
  - Keys Processed: ${originalKeys.length}
213
213
  - Sorting Required: ${!isAlreadySorted}
214
- - MD5 Calculated: ${calculateMD5}
214
+ - SHA-256 Calculated: ${calculateSHA256}
215
215
  - Executed: ${new Date().toISOString()}
216
216
  - Status: ✅ Complete`
217
217
  }]
@@ -228,10 +228,10 @@ Note: Sorted keys are our METHOD to guarantee requirement #1, not a payware requ
228
228
  - Invalid JSON structure
229
229
  - Circular references in payload
230
230
  - Non-serializable values (functions, undefined, etc.)
231
- - Different JSON strings used for JWT MD5 vs HTTP body
231
+ - Different JSON strings used for JWT SHA-256 vs HTTP body
232
232
 
233
- **Debug Steps for MD5 Errors**:
234
- 1. Verify the SAME string is used for JWT contentMd5 and HTTP body
233
+ **Debug Steps for SHA-256 Errors**:
234
+ 1. Verify the SAME string is used for JWT contentSha256 and HTTP body
235
235
  2. Check for extra whitespace or formatting differences
236
236
  3. Ensure consistent property ordering (use deterministic serialization)
237
237
  4. Validate that objects are properly serializable
File without changes