Skip to content

Configuration de Stripe pour la nouvelle version 1.x de Cywise

Cywise 0.x utilise Stripe et des clients ont un abonnement en cours.

Pour Cywise 1.x, nous avons changé de framework pour utiliser Wave.

Je veux configurer Stripe sur Cywise 1.x et récupérer les différentes informations Stripe stockées dans la base de la version 0.x.

Fonctionnement de Stripe en 0.x et 1.x

IDs Stripe dans v0.x

Base Table Column
towerify subscriptions stripe_id
towerify subscriptions stripe_status
towerify subscriptions stripe_price
towerify subscription_items stripe_id
towerify subscription_items stripe_product
towerify subscription_items stripe_price
towerify users stripe_id
towerify users stripe_tx_id

IDs Stripe dans v1.x | Base | Table | Column | | :--------- | :------------ | :--------------------- | | towerify1x | subscriptions | vendor_slug | | towerify1x | subscriptions | vendor_product_id | | towerify1x | subscriptions | vendor_transaction_id | | towerify1x | subscriptions | vendor_customer_id | | towerify1x | subscriptions | vendor_subscription_id |

Dans la v0.x, le seul menu lié à Stripe est "Mon abonnement" qui renvoie l'utilisateur vers une page Stripe (https://billing.stripe.com/p/session/live_...) où il peut changer l'abonnement, l'annuler, changer le moyen de paiement, voir les factures. Vu le code, il n'utilise que le users.stripe_id pour générer l'URL vers Stripe users.stripe_tx_id est utilisé pour faire l'aller-retour entre Cywise et Stripe au moment de la souscription. La v0.x stocke une souscription liée à un item de souscription alors que la v1.x ne stocke pas d'item.

En faisant un test d'achat avec la v1.x et Stripe en mode tests, je n'ai rien dans les colonnes vendor_product_id et vendor_transaction_id de la table subscriptions.

Analyse des données 0.x et 1.x

J'ai récupéré la base de données de Cywise PROD en local (cywise_ui_prod). Ma version 1.x utilise une base de donnée nommée towerify1x.

Dans cywise_ui_prod.users, les users avec un stripe_tx_id non null ne sont que des users CF :

  • 26,Cyrille Savelief (ISTA)
  • 35,Cyrille Savelief (Postface)
  • 3,Cyrille Savelief (Limited Administrator)
  • 1,Engineering

