一、签名方法
调用 API 时需要对请求参数进行签名验证,服务器会对该请求参数进行验证是否合法的。方法如下:
根据参数名称(除签名和图片文件)将所有请求参数按照字母先后顺序排序:key=value .... &key=value,并且除去待签名参数数组中的空值和签名参数
例如:将foo=1,bar=2,baz=3 排序为bar=2,baz=3,foo=1,参数名和参数值链接后,得到拼装字符串bar=2&baz=3&foo=1
系统暂时只支持MD5加密方式:
md5:将$key='www.cent123.com'拼接到参数字符串尾部进行md5加密,格式是:md5(bar=2&baz=3&foo=1...$key)
二、调用示例
1)输入参数为:
$parameter = array(
'method' => 'get_info',
'timestamp' => 1483620175,
'format' => 'json',
'user' => 'admin',
'order_id' => 100,
);
2)按照参数名称升序排列:
$parameter = array(
'format' => 'json',
'method' => 'get_info',
'order_id' => 100,
'timestamp' => 1483620175,
'user' => 'admin',
);
3)连接字符串
连接参数名与参数值,并在尾部加上$key,如下:
format=json&method=get_info&order_id=100×tamp=1483620175&user=adminwww.cent123.com
4)生成签名:
32位MD5值 -> 818d0a37efb41f75ff9e86c703cee2d6
5)拼装HTTP请求 sign => 818d0a37efb41f75ff9e86c703cee2d6
sign_type => MD5
sign和sign_type 也会一起作为参数发送
$dataSubmit = new DataSubmit($url);
$html_text = $dataSubmit->buildRequestForm($parameter);
echo $html_text;
DataSubmit.class.php/**
* Created by PhpStorm.
* User: centphp.com
* Date: 2017/1/5
* Time: 16:02
*/
class DataSubmit
{
private $data_config;
function __construct($url = '/', $data_config = array('key' => 'www.cent123.com', 'sign_type' => 'MD5', 'input_charset' => 'utf-8'))
{
$this->url = $url;
$this->data_config = $data_config;
}
/**
* 生成签名结果
* @param $para_sort 已排序要签名的数组
* @return string 签名结果字符串
*/
function buildRequestMysign($para_sort)
{
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);
$mysign = "";
switch (strtoupper(trim($this->data_config['sign_type']))) {
case "MD5" :
$mysign = md5($prestr . $this->data_config['key']);
break;
default :
$mysign = "";
}
return $mysign;
}
/**
* 生成要请求给支付宝的参数数组
* @param $para_temp 请求前的参数数组
* @return 要请求的参数数组
*/
function buildRequestPara($para_temp)
{
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = argSort($para_filter);
//生成签名结果
$mysign = $this->buildRequestMysign($para_sort);
//签名结果与签名方式加入请求提交参数组中
$para_sort['sign'] = $mysign;
$para_sort['sign_type'] = strtoupper(trim($this->data_config['sign_type']));
return $para_sort;
}
/**
* 生成要请求给支付宝的参数数组
* @param $para_temp 请求前的参数数组
* @return 要请求的参数数组字符串
*/
function buildRequestParaToString($para_temp)
{
//待请求参数数组
$para = $this->buildRequestPara($para_temp);
//把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
$request_data = createLinkstringUrlencode($para);
return $request_data;
}
/**
* 建立请求,以表单HTML形式构造(默认)
* @param $para_temp 请求参数数组
* @param $method 提交方式。两个值可选:post、get
* @param $button_name 确认按钮显示文字
* @return 提交表单HTML文本
*/
function buildRequestForm($para_temp, $method = 'post', $button_name = '确认')
{
$this->url = trim($this->url, '?&');
if (strpos($this->url, '?') !== false) {
$this->url .= '&';
} else {
$this->url .= '?';
}
//待请求参数数组
$para = $this->buildRequestPara($para_temp);
$sHtml = "
url . "input_charset=" . trim(strtolower($this->data_config['input_charset'])) . "' method='" . $method . "'>";while (list ($key, $val) = each($para)) {
$sHtml .= "";
}
//submit按钮控件请不要含有name属性
$sHtml = $sHtml . "
";$sHtml = $sHtml . "";
//echo $sHtml;
return $sHtml;
}
}
//函数
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param $para 需要拼接的数组
* @return string 拼接完成以后的字符串
*/
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;
}
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
* @param $para 需要拼接的数组
* @return string 拼接完成以后的字符串
*/
function createLinkstringUrlencode($para)
{
$arg = "";
while (list ($key, $val) = each($para)) {
$arg .= $key . "=" . urlencode($val) . "&";
}
//去掉最后一个&字符
$arg = substr($arg, 0, count($arg) - 2);
//如果存在转义字符,那么去掉转义
if (get_magic_quotes_gpc()) {
$arg = stripslashes($arg);
}
return $arg;
}
/**
* 除去数组中的空值和签名参数
* @param $para 签名参数组
* @return array 去掉空值与签名参数后的新签名参数组
*/
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;
}
测试:include "lib/DataSubmit.class.php";
$parameter = array(
'method' => 'get_info',
'timestamp' => 1483620175,
'format' => 'json',
'user' => 'admin',
'order_id' => 100,
);
$url = './test.php';
$dataSubmit = new DataSubmit($url);
$html_text = $dataSubmit->buildRequestForm($parameter, "post", "确认");
echo $html_text;
根据支付宝支付接口修改