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 相关文章推荐
php 数组的合并、拆分、区别取值函数集
Feb 15 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 PHP
php实现的递归提成方案实例
Nov 14 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
php下载文件,添加响应头的简单实例
Sep 22 PHP
Yii框架表单提交验证功能分析
Jan 07 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
Yii2语言国际化自动配置详解
Aug 22 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
PHP实现页面静态化深入讲解
Mar 04 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
Google韩国首页图标动画效果
2007/08/26 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
JavaScript变量的作用域全解析
2015/08/14 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
python字典get()方法用法分析
2015/04/17 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
python中子类继承父类的__init__方法实例
2016/12/15 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python分布式编程实现过程解析
2019/11/08 Python
Python生成器generator原理及用法解析
2020/07/20 Python
产品促销活动策划书
2014/01/15 职场文书
春节联欢会主持词
2014/03/24 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python