1.具体代码如下:
<?php
namespace Common\Custom;
/**
* 任务投递
*
* @return void
**/
class Delivery
{
private $_error;
private $_request_url;
public function __construct()
{
$pres = explode('.', C('HTTP_SERVER'));
$server_name = $pres[1];
$sanger_url = 'http://www.xxx.com';
$key_server_params = array(
'sg' => array(
'client' => 'Key1',
'key' => 'secret111',
'ip' => array(
'example' => 'http://xxxxx:端口号/xxxxxxx', // 接口地址url
)
),
);
$this->_key_params = $key_server_params[$server_name];
}
/**
* 运行任务
*
* @param string
* @param int
*
**/
public function runTask($request_type, $params)
{
$method = 'run' . str_replace(' ', '', ucwords(str_replace('_', ' ', $request_type))) . 'Task';
$task_params = array(
'example',
);
if (!in_array($request_type, $task_params)) {
$this->_error = '请求方法不存在';
return false;
}
return $this->$method($params);
}
/**
* 具体的实现方法
*
* @param array
*
* @return bool
**/
public function runExampleTask($params)
{
$api_params = array(
'method' => $params['method'],
'exp_type' => $params['exp_type'],
'submit_location' => $params['submit_location'],
'task_type' => intval($params['task_type']),
'task_id' => $params['task_id'],
);
// 对请求的页面参数进行排序,用于验证是否重复请求,如果没有该需求可以去掉
$this->_arrayKeySort($api_params);
$param_string = http_build_query($api_params);
$this->_request_url = $this->_key_params['ip']['example'];
$signature_param = $this->signature();
$this->_data = $signature_param . '&' . $param_string;
// 进行接口请求
if (false === $response = $this->postData()) {
return false;
}
if (false === $response['success']) {
$this->_error = $response['info'];
return false;
}
return true;
}
/**
* POST请求数据
*
* @param string
*
* @return string
**/
private function postData()
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->_request_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 180);
$res = curl_exec($ch);
if ($error = curl_error($ch)) {
$this->_error = curl_error($ch);
return false;
}
curl_close($ch);
if (json_decode($res, true) == '') {
return array('success' => false, 'info' => $res);
}
$res = json_decode($res, true);
return $res;
}
/**
* 签名
*
* @return string
**/
private function signature()
{
$params = array(
'client' => $this->_key_params['client'],
'nonce' => rand(1000, 10000),
'timestamp' => time(),
);
$signature_params = array(
'key' => $this->_key_params['key'],
'timestamp' => $params['timestamp'],
'nonce' => $params['nonce'],
);
sort($signature_params, SORT_STRING);
$params['signature'] = sha1(join('', $signature_params));
return htmlspecialchars(http_build_query($params));
}
public function __call($method_name, $params)
{
$this->_error = '接口没有' . $method_name . '方法';
echo $this->_error;
return false;
}
/**
* 递归排序[升序]
*
* @return string
**/
function arrayKeySort(&$params, $type = 'string')
{
if ($type == 'string') {
ksort($params, SORT_STRING);
} else {
sort($params);
}
if (is_array($params)) {
foreach ($params as $key => $val) {
if (is_array($val)) {
$type = 'string';
if (!empty($val[0])) {
$type = 'int';
}
arrayKeySort($params[$key],$type);
}
}
}
}
/**
* 返回错误
*
* @return string
**/
public function getError()
{
return $this->_error;
}
}
1.说明:
key_server_params:参数配置,区分了不同的主机配置[sg],
(client:客户端ID,key:秘钥):用于通信的验证
ip:请求的接口地址
runTask:用于具体任务的分发
runExampleTask:具体的的任务的实现
postData:实现了curl的post请求
signature:进行通信前的签名,需要保证目标接口的通信规则一样
arrayKeySort:用于对数组进行按照value,key进行排序保持数据的顺序性
具体的业务层的调用代码:
$task = new \Common\Custom\Delivery();
$params = array(
//参数....
);
$request_type = 'example';
$task->runTask($request_type, $params);