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 相关文章推荐
phpinfo 系统查看参数函数代码
Jun 05 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
php将access数据库转换到mysql数据库的方法
Dec 24 PHP
php实现无限级分类
Dec 24 PHP
php实现字符串首字母大写和单词首字母大写的方法
Mar 14 PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
Apr 10 PHP
PHP中trait使用方法详细介绍
May 21 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
PHP ob缓存以及ob函数原理实例解析
Nov 13 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
微信扫描二维码登录网站代码示例
2013/12/30 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
Python获取apk文件URL地址实例
2013/11/01 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
python tkinter canvas使用实例
2019/11/04 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
泰国网上购物:Shopee泰国
2018/09/14 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
公司业务主管岗位职责
2013/12/07 职场文书
教师实习自我鉴定
2013/12/11 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
校园运动会广播稿
2015/08/19 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书