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 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
让你同时上传 1000 个文件 (二)
Oct 09 PHP
php+mysql开源XNA 聚合程序发布 下载
Jul 13 PHP
centos 5.6 升级php到5.3的方法
May 14 PHP
php中filter函数验证、过滤用户输入的数据
Jan 13 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
php中strtotime函数用法详解
Nov 15 PHP
简单谈谈PHP vs Node.js
Jul 17 PHP
PHP微信红包生成代码分享
Oct 06 PHP
php array_key_exists() 与 isset() 的区别
Oct 24 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 PHP
Yii框架应用组件用法实例分析
May 15 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
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
IE6 fixed的完美解决方案
2011/03/31 Javascript
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
python实现目录树生成示例
2014/03/28 Python
python中将字典转换成其json字符串
2014/07/16 Python
Python使用gensim计算文档相似性
2016/04/10 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
python实现简单井字棋游戏
2020/03/04 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
最新的大学生找工作自我评价
2013/09/29 职场文书
英语文学专业学生的自我评价
2013/10/31 职场文书
会计学个人自荐信模板
2013/12/13 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server