使用API​​将发票过帐到XERO

时间:2015-05-08 06:25:48

标签: php api http curl oauth

我正在尝试发票XERO。这是函数

<?php
Function CallAPI($url, $method, $parameters, $options, &$response)
    {
    if (!IsSet($options['Resource'])) $options['Resource'] = 'API call';
    if (!IsSet($options['ConvertObjects'])) $options['ConvertObjects'] = false;
    $version = intval($this->oauth_version);
    $two_legged = ($version === 1 && IsSet($options['2Legged']) && $options['2Legged']);
    if (strlen($this->access_token) === 0 && !$two_legged)
        {
        if (!$this->RetrieveToken($valid)) return false;
        if (!$valid) return $this->SetError('the access token is not set to a valid value');
        }

    switch ($version)
        {
    case 1:
        if (!$two_legged && strlen($this->access_token_expiry) && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0)
            {
            if (strlen($this->refresh_token) === 0) return ($this->SetError('the access token expired and no refresh token is available'));
            if ($this->debug) $this->OutputDebug('Refreshing the OAuth access token expired on ' . $this->access_token_expiry);
            $oauth = array(
                'oauth_token' => $this->access_token,
                'oauth_session_handle' => $this->refresh_token
            );
            if (!$this->ProcessToken1($oauth, $access_token)) return false;
            if (IsSet($options['FailOnAccessError']) && $options['FailOnAccessError'] && strlen($this->authorization_error))
                {
                $this->error = $this->authorization_error;
                return false;
                }

            if (!IsSet($access_token['authorized']) || !$access_token['authorized']) return ($this->SetError('failed to obtain a renewed the expired access token'));
            $this->access_token = $access_token['value'];
            $this->access_token_secret = $access_token['secret'];
            if (IsSet($access_token['refresh'])) $this->refresh_token = $access_token['refresh'];
            }

        $oauth = array();
        if (!$two_legged) $oauth[strlen($this->access_token_parameter) ? $this->access_token_parameter : 'oauth_token'] = $this->access_token;
        break;

    case 2:
        if (strlen($this->access_token_expiry) && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0)
            {
            if (strlen($this->refresh_token) === 0) return ($this->SetError('the access token expired and no refresh token is available'));
            if ($this->debug) $this->OutputDebug('Refreshing the OAuth access token expired on ' . $this->access_token_expiry);
            if (!$this->ProcessToken2(null, true)) return false;
            if (IsSet($options['FailOnAccessError']) && $options['FailOnAccessError'] && strlen($this->authorization_error))
                {
                $this->error = $this->authorization_error;
                return false;
                }
            }

        $oauth = null;
        if (strcasecmp($this->access_token_type, 'Bearer')) $url.= (strcspn($url, '?') < strlen($url) ? '&' : '?') . (strlen($this->access_token_parameter) ? $this->access_token_parameter : 'access_token') . '=' . UrlEncode($this->access_token);
        break;

    default:
        return ($this->SetError($this->oauth_version . ' is not a supported version of the OAuth protocol'));
        }

    return ($this->SendAPIRequest($url, $method, $parameters, $oauth, $options, $response));
    }

我一直收到此错误

我成功连接到Xero API, 但我目前仍然坚持使用XML发布发票。

<?php
$url = 'xml/invoice.xml';
$xml = simplexml_load_file($url);
$success3 = $client->CallAPI('https://api.xero.com/api.xro/2.0/Invoices', 'POST', array(
    'format' => 'text/xml',
    'File' => $xml
) , array(
    'FailOnAccessError' => true,
    'DecodeXMLResponse' => 'simplexml'
) , $user3);

这是我的代码,但我不确定这是否有效。 这是我作为回复得到的错误。

SimpleXMLElement Object
(
[ErrorNumber] => 17
[Type] => NoDataProcessedException
[Message] => No data has been processed for this endpoint. This endpoint is expecting Invoice data to be specifed in the request body.
)

以下是我正在使用的代码

<?php
/*
* login_with_xero.php
*
* @(#) $Id: login_with_xero.php,v 1.2 2014/03/16 12:41:48 mlemos Exp $
*
*/
/*
*  Get the http.php file from http://www.phpclasses.org/httpclient
*/
require ('http.php');

require ('oauth_client.php');

$client = new oauth_client_class;
$client->debug = false;
$client->debug_http = true;
$client->server = 'Xero';
$client->redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . dirname(strtok($_SERVER['REQUEST_URI'], '?')) . '/login_with_xero.php';
$client->client_id = '3TBW9EI6KFFD6GDEKEDSTKZXHFVOLK';
$application_line = __LINE__;
$client->client_secret = 'OQZJTYDZQH0CTEKNH1MWCTY3AJFTU0';

if (strlen($client->client_id) == 0 || strlen($client->client_secret) == 0) die('Please go to Xero Applications page https://api.xero.com/Application/Add , ' . 'create an application, and in the line ' . $application_line . ' set the client_id to Consumer key and client_secret with Consumer secret. ' . 'The Callback URL must be ' . $client->redirect_uri . ' If you want to post to ' . 'the user timeline, make sure the application you create has write permissions');

if (($success = $client->Initialize()))
    {
    if (($success = $client->Process()))
        {
        if (strlen($client->access_token))
            {
            $success = $client->CallAPI('https://api.xero.com/api.xro/2.0/Users', 'GET', array() , array(
                'FailOnAccessError' => true,
                'DecodeXMLResponse' => 'simplexml'
            ) , $user);
            $success2 = $client->CallAPI('https://api.xero.com/api.xro/2.0/Invoices', 'GET', array() , array(
                'FailOnAccessError' => true,
                'DecodeXMLResponse' => 'simplexml'
            ) , $user2);
            $url = 'xml/invoice.xml';
            $xml = simplexml_load_file($url);
            echo $xml;
            $success3 = $client->CallAPI('https://api.xero.com/api.xro/2.0/Invoices', 'POST', array(
                'format' => 'text/xml',
                'File' => $xml
            ) , array(
                'FailOnAccessError' => true,
                'DecodeXMLResponse' => 'simplexml'
            ) , $user3);
            }
        }

    $success = $client->Finalize($success);
    }

if ($client->exit) exit;

if ($success)
    {
?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Xero OAuth client results</title>
    </head>
    <body>
    <?php
    echo '<h1>', HtmlSpecialChars($user->Users->User->FirstName) , ' you have logged in successfully with Xero!</h1>';
    echo '<pre>', HtmlSpecialChars(print_r($user, 1)) , '</pre>';
    echo '<pre>', HtmlSpecialChars(print_r($user2, 1)) , '</pre>';
    echo '<pre>', HtmlSpecialChars(print_r($user3, 1)) , '</pre>';
?>
    </body>
    </html>
    <?php
    }
  else
    {
?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>OAuth client error</title>
    </head>
    <body>
    <h1>OAuth client error</h1>
    <pre>Error: <?php
    echo HtmlSpecialChars($client->error); ?></pre>
    </body>
    </html>
    <?php
    }

?>

1 个答案:

答案 0 :(得分:0)

'format' => 'text/xml'更改为format' => 'xml'