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
php面向对象全攻略 (十五) 多态的应用
Sep 30 PHP
PHP 多维数组排序(usort,uasort)
Jun 30 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
PHP高级编程实例:编写守护进程
Sep 02 PHP
php字符串截取函数用法分析
Nov 25 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
Jul 09 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
vmware linux系统安装最新的php7图解
Apr 14 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
Session的工作方式
2006/10/09 PHP
PHP 图片上传代码
2011/09/13 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
原生js实现九宫格拖拽换位
2021/01/26 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
RealTek面试题
2016/06/28 面试题
电子商务专业推荐信范文
2013/12/02 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书