Saloon retries whenever an exception is thrown (handleRetry defaults to true)
and both connectors set tries = 3, so POST /payoffs, PATCH /payoffs/{id}/accept
and SBP QrcReversalRequest were sent to the bank up to three times while the
caller believed it had made a single request. For payouts a repeated POST is a
duplicate-payment risk, not a harmless retry.
HasSafeRetries replaces the HasTries default at the connector level (Saloon
retries only when the per-send callable, the request and the connector all
allow it):
- a deterministic bank verdict (4xx/5xx) is never retried;
- an explicit deny-list covers money operations;
- an explicit allow-list keeps retries for read-only SBP operations, since that
API uses POST even for reads (GetQrcReversalDataRequest stays denied: the bank
matches the following reversal against it, EBD 44 / I14044);
- by default only GET/HEAD/OPTIONS are retried.
Every decision is logged through the connector's PSR-3 logger as
'[alfa-sdk][retry]', so physical request count per operation is countable via
X-Request-ID.
Tests: tests/Feature/RetryPolicyTest.php (23 tests), including an assertion on
the real retry loop that a failing non-idempotent POST is sent exactly once,
while a read-only GET still uses all configured attempts.
Three request classes in Sbp\Requests\DigitalRuble\CashLink used the HasStringBody
trait and CmsSigner::canonicalize() without importing them, so loading the class
fataled with 'Trait not found' / 'Class not found'.
- Make keyNameAlias parameter optional in SbpConnector with null default
- Add redirectUri parameter to AlfaBankServiceProvider configuration
- Make keyNameAlias optional in service provider with null coalescing operator
- Add conditional check for caBundlePath to allow disabling SSL verification
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Refactor AlfaBankConnector to use Saloon's OAuth2 traits
- Update authentication methods to use new OAuth2 implementation
- Add tests for authorization URL generation, token exchange, and refresh
- Replace custom GetTokenRequest with Saloon's built-in OAuth2 requests
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Implement H2H authentication service for secure client authentication
- Add new examples for authorization code flow and H2H auth service
- Include example for generating client secret
- Update core connector and token request functionality
- Enhance README with new features
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>