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中session退出登陆问题
Feb 27 PHP
CodeIgniter CLI模式简介
Jun 17 PHP
php数组添加元素方法小结
Dec 20 PHP
简单介绍PHP的责任链编程模式
Aug 11 PHP
谈谈 PHP7新增功能
Dec 16 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
Oct 18 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
May 02 PHP
php将xml转化对象的实例详解
Nov 17 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+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
react高阶组件添加和删除props
2019/04/26 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python检索特定内容的文本文件实例
2018/06/05 Python
python实现三维拟合的方法
2018/12/29 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
西安交大自主招生自荐信
2014/01/27 职场文书
董事长秘书职责
2014/01/31 职场文书
亮剑精神演讲稿
2014/05/23 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android