|
<?php
/**
* 资料来源:支付宝
* 签名:所有交互的数据都需要签名,除了 sign(签名),和 sign_type(签名方式:md5,rsa)
* md5签名
* 1.私钥:只有你和服务器知道,用于加密数据,由英文字母和数据组成,共32位
* 2.请求时签名:$sign=md5((待签名字符串.md5私钥));
* 3.返回时验证:$_POST['sign']==md5((待验证字符串,md5私钥))
* rsa签名
* 1.私钥与公钥:openssl生成
* 2.请求时签名:$sign = rsaSign(待签名字符串,私钥);
* 3.返回时验证:$_POST['sign'] == rsaVerify(待验证字符串,公钥);
*/
/**
* 演示md5签名过程
*/
/**
* 除去数组中的空值和签名参数
* @param $para 签名参数组
* return 去掉空值与签名参数后的新签名参数组
*/
function paraFilter($para) {
$para_filter = array();
while (list ($key, $val) = each ($para)) {
if($key == "sign" || $key == "sign_type" || $val == "")continue;
else$para_filter[$key] = $para[$key];
}
return $para_filter;
}
/**
* 对数组排序
* @param $para 排序前的数组
* return 排序后的数组
*/
function argSort($para) {
ksort($para);
reset($para);
return $para;
}
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
* @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;
}
/**
* 生成md5签名字符串
* @param $prestr 需要签名的字符串
* @param $key 私钥
* return 签名结果
*/
function md5Sign($prestr, $key) {
$prestr = $prestr . $key;
return md5($prestr);
}
class Submit{
public $_sign_type ='';
public $_md5_key = '';
public $_private_key_path = '';
public function __construct($sign_type){
$this->_sign_type = strtoupper($sign_type);
}
/**
* 对参数进行过滤,然后排序
* @param array $para_temp
*/
function filterPara($para_temp){
$para_filter = paraFilter($para_temp);//除去待签名参数数组中的空值和签名参数
return argSort($para_filter);//对待签名参数数组排序
}
/**
* 生成签名结果
* @param $para_sort 已排序要签名的数组
* @return string 签名结果字符串
*/
function buildRequestMysign($para_sort) {
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);
$mysign = "";
switch ($this->_sign_type) {
case "MD5":$mysign = md5Sign($prestr, $this->_md5_key);break;
case "RSA" :$mysign = rsaSign($prestr, $this->_private_key_path);break;
default :$mysign = "";
}
return $mysign;
}
/**
* 生成要发送给支付宝的参数数组
* @param $para_temp 请求前的参数数组
* @return 要请求的参数数组
*/
public function buildRequestPara($para_temp) {
$para_sort = $this->filterPara($para_temp);//对待签名参数进行过滤
$para_sort['sign'] = $this->buildRequestMysign($para_sort);//生成签名结果,并与签名方式加入请求提交参数组中
$para_sort['sign_type'] = strtoupper(trim($this->_sign_type));
return $para_sort;
}
}
|
|
|