快速开始
Jpay 支持 API 接入,也支持 Wordpress、Shoplazza 等第三方平台(见扩展或联系工作人员)。
生成签名
The signature value is an uppercase MD5 hash of a sorted, URL-encoded parameter string concatenated with your merchant API key. Include the resulting value in the sign or pay_md5sign field of each request.
Signature data
Collect all request parameters with non-empty values (excluding sign and pay_md5sign), sort them by parameter name in ASCII order, and join them as key1=value1&key2=value2.... Append &key={merchantApiKey} to form stringSignTemp.
Only top-level scalar fields participate in signing. Nested objects and arrays are sent in the request body but are not included in the signature string.
Example data
| Field | Description | Test data |
|---|---|---|
pay_orderid | Merchant order ID. | ORDER123456 |
pay_amount | Payment amount. | 100.00 |
pay_memberid | Merchant ID. | 10010 |
pay_applydate | Order timestamp. | 2024-01-01 12:00:00 |
pay_bankcode | Bank code. | 901 |
pay_notifyurl | Async notification URL. | https://example.com/notify |
pay_callbackurl | Return URL after payment. | https://example.com/callback |
key | Merchant API key appended during signing. | 7e4nicn14nhyup146dfbi8hpnpus9juz |
Steps
- Filter out empty values and the
sign/pay_md5signfields from the request parameters. - Sort the remaining parameter names in ascending ASCII order and join them as URL key-value pairs.
- Append
&key={merchantApiKey}to buildstringSignTemp. - Compute
MD5(stringSignTemp)and convert the result to uppercase.
Expected stringSignTemp with the test data above
stringSignTemp
pay_amount=100.00&pay_applydate=2024-01-01 12:00:00&pay_bankcode=901&pay_callbackurl=https://example.com/callback&pay_memberid=10010&pay_notifyurl=https://example.com/notify&pay_orderid=ORDER123456&key=7e4nicn14nhyup146dfbi8hpnpus9juzExpected signature with the test data above
sign
F8E5D99685501D1676CA95A3871581EACode examples
- Javascript
- PHP
- Python
import { md5 } from "js-md5";
const KEY = "7e4nicn14nhyup146dfbi8hpnpus9juz";
const params = {
pay_orderid: "ORDER123456",
pay_amount: "100.00",
pay_memberid: "10010",
pay_applydate: "2024-01-01 12:00:00",
pay_bankcode: "901",
pay_notifyurl: "https://example.com/notify",
pay_callbackurl: "https://example.com/callback",
};
function generateSign(data, key) {
const signData = [];
Object.keys(data)
.filter((name) => data[name] !== "" && data[name] != null)
.sort()
.forEach((name) => signData.push(`${name}=${data[name]}`));
signData.push(`key=${key}`);
return md5(signData.join("&")).toUpperCase();
}
const sign = generateSign(params, KEY);
console.log(sign); // F8E5D99685501D1676CA95A3871581EA<?php
$key = '7e4nicn14nhyup146dfbi8hpnpus9juz';
$params = [
'pay_orderid' => 'ORDER123456',
'pay_amount' => '100.00',
'pay_memberid' => '10010',
'pay_applydate' => '2024-01-01 12:00:00',
'pay_bankcode' => '901',
'pay_notifyurl' => 'https://example.com/notify',
'pay_callbackurl' => 'https://example.com/callback',
];
ksort($params);
$parts = [];
foreach ($params as $name => $value) {
if ($value !== '' && $value !== null) {
$parts[] = $name . '=' . $value;
}
}
$parts[] = 'key=' . $key;
$stringSignTemp = implode('&', $parts);
$sign = strtoupper(md5($stringSignTemp));
echo $sign; // F8E5D99685501D1676CA95A3871581EAimport hashlib
KEY = "7e4nicn14nhyup146dfbi8hpnpus9juz"
params = {
"pay_orderid": "ORDER123456",
"pay_amount": "100.00",
"pay_memberid": "10010",
"pay_applydate": "2024-01-01 12:00:00",
"pay_bankcode": "901",
"pay_notifyurl": "https://example.com/notify",
"pay_callbackurl": "https://example.com/callback",
}
sign_data = [
f"{name}={value}"
for name, value in sorted(params.items())
if value not in ("", None)
]
sign_data.append(f"key={KEY}")
string_sign_temp = "&".join(sign_data)
sign = hashlib.md5(string_sign_temp.encode("utf-8")).hexdigest().upper()
print(sign) # F8E5D99685501D1676CA95A3871581EA