Utiliser le Checkout API pour la session de souscription (accept_url/cancel_url)
hosted_page_links.payment_info (POST /v1/subscription) n'honore pas accept_url/cancel_url malgré la doc, même passés en query string (constaté en test sur test.colibre.fr). On génère maintenant la page de paiement via POST /v1/session/subscription (Checkout API), qui accepte ces champs dans son body et redirige effectivement le navigateur — même mécanisme déjà fonctionnel pour l'ajout de moyen de paiement (create_recurring_session). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+15
-14
@@ -1,5 +1,4 @@
|
||||
import os
|
||||
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
|
||||
|
||||
import httpx
|
||||
|
||||
@@ -62,13 +61,6 @@ def update_customer(handle: str, data: dict) -> dict:
|
||||
return _call("PUT", f"/v1/customer/{handle}", json=data)
|
||||
|
||||
|
||||
def _with_query(url: str, **params: str) -> str:
|
||||
parts = urlsplit(url)
|
||||
query = dict(parse_qsl(parts.query))
|
||||
query.update(params)
|
||||
return urlunsplit(parts._replace(query=urlencode(query)))
|
||||
|
||||
|
||||
def create_subscription_session(
|
||||
plan_handle: str,
|
||||
handle: str,
|
||||
@@ -78,9 +70,6 @@ def create_subscription_session(
|
||||
customer_handle: str | None = None,
|
||||
create_customer: dict | None = None,
|
||||
) -> str:
|
||||
# CreateSubscription (POST /v1/subscription) n'a pas de champs accept_url/
|
||||
# cancel_url : ils doivent être ajoutés en query string sur le lien
|
||||
# hosted_page_links.payment_info renvoyé, pas dans le body (cf. doc Frisbii).
|
||||
body: dict = {
|
||||
"plan": plan_handle,
|
||||
"signup_method": "link",
|
||||
@@ -92,9 +81,21 @@ def create_subscription_session(
|
||||
body["create_customer"] = create_customer
|
||||
if no_trial:
|
||||
body["no_trial"] = True
|
||||
data = _call("POST", "/v1/subscription", json=body)
|
||||
payment_info = data["hosted_page_links"]["payment_info"]
|
||||
return _with_query(payment_info, accept_url=accept_url, cancel_url=cancel_url)
|
||||
_call("POST", "/v1/subscription", json=body)
|
||||
# CreateSubscription (POST /v1/subscription) n'a pas de champs accept_url/
|
||||
# cancel_url. La session de checkout dédiée (Checkout API), elle, les
|
||||
# honore et redirige réellement le navigateur après succès/annulation.
|
||||
data = _call(
|
||||
"POST",
|
||||
"/v1/session/subscription",
|
||||
json={
|
||||
"subscription": handle,
|
||||
"accept_url": accept_url,
|
||||
"cancel_url": cancel_url,
|
||||
},
|
||||
base_url=_checkout_url(),
|
||||
)
|
||||
return data["url"]
|
||||
|
||||
|
||||
def create_recurring_session(
|
||||
|
||||
Reference in New Issue
Block a user