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令牌 Token改进版
Jul 18 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
May 02 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
PHP中filter函数校验数据的方法详解
Jul 31 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
简单谈谈 php 文件锁
Feb 19 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
Oct 21 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
德生1994机评
2021/03/02 无线电
在php MYSQL中插入当前时间
2008/04/06 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
TensorFlow高效读取数据的方法示例
2018/02/06 Python
Python pickle模块实现对象序列化
2019/11/22 Python
python基于socket函数实现端口扫描
2020/05/28 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
毕业生就业意向书
2014/04/01 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
公司备用金管理制度
2015/08/04 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
Golang生成Excel文档的方法步骤
2021/06/09 Golang
分享Python异步爬取知乎热榜
2022/04/12 Python