如何在PHP中为Instamojo的支付链接创建签名?

时间:2015-03-20 15:28:26

标签: php instamojo

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

1 个答案:

答案 0 :(得分:4)

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

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

此处$message将是"|"分隔值,而$salt将是developers page中的私有盐(请确保您已登录)。

生成$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

对于上面的网址,您将获得以下订单:

  1. data_amount
  2. data_email
  3. data_name
  4. data_phone
  5. 使用上述键顺序,我们将按以下顺序获取值:

    1. 123.45
    2. aditya@instamojo.com
    3. Aditya Sengupta
    4. 9999999999
    5. 现在使用|(管道)运算符连接上述值,因此$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');
      

      有关详细信息,请阅读他们的Integration documentationHow do I ensure that the link is tamper proof?