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 相关文章推荐
用libTemplate实现静态网页的生成
Oct 09 PHP
dedecms中常见问题修改方法总结
Mar 21 PHP
PHP常用正则表达式集锦
Aug 17 PHP
PHP+redis实现添加处理投票的方法
Nov 14 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
Yii框架连接mongodb数据库的代码
Jul 27 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
Oct 08 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
浅谈PHP中类和对象的相关函数
Apr 26 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 09 PHP
php连接mysql数据库最简单的实现方法
Sep 24 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 文件上传系统手记
2009/10/26 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
Python中的两个内置模块介绍
2015/04/05 Python
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
Python中的函数作用域
2018/05/07 Python
基于python实现KNN分类算法
2020/04/23 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
python中adb有什么功能
2020/06/07 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
入党转预备思想汇报
2014/01/07 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
廉政承诺书2015
2015/04/28 职场文书
革命电影观后感
2015/06/18 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
MySQL学习总结-基础架构概述
2021/04/05 MySQL