PHP code example of ajaxjs / query-sign-php
1. Go to this page and download the library: Download ajaxjs/query-sign-php library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ajaxjs / query-sign-php example snippets
spl_autoload_register(static function (string $class): void {
$prefix = 'QuerySign\\';
if (strncmp($class, $prefix, strlen($prefix)) !== 0) {
return;
}
$file = __DIR__ . '/vendor/ajaxjs/query-sign-php/src/'
. str_replace('\\', '/', substr($class, strlen($prefix))) . '.php';
if (is_file($file)) {
use QuerySign\QuerySign;
$qs = new QuerySign(['secret' => 'my-secret-key']);
$qs->data([
'appId' => 'wx1234567890',
'ts' => 1700000000,
'nonce' => 'a1b2c3',
'user' => ['id' => 7, 'name' => 'tom'],
]);
$qs->getStringToSign();
// => 'appId=wx1234567890&nonce=a1b2c3&ts=1700000000&user%5Bid%5D=7&user%5Bname%5D=tom'
$qs->getSign();
// => 'aca22e904d66fb82b613f97e2867e9e65270d4cde0f9aa62236798d450e50e71'
(string) $qs; // 等价于 $qs->toString()
// => 'appId=wx1234567890&nonce=a1b2c3&ts=1700000000&user%5Bid%5D=7&user%5Bname%5D=tom&sign=aca22e904d66fb82b613f97e2867e9e65270d4cde0f9aa62236798d450e50e71'
$qs->sign();
// => ['appId' => 'wx1234567890', 'ts' => 1700000000, 'nonce' => 'a1b2c3',
// 'user' => ['id' => 7, 'name' => 'tom'], 'sign' => 'aca22e90...']
json_encode($qs->sign());
// => {"appId":"wx1234567890","ts":1700000000,"nonce":"a1b2c3","user":{"id":7,"name":"tom"},"sign":"aca22e904d66fb82b613f97e2867e9e65270d4cde0f9aa62236798d450e50e71"}
$qs = new QuerySign(['secret' => 'my-secret-key']);
// 直接把整个请求参数丢进来即可
$qs->data($_GET);
if (!$qs->verify()) {
http_response_code(403);
exit('invalid signature');
}
$qs->options();
// => ['secret' => 'my-secret-key', 'signField' => 'sign', 'algorithm' => 'sha256',
// 'encoding' => 'hex', 'uppercase' => false, 'loose' => false]
QuerySign::SPEC_VERSION; // => 1,规范版本号,跨语言实现必须一致
QuerySign::COMMON_ALGORITHMS; // => ['md5','sha1','sha224','sha256','sha384','sha512']
use QuerySign\Exception\InvalidArgumentException;
try {
$qs->data(['at' => new DateTime()]);
} catch (InvalidArgumentException $e) {
// query-sign: 不支持的值类型 object(DateTime) (路径: at),请先转换为关联数组/索引数组或字符串
}
use QuerySign\Exception\ExceptionInterface;
try {
$sign = $qs->getSign();
} catch (ExceptionInterface | \TypeError $e) {
// ...
}
$qs = new QuerySign(['secret' => 'k']);
// null 被整体丢弃,0 / '' / false 照常参与
$qs->data(['a' => 1, 'b' => null, 'c' => ['d' => null, 'e' => 2], 'f' => [], 'g' => 0, 'h' => '', 'i' => false]);
$qs->getStringToSign();
// => 'a=1&c%5Be%5D=2&g=0&h=&i=false'
// 只有顶层的 sign 被剔除,嵌套的 sign 照常参与
$qs->data(['sign' => 'keep-me', 'x' => ['sign' => 'inner']]);
$qs->getStringToSign();
// => 'x%5Bsign%5D=inner'
$qs->data(['amount' => '88.88']); // 推荐
$qs->data(['amount' => 88.88]); // 可用,但依赖两端浮点格式化完全一致
$qs->data(['at' => new DateTime()]); // ✗ 请自行 ->format(DATE_ATOM)
$qs->data(['id' => $someObject]); // ✗ 请自行 (array) 或 get_object_vars()
$qs->data(['fh' => fopen(...)]); // ✗ resource
$qs->data(['n' => NAN]); // ✗
$data = json_decode('{"0":"x","1":"y","2":"z"}', true);
// PHP 得到的是索引数组 [0 => 'x', 1 => 'y', 2 => 'z'],不是关联数组
$qs = new QuerySign(['secret' => 'my-secret-key']);
$qs->data(json_decode('{"0":"x","1":"y","2":"z"}', true));
$qs->getStringToSign();
// => '0=x&1=y&2=z'
$qs->getSign();
// => 'cd9bcc4f7b83320e0bf846d1258ec36c753cbeb45751cad2c85faa8737a1745e'
$qs = new QuerySign(['secret' => 'my-secret-key']);
$qs->data([10, 20]);
$qs->getStringToSign(); // => '0=10&1=20'
$qs->getSign(); // => '10d990bdc1ac924da51e00f473cd16a980e2a3c76e2b0b838e64fce0722f6b36'
json_encode($qs->sign());
// => {"0":10,"1":20,"sign":"10d990bdc1ac924da51e00f473cd16a980e2a3c76e2b0b838e64fce0722f6b36"}
$qs = new QuerySign(['secret' => 'k', 'encoding' => 'base64']);
$qs->data(['a' => 'x', 'b' => 1, 'c' => ['d' => [1, 2]]]);
$qs->getSign();
// => 'e6u2DDb5kxLyBwzj6aPU1ywvhZ3fMgxH/XC2YijLgQc='
$qs->toString();
// => 'a=x&b=1&c%5Bd%5D%5B0%5D=1&c%5Bd%5D%5B1%5D=2&sign=e6u2DDb5kxLyBwzj6aPU1ywvhZ3fMgxH%2FXC2YijLgQc%3D'
$qs = new QuerySign(['secret' => 'my-secret-key', 'loose' => true]);
$qs->data(['a' => 1, 'sign' => 'BD2EE5E60CD0794933ADF88E60C8D764A2D073B5CE4BC27CE64D66B6EF4D5C34']);
$qs->verify(); // => true(小写形式是 bd2ee5e60cd0794933adf88e60c8d764a2d073b5ce4bc27ce64d66b6ef4d5c34)
$qs = new QuerySign(['secret' => 'my-secret-key', 'signField' => 'signature']);
$qs->data(['a' => 1, 'b' => 2]);
json_encode($qs->sign());
// => {"a":1,"b":2,"signature":"5e7316c24a005a818c9a98b0692c437be9577737df3c1ca3d9fbfa08556f88f6"}
bash
composer bash
php tests/run.php