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 表单验证实现代码
Mar 10 PHP
php error_log 函数的使用
Apr 13 PHP
php SQL Injection with MySQL
Feb 27 PHP
PHP实现货币换算的方法
Nov 29 PHP
php保存任意网络图片到服务器的方法
Apr 14 PHP
php猴子选大王问题解决方法
May 12 PHP
php比较两个字符串长度的方法
Jul 13 PHP
PHP基于SMTP协议实现邮件发送实例代码
Apr 27 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
PHP number_format函数原理及实例解析
Jul 14 PHP
php去除deprecated的实例方法
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管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
Python操作MySQL简单实现方法
2015/01/26 Python
Python with用法实例
2015/04/14 Python
详解python 发送邮件实例代码
2016/12/22 Python
Python使用剪切板的方法
2017/06/06 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
Python多线程获取返回值代码实例
2020/02/17 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
大专生工程监理求职信
2013/10/04 职场文书
数控技术专业推荐信
2013/11/01 职场文书
个人年底工作总结
2015/03/10 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫
Android Rxjava3 使用场景详解
2022/04/07 Java/Android