I have an iOS app with Plaid/Dwolla integration. This has worked for many months but the last time I tried it was a few months ago. Every once in a while I try it to make sure it is still working. Now it fails. I was using iOS14 but now have iOS17. That is the only difference. I have two versions, the proper one uses a secure server for auth and transfers (I use Heroku), and a simpler one calls the auth and transfer API directly from the app to your servers (which I know is not allowed for real production). Both versions are failing.
Here is the log from the Heroku failure which is “certificate has expired”. I have no idea what that means.
2024-05-09T21:27:53.160222+00:00 app[web.1]: Your app is listening on port 32722
2024-05-09T21:27:53.300948+00:00 heroku[web.1]: State changed from starting to up
2024-05-09T21:42:24.107531+00:00 app[web.1]: { bearer: ‘x3RPHKfj2qwVbnFiCROfn5DXpUXw51T2QICrYIyxMbee8u1A11’,
2024-05-09T21:42:24.107771+00:00 app[web.1]: destination: ‘https://api-sandbox.dwolla.com/funding-sources/e57985ec-bd30-49e2-84a0-f14a9904ede9’,
2024-05-09T21:42:24.107772+00:00 app[web.1]: amt: ‘55’ }
2024-05-09T21:42:24.107779+00:00 app[web.1]: x3RPHKfj2qwVbnFiCROfn5DXpUXw51T2QICrYIyxMbee8u1A11 https://api-sandbox.dwolla.com/funding-sources/e57985ec-bd30-49e2-84a0-f14a9904ede9 55
2024-05-09T21:42:24.107789+00:00 app[web.1]: {“amount”:{“currency”:“USD”,“value”:“55”},“_links”:{“source”:{“href”:https://api-sandbox.dwolla.com/funding-sources/5921a0ab-854d-4a11-ba3c-6f9cf61aba83},“destination”:{“href”:https://api-sandbox.dwolla.com/funding-sources/e57985ec-bd30-49e2-84a0-f14a9904ede9}}}
2024-05-09T21:42:24.107789+00:00 app[web.1]: { hostname: ‘api-sandbox.dwolla.com’,
2024-05-09T21:42:24.107790+00:00 app[web.1]: port: 443,
2024-05-09T21:42:24.107790+00:00 app[web.1]: path: ‘/transfers’,
2024-05-09T21:42:24.107790+00:00 app[web.1]: method: ‘POST’,
2024-05-09T21:42:24.107791+00:00 app[web.1]: headers:
2024-05-09T21:42:24.107791+00:00 app[web.1]: { ‘Content-Type’: ‘application/vnd.dwolla.v1.hal+json’,
2024-05-09T21:42:24.107792+00:00 app[web.1]: Accept: ‘application/vnd.dwolla.v1.hal+json’,
2024-05-09T21:42:24.107792+00:00 app[web.1]: Authorization: ‘Bearer x3RPHKfj2qwVbnFiCROfn5DXpUXw51T2QICrYIyxMbee8u1A11’ } }
2024-05-09T21:42:24.135122+00:00 app[web.1]: { Error: certificate has expired
2024-05-09T21:42:24.135124+00:00 app[web.1]: at TLSSocket. (_tls_wrap.js:1116:38)
2024-05-09T21:42:24.135124+00:00 app[web.1]: at emitNone (events.js:106:13)
2024-05-09T21:42:24.135124+00:00 app[web.1]: at TLSSocket.emit (events.js:208:7)
2024-05-09T21:42:24.135124+00:00 app[web.1]: at TLSSocket._finishInit (_tls_wrap.js:643:8)
2024-05-09T21:42:24.135125+00:00 app[web.1]: at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:473:38) code: ‘CERT_HAS_EXPIRED’ }
2024-05-09T21:42:54.105724+00:00 heroku[router]: at=error code=H12 desc=“Request timeout” method=POST path=“/dwollaTransfer” host=square-inapp-test.herokuapp.com request_id=ad50b0bb-5b0b-4a3c-bda8-4b5e3cda050b fwd=“108.20.21.169” dyno=web.1 connect=0ms service=30036ms status=503 bytes=0 protocol=https
The direct from app to your server version throws a status code 400 when the transfer occurs. The body of data sent via the API contains the source and destination funding sources as shown in the Heroku log above. No other useful information is returned but here is the returned data.
Printing description of response:
▿ Optional
- some : <NSHTTPURLResponse: 0x600001c9d1e0> { URL: https://api-sandbox.dwolla.com/transfers } { Status Code: 400, Headers {
“Access-Control-Allow-Origin” = (
“*”
);
“Content-Length” = (
88
);
“Content-Type” = (
“application/vnd.dwolla.v1.hal+json; profile="http://nocarrier.co.uk/profiles/vnd.error/\”"
);
Date = (
“Thu, 09 May 2024 22:38:20 GMT”
);
Server = (
cloudflare
);
“cf-cache-status” = (
DYNAMIC
);
“cf-ray” = (
“88152de0ad51905c-BOS”
);
“x-request-id” = (
“8fcbd82a-4318-4ca1-962a-2dba64633655”
);
} }
The customerID I am using is:
c271b8e8-4263-406c-934e-a402b3b26fa3
As I say, the Plaid/Dwolla code for my app has worked in the past, the only difference that I can see is the update to iOS17.
Thanks.