Repository navigation
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
dataarray 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/copyProductnow acceptname,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).
SpecConformanceTestfreezes 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 underdata[]as required.- Wrong response field mapping —
getPurchase,getProduct,getImage,statsSales,getGlobalSettingsand 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
dataenvelope 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'svalid_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:
CreatePaymentplanRequestnow takes$productIdbefore$paymentPlan.- Several request constructors changed to the real API parameters:
UpdateAffiliateCommissionRequesttakesproductIds(string);GetEticketRequest/ValidateEticketRequestuseeticketId; the service-proof requests useserviceProofId(int);ListAccountAccessRequestis parameterless;ListPaymentPlansRequestrequires aproductId; the eticket/service-proof/delivery list endpoints take a search DTO. - Some response properties moved — e.g.
GetPurchaseResponseno longer has$productId/$buyerEmail; use$response->buyer->emailand$response->items[0]->productId, or the full$response->data. UpdateBuyerRequesttakes individual address fields instead of an$addressarray.refundPartiallymoved from$ds24->billingto$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)