0

我计划构建一个我自己的财务管理应用程序供个人使用。我已经通过 Chase 启用了直接连接服务,但在从服务器获得响应时遇到了一些问题。这是我正在使用的代码。有人很好,可以在另一个论坛上发布这个供其他人使用。

<?php

// this function is just used to generate a random transaction id below
function getRandomString($length = 40, $charset = 'alphanum') {
$alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$num = '0123456789';
switch ($charset) {
    case 'alpha':
        $chars = $alpha;
        break;
    case 'alphanum':
        $chars = $alpha . $num;
        break;
    case 'num':
        $chars = $num;
        break;            
}

$randstring='';
$maxvalue=strlen($chars)-1;
for ($i = 0; $i < $length; $i++)
  $randstring .= substr($chars, rand(0, $maxvalue), 1);
return $randstring;
}

// user login info
$user = 'username';
$pass = 'password';

// account info
$accnt_num = '00000000';
$accnt_type = 'CHECKING';

// date and a random unique transaction id
$txn_id = getRandomString(6);
$tz_offset = date('Z')/3600;
$date = date("YmdHis[$tz_offset:T]");

// Chase info
$org = 'B1';
$fid = '10898';
$bank_id = '122100024';

// transaction retrieval date range
$start_date = '20090101000000';        // from date, to..
$end_date = date('YmdHis');        // now

$xml = "
<OFX>
    <SIGNONMSGSRQV1>
    <SONRQ>
        <DTCLIENT>$date</DTCLIENT>
        <USERID>$user</USERID>
        <USERPASS>$pass</USERPASS>
        <LANGUAGE>ENG</LANGUAGE>
        <FI>
            <ORG>$org</ORG>
            <FID>$fid</FID>
        </FI>
        <APPID>QWIN</APPID>
        <APPVER>2200</APPVER>
    </SONRQ>
</SIGNONMSGSRQV1>

<BANKMSGSRQV1>
    <STMTTRNRQ>
        <TRNUID>$txn_id</TRNUID>
        <STMTRQ>
            <BANKACCTFROM>
                <BANKID>$bank_id</BANKID>
                <ACCTID>$accnt_num</ACCTID>
                <ACCTTYPE>$accnt_type</ACCTTYPE>
            </BANKACCTFROM>
            <INCTRAN>
                <DTSTART>$start_date</DTSTART>
                <DTEND>$end_date</DTEND>
                <INCLUDE>Y</INCLUDE>
            </INCTRAN>
        </STMTRQ>
    </STMTTRNRQ>
</BANKMSGSRQV1>
</OFX>";

$ch = curl_init();
$ch1 = curl_setopt($ch, CURLOPT_URL, 'https://ofx.chase.com');
$ch2 = curl_setopt($ch, CURLOPT_POST, 1);
$ch3 = curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
$ch4 = curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$ch5 = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ch6 = curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$result = curl_exec($ch);
if ($result) {
    echo $result;
}
    else
echo "<pre>CURL ERROR: " . curl_error($ch) . "</pre>";
curl_close ($ch);
?>

尝试从浏览器运行此消息时,我收到以下消息。

CURL ERROR: SSL read: error:00000000:lib(0):func(0):reason(0), errno 0

我在另一篇文章中看到您可能需要更新 cacert.pem 证书,所以我下载了新证书并将其添加到我的 php.ini 文件中,但它没有帮助。

curl.cainfo = "C:\xampp\PHP\cacert.pem"

如果我使用 curl_errno 而不是 curl_error,我会得到一个 curl 错误代码 56,即 CURLE_RECV_ERROR (56) 接收网络数据失败。

我知道追逐服务器可用于 OFX 下载,因为我能够通过 GNUCash 财务经理获取我的银行信息。有人可以提供的任何帮助将不胜感激。

4

1 回答 1

1

我最近一直在做类似的事情,由于我真的无法解释的原因,我也无法获得您用来工作的相同代码片段。然而,我确实对这个 php 库有立竿见影的运气。你会得到一个漂亮整洁的 $finance 对象。我破解了帐户类以拥有一个$transactions属性,我稍后会用交易填充该属性,因为该信息可从已经发出的 OFX​​ 请求中获得。

我将此添加到 Account->setup() 的末尾

    ...
    $a = $x->xpath('/OFX/*/*/*/AVAILBAL/BALAMT');
    if(isset($a[0]))
        $this->availableBalance = (double)$a[0];

// added code below
    if($this->type == 'BANK')
        $this->transactions = $x->xpath('/OFX/BANKMSGSRSV1/STMTTRNRS/STMTRS/BANKTRANLIST/STMTTRN');
    elseif($this->type == 'CC')
        $this->transactions = $x->xpath('/OFX/CREDITCARDMSGSRSV1/CCSTMTTRNRS/CCSTMTRS/BANKTRANLIST/STMTTRN');

希望这可以帮助!

于 2014-03-23T17:57:34.807 回答