Débloquez un tutoriel vidéo après le paiement avec le nodejs Stripe ex: (les tutorials de udemy)

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

J’ai créé une page d’inscription pour que l’utilisateur ait son propre compte et une page de connexion pour qu’il puisse se connecter. Maintenant, après que l’utilisateur soit connecté, Je soumets un tutoriel vidéo payable avec Stripe. Ce que je voulais, c’est qu’après avoir acheté ce cours avec Stripe. Le tutorial se déverrouille automatiquement pour l’utilisateur.

voici mon code avec Stripe. Je l’ai testé et ça marche très bien.

const postCharge = (req, res) =>{
    console.log(req.body);

   const email = req.body.stripeEmail
   const source = req.body.stripeToken
   
  
    stripe.customers.create({
      email: email,
      source:  source
    })
    .then(customer => stripe.charges.create({
        amount: 2500,
        currency: "usd",
        customer: customer.id
    }))
    
    .then(() => res.render('success'))
    .catch((error) => console.log(error))
}

.En même, vous pouvez me conseiller s’il y’a plus simple à faire.

MERCI

+0 -0

Salut !

Après le paiement il faut donc :

  1. Enregistrer quelque part que ton utilisateur a maintenant accès au tutoriel (par exemple dans MongoDB si tu l’utilises)
  2. Rediriger vers le tutoriel si besoin (via des headers HTTP)
  3. Aller voir à chaque tentative d’accès au tutoriel si l’utilisateur connecté y a accès pour afficher ou non la vidéo

Avec quel point as-tu un blocage ?

Édité par viki53

Mes tutos — Architecte technique : JS/Node/Angular/Mongo, PHP/MySQL, AWS — Consultant qualité, ergonomie et UX

+0 -1
Auteur du sujet

Merci pour votre réponse.

J’ai essayé de d’enregistrer l’utilisateur qui à payer dans mongodb voila le code:

/*****MON MODEL*****/

const mongoose = require('mongoose')

const userSchema = new mongoose.Schema({
    email: {
        type: String,
        require: true
    },
    source: {
        type: String,
        require: true
    }
})

const Payment =  mongoose.model('Payment', userSchema)

module.exports = Payment

/*****MON MODEL*****/
const Payment = require('../models/payment')


const postCharge = (req, res) =>{
    console.log(req.body);

   const email = req.body.stripeEmail
   const source = req.body.stripeToken

   const savePayment = new Payment({
       email: email,
       source: source
   })

   /***  */
    savePayment.save((err, userPayment) =>{
        if(err) console.log(err);
    })
   /*** */
   
  
    stripe.customers.create({
      email: email,
      source:  source
    })
    .then(customer => stripe.charges.create({
        amount: 2500,
        currency: "usd",
        customer: customer.id
    }))
    
    .then(() => res.render('success'))
    .catch((error) => console.log(error))
    
    
}

Maintenant si ce code est bon parceque que il l’enregistre bien dans mongodb. Comment faire en sorte désqu’il se connect il voit son cours dans un lien bouton ex:
<button class="btn btn-info my-2 my-sm-0 m-3"> <a class="nav-link text-white " href="/Tuto"> Access aux Cours </a> </button>

désqu’il click il se rend directement au tutorial maintenant deblocké grace au paiement

Mais se lien ne marche s’il paye

Merci

Édité par ahmadanote26

+0 -0
Auteur du sujet

Il faut regarder dans MongoDB si l’utilisateur a des paiements enregistrés qui correspondent au tutoriel en question.

Si c’est le cas alors on peut lui mettre le lien.

viki53

oui c’est ici que j’ai un blocage pour l’enregistrement de l’utilisateur aprés le paiement Merci

+0 -0
Auteur du sujet

As-tu déjà tenté une requête MongoDB pour voir si l’utilisateur connecté avait déjà un paiement ?

À quoi ressemble-t-elle ?

viki53

Ah non je ne suis pas à ce stade, là ou je suis j’essaye de relier l’utilisateur et le paiement pour l’enregistrer dans mongodb !! c’est principal souci depuis

Édité par ahmadanote26

+0 -0
Auteur du sujet

Ton utilisateur est connecté ? Tu devrais avoir un identifiant unique pour chaque utilisateur alors. Tu peux donc le copier dans les infos de paiement pour l’utiliser après dans ta recherche.

viki53

Si bien-sur il a un id . Mais quand j’avais essayé je crois que je l’ai mal codé. Voila mon code


const postCharge = (req, res) =>{
    console.log(req.body);
   
   const email = req.body.stripeEmail
   const source = req.body.stripeToken

   const savePayment = new Payment({
 
       email: email,
       source: source
   })

  
   
  
    stripe.customers.create({
      email: email,
      source:  source
    })
    .then(customer => stripe.charges.create({
        amount: 2500,
        currency: "usd",
        customer: customer.id,
        success_url: '/Tutorial/<%= id  %>',
    }))
    
    .then(() => res.render('success'))
    .catch((error) => console.log(error))

    
}

Édité par ahmadanote26

+0 -0
Auteur du sujet

Parfait, donc maintenant tu peux faire une requête pour savoir si tu as un paiement pour cet utilisateur.

Si tu as un résultat, alors l’utilisateur a bien payé et tu peux afficher le tutoriel, sinon tu peux l’envoyer vers Stripe.

viki53

Sincerement je ne sais comment te remercier j’ai reussi grâce à vous. j’ai testé sur d’autre utilisateur et ça marche à merveille Voilà tout mon code

const postCharge = async (req, res) =>{
    console.log(req.body);
   
   const email = req.body.stripeEmail
   const source = req.body.stripeToken
//    const name  =   req.body.name

   const savePayment = new Payment({
      nomid: req.user.id,
       email: email,
       source: source
   })

   /***  */
    savePayment.save((err, userPayment) =>{
        if(err) console.log(err);
    })
   /*** */
   
  
    stripe.customers.create({
      email: email,
      source:  source
    })
    .then(customer => stripe.charges.create({
        amount: 2500,
        currency: "usd",
        customer: customer.id,
    }))
    
    .then(() => res.render('success'))
    .catch((error) => console.log(error))

    
}


const getPass = (req, res) =>{
    const nomId = req.user.id
   
    Payment.findOne({nomId}, function (err, docs) { 
        if (err)console.log(err) 
            res.render('tutorial')
       
    }); 

}
 
 

/****** J'ai mis ça dans un navbar ****/

   <button class="btn btn-info my-2 my-sm-0 m-3">
          <a class="nav-link text-white " href="/tutorial/<%= id  %>">
          Access aux Cours
          </a>
   </button>
   

Si tu fais des tutos sur nodejs merci de me partager MERCI

Édité par ahmadanote26

+0 -0
Auteur du sujet

J’ai pas encore fait de tuto spécialement sur Node.js non, mais il y en a de très bons un peu partout. Mais c’est la pratique qui fait progresser (et savoir lire la doc pour trouver la bonne méthode) ;)

viki53

desolé de revenir, tout marché tout à coup, j’ai constaté quand j’ajoute une autre utlisateur il a accés sans qu’il paie et le terminal me rend Cannot read property 'id' of undefined
je croix qu’ici, il y’a un probléme sur ce code :


const getPass = (req, res) =>{
    const nomId = req.user.id

    Payment.findOne({nomId}, function (err, docs) { 
     
        if (err)console.log(err) 
            res.render('tutorial')
       
    }); 
}

désolé encore

Édité par ahmadanote26

+0 -0
Auteur du sujet

Effectivement, findOne peut ne rien retourner, il faut vérifier que tu as un paiement en paramètre de ton callback. ;)

viki53

désolé, j’ai pas bien compris mias en tout cas quand j’ai fait un console.log de docs:

[
  {
    _id: 5f63c0aa19dd15187878135d,
    nomid: '5f5a97395923ee3b3499fd93',
    email: 'bnfdjn@gmail.com',
    source: 'tok_1HSTIZLo5RtUv28656mOuLxX',
    __v: 0
  }
]

+0 -0

C’est donc que tu as bien un paiement qui correspond. Mais il est aussi possible de passer au même endroit sans résultat (auquel cas docs devrait être undefined ou null). Il faut donc créer une condition (un if quoi) pour vérifier s’il y a bien un paiement trouvé pour l’utilisateur.

Mes tutos — Architecte technique : JS/Node/Angular/Mongo, PHP/MySQL, AWS — Consultant qualité, ergonomie et UX

+0 -0
Auteur du sujet

C’est donc que tu as bien un paiement qui correspond. Mais il est aussi possible de passer au même endroit sans résultat (auquel cas docs devrait être undefined ou null). Il faut donc créer une condition (un if quoi) pour vérifier s’il y a bien un paiement trouvé pour l’utilisateur.

viki53

ok, donc la condition sera sur

const getPass = (req, res) =>{
 
    Payment.find(function (err, docs) { 
        console.log(docs);
     
        if (err)console.log(err) 
            res.render('tutorial',)
       
    }); 
}

ou pas ???

+0 -0
Auteur du sujet

Ça dépend si tu veux la faire dans ton contrôleur ou dans ton template (la vue).

Mais oui ça peut se faire à ce niveau-là pour rediriger l’utilisateur ailleurs s’il n’a pas accès au tutoriel.

viki53

re-bonjour, toujours de vous fatiguer. ok j’ai essayé dans la vue comme suite

<%  if(docs === true) {%>
  <div class="agent-video">
    <div class="gridrow">
      <div class="colnomarg span_1_of_4 menu">
        <div class="logo"><p>Suivre<br>Votre<br>Apprentissage!</p></div>
        <div class="links link1 active"><span>01.</span>&nbsp; test 1 </div>
        <div class="links link2"><span>02.</span>&nbsp; test 2 </div>
        <div class="links link3"><span>03.</span>&nbsp; test 3</div>
        <div class="links link4"><span>04.</span>&nbsp; test 4 </div>
        <div class="links link5"><span>05.</span>&nbsp; test 5 </div>
      </div>
      
      <div class="colnomarg span_3_of_4 content">
        <div class="pages page1 active">
          <div class="wistia_responsive_padding" style="padding:56.25% 0 0 0;position:relative;">
            <div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;">
              <div class="videoFoam=true" style="height:100%;width:100%"> 
                <video width="100%" height="100%" controls>
                  <source src="../public/video/test.mp4" type="video/mp4">
                </video>&nbsp;
              </div>
            </div>
          </div>
          <div class="gridrow">
            <div class="col span_2_of_3">
              <h2>Lorem Ipsum Page 1</h2>
              <p>Morbi in nibh elementum, consectetur ligula non, efficitur libero. Cras tincidunt libero non felis venenatis, non mattis neque eleifend. Fusce pharetra at odio eu accumsan. Duis viverra tincidunt ante in vestibulum. Donec eu commodo lectus, quis egestas massa. Duis sit amet purus euismod, sodales felis id, lacinia leo. Praesent pulvinar non dolor in condimentum. Suspendisse ex est, finibus vitae sapien eu, posuere aliquam eros. Aenean quis mauris sit amet metus sagittis vestibulum vel vel sem. Suspendisse urna tortor, tempus sit amet sagittis quis, mattis ac magna.</p>
            </div>
            <div class="col span_1_of_3">
              <div class="btn link2">>&nbsp; Continue</div>
              <div class="btn gray"><&nbsp; Go Back</div>
           
            </div>
          </div>        
        </div>




        <!-- VIDEO 2 -->
        <div class="pages page2">
          <div class="wistia_responsive_padding" style="padding:56.25% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><div class="wistia_embed wistia_async_avk9twrrbn videoFoam=true" style="height:100%;width:100%">&nbsp;</div></div></div>
          <div class="gridrow">
            <div class="col span_2_of_3">
              <h2>Lorem Ipsum Page 2</h2>
              <p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam sem sapien, porta eu sodales sed, finibus finibus velit. Suspendisse blandit leo eros, eget sollicitudin massa posuere eu. Phasellus viverra id arcu sit amet consectetur. Curabitur consectetur venenatis magna in bibendum. Nam eget leo sit amet nisi commodo congue. Aenean lobortis dignissim lorem, quis suscipit purus maximus eget. Etiam nec euismod ante, id tempus risus. In hac habitasse platea dictumst. Pellentesque dolor diam, pellentesque eget justo non, volutpat iaculis felis. Sed sed sagittis nisl. Vivamus iaculis vestibulum nunc ac pulvinar. Nam in ipsum risus.</p>
            </div>
            <div class="col span_1_of_3">
              <div class="btn link3">>&nbsp; Continue</div>
              <div class="btn link1"><&nbsp; Go Back</div>
              
            </div>
          </div>
        </div>
        <!-- FIN VIDEO2 -->





       
       
       
        <!-- VIDEO3 -->
        <div class="pages page3">
          <div class="wistia_responsive_padding" style="padding:56.25% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><div class="wistia_embed wistia_async_pukozq6xf0 videoFoam=true" style="height:100%;width:100%">&nbsp;</div></div></div>
          <div class="gridrow">
            <div class="col span_2_of_3">
              <h2>Lorem Ipsum Page 3</h2>
              <p>Ut tincidunt tortor at tortor rutrum, scelerisque commodo nulla imperdiet. Nunc tincidunt porttitor mi at iaculis. Cras semper tortor et ante fermentum, non sollicitudin ante venenatis. Etiam ornare commodo tortor iaculis congue. Cras hendrerit sollicitudin felis, vitae hendrerit tortor mattis eget. Quisque vel pulvinar massa. Suspendisse aliquam nisi in ipsum laoreet, et sollicitudin nisl congue. Praesent consectetur velit quis pulvinar eleifend. Nam a mollis mauris, eget placerat erat. Nulla facilisi. Pellentesque iaculis convallis elit sit amet finibus. Vivamus convallis, felis nec vulputate scelerisque, eros elit elementum purus, nec eleifend urna diam euismod sapien.</p>
            </div>
            <div class="col span_1_of_3">
              <div class="btn link4">>&nbsp; Continue</div>
              <div class="btn link2"><&nbsp; Go Back</div>
              
            </div>
          </div>
        </div>
        <!-- FIN VIDEO 3 -->

        



         <!-- VIDEO 4 -->
        <div class="pages page4">
          <div class="wistia_responsive_padding" style="padding:56.25% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><div class="wistia_embed wistia_async_efsrxlup84 videoFoam=true" style="height:100%;width:100%">&nbsp;</div></div></div>
          <div class="gridrow">
            <div class="col span_2_of_3">
              <h2>Lorem Ipsum Page 4</h2>
              <p>Ut feugiat nibh dui, vel aliquet mauris bibendum in. Aenean vulputate at mauris vulputate mollis. Donec sit amet tempus mi. Morbi iaculis leo nec feugiat interdum. Aenean tempus pretium libero. Morbi dapibus maximus velit eu gravida. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis pulvinar vestibulum erat, sit amet volutpat leo bibendum vel. Nullam eleifend convallis ex eget gravida.</p>
            </div>
            <div class="col span_1_of_3">
              <div class="btn link5">>&nbsp; Continue</div>
              <div class="btn link3"><&nbsp; Go Back</div>
            </div>
          </div>
        </div>




         <!-- VIDEO 5 -->
        <div class="pages page5">
          <div class="wistia_responsive_padding" style="padding:56.25% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><div class="wistia_embed wistia_async_hs0fhkxyk5 videoFoam=true" style="height:100%;width:100%">&nbsp;</div></div></div>
          <div class="gridrow">
            <div class="col span_2_of_3">
              <h2>Lorem Ipsum Page 5</h2>
              <p>Maecenas at iaculis dui. Morbi et placerat dui. Pellentesque laoreet tortor nec auctor placerat. Phasellus suscipit finibus ante, ullamcorper pellentesque ligula tincidunt nec. Phasellus quis felis ex. Aliquam elementum, velit eu gravida pharetra, lorem turpis scelerisque lectus, et iaculis sem nunc at nunc. Mauris id odio condimentum, blandit nisi id, blandit tellus.</p>
            </div>
            <div class="col span_1_of_3">
              <div class="btn gray">>&nbsp; Continue</div>
              <div class="btn link4"><&nbsp; Go Back</div>
    
            </div>
          </div>
        </div>
      </div>
      
    </div>
  </div>


  <script type="text/javascript">
    
$(document).ready(function(){
  //ES6 'let' loop yo
  for (let i = 1; i < 6; i++) {
    $('.link' + i).click( function(){
      $('.links').removeClass('active');
      $('.pages').removeClass('active');
      $('.link'+i).addClass('active');
      $('.page'+i).addClass('active');
    });
  }
  //does this for every .links div on the left side and every 'continue' or 'go back' button with the same classes
});
  </script>
  <%} else {%>

    <h1>not access</h1>
   <%}  %>
   
   //////////  Dans nodejs
   
   const getPass = (req, res) =>{
  Payment.findOne({nomid: req.user}, (err, docs) =>{
      if(err) console.log(err);
      res.render('tutorial', {docs: docs})
  })
}

Et la il me fait Not access alors que cet utilisateur à access parce qu’il a payé

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte