Ошибка 3120 от ReceivePaymentAddRq - php devkit - PullRequest
0 голосов
/ 26 марта 2019

Я добавляю получение платежей, используя php devkit здесь https://github.com/consolibyte/quickbooks-php.

Проблема не в ответе на быстрые книги, а также в отсутствии проблемы.Я проверил журналы веб-соединителя и файлы журнала php.Но функция ответа не вызывается никогда.

Я уверен, что до нескольких дней назад это работало хорошо.Я понятия не имею, в чем именно заключается проблема.

qbxml версия: 10.0

запрос xml:

<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="10.0"?>
<QBXML>
    <QBXMLMsgsRq onError="continueOnError">
        <ReceivePaymentAddRq requestID="153">
            <ReceivePaymentAdd>
                <CustomerRef >
                    <FullName >Duncan, Dave</FullName>
                </CustomerRef>
                <TxnDate >2023-12-15</TxnDate>
                <RefNumber>Wire</RefNumber>
                <TotalAmount>2585.00</TotalAmount>
                <PaymentMethodRef><FullName>Check</FullName></PaymentMethodRef>
                <Memo>Paid In Full</Memo>
                <AppliedToTxnAdd>
                    <TxnID>28CA9-1702576301</TxnID>
                    <PaymentAmount >2585.00</PaymentAmount>
                </AppliedToTxnAdd>
            </ReceivePaymentAdd>
        </ReceivePaymentAddRq>
    </QBXMLMsgsRq>
</QBXML>

php-скрипты:

$map = array(
QUICKBOOKS_ADD_RECEIVE_PAYMENT => array( '_quickbooks_payment_add_request', '_quickbooks_payment_add_response' ));

$errmap = array(
        // QUICKBOOKS_IMPORT_CUSTOMER => '_quickbooks_customer_query_error', 
        '*' => '_quickbooks_error_catchall',                // Catch any other errors that might occur
..

$hooks = array(
        QuickBooks_WebConnector_Handlers::HOOK_LOGINSUCCESS => '_quickbooks_sync_to_qb',    // call this whenever a successful login occurs
    );
function _quickbooks_sync_to_qb($requestID, $user, $hook, &$err, $hook_data, $callback_config)
{ 
    $database = new Database();
    $db = $database->getConnection();

    $Queue = new QuickBooks_WebConnector_Queue($database->dsn);
    $payment = new Payment($db);
    $payment->needSync = true; 

    $stmt = $payment->read();
    $num = $stmt->rowCount();

    if ($num > 0) {
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

            $Queue->enqueue(QUICKBOOKS_ADD_RECEIVE_PAYMENT, $row['id']);
        }
    }


    $database->destroy();
}
function _quickbooks_payment_add_request($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $version, $locale)
{error_log('start from here');
    $database = new Database();
    $db = $database->getConnection();

    // Grab the data from our MySQL database
    $payment = new Payment($db);
    $payment->id = (int) $ID;
    error_log('1');
    // Validation
    $stmt = $payment->read();
    $num = $stmt->rowCount();

    if ($num > 0) {error_log('2');
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

            extract($row);

            // get trasaction id from invoice
            $invoice = new Invoice($db);
            $invoice->refNumber = $invoice_ref_number;
            error_log('21');
            $xml = '<?xml version="1.0" encoding="utf-8"?>
                <?qbxml version="10.0"?>
                <QBXML>
                    <QBXMLMsgsRq onError="continueOnError">
                        <ReceivePaymentAddRq>
                            <ReceivePaymentAdd>';

                    if ($customer_ref_listid != '' || $customer_ref_fullname != '') {

                        $xml .= '<CustomerRef >';

                        if ($customer_ref_listid != '') {

                            $xml .= '<ListID  >' . $customer_ref_listid . '</ListID>';

                            // invoice customer ref listid
                            $invoice->customerRefListID = $customer_ref_listid;
                        }
                        if ($customer_ref_fullname != '') {

                            $xml .= '<FullName >' . $customer_ref_fullname . '</FullName>';

                            // invoice customer ref fullname
                            $invoice->customerRefFullName = $customer_ref_fullname;
                        }

                        $xml .= '</CustomerRef>';
                    }


                    $stmt = $invoice->read();
                    $num = $stmt->rowCount();
                    $txnID = '';
                    $txnDate = '';

                    if ($num > 0) {

                        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

                            $txnID = $row['txn_id'];
                            $txnDate = date_format(date_create($row['txn_date']), 'Y-m-d');

                        }
                    }


                        $xml .= '<TxnDate >' . $txnDate . '</TxnDate>
                                <RefNumber>' . $ref_number . '</RefNumber>
                                <TotalAmount>' . $total_amount . '</TotalAmount>
                                <PaymentMethodRef>';

                        if (!empty($payment_method_ref_listid)) {

                            $xml .= '<ListID>' . $payment_method_ref_listid . '</FullName>';
                        }
                        if (!empty($payment_method_ref_fullname)) {

                            $xml .= '<FullName>' . $payment_method_ref_fullname . '</FullName>';
                        }

                        $xml .= '</PaymentMethodRef>
                                <Memo>' . $memo . '</Memo>
                                <AppliedToTxnAdd>
                                    <TxnID>' . $txnID . '</TxnID>
                                    <PaymentAmount >' . $total_amount . '</PaymentAmount>
                                </AppliedToTxnAdd>
                            </ReceivePaymentAdd>
                        </ReceivePaymentAddRq>
                    </QBXMLMsgsRq>
                </QBXML>';
                error_log('22');
        }
        error_log('3');
        $database->destroy();
        error_log('4');
        error_log($xml);
        return $xml;
    }
    error_log('5');
    $database->destroy();
    return false;

}

