Kan enbart hämta 40 senaste transaktionerna
lasdjfk opened this issue · 15 comments
Kan enbart hämta 40 senaste transaktionerna, sedan kommer inga fler, även om jag går till nästa sida. Är detta en begränsning som är inbyggd i detta API? I den officiella Swedbank appen verkar man kunna gå hur långt tillbaka i tiden som helst.
Det du kan göra i Swedbanks/sparbanken app kan du i teorin göra med SwedbankJson, den använder exakt samma API. Det kanske är möjligt att Swedbank har ändrat hur den sköter sidbläddringen sedan jag sist tittade på det.
Vad är det för typ av konto du försöker bläddra i? Har ser din kod ut som sköter bläddringen?
Hmm, ja känns som kanske Swedbank ändrat något. Använder vanligt privatkonto $bankApp = 'swedbank'.
Ungefär denna kod:
// get profile id
$profiles = $bankConn->Profilelist();
$profile_id = $profiles->privateProfile->id;
$accounts = $bankConn->AccountList($profile_id);
$account_id = $accounts->transactionAccounts[1]->id;
// loop until all transaction have been found
for ($x = 1; $x < 999; $x++)
{
$account_info = $bankConn->AccountDetails($account_id, 20, $x);
$transactions = $account_info->transactions;
$count = count($transactions);
if (! $account_info->moreTransactionsAvailable)
{
break;
}
}
Funkar att bläddra till andra sidor om jag väljer 20 per sida. Men totalt blir endast 40 transaktioner.
Det jag kan se är att Swedbanks appar ät att de använder endpointen engagement/account/$accountID/transactions
, till skillnad mot AccountDetails() som använder engagement/transactions/$accountID
.
Det är möjligt att dessa endpoints har olika beteenden, men jag har tyvärr inte möjlighet att se det pga. jag har inte tillgång till ett konto med många transaktioner.
Har du provat att enbart ange accountID i AccountDetails() och inte skicka med antalet och sidnumrering? Får du fler transaktioner då? Om ja, då brukar Swedbank skicka med en next-länk med den URL som man bör använda för att kunna göra en viss sak i API:et. Om du kan dela med dig av den URL:en, anonymiserad så klar, så skulle jag kunna titta på att antingen göra en ny patch eller lägga till en syster-metod till AccountDetails() som använder den nya metoden.
Aha! Fick några fler transaktioner när jag skickar utan antal och sidnumrering, och även [moreTransactionsAvailable] => 1, samt en next länk. Så det är nog som du säger. Såhär ser länken ut:
/v5/engagement/transactions/$accountID?transactionsPerPage=46&paginationId=$accountID&page=2
Tjohoo, när jag ändrar till
$output = $this->_auth->getRequest("engagement/account/$accountID/transactions", $query);
i accountDetails-metoden så får jag transaktioner ända tillbaka till början av 2020. Underbart! Dock har transaktionsobjektet lite annat format så kanske hade varit bättre ett ha det i en separat metod.
En annan bra grej är att det numera verkar finnas ett uniqueTransactionId som verkar stabilt och borde kunna användas för att synkronisera transaktioner till databas.
Tjohoo, när jag ändrar till $output = $this->_auth->getRequest("engagement/account/$accountID/transactions", $query);
i accountDetails-metoden så får jag transaktioner ända tillbaka till början av 2020. Underbart! Dock har transaktionsobjektet lite annat format så kanske hade varit bättre ett ha det i en separat metod.
Strålande, bra jobbat! Ja, det är nog bäst att man har det som en separat metod. Tänker att man döper den till "AccountTranscations" eller likande. Men om jag ska kunna göra det, så behöver jag veta hur responsen för engagement/account/$accountID/transactions
ser ut. Närmare bestämt hur den bygger upp URL:en för pagenering till nästa sida. För jag tror att att skicka in next-URL:en som en eventuell parameter kanske är en tillräcklig bra lösning för det.
En annan bra grej är att det numera verkar finnas ett uniqueTransactionId som verkar stabilt och borde kunna användas > för att synkronisera transaktioner till databas.
Nice om det stämmer. Jag behöver nog undersöka det lite djupare, då Swedbanks API kan vara oberäknelig i vissa situationer. Men om den är tillförlitlig så löser det många sync-relaterade problem!
Såhär ser next URL:en ut:
[uri] => /v5/engagement/account/$accountID/transactions?transactionsPerPage=57&page=2
Av någon anledning verkar pagineringen inte fungera i accountDetails efter ändringen enl ovan. Om jag skickar med parametrarna får jag samtliga transaktioner i en enda respons. Skickar jag inte med några parametrar får jag 57 transaktioner och en länk till nästa sida.
Verkar enbart fungera med paginering om jag tar exakt 57 transaktioner i taget. Alla andra nummer returnerar samtliga transaktioner från tidens begynnelse.
Edit: Tror swedbank appen laddar 57 transaktioner i taget också, så det kanske är hårdkodat att bara funka med detta.
Undersökt vad för info man får från engagement/account/$accountID/transactions
, tyvärr så saknas memo info från Swish, och ingen länk till mer info om transaktionen finns heller.
[40] => stdClass Object
(
[hasUncertainCategorization] =>
[parsedData] => Array
(
[0] => stdClass Object
(
[key] => ReferenceId
[value] => 66337120502xxxxx
)
[1] => stdClass Object
(
[key] => BookedDate
[value] => 2022-01-10
)
[2] => stdClass Object
(
[key] => TextSv
[value] => Swish skickad +467093xxxxx
)
[3] => stdClass Object
(
[key] => TextEn
[value] => Swish payment +467093xxxxx
)
[4] => stdClass Object
(
[key] => TransCode
[value] => 256
)
[5] => stdClass Object
(
[key] => SwishFromName
[value] => SVEN SVENSSON
)
[6] => stdClass Object
(
[key] => SwishFromNumber
[value] => +46 (0)705 xxx xxx
)
[7] => stdClass Object
(
[key] => SwishToName
[value] => Jan Jacobsson
)
[8] => stdClass Object
(
[key] => SwishToNumber
[value] => +46 (0)709 xxx xxx
)
[9] => stdClass Object
(
[key] => MerchantName
[value] =>
)
)
[accountId] => 416984
[uniqueTransactionId] => 00DAE1F6E123ADA3B2xxxxxxxx
[reservationId] => 00DAE1F6E123ADA3B2xxxxxxxx
[comments] => Array
(
)
[tags] => Array
(
)
[timestamp] => 2022-01-08T10:58:31.00000
[id] => 600xxxxxx
[date] => 2022-01-08T00:00:00.00000
[dateFormatted] => 2022-01-08
[amount] => -5120
[currency] => SEK
[text] => Swish skickad +46709xxxxxx
[categoryId] => 290
[detectedCategories] => Array
(
[0] => stdClass Object
(
[categoryId] => 290
[score] => 1
)
)
[isOwnAccountTransfer] =>
)
@CirruZZ precis. Och saknas även acccountingDate (bokföringsdatum). Och detta är ju konstigt för på Swedbank-appen kan man få all denna data, även om man går tillbaka långt i tiden. Undrar om swedbank-appen använder någon annan endpoint nu för tiden. Vad tror du @walle89 ?
Ps. jag försökte använda detta id med funktionen transactionDetails, men detta gick inte tyvärr.
@CirruZZ precis. Och saknas även acccountingDate (bokföringsdatum). Och detta är ju konstigt för på Swedbank-appen kan man få all denna data, även om man går tillbaka långt i tiden. Undrar om swedbank-appen använder någon annan endpoint nu för tiden. Vad tror du @walle89 ?
Är inte [key] => BookedDate
bokföringsdatumet då?
Ps. jag försökte använda detta id med funktionen transactionDetails, men detta gick inte tyvärr.
Kollade på det också men det är olika id. Du kan bara, vad jag vet, få ut det ID som behövs från engagement/transactions/$accountID
och där är ju begräsningen hur långt bak i tiden man kan gå.
@CirruZZ precis. Och saknas även acccountingDate (bokföringsdatum). Och detta är ju konstigt för på Swedbank-appen kan man få all denna data, även om man går tillbaka långt i tiden. Undrar om swedbank-appen använder någon annan endpoint nu för tiden. Vad tror du @walle89 ?
Är inte
[key] => BookedDate
bokföringsdatumet då?
Nä, BookedDate verkar alltid vara samma som transaktionsdatum såvitt jag kan se.
Jag har en transkation som i Swedbankappen är märkt som Bokförningsdartum 2022-02-25, Transatkionsdatum 2022-02-24. Detta är payloaden:
{
"hasUncertainCategorization": false,
"parsedData": [{
"key": "BookedDate",
"value": "2022-02-25"
}, {
"key": "TextSv",
"value": "Övf via internet 24438FAKE635970"
}, {
"key": "TextEn",
"value": "Tranf by interne 24438FAKE635970"
}, {
"key": "TransCode",
"value": "552"
}, {
"key": "MerchantName",
"value": " "
}],
"accountId": 5FAKE61,
"uniqueTransactionId": "45A00FAKE1D9096806BCC53952",
"reservationId": "45A0000DB1D9FAKE5395096802",
"comments": [],
"tags": [],
"timestamp": "2022-02-24T20:08:51.00000",
"id": 63FAKE793,
"date": "2022-02-24T00:00:00.00000",
"dateFormatted": "2022-02-24",
"amount": 2.0,
"currency": "SEK",
"text": "Övf via internet 24438FAKE635970",
"categoryId": 213,
"detectedCategories": [{
"categoryId": 213,
"score": 0.65
}, {
"categoryId": 229,
"score": 0.2
}, {
"categoryId": 302,
"score": 0.15
}],
"isOwnAccountTransfer": false
}
Med andra ord, BookedDate är bokförnngsdatumet. Någon av de övriga datumen är transaktionsdatumet.
Dessutom så verkar det som att transactionDetails
eller motsvarande inte används över huvud taget med engagement/account/$accountID/transactions
endpointen. All information om alla transaktioner bör finnas där.
Gällande Swish så kan jag tyvärr inte testa det, då jag använder inte det med Swedbank.
Ja, det verkar ju faktiskt stämma, nu när jag kollar igen, att BookedDate är bokföringsdatum. Så bra!
parsedData finns inte innan 2021-02-01 för mig, men det stämmer med den info jag får från swedbank-appen (inte heller där får jag bokföringsdatum för transaktioner innan 2021-02-01).