Repository navigation
Release 8.9.0 - payment setups, retries and issuing - #705
armando-rodriguez-cko wants to merge 1 commit into
Conversation
🟡 Risk Classification: MINORApproval route: AI Review + Human Approval Classification reasons
Operational gates
Files analysed: 1 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
🔵 Advisory review: Sound, but needs your judgementThis PR needs a human approval. The code itself reads as correct; whether it should land depends on context I don't have. The diff only shows a version bump from 8.8.0 to 8.9.0; all substantive code changes described in the PR body are not visible in this diff. The PR explicitly flags breaking type changes (PaymentSetupPaymentType, Double vs Long, CustomerRetry vs PaymentRetryRequest) yet increments only the minor version, which a reviewer should consciously sign off on. For you to decide
This is not an approval. wall-e cannot auto-approve this PR — it is an opinion to help whoever does. Advisory review · us.anthropic.claude-sonnet-4-6 · wall-e 2026.06.19-02 |
363276f to
971306d
Compare
🟡 Risk Classification: MINORApproval route: AI Review + Human Approval Classification reasons
Operational gates
Files analysed: 1 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
971306d to
bdeea21
Compare
🟡 Risk Classification: MINORApproval route: AI Review + Human Approval Classification reasons
Operational gates
Files analysed: 1 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
This release adds the Payment Setup payment type, the risk settings on the Payment Setup confirm response and the Tamara risk assessment fields. It also adds the subscription details and the retry attempt count to payment responses, and lets you revoke and suspend Issuing cards without a request body. Customer retries on hosted payments and payment links now use the type the API accepts, and the update card headers the API no longer documents are deprecated. Every deprecated member keeps working and will be removed in the next major version. **Added** Issuing (#697) * `IssuingClient#revokeCard(String cardId)`, `#suspendCard(String cardId)`, `#revokeCardSync(String cardId)` and `#suspendCardSync(String cardId)`. The existing overloads that take a `RevokeCardRequest` or `SuspendCardRequest` now accept `null`, because the request body is optional in the API. Payment Setups (#700) * `PaymentSetupPaymentType` with the values of the Payment Setups API: `REGULAR` (`regular`), `RECURRING` (`recurring`), `MOTO` (`moto`), `INSTALLMENT` (`installment`), `PAY_LATER` (`pay_later`), `UNSCHEDULED` (`unscheduled`). * `PaymentSetupsConfirmResponse#risk` (`PaymentSetupRisk`). * `Tamara#initialization` (`PaymentMethodInitialization`, default `DISABLED`) and `Tamara#riskAssessment`, with the new `TamaraRiskAssessment` (`premiumCustomer`, `riskScore`, `orderCountLast24h`, `linkedDeviceCount`). Payments (#701) * `PaymentResponse#subscription` (`PaymentSubscription`). * `PaymentRetryResponse#attemptsMade`, returned by get payment details. **Changed** * `PaymentRetryRequest#enabled` is no longer deprecated. It is the required switch for asynchronous retries on payment requests (#701). * Request and response fields of payments, payment retries, hosted payments, payment links, payment sessions and Payment Setups now document whether they are required or optional, with the limits, defaults and enum values of the API reference (#700, #701). * Payment Setup payment methods document that an update replaces the payment methods, so `initialization` must be sent as `ENABLED` again to keep a method enabled (#700). **Fixed** * The `Retry` response of a payment request no longer reports `maxAttempts` as 6 when the API did not return it (#701). **Deprecated** All deprecated members keep working and will be removed in the next major version. * `CardUpdateHeaders` and the `IssuingClient#updateCard` and `#updateCardSync` overloads that take it: the API no longer documents the `return-encrypted-cvv` and `Encryption-Key` headers. Headers that are set are still sent. Use `updateCard(String, UpdateCardRequest)` or `updateCardSync(String, UpdateCardRequest)` (#697). * `HostedPaymentRequest#setCustomerRetry(PaymentRetryRequest)` and `HostedPaymentRequestBuilder#customerRetry(PaymentRetryRequest)`: customer retries only accept `max_attempts`, so only that value is kept. Use the `CustomerRetry` overloads (#701). * `PaymentLinkRequest#setCustomerRetry(PaymentRetryRequest)` and `PaymentLinkRequestBuilder#customerRetry(PaymentRetryRequest)`: same reason. Use the `CustomerRetry` overloads (#701). **Breaking changes required by the API**⚠️ * `PaymentSetupsRequest#paymentType`, `PaymentSetupsResponse#paymentType` and `PaymentSetupsConfirmResponse#paymentType` change from `com.checkout.payments.PaymentType` to `PaymentSetupPaymentType`. The Payment Setups API only accepts the lowercase values; the old type sent `PayLater`, which the API rejects with a 422, and read every value except `regular` as null. Migration: replace `PaymentType.X` with `PaymentSetupPaymentType.X` (#700). * `MerchantAccount#lastPaymentAmount` (Payment Setups customer) changes from `Long` to `Double`, because the API defines it as a number (for example `55.99`). Migration: pass a `Double` (for example `500d`) and read the getter as `Double` (#700). * `HostedPaymentRequest#customerRetry` and `PaymentLinkRequest#customerRetry` change from `PaymentRetryRequest` to `CustomerRetry`, because customer retries only accept `max_attempts` (0 to 5). Code that sets the field keeps compiling through the deprecated overloads; code that reads `getCustomerRetry()` now gets a `CustomerRetry`. Migration: `CustomerRetry.builder().maxAttempts(n).build()` (#701). **Dependencies** * gson 2.14.0, slf4j-api 2.0.18 and commons-codec 1.22.1, all still compatible with Java 8 (#702).
bdeea21 to
b781c4e
Compare
🟡 Risk Classification: MINORApproval route: AI Review + Human Approval Classification reasons
Operational gates
Files analysed: 1 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
|



This release adds the Payment Setup payment type, the risk settings on the Payment Setup confirm response and the Tamara risk assessment fields. It also adds the subscription details and the retry attempt count to payment responses, and lets you revoke and suspend Issuing cards without a request body. Customer retries on hosted payments and payment links now use the type the API accepts, and the update card headers the API no longer documents are deprecated. Every deprecated member keeps working and will be removed in the next major version.
Added
Issuing (#697)
IssuingClient#revokeCard(String cardId),#suspendCard(String cardId),#revokeCardSync(String cardId)and#suspendCardSync(String cardId). The existing overloads that take aRevokeCardRequestorSuspendCardRequestnow acceptnull, because the request body is optional in the API.Payment Setups (#700)
PaymentSetupPaymentTypewith the values of the Payment Setups API:REGULAR(regular),RECURRING(recurring),MOTO(moto),INSTALLMENT(installment),PAY_LATER(pay_later),UNSCHEDULED(unscheduled).PaymentSetupsConfirmResponse#risk(PaymentSetupRisk).Tamara#initialization(PaymentMethodInitialization, defaultDISABLED) andTamara#riskAssessment, with the newTamaraRiskAssessment(premiumCustomer,riskScore,orderCountLast24h,linkedDeviceCount).Payments (#701)
PaymentResponse#subscription(PaymentSubscription).PaymentRetryResponse#attemptsMade, returned by get payment details.Changed
PaymentRetryRequest#enabledis no longer deprecated. It is the required switch for asynchronous retries on payment requests (fix(payments): align retry and customer retry types with the spec #701).initializationmust be sent asENABLEDagain to keep a method enabled (feat(setups): add the setup payment type, confirm risk and tamara fields #700).Fixed
Retryresponse of a payment request no longer reportsmaxAttemptsas 6 when the API did not return it (fix(payments): align retry and customer retry types with the spec #701).Deprecated
All deprecated members keep working and will be removed in the next major version.
CardUpdateHeadersand theIssuingClient#updateCardand#updateCardSyncoverloads that take it: the API no longer documents thereturn-encrypted-cvvandEncryption-Keyheaders. Headers that are set are still sent. UseupdateCard(String, UpdateCardRequest)orupdateCardSync(String, UpdateCardRequest)(deprecate(issuing): deprecate the update-card headers and allow revoke and suspend without a body #697).HostedPaymentRequest#setCustomerRetry(PaymentRetryRequest)andHostedPaymentRequestBuilder#customerRetry(PaymentRetryRequest): customer retries only acceptmax_attempts, so only that value is kept. Use theCustomerRetryoverloads (fix(payments): align retry and customer retry types with the spec #701).PaymentLinkRequest#setCustomerRetry(PaymentRetryRequest)andPaymentLinkRequestBuilder#customerRetry(PaymentRetryRequest): same reason. Use theCustomerRetryoverloads (fix(payments): align retry and customer retry types with the spec #701).Breaking changes required by the API⚠️
PaymentSetupsRequest#paymentType,PaymentSetupsResponse#paymentTypeandPaymentSetupsConfirmResponse#paymentTypechange fromcom.checkout.payments.PaymentTypetoPaymentSetupPaymentType. The Payment Setups API only accepts the lowercase values; the old type sentPayLater, which the API rejects with a 422, and read every value exceptregularas null. Migration: replacePaymentType.XwithPaymentSetupPaymentType.X(feat(setups): add the setup payment type, confirm risk and tamara fields #700).MerchantAccount#lastPaymentAmount(Payment Setups customer) changes fromLongtoDouble, because the API defines it as a number (for example55.99). Migration: pass aDouble(for example500d) and read the getter asDouble(feat(setups): add the setup payment type, confirm risk and tamara fields #700).HostedPaymentRequest#customerRetryandPaymentLinkRequest#customerRetrychange fromPaymentRetryRequesttoCustomerRetry, because customer retries only acceptmax_attempts(0 to 5). Code that sets the field keeps compiling through the deprecated overloads; code that readsgetCustomerRetry()now gets aCustomerRetry. Migration:CustomerRetry.builder().maxAttempts(n).build()(fix(payments): align retry and customer retry types with the spec #701).Dependencies