PHP curl通信代码

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);

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值