//组合签名
$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;
}

  转自:http://www.jb51.net/article/115475.htm

最新文章

  1. js json 特定条件删除 增加 遍历
  2. iOS 传值 委托(delegate)和block 对比
  3. 关于MYSQL四种引擎
  4. 真机测试无缘无故finish了。程序也没有启动
  5. maven profile动态选择配置文件
  6. Jquery AutoComplete的使用方法实例
  7. Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)
  8. Oracle错误ORA-03113: end-of-file on communication channel处理办法
  9. 【集训笔记】二分图及其应用【HDOJ1068【HDOJ1150【HDOJ1151
  10. HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(基础巴什博奕)
  11. swiper.js 碰到的坑
  12. hadoop配置文件详解,安装及相关操作
  13. web工程自动部署(tomcat服务器)
  14. awk多分隔符功能及wc命令案列及企业级应用
  15. [Swift]LeetCode743. 网络延迟时间 | Network Delay Time
  16. MySQL 5.7.14 net start mysql 服务无法启动
  17. openresty的安装和使用
  18. 【exe4j】如何利用exe4j把java桌面程序生成exe文件
  19. C语言版kafka消费者代码运行时异常kafka receive failed disconnected
  20. 读取siftgeo格式文件的matlab程序

热门文章

  1. C语言学生成绩管理系统(简易版)
  2. Erwin 简单使用
  3. MBProgressHUD 优雅地去提示
  4. vue2.0之监听属性的使用心得及搭配计算属性的使用
  5. spring-开发需要jar包
  6. Go单元测试与基准测试
  7. myql简单语法测试
  8. 千锋教育Vue组件--vue基础的方法
  9. 找回被丢弃怎么找都找不回来的git中的commit
  10. [CodeForces238E]Meeting Her(图论+记忆化搜索)