Paypal - 从服务器发送金额

时间:2017-07-18 10:57:31

标签: angular paypal

这是我第一次尝试在我的网站上实施付款,而且几乎没有任何关于paypal的东西我觉得很难掌握。

在我的应用中,用户可以上传他想要翻译的视频。 每个视频都可以翻译成多种语言。 总价格是根据用户选择的视频时长和所请求的语言计算的。

以最简单的方式,我将此代码添加到我的网站

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
      <input type="hidden" name="cmd" value="_xclick">
      <input type="hidden" name="business" value="myFakeBusinees">
      <input type="hidden" name="item_name" [value]="transactionId">
      <input type="hidden" name="currency_code" value="USD">
      <input type="hidden" name="amount" [value]="totalPrice">
      <input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" (click)="submit()">
      <input type="submit" value="Paypal"/>
    </form>

在paypal中,我将returnUrl配置到我的服务器,付款后,我向用户显示摘要。

我使用这种方法的问题是用户可以从客户端更改数量隐藏字段。尽管我可以在调用returnUrl之后检查服务器中的付费金额,但我不想启用这种情况。

我试着阅读服务器api,但我不确定它能做到我想要的。 我想到了以下流程,并想知道这是否正确以及PayPal是否支持这一点。

流程:

  • 用户在客户端创建订单。每个订单都有一个transactionId
  • 当用户单击“付款”按钮时,客户端会将具有transactionId的请求发送到服务器。
  • 服务器计算totalPrice,并发送payapel以为此金额创建令牌。服务器将令牌返回给客户端。
  • 客户端收到令牌并正在导航到paypal。
  • 在paypal网站,用户选择他的付款方式并付款。 Paypal服务器将此令牌的确认返回给myserver。
  • 我的服务器针对transactionId检查令牌,如果一切正常,则显示用户“您的订单已创建”页面。

任何帮助都将非常感激。我很难弄清楚文件的流程。

1 个答案:

答案 0 :(得分:1)

基本上您要做的是在用户点击付费按钮并获取createOrderreturn_url后,在后端调用cancel_url API(请参阅下面的nodejs代码) 从前端使用window.location,例如:window.location.origin +&#39; / success-url&#39;这样在本地服务器上测试时没有问题, 舞台和制作。然后,当用户被重定向到https://example.com/success-url时,paymentIdPayerID将被传递 网址中的payapal,然后从该页面中,您可以在后端调用executeOrder

以下是documentation

的链接

以下是nodejs代码示例:

exports.createOrder = (data, callback) => {
  /* First step when user clicks 'Pay with paypal' on place-order screen */
  var create_payment_json = {
    "intent": "sale",
    "payer": {
      "payment_method": "paypal"
    },
    "redirect_urls": {
      "return_url": data.return_url,
      "cancel_url": data.cancel_url
    },
    "transactions": [{
      "amount": {
        "total": getAmountFromNoOFVideos(),
        "currency": "USD"
      },
      "description": "Video Translation"
    }]
  };

  paypal.payment.create(create_payment_json, function (error, payment) {
    if (error) {
      callback(error);
    } else {
      if(payment.payer.payment_method === 'paypal') {
        for(var i=0; i < payment.links.length; i++) {
          var link = payment.links[i];
          if (link.method === 'REDIRECT') {
            redirectUrl = link.href;
          }
        }
      }
      callback(null, redirectUrl, payment.id)
    }
  });
}

exports.executeOrder = (data, callback) => {
  /* Second and final step in place-order screen */
  let paymentId = data.paymentId;
  let PayerID = data.PayerID;

  var details = { "payer_id": PayerID };
  paypal.payment.execute(paymentId, details, function (error, payment) {
    if (error) {
      console.log("\x1b[31m", "PAYPAL ERROR: ", error)
      callback(error);
    } else {
      callback(null, true);
    }
  });
}

Paypal流程: - 假设您的网站链接为www.videotranslate.com

  1. 用户点击您网站www.videotranslate.com
  2. 上的付款按钮
  3. 您对API www.videotranslate.com/api/createOrder进行了AJAX调用 来自您的角度组件/服务(取决于您的设计)
  4. 在AJAX通话的成功功能中,您获得了redirectUrl 来自后端的createOrder函数。
  5. 当用户通过paypal付款成功时,paypal会 将用户重定向到www.videotranslate.com/success-callback
  6. 现在,在此页面上,您将对API进行AJAX调用 来自Angular的www.videotranslate.com/api/executeOrder
  7. 如果用户在paypal上取消付款,paypal会将用户重定向到 www.videotranslate.com/cancel-callback,您可以在这里显示错误 敬酒并要求用户再次付款。