8

У меня есть такая же проблема, как описано в сообщении Implementation of Paypal in single page application К сожалению, никто в этом обширном сообществе, похоже, не ответил :( С большим количеством ударов головой я смог реализовать грязный взломать, как показано ниже и я знаю, что это неправильное решение. Может ли любой из гуру любезно задуматься над этим вопросом и ответить/дать обратную связь, если мой грязный взлом - это правильный путь или его можно лучше реализовать. Ниже моего грязного взлома :( Большое спасибо . заранее за ваши ответы/комментарииИнтеграция с PayPal с одной страницей

у меня есть кнопка, чтобы сказать получку с PayPal и OnClick открыть новое окно ->window.open("/paypalCreate", width = "20px", height = "20px"); и я захвачу этот запрос получить «/ paypalCreate» в моем node.js сервер и вызовите создать метод, который выглядит Лик ниже

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}); 
     } 
    }); 
}; 

После того, как пользователь закрывает открытое окно, в котором PayPal в настоящее время обработал оригинал окна SPA будет обновлен и таким образом получать информацию об оплате из БД и здесь вы можете справиться SPA, каким бы вы ни хотели. Я знаю, что это грязный хак, но, как и вы, я не мог найти лучшего способа. Пожалуйста, дайте мне знать, если это сработает для вас или у вас есть лучший способ сделать это.

веселит, Chidan

ответ

11

Попробуйте это. Это то, что я использую для своего приложения.

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; 

Редактировать: Модуль config3 будет выглядеть следующим образом. Документах для этого модуля можно найти 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 
    }, 

Насколько Перенаправление вам не нужно, чтобы отправить пользователю Paypal. При успешном завершении транзакции завершено сообщение/страница. При сбое отображается сообщение об ошибке и позволяет исправить ошибку.

+0

Привет, Бен, спасибо. У меня есть 2 вопроса, как выглядит ваш файл конфигурации? и это будет работать для оплаты по кредитным картам, где нет перенаправления на сайт paypal, но как я могу обработать перенаправление на сайт paypal и вернуться к успеху или отменить URL? –

+0

Я обновил свой ответ на два вопроса. Если это решило вашу проблему, примите это как принятый ответ. благодаря – BenH

Смежные вопросы