Skip to content

v3.0.0 — Complete, fully-typed binding to the Digistore24 API

Latest

Choose a tag to compare

@PaulGossen PaulGossen released this 18 Jun 07:28
· 1 commit to main since this release

This major release turns the SDK into a complete, fully-typed binding to the entire Digistore24 API and fixes a long list of inconsistencies — many of which meant requests silently did nothing or responses came back empty. Every change was derived from the per-endpoint OpenAPI specs and verified live against a real account and order.

✨ Highlights

  • Fully-typed, complete binding. Every response now exposes every API field as a typed property — with nested DTOs for objects like the buyer, line items, and transactions — plus a data array with the full raw payload so no field is ever lost. Every request exposes a settable property for every spec parameter. (+41 DTOs, +14 enums.)
  • All 9 product languages. createProduct / updateProduct / copyProduct now accept name, description, access_instructions, optin_text, etc. in all nine API languages (de, en, es, fr, pt, pl, it, nl, sl) — previously only de/en/es.
  • Spec-aligned HTTP methods. Reads use GET, updates PUT, deletes DELETE (previously almost everything was POST).
  • SpecConformanceTest freezes the endpoint → HTTP-method mapping for all 122 endpoints and guards against future drift.

🐞 Notable fixes

  • data[] wrapping — many create/update endpoints (productGroup, orderform, voucher, paymentplan, shippingCostPolicy, product, buyer, upsells, affiliateCommission, purchase, …) sent their fields flat, so the API silently ignored the update (modified:N) or rejected the call. They now nest the fields under data[] as required.
  • Wrong response field mapping — getPurchase, getProduct, getImage, statsSales, getGlobalSettings and others read wrong or non-existent keys and surfaced only a fraction of the data; all corrected to the real keys.
  • Empty responses — ten parsers (createOrderform, createUpgrade, getOrderform, getPurchaseTracking, …) returned nothing because they unwrapped the data envelope twice. Fixed.
  • Parsing crashes — response parsing no longer throws when the API legitimately returns a value a strict input validator would reject (e.g. getVoucher's valid_from).
  • Correct parameter names where they differed from the SDK (policy_id, service_proof_id, …).

⚠️ Breaking changes

Most "breaking" changes touch code paths that were previously broken. The key ones:

  • CreatePaymentplanRequest now takes $productId before $paymentPlan.
  • Several request constructors changed to the real API parameters: UpdateAffiliateCommissionRequest takes productIds (string); GetEticketRequest / ValidateEticketRequest use eticketId; the service-proof requests use serviceProofId (int); ListAccountAccessRequest is parameterless; ListPaymentPlansRequest requires a productId; the eticket/service-proof/delivery list endpoints take a search DTO.
  • Some response properties moved — e.g. GetPurchaseResponse no longer has $productId / $buyerEmail; use $response->buyer->email and $response->items[0]->productId, or the full $response->data.
  • UpdateBuyerRequest takes individual address fields instead of an $address array.
  • refundPartially moved from $ds24->billing to $ds24->purchases.
  • Invalid requests now throw a ValidationException (HTTP 400) before any HTTP call.

👉 See MIGRATION.md for step-by-step upgrade instructions and CHANGELOG.md for the full list.

Requirements

  • PHP 8.4+ (the SDK uses property hooks)