Les users avec un stripe_id non null (19 users et il en reste 12 quand j'enlève les users CF) :

id name email stripe_id stripe_tx_id
1 Engineering engineering@computablefacts.com cus_R4tAQ4CDVSO9bA 51334309-16be-4415-bd8e-3c495445862f
3 Cyrille Savelief (Limited Administrator) csavelief+limited_administrator@computablefacts.com cus_R4Vvaz9Ts3nXqG 605953fa-4623-40bb-8861-ad32370f63eb
26 Cyrille Savelief (ISTA) csavelief+ista@computablefacts.com cus_Rb70p9XOKjyk5c dea822e2-805a-4763-80bb-31674d84a5a0
35 Cyrille Savelief (Postface) csavelief+postface@computablefacts.com cus_R4aJPuHg604F9x ab9fc5a1-a890-4d86-9937-6239d934986f
37 Matthieu Gosset Matthieu.Gosset@ista.com cus_R5Wmp5WG50t5MC
43 John Doe csavelief+johndoe@computablefacts.com cus_R4QxKhCEETkzfx
44 Probance Infra infra@probance.com cus_R7n3rnDNyp6A3Q
46 Elephantastic ndr@elephantastic.io cus_Rn7oy3DOjeicTv
47 Cyrille Savelief (Hermès) csavelief+hermes@computablefacts.com cus_RHvbBwQKrDbMUJ
50 Erwan Roussel erwan.roussel@ext.hermes.com cus_RXHRLdUgeGlVEg
53 Sylvain Moreau smoreau@oppscience.com cus_RNWQiA86rsWNjh
55 Benoist Moro benoist.moro@hermes.com cus_RWBB4uxNqi1XX5
58 Dridou acoestesquis@oppscience.com cus_RYljdW8EGsofrB
63 Nico nbloch@oppscience.com cus_RYlwNcyj5tiqiF
99 Gabriel Albertini techinfo@mind-techno.fr cus_RqNDmpQooyae3C
107 Cyrille Savelief (démo) csavelief@computablefacts.com cus_SOAhFa204v34Hv
123 grenier grenier@cgsecurity.org cus_SOFWe2ubw9D7Bq
124 Benaounallah Samira sbenaounallah@mind-techno.fr cus_SIsilsDVf0guwB
129 frederic.gatte frederic.gatte@onda.ai cus_SQiA8dMkFmJ3sY

Dans cywise_ui_prod.subscriptions, il y a 4 enregistrements :

id user_id type stripe_id stripe_status stripe_price quantity
1 43 default sub_1QCN5LDHRqrzgOLGSDqOqWUb active price_1QC4ugDHRqrzgOLGuj1AUt7B 1
2 47 default sub_1QPLmCDHRqrzgOLGq6PNAli5 active price_1QC4ugDHRqrzgOLGuj1AUt7B 1
4 53 default sub_1QiBy7DHRqrzgOLGk5s0SOeP active price_1Qee99DHRqrzgOLGOfaVSPbt 1
5 46 default sub_1QtXaYDHRqrzgOLGjCwvwQ3f active price_1QeeA0DHRqrzgOLGmijDTdnj 1

Et 4 items dans cywise_ui_prod.subscription_items, un pour chaque subscription :

subscription_id stripe_id stripe_product stripe_price quantity
1 si_R4W7ca02BG8zjG prod_R4DL9LqLluJPGv price_1QC4ugDHRqrzgOLGuj1AUt7B 1
2 si_RHvdPGXWVgHpti prod_R4DL9LqLluJPGv price_1QC4ugDHRqrzgOLGuj1AUt7B 1
4 si_RbOl7ZCW5szU4y prod_R4DL9LqLluJPGv price_1Qee99DHRqrzgOLGOfaVSPbt 1
5 si_Rn7qyVMWOW6TbE prod_R4DLcRRE2VrjRp price_1QeeA0DHRqrzgOLGmijDTdnj 1

Donc 4 commandes, une pour chacun de ces users :

  • user 43 = csavelief+johndoe@computablefacts.com
  • user 46 = ndr@elephantastic.io
  • user 47 = csavelief+hermes@computablefacts.com
  • user 53 = smoreau@oppscience.com

Je vais me concentrer sur nos 2 "vrais" clients : elephantastic et oppscience

  • user 46 pwd = 2NWeVdrACR6mvzHR_FKTCT9B0qyQARRD7FE+ee+3fdGetUbkTnVp11UVI3AY= / FZYQDkak0v81dCjX
  • user 53 pwd = yp7fVB1WQGVVtc2G_7BpPWq7VsWleyBiE6082yA== / NRgig7974NdfCZP

Dans l'UI de Stripe PROD, j'ai cus_Rn7oy3DOjeicTv comme ID pour elephantastic et cus_RNWQiA86rsWNjh comme ID pour oppscience. Ce qui correspond bien à la colonne users.stripe_id de cywise_ui_prod.

Pour elephantastic, je vois une subscription sub_1QtXaYDHRqrzgOLGjCwvwQ3f avec un item si_Rn7qyVMWOW6TbE pour un prix price_1QeeA0DHRqrzgOLGmijDTdnj (400€/mois) Pour oppscience, je vois une subscription sub_1QiBy7DHRqrzgOLGk5s0SOeP avec un item si_RbOl7ZCW5szU4y pour un prix price_1Qee99DHRqrzgOLGOfaVSPbt (150€/mois)

Avec mon test en local, j'ai les infos suivante (Stripe Test) dans towerify1x.plans :

id name monthly_price_id yearly_price_id onetime_price_id active role_id default monthly_price yearly_price onetime_price
1 Essentiel price_1QBer1DHRqrzgOLGvN2AXQCU 1 3 0 100
2 Standard price_1QBf6fDHRqrzgOLGo2kfG5RC 1 4 1 300
3 Premium price_1QBfERDHRqrzgOLGHNm8JLou 1 5 0 500

Et dans towerify1x.subscriptions :

id billable_type billable_id plan_id vendor_slug vendor_product_id vendor_transaction_id vendor_customer_id vendor_subscription_id status cycle seats trial_ends_at ends_at
1 user 7 1 stripe cus_SYINFDfvdAgpdU sub_1RdBmWDHRqrzgOLG6BA89H4b active month 1

Donc, pour chaque entrée dans cywise_ui_prod.subscriptions, je vais trouver l'utilisateur
cywise_ui_prod.subscriptions.user_id => this_user puis faire correspondre :

  • towerify1x.subscriptions.billable_type = 'user'
  • towerify1x.subscriptions.billable_id = cywise_ui_prod.subscriptions.user_id
  • towerify1x.subscriptions.plan_id = "recherche de l'ID de plan par rapport à l'ID de prix de Stripe cywise_ui_prod.subscriptions.stripe_price"
  • towerify1x.subscriptions.vendor_slug = 'stripe'
  • towerify1x.subscriptions.vendor_product_id = null
  • towerify1x.subscriptions.vendor_transaction_id = null
  • towerify1x.subscriptions.vendor_customer_id = this_user.stripe_id
  • towerify1x.subscriptions.vendor_subscription_id = cywise_ui_prod.subscriptions.stripe_id
  • towerify1x.subscriptions.status = cywise_ui_prod.subscriptions.stripe_status
  • towerify1x.subscriptions.cycle = 'month'
  • towerify1x.subscriptions.seats = 1