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 | 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