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 需要掌握的东西 不做浮躁的人
Dec 28 PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
PHP函数eval()介绍和使用示例
Aug 20 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
Yii CGridView用法实例详解
Jul 12 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
Swoole扩展的6种模式深入详解
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
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP 验证登陆类分享
2015/03/13 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python 自动去除空行的实例
2018/07/24 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
浅谈Python基础—判断和循环
2019/03/22 Python
python 读取数据库并绘图的实例
2019/12/03 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
商务英语毕业生自荐信范文
2013/11/08 职场文书
办理护照介绍信
2014/01/16 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
精神文明建设标语
2014/06/16 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
领导工作表现评语
2015/01/04 职场文书
中标通知书
2015/04/17 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
生日祝酒词大全
2015/08/10 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技