Эта функция, кажется, не вызывается, даже если она правильно зарегистрирована.

function _quickbooks_payment_add_response($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $xml, $idents)
{error_log('_quickbooks_payment_add_response');
    $database = new Database();

РЕДАКТИРОВАТЬ: VERBOSE LOG

20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : qbNationality="US"
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : qbXMLMajorVers="13"
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : qbXMLMinorVers="0"
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : Received from sendRequestXML() following parameter:
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : strRequestXML =
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : XML dump follows: -

<?xml version="1.0" encoding="utf-8"?>
                <?qbxml version="10.0"?>
                <QBXML>
                    <QBXMLMsgsRq onError="continueOnError">
                        <ReceivePaymentAddRq requestID="158">
                            <ReceivePaymentAdd><CustomerRef ><FullName >Duncan, Dave</FullName></CustomerRef><RefNumber>Wire</RefNumber>
                                <TotalAmount>2585.00</TotalAmount>
                                <PaymentMethodRef><FullName>Check</FullName></PaymentMethodRef>
                                <Memo>Paid In Full</Memo>
                                <AppliedToTxnAdd>
                                    <TxnID>28CA9-1702576301</TxnID>
                                    <PaymentAmount >2585.00</PaymentAmount>
                                </AppliedToTxnAdd>
                            </ReceivePaymentAdd>
                        </ReceivePaymentAddRq>
                    </QBXMLMsgsRq>
                </QBXML>

20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : Request xml received.
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Processing request #1
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : REQUEST: received from application: size (bytes) = 666
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Sending request to QuickBooks.
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Response received from QuickBooks: size (bytes) = 245
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Sending response back to application.
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : *** Calling receiveResponseXML() with following parameters:
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : wcTicket="35382423-f97d-5fc4-3935-d4a7629367a8"
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : response =
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<ReceivePaymentAddRs requestID="158" statusCode="3120" statusSeverity="Error" statusMessage="Object &quot;28CA9-1702576301&quot; specified in the request cannot be found. " />
</QBXMLMsgsRs>
</QBXML>


20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : hresult=""
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : message=""
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : Received from receiveResponseXML() following parameters:
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : more="100">
20190327.20:42:17 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : Done. No more to process.

1 Ответ

1 голос
/ 27 марта 2019

Трудно сказать, не видя журналы (журналы Web Connector в режиме VERBOSE, а также вывод таблицы SQL quickbooks_log), что именно здесь не так, но вот как минимум несколько вещей, которые нужно проверить:

1.Вы УВЕРЕНЫ, что не получаете ответ от QuickBooks?

Вы указываете «Проблема не в ответе из QuickBooks», но это может не иметь место в данном случае.

Подтвердили ли вы, что вы не получаете ответа в реальных журналах?Например, если произошла ошибка (например, может быть, клиент или счет не существует), тогда QuickBooks отправит обратно ошибку , но ваша функция ответа не будет вызвана - ошибкавместо этого будет вызван обработчик .

У вас есть что-то подобное в вашем коде?

$errmap = array(
    3070 => '_quickbooks_error_stringtoolong',              // Whenever a string is too long to fit in a field, call this function: _quickbooks_error_stringtolong()
    // ... more error handlers here ...
    );

(из https://github.com/consolibyte/quickbooks-php/blob/master/docs/web_connector/example_web_connector.php)

Возможно, вместо функции ответа вызывается обработчик ошибок?

2.Вы не передаете атрибут requestID = "..."

Web Connector использует атрибут XML requestID="...", чтобы иметь возможность сопоставлять исходящие запросы с входящими ответами.Вы не используете это, но должно быть.

Изменить это:

<ReceivePaymentAddRq>

На это:

<ReceivePaymentAddRq requestID="' . $requestID . '">

Подробнее:

3.Вы не значения XML кодирования

Для этого:

<Memo>' . $memo . '</Memo>

Если $memo установлен на bla bla <something> bla bla, то вы собираетесьв конечном итоге искаженный XML:

<Memo>bla bla <something bla bla</Memo>

Вы должны XML-кодировать эти значения.

4.Переменная $ memo не определена

Вы говорите, что ваш итоговый XML выглядит следующим образом:

<Memo>Paid In Full</Memo>

Но когда я смотрю на ваш код,$memo is undefined .Это заставляет меня подозревать, что вставленный здесь XML-код , а не - это фактический XML-код, который вы отправляете в QuickBooks.

Где эта переменная установлена ​​на Paid In Full?Он не устанавливается нигде в вставленном вами коде.

Это также должно вызывать ошибку / предупреждение PHP о неопределенной переменной, что может привести к поломке.

5.Убедитесь, что ваш веб-коннектор находится в режиме VERBOSE

В режиме VERBOSE в веб-коннекторе отображается намного больше данных.Вы должны быть в состоянии легко найти запрос и проанализировать / опубликовать соответствующие журналы.

6.Посмотрите таблицы quickbooks_log и quickbooks_queue

Что они показывают / говорят?

Что такое статус (поле qb_status) и сообщение в записи в очереди (таблица SQL quickbooks_queue)?

...