Skip to main content
Message encoding prevents errors and ambiguity caused by special characters during transmission. Proper encoding ensures data integrity across all API communications.

Encoding Requirements

Byte Data (Signatures & Encrypted Content)

All binary data including signatures and encrypted content must be Base64 encoded before transmission. Method: Base64 encoding
// Encoding a signature
const signature = crypto.sign('RSA-SHA256', data, privateKey);
const encodedSignature = signature.toString('base64');

// For URL-safe contexts, use base64url
const base64UrlSignature = signature
  .toString('base64')
  .replace(/\+/g, '-')
  .replace(/\//g, '_')
  .replace(/=/g, '');
import base64

# Encoding a signature
signature = sign_data(data, private_key)
encoded_signature = base64.b64encode(signature).decode('utf-8')

# For URL-safe contexts
url_safe_signature = base64.urlsafe_b64encode(signature).decode('utf-8').rstrip('=')

HTTPS URL Data

URLs must be percent-encoded before transmission to handle special characters correctly. Method: URL encoding (percent-encoding)
OriginalEncoded
https://www.merchant.com/callback?order=123https%3A%2F%2Fwww.merchant.com%2Fcallback%3Forder%3D123
https://example.com/path with spaceshttps%3A%2F%2Fexample.com%2Fpath%20with%20spaces
// URL encoding
const callbackUrl = 'https://www.merchant.com/authorizationResult';
const encodedUrl = encodeURIComponent(callbackUrl);
// Result: https%3A%2F%2Fwww.merchant.com%2FauthorizationResult
from urllib.parse import quote

callback_url = 'https://www.merchant.com/authorizationResult'
encoded_url = quote(callback_url, safe='')
# Result: https%3A%2F%2Fwww.merchant.com%2FauthorizationResult

Character Sets

Request Body

  • Encoding: UTF-8
  • Content-Type: application/json; charset=UTF-8
All JSON request bodies should be UTF-8 encoded. Special characters in string values are automatically handled by JSON serialization.
const requestBody = {
  orderDescription: "Café latté × 2", // UTF-8 characters
  extendInfo: JSON.stringify({ note: "特殊字符" })
};

// Send with proper content-type
fetch(url, {
  headers: { 'Content-Type': 'application/json; charset=UTF-8' },
  body: JSON.stringify(requestBody)
});

Signature Calculation

When calculating signatures, the content to be signed must be properly encoded:
1

Construct String

Build the string to sign from HTTP method, URI, headers, and body
2

Encode to Bytes

Convert the string to UTF-8 bytes
3

Sign

Apply RSA-SHA256 signature algorithm
4

Base64 Encode

Encode the binary signature as Base64
// Complete signature flow
const contentToSign = [
  'POST',
  '/api/open/v2/payments/pay',
  clientId,
  requestTime,
  JSON.stringify(body)
].join('\n');

// Convert to bytes (UTF-8)
const bytes = Buffer.from(contentToSign, 'utf-8');

// Sign
const signer = crypto.createSign('RSA-SHA256');
signer.update(bytes);
const signature = signer.sign(privateKey);

// Base64 encode
const encodedSignature = signature.toString('base64');

Common Encoding Scenarios

Data TypeEncoding MethodExample Use Case
SignatureBase64Signature header value
Encrypted dataBase64Sensitive field encryption
Callback URLsURL encodingpaymentNotifyUrl parameter
JSON bodyUTF-8Request body transmission
Extended infoJSON stringextendInfo field

Best Practices

Double Encoding: Be careful not to encode data twice. If you URL-encode a value and then include it in a JSON body that gets URL-encoded again, you’ll have double-encoded data that won’t decode correctly.