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 相关文章推荐
MVC模式的PHP实现
Oct 09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
Dec 13 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
php数组合并的二种方法
Mar 21 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
Jul 08 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 PHP
php实现统计网站在线人数的方法
May 12 PHP
Yii2 assets清除缓存的方法
May 16 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHPMAILER实现PHP发邮件功能
Apr 18 PHP
PHP预定义超全局数组变量小结
Aug 20 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中文本操作的类
2007/03/17 PHP
dedecms中常见问题修改方法总结
2007/03/21 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
Python中的魔法方法深入理解
2014/07/09 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
杠杆的科学教学反思
2014/01/10 职场文书
室内拓展活动方案
2014/02/13 职场文书
工厂标语大全
2014/10/06 职场文书
会议欢迎词范文
2015/01/27 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
python numpy中setdiff1d的用法说明
2021/04/22 Python
vue引入Excel表格插件的方法
2021/04/28 Vue.js
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js
golang语言指针操作
2022/04/14 Golang
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript