PHP实现RSA签名生成订单功能【支付宝示例】

5年以前  |  阅读数:549 次  |  编程语言:PHP 

本文实例讲述了PHP实现RSA签名生成订单功能。分享给大家供大家参考,具体如下:


    //组合签名
    $a=time();
    $b=substr($a, 1);
    //生成随机订单号
    $orderid= $b.mt_rand(10000,99999);
    //合作身份者id,以2088开头的16位纯数字
    $mygoods['partner']="2088011744308664";
    //商家账号
    $mygoods['seller']="2088011744308664";
    //订单号
    $mygoods['out_trade_no']=$orderid;
    //主题
    $mygoods['subject']=$goods_name;
    //商品描述信息
    $mygoods['body']=$goods_infro;
    //商品价格
    $mygoods['total_fee']=$score;
    //服务器端异步响应地址
    $mygoods['notify_url']= "http://211.149.220.47/php/notify_url.php";
    //排序
    $mygoods = argSort($mygoods);
    //拼接
    $mystr = createLinkstring($mygoods);
    //签名
    $sign = rsaSign($mystr);
    //对签名进行urlencode转码
    $sign = urlencode($sign);
    //生成最终签名信息
    $orderInfor = $mystr."&sign;=".$sign."&sign;_type=RSA";
    /*******特殊的 验签支付宝反馈给App的签名信息*******/
    //支付宝反馈给App端信息拆解如下
    $str = 'body=%E7%B2%BE%E5%93%81%E5%84%BF%E7%AB%A5%E4%B9%A6%E5%8C%85%E5%96%9C%E6%B4%8B%E6%B4%8B%E7%9A%84&notify;_url=http%3A%2F%2F211.149.220.47%2Fphp%2Fnotify_url.php&out;_trade_no=40609294027478&partner;=2088011744308664&seller;=2088011744308664&subject;=%E4%B9%A6%E5%8C%85&success;=true&total;_fee=0.01';
    //被拆解后的支付宝签名
    $sign = 'Itorzqous2F7kYWWOpmoB%2FJUYgySRzh%2FOOKMhVhv%2BM48CnFk%2BQCp2cKcSsNGcDTs2AsAk%2BRYTuyMYZkGH56t8jcV2GGFkrJr%2FPxcGRlEK08QadAhImYzy9piVjoW0102lhSJYapiXGBTl5eiZ88RiyRA62D2nJEtH%2FBVXpuq63A%3D';
    //得到签名
    $sign = urldecode($sign);
    //得到待签名字符串
    $str = urldecode($str);
    //验签数据,验签成功将返回true 否则 flase
    var_dump(verify($str, $sign));
    /*************************需要使用到的方法*******************************/
    /**
     * 把数组所有元素,按照"参数=参数值"的模式用"&"字符拼接成字符串
     * @param $para 需要拼接的数组
     * return 拼接完成以后的字符串
     */
    function createLinkstring($para) {
      $arg = "";
      while (list ($key, $val) = each ($para)) {
        $arg.=$key."=".$val."&";
      }
      //去掉最后一个&字符
      $arg = substr($arg,0,count($arg)-2);
      //如果存在转义字符,那么去掉转义
      if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
      return $arg;
    }
    /**
     * 对数组排序
     * @param $para 排序前的数组
     * return 排序后的数组
     */
    function argSort($para) {
      ksort($para);
      reset($para);
      return $para;
    }
    /**
     * RSA签名
     * @param $data 待签名数据
     * @param $private_key_path 商户私钥文件路径
     * return 签名结果
     */
    function rsaSign($data, $private_key_path) {
      $priKey = file_get_contents($private_key_path);
      $res = openssl_get_privatekey($priKey);
      openssl_sign($data, $sign, $res);
      openssl_free_key($res);
      //base64编码
      $sign = base64_encode($sign);
      return $sign;
    }
    /**RSA验签
     * $data待签名数据
     * $sign需要验签的签名
     * 验签用支付宝公钥
     * return 验签是否通过 bool值
     */
    function verify($data, $sign) {
      //读取支付宝公钥文件
      $pubKey = file_get_contents('key/alipay_public_key.pem');
      //转换为openssl格式密钥
      $res = openssl_get_publickey($pubKey);
      //调用openssl内置方法验签,返回bool值
      $result = (bool)openssl_verify($data, base64_decode($sign), $res);
      //释放资源
      openssl_free_key($res);
      //返回资源是否成功
      return $result;
    }

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php排序算法总结》、《PHP常用遍历算法与技巧总结》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例