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


Posted in PHP onJune 06, 2017

本文实例讲述了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¬ify_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 相关文章推荐
完美实现GIF动画缩略图的php代码
Jan 02 PHP
实用PHP会员权限控制实现原理分析
May 29 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
PHP中使用smarty生成静态文件的例子
Apr 24 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
详解PHP归并排序的实现
Oct 18 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP编程一定要改掉的5个不良习惯
Sep 18 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 #PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 #PHP
PHP培训要多少钱
Jun 06 #PHP
Mac系统完美安装PHP7详细教程
Jun 06 #PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 #PHP
PHP PDO操作MySQL基础教程
Jun 05 #PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 #PHP
You might like
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP自定义多进制的方法
2016/11/03 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
js获取单选按钮的数据
2006/11/27 Javascript
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
Structs界面控制层技术
2013/10/11 面试题
标准毕业生自荐信范文
2013/11/04 职场文书
装饰资料员岗位职责
2013/12/30 职场文书
2014年科普工作总结
2014/12/06 职场文书
中秋节慰问信
2015/02/15 职场文书
音乐课外活动总结
2015/05/09 职场文书
SQL写法--行行比较
2021/08/23 SQL Server
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL