<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Administrator
 * Date: 18-1-25
 * Time: 下午4:35
 * To change this template use File | Settings | File Templates.
 * 推送物流报文到发送客户端
 */
set_time_limit(0);

require_once 'config.php';

$flag = APPLICATION_PATH . '/../data/log/PushEportLogisticsXmlCron.lock';

if (@file_exists($flag)) {
    echo sprintf('[%s]', date('Y-m-d H:i:s')), ' Anather process is running.', "\r\n";
    echo $flag, "\r\n\r\n";
    exit();
}

$handler = fopen($flag, 'wb');
fclose($handler);

/**
 * CURL
 */
function curlExecute($url, $postData = '') {
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_FAILONERROR, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_TIMEOUT, 300);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);

    $response = curl_exec($curl);
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $ack      = array(
        'status'   => 0,
        'response' => $response,
    );

    if (curl_errno($curl)) {
        $ack['response'] = curl_error($curl);
    }
    elseif (200 === (int) $httpCode) {
        $ack['status'] = 1;
    }

    curl_close($curl);

    return $ack;
}

// 密钥、令牌
$appSecret = '76EC82BCE17F93667477774A4CBF0BB5';
$appToken  = 'F00FD5D2-1CD7-42AB-0274-F58907795BA2';

$sendPath  = '/home/webcode/export/wms/data/DZKA';
$apiUrl    = 'http://119.145.38.246:11111/gateway.php';
$action    = 'send';
$maxSize   = 50; // 每次推送报文数量

echo '[', date('Y-m-d H:i:s'), '] Start', "\r\n";

$dirHandler = @opendir($sendPath);

if (FALSE === $dirHandler) {
    echo '报文目录无法读取', "\r\n";
}
else {
    $success      = 0;
    $responseBody = '';

    while ((FALSE !== $fileName = readdir($dirHandler))) {
        if ('.' !== $fileName && '..' !== $fileName && is_file($sendPath . '/' . $fileName)) {
            $responseBody .= '<file>';
            $responseBody .= '<name>' . $fileName . '</name>';
            $responseBody .= '<content>' . base64_encode(file_get_contents($sendPath . '/' . $fileName)) . '</content>';
            $responseBody .= '</file>';

            ++$success;
        }

        if ($success >= $maxSize) {
            $operationTime = date('Y-m-d H:i:s');

            $request  = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>';
            $request .= '<request>';
            $request .= '<token>' . $appToken . '</token>';
            $request .= '<timestamp>' . $operationTime . '</timestamp>';
            $request .= '<action>' . $action . '</action>';
            $request .= '<sign>' . strtoupper(md5($operationTime . $appSecret . $action . $operationTime)) . '</sign>';
            $request .= '<fileSet>' . $responseBody . '</fileSet>';
            $request .= '</request>';

            $ack = curlExecute($apiUrl, base64_encode($request));

            if (1 === $ack['status']) {
                $response = base64_decode($ack['response']);
                $xmlObj   = @simplexml_load_string($response);

                if (FALSE !== $xmlObj) {
                    $responseCode    = isset($xmlObj->code) ? (int) $xmlObj->code : '';
                    $responseMessage = isset($xmlObj->message) ? $xmlObj->message : '';

                    if (isset($xmlObj->code) && 100 === (int) $xmlObj->code) { // 数据推送成功删除报文
                        if (isset($xmlObj->fileSet)) {
                            foreach ($xmlObj->fileSet->file as $file) {
                                $fileName = isset($file->name) ? trim($file->name) : '';

                                if ('' !== $fileName && is_file($sendPath . '/' . $fileName)) {
                                    @unlink($sendPath . '/' . $fileName);
                                }
                            }
                        }
                    }

                    echo sprintf('[%s] %s', $responseCode, $responseMessage), "\r\n";
                }
                else {
                    echo '发送客户端响应XML内容无法解析1：', $ack['response'], "\r\n";
                }
            }

            $success      = 0;
            $responseBody = '';
        }
    }

    if ($success) { // 还有残留继续推送
        $operationTime = date('Y-m-d H:i:s');

        $request  = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>';
        $request .= '<request>';
        $request .= '<token>' . $appToken . '</token>';
        $request .= '<timestamp>' . $operationTime . '</timestamp>';
        $request .= '<action>' . $action . '</action>';
        $request .= '<sign>' . strtoupper(md5($operationTime . $appSecret . $action . $operationTime)) . '</sign>';
        $request .= '<fileSet>' . $responseBody . '</fileSet>';
        $request .= '</request>';

        $ack = curlExecute($apiUrl, base64_encode($request));
        var_dump($ack);
        if (1 === $ack['status']) {
            $response = base64_decode($ack['response']);
            $xmlObj   = @simplexml_load_string($response);

            if (FALSE !== $xmlObj) {
                $responseCode    = isset($xmlObj->code) ? (int) $xmlObj->code : '';
                $responseMessage = isset($xmlObj->message) ? $xmlObj->message : '';

                if (isset($xmlObj->code) && 100 === (int) $xmlObj->code) { // 数据推送成功删除报文
                    if (isset($xmlObj->fileSet)) {
                        foreach ($xmlObj->fileSet->file as $file) {
                            $fileName = isset($file->name) ? trim($file->name) : '';

                            if ('' !== $fileName && is_file($sendPath . '/' . $fileName)) {
                                @unlink($sendPath . '/' . $fileName);
                            }
                        }
                    }
                }

                echo sprintf('[%s] %s', $responseCode, $responseMessage), "\r\n";
            }
            else {
                echo '发送客户端响应XML内容无法解析2：', $ack['response'], "\r\n";
            }
        }
    }

    closedir($dirHandler);
}

echo '[', date('Y-m-d H:i:s'), '] End', "\r\n";
@unlink($flag);
