PayPal Rest API、firebase 函数和 Angular 6 出现 CORS 错误

Posted

技术标签:

【中文标题】PayPal Rest API、firebase 函数和 Angular 6 出现 CORS 错误【英文标题】:CORS error with PayPal Rest API, firebase functions and Angular 6 【发布时间】:2018-12-25 00:08:17 【问题描述】:

我想使用 Paypal 为我的市场设置付款。我使用 Angular 6 构建我的应用,使用 firebase 构建我的应用程序,使用 firebase 函数(谷歌云函数)。

我使用这个Paypal firebase function 示例来构建我的firebase 后端。

在我的前端应用程序中,我得到了这个函数来触发付款方式:

processPayment() 
    this.http.post('https://us-central1-project.cloudfunctions.net/pay', price: this.amount )
      .subscribe(res => console.log(res));
  

所以这应该将我重定向到支付amount 变量的贝宝页面。这是 CORS 错误发生的地方,当我触发该函数时,我最终在控制台中出现此错误:

跨域请求被阻止:同源策略不允许读取位于https://us-central1-project.cloudfunctions.net/pay 的远程资源(原因:CORS 标头“Access-Control-Allow-Origin”缺失)。 跨域请求被阻止:同源策略不允许读取位于https://us-central1-project.cloudfunctions.net/pay 的远程资源。 (原因:CORS 请求未成功)。

如果我错了,请纠正我,但这个错误来自我试图通过 localhost:4200 使用我的 IP 访问此页面的事实。 (请注意,如果我手动向https://us-central1-cop-room-host.cloudfunctions.net/pay 发出请求,该页面正在工作)。

所以我尝试修改我的云功能代码,我补充道:

const cors = require('cors')(
  origin: true,
);

但是,我最终在控制台中出现了这个错误:

跨域请求被阻止:同源策略不允许读取位于https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-54G25913XT5841335 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。 跨域请求被阻止:同源策略不允许读取位于https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-54G25913XT5841335 的远程资源。 (原因:CORS 请求未成功)。

此外,origin:true 是不安全的......

如何配置此付款方式以使其与 angular 6 一起使用?

【问题讨论】:

【参考方案1】:

需要明确的是,这不是 Angular 错误。它同样影响所有网络应用,我们将在下面看到的大多数修复实际上都是修改服务器或浏览器。

您违反了同源策略 - 它表示每个 AJAX 请求必须与您站点的确切主机、协议和端口匹配。 可能导致这种情况的原因:

从本地提供的文件访问服务器(来自 file:///YourApp/index.html 到 http://api.awesome.com) 外部 API(来自http://yourapp.com 的请求 http://api.awesome.com)。访问内部 API(来自 http://yourapp.com 到 http://api.yourapp.com)。打不一样的 同一主机上的端口(webapp 在http://localhost:3000,API 是 http://localhost:4000) 通过 http 从 https 请求,反之亦然 (向http://yourapp.com请求https://yourapp.com)

【讨论】:

我明白你的意思,我想我理解这个问题。所以在我的情况下,如果我正确理解问题,我将从 localhost:4200 请求到sandbox.paypal.com/cgi-bin/…。但我不明白我应该怎么做才能让它工作? 如果你想让它工作,你必须使用localhost.com:4200而不是localhost.com:4200,如果你想创建localhost,请检查这个链接brianflove.com/2016/10/22/angular-cli-using-https 我的 api 应该位于 localhost.com 吗?我做不到啊啊啊 是的 bcoz paypal 使用 https 安全连接 我们的本地主机使用非安全连接我的意思是 http 我按照教程将浏览器连接到localhost:4200,但我总是以同样的错误结束...【参考方案2】:

CORS 错误在 web 应用中处理起来很复杂,尤其是当您无法访问所使用的 API 代码时。所以我改变了一点服务器的机制,而不是在我触发支付功能后获得 302 重定向到贝宝页面

res.redirect(302, links.approval_url.href);

我发送链接并通过 Angular 应用程序直接访问该链接:

功能代码(index.ts):

res.status(200).send(JSON.stringify(links['approval_url'].href));

Web App 组件代码:

processPayment() 
   this.http.post('https://us-central1-cop-room-host.cloudfunctions.net/pay', price: this.amount )
     .subscribe(res => 
       console.log(res);
       document.location.href = res;
     );
   

【讨论】:

以上是关于PayPal Rest API、firebase 函数和 Angular 6 出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Paypal REST API 时需要 API 证书

PayPal REST 令牌请求:api.paypal.com OK,api-m 失败

使用 Paypal REST API 创建付款

使用 paypal/rest-api-sdk-php 的 laravel paypal 集成错误

Paypal 快速结账与 PayPal REST API 的集成

了解 PayPal 的 REST API