2

我想知道我可以使用哪个函数在 PHP 中为 Instamojo 的支付链接创建签名,如果我有一组只读值,我应该遵循什么程序?

4

1 回答 1

4

您可以使用hash_hmacPHP 中的函数来创建签名。Instamojo 使用“sha1”算法,因此,您的hash_hmac调用将如下所示:

hash_hmac("sha1", $message, $salt)

$message将是"|"分离的值,并且$salt将是开发人员页面中的私有盐(确保您已登录)。

生成算法为$message

按其键的字母顺序排列只读字段。如果您有任何带有大写字母的键,请先将它们转换为小写字母。

假设网址是:

https://www.instamojo.com/demo/demo-offer/?data_name=Aditya+Sengupta&data_email=aditya@instamojo.com&data_phone=9999999999&data_amount=123.45&data_readonly=data_name&data_readonly=data_email&data_readonly=data_phone&data_readonly=data_amount

对于上面的 url,您将获得以下顺序:

  1. data_amount
  2. data_email
  3. data_name
  4. data_phone

使用上述键顺序,我们将按以下顺序获取值:

  1. 123.45
  2. aditya@instamojo.com
  3. 阿迪亚·森古普塔
  4. 9999999999

|现在使用(pipe) 运算符连接上述值,$message如下所示:

123.45|aditya@instamojo.com|Aditya Sengupta|9999999999

如果你$salt是“abcde”,那么你会得到这个作为签名:

$ php -a
Interactive shell

php > $message = "123.45|aditya@instamojo.com|Aditya Sengupta|9999999999";
php > $salt = "abcde";
php > echo hash_hmac("sha1", $message, $salt) . "\n";
676a4b5ba30e464f027249747a63ea587f8c4b9a

如果我有一个只读值数组怎么办

那么你需要先按键对数组进行排序,它应该不区分大小写。如果您使用的是 PHP 5.4.0 +,您可以执行以下操作:

php > $read_only_fields = ["data_email" => "aditya@instamojo.com", "data_Phone" => "9999999999", "data_name" => "Aditya Sengupta", "data_Amount" => "123.45"];
php > ksort($read_only_fields, SORT_STRING | SORT_FLAG_CASE);
php > $message = implode('|', $read_only_fields);
php > echo $message . "\n";
123.45|aditya@instamojo.com|Aditya Sengupta|9999999999
php > $salt = "abcde";
php > echo hash_hmac("sha1", $message, $salt) . "\n";
676a4b5ba30e464f027249747a63ea587f8c4b9a

对于旧版本的 PHP(早于 5.4.0),使用它进行排序:

uksort($data, 'strcasecmp');

有关更多信息,请阅读他们的集成文档以及如何确保链接是防篡改的?.

于 2015-03-20T15:28:26.243 回答