Skip to main content

Data Signature and Verification

Generate data signature

Before generate signature, please make sure the following materials are ready:

  • Get your Merchant Safecode
  • Generate a RSA key pair. Your can generate it via our service or by yourself
  • Upload your RSA public key to our service

Please follow this guideline to generate your data signature:

  1. Sort request parameters by key in ASCII order
  2. Concat each parameters' key value by = and join all parameters by &, then append & and your safecode at suffix of sign string
  3. Encrypt sign string in SHA256 by your RSA private key
  4. Encode encrypted string in base64 to get your final signature
// Concatenated string before sign
amount=1&channel=alipay&currency=CNY&merchantid=123456&mid=1&notifyurl=www.abc.com/callback&returnurl=www.abc.com/returnurl&service=Payment&PUT_YOUR_SAFECODE_HERE
function generate_signature($params, $safecode, $sign_type): string
{
$serialize_sign = serialize_sign($params, $safecode, $sign_type);
$private_key = openssl_get_privatekey(file_get_contents('private_key.pem'));
openssl_sign($serialize_sign, $signature, $private_key, 'SHA256');
openssl_free_key($private_key);

return base64_encode($signature);
}

function serialize_sign(array $params, string $safecode, string $sign_type): string
{
switch ($sign_type) {
case 'payment_v2':
case 'withdraw_v2':
$sign_fields = [
'user_id', 'order_id', 'amount', 'currency', 'channel',
'timestamp',
];
break;
case 'payment_query_v2':
case 'withdraw_query_v2':
$sign_fields = ['user_id', 'order_id', 'timestamp'];
break;
case 'balance_v2':
$sign_fields = ['user_id', 'timestamp'];
break;

case 'payment_response':
$sign_fields = [
'user_id', 'order_id', 'transaction_id', 'channel',
'submit_currency', 'submit_amount', 'accept_currency', 'accept_amount',
'exchange_rate', 'pay_url',
];
break;
case 'withdraw_response':
$sign_fields = [
'user_id', 'order_id', 'transaction_id', 'channel',
'submit_currency', 'submit_amount', 'accept_currency', 'accept_amount',
'exchange_rate',
];
break;
case 'payment_query_response':
case 'withdraw_query_response':
$sign_fields = [
'user_id', 'order_id', 'transaction_id', 'channel',
'submit_currency', 'submit_amount', 'accept_currency', 'accept_amount',
'exchange_rate', 'status', 'timestamp',
];
break;
case 'balance_response':
default:
$sign_fields = ['user_id', 'timestamp'];
break;
}

if ($sign_fields) {
$params = array_intersect_key($params, array_flip($sign_fields));
}

ksort($params);

$sign = '';
foreach ($params as $key => $value) {
$sign .= $key.'='.$value.'&';
}
$sign .= $safecode;

return $sign;
}

Verify response signature of PTS

Before verify signature, please make sure the following materials are ready:

  • Get your Merchant Safecode
  • Get RSA public key of PTS

Please follow this guideline to verification signature sent from PTS:

  1. Sort response parameters except signature by key in ASCII order. All parameters except signature should participate in the verification string
  2. Concat key/value of parameters by = symbol, then join all parameters by & symbol
  3. Append & and your merchant safecode at suffix of the verification string
  4. Decode response signature by base64 decoder to binary signature
  5. Verify the binary signature via SHA256 with verification string and PTS public key
function verify_signature($response, $safecode, $signType)
{
$params = $response['data'];
$signature = base64_decode($params['sign']);

$serialize_sign = serialize_sign($params, $safecode, $signType);

$pubKey = openssl_get_publickey(file_get_contents('plateform_public_key.pem'));
$verified = openssl_verify($serialize_sign, $signature, $pubKey, OPENSSL_ALGO_SHA256);
openssl_free_key($pubKey);

return $verified !== 0;
}