8

Mam dokładnie ten sam problem, co opisano w poście Implementation of Paypal in single page application Niestety, nikt w tej ogromnej społeczności nie wydaje się odpowiedzieć :( Z dużą ilością uderzeń głową udało mi się zaimplementować brudny hack, jak poniżej i wiem, że to nie jest właściwe rozwiązanie, czy któryś z guru uprzejmie zastanowiłby się nad tym pytaniem i odpowiedział/dałby informację zwrotną, jeśli mój brudny hack jest właściwy lub może być lepiej zaimplementowany poniżej mojego brudnego hacka :( Wielkie dzięki z góry za twoje odpowiedzi/komentarzeintegracja paypal z pojedynczą aplikacją strony

Mam przycisk, aby powiedzieć pay with paypal i onClick Otwieram nowe okno ->window.open("/paypalCreate", width = "20px", height = "20px"); i przechwytuję to otrzymuję prośbę "/ paypalCreate" w moim node.js Serwer i nazywają stworzyć metodę, która wygląda liek poniżej

exports.create = function (req, res) { 
    //Payment object 
    var payment = { 
     //fill details from DB 
    }; 

    //Passing the payment over to PayPal 
    paypal.payment.create(payment, function (error, payment) { 
     if (error) { 
      console.log(error); 
     } else { 
      if (payment.payer.payment_method === 'paypal') { 
       req.session.paymentId = payment.id; 
       var redirectUrl; 
       for (var i = 0; i < payment.links.length; i++) { 
        var link = payment.links[i]; 
        if (link.method === 'REDIRECT') { 
         redirectUrl = link.href; 
        } 
       } 
       res.redirect(redirectUrl); 
      } 
     } 
    }); 
}; 

This redirects user to paypal and once user confirms or cancels payment, the redirect urls are called. And in the success redirect url I capture the payment details into the databse and render a html in this opened window with the confirmation. 

exports.execute = function (req, res) { 
    var paymentId = req.session.paymentId; 
    var payerId = req.param('PayerID'); 

    // 1. if this is executed, then that means the payment was successful, now store the paymentId, payerId and token into the database 
    // 2. At the close of the popup window open a confirmation for the reserved listing 
    var details = {"payer_id": payerId}; 
    paypal.payment.execute(paymentId, details, function (error, payment) { 
     if (error) { 
      console.log(error); 
     } else { 
      //res.send("Hell yeah!"); 
      res.render('paypalSuccess', {payerId: payerId, paymentId: paymentId}); 
     } 
    }); 
}; 

Gdy użytkownik zamyka otwarte okno, w którym paypal był obsługiwane orginal okno SPA będzie odświeżony, a tym samym uzyskanie szczegółów płatności z DB i tutaj można obsługiwać SPA w jakikolwiek sposób chcesz. Wiem, że to brudny hack, ale jak ty nie mogłem znaleźć lepszego sposobu. Daj mi znać, jeśli to działa dla Ciebie lub jeśli znajdziesz lepszy sposób na zrobienie tego.

okrzyki, Chidan

Odpowiedz

11

Spróbuj tego. To jest to, czego używam w mojej aplikacji.

var config = require("config3"); 
var paypal_api = require("paypal-rest-sdk"); 
paypal_api.configure(config.paypal); 
var log = require("app/log"); 

function pay(creditCard, amount, description, callback) { 
    var paypalOptions = { 
     intent: "sale", 
     payer: { 
      payment_method: "credit_card", 
      funding_instruments: [{credit_card: creditCard}] 
     }, 
     transactions: [{ 
      amount: { 
       total: amount, 
       currency: "USD" 
      }, 
      description: description 
     }] 
    }; 
    if (config.paypal.enabled) { 
     paypal_api.payment.create(paypalOptions, function (error, response) { 
      log.debug({ 
       err: error, 
       response: response || (error && error.response) 
      }, "paypal payment response"); 
      callback(error, response); 
     }); 
    } else { 
     setImmediate(function() { 
      callback(null, {"fakePaypal": "is fake"}); 
     }); 
    } 
} 

module.exports = pay; 

Edytuj: Moduł config3 wyglądałby tak. Docs dla tego modułu można znaleźć here

module.exports = { 
    paypal: { 
    client_id: "Secret API key", 
    client_secret: "Secret API key", 
    host: "api.sandbox.paypal.com", 
    enabled: true 
    }, 
    mysql: { 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: '' 
    }, 
    redis: { 
    host: "localhost", 
    port: 6379 
    }, 

Jeśli chodzi o przekierowanie nie trzeba wysłać użytkownikowi Paypal. Po sukcesie wystarczy pokazać transakcję zakończoną wiadomością/stronę. Po błędzie pokaż błąd i pozwól mu to naprawić.

+0

Witaj Ben, dzięki. Mam jednak 2 pytania, jak wygląda twój plik konfiguracyjny? a to działałoby na płatności kartami kredytowymi, gdzie nie ma przekierowania na stronę paypal, ale jak mogę obsłużyć przekierowanie do strony paypal iz powrotem do sukcesu lub anulować URL? –

+0

Zaktualizowałem moją odpowiedź na te dwa pytania. Jeśli to rozwiązało problem, zaakceptuj go jako zaakceptowaną odpowiedź. Dzięki – BenH