Как правильно использовать IPN в платежах PayPal и отправлять только один раз на внутренний сервер? - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь использовать IPN в PayPal API. Я создал

https://ipnpb.sandbox.paypal.com/cgi-bin/webscr

, но каждый раз, когда я использую почтальон для отправки запроса на утверждение, я получаю ответ в конечной точке IPN. как заставить PayPal IPN отправлять мне только один раз или продолжать отправку до тех пор, пока сервер его не получит, тогда IPN прекратит отправку этого конкретного платежного сообщения IPN.

ПРИМЕЧАНИЕ: при попытке использовать симулятор IPN iполучите это сообщение

"ipn не был отправлен, и рукопожатие не было проверено. проверьте ваши данные."

, но я получаю данные на своем внутреннем сервере. так что в моей логике кода что-то не так?

МОЙ пример кода:

app.post('/ipn', (req, res) => {
  var isProduction = false;

  var strSimulator  = "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr";
  var strLive = "https://ipnpb.paypal.com/cgi-bin/webscr";
  var paypalURL = strSimulator;

  if (isProduction)  paypalURL = strLive;

  let ipnTransactionMessage = req.body;

  let formUrlEncodedBody = querystring.stringify(ipnTransactionMessage);
  let verificationBody = `cmd=_notify-validate&${formUrlEncodedBody}`;
  let options = {
    method: "POST",
    uri: paypalURL,
    body: verificationBody,
  };

  // POST verification IPN data to paypal to validate.
  request(options, function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
      // Check the response body for validation results.
      if (body === "VERIFIED") {
        console.log(ipnTransactionMessage);
        console.log(`Verified IPN: IPN message for Transaction ID: ${ipnTransactionMessage.txn_id} is verified.`);
        // TODO: Implement post verification logic on ipnTransactionMessage
      } else if (body === "INVALID") {
        console.error(`Invalid IPN: IPN message for Transaction ID: ${ipnTransactionMessage.txn_id} is invalid.`);
      } else {
        console.error("Unexpected reponse body.");
      }
    }else {
      // Error occured while posting to PayPal.
      console.error('error', error);
      console.log('body', body);
    }
  });
});

Ожидаемое поведение

  1. IPN в PayPal отправляется только после его завершения или отмены. После того как серверный сервер получит вызов IPN и подтвердит его с помощью PayPal.
  2. Как отменить платеж в PayPal или установить для него тайм-аут.
...