php 调用api 认证,PHP调用 API 时对请求参数进行签名验证

一、签名方法

调用 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;

根据支付宝支付接口修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值