1

我正在将paypalrestsdk集成到我的 AppEngine 项目中。当我使用本地 dev_appserver尝试在 PayPal 沙箱上创建付款时,出现以下错误:

SSLCertificateError: Invalid and/or missing SSL certificate for URL: https://api.sandbox.paypal.com/v1/oauth2/token

所以,我试图提供正确的 pem 文件,从这里下载并设置正确的ssl_option属性:

# Setting up the correct path to the .pem file
cert = os.path.join(ROOT, 'certs/api.sandbox.paypal.com_SHA-2_01132018.pem')
logger.info("Using SSL certificate: %s", cert)
return Api(
    mode=get_paypal_environment(), # sandbox or live
    client_id=flask.current_app.config["PAYPAL_CLIENT_ID"],
    client_secret=flask.current_app.config["PAYPAL_CLIENT_SECRET"],
    ssl_options={"cert": cert}
)

这里有 PayPalRestSDK 文档,其中提供了有关如何提供证书的详细信息。我已经仔细检查了创建的路径是否正确。

我在这里找到了一个关于类似问题的错误报告。

另外,我尝试了此处建议的解决方案,但仍然无法正常工作。

在实时实例上,在 apppot 上,这一切都完美无缺

这是我的 requirements.txt 的相关部分:

Flask==0.10.1
itsdangerous==0.24
paramiko==1.15.1
pycrypto==2.6.1
Flask-OAuthlib==0.9.1
google-api-python-client==1.4.0
paypalrestsdk==1.11.1
requests[security]==2.9.1

有没有人有同样的问题?

4

1 回答 1

4

好的,我相信我已经解决了这个问题,至少在我的情况下,我将在下面描述。

这似乎是由于两个问题:

问题 #1) PayPal 正在迁移到仅支持 TLS 1.2,并已开始切换沙盒 URL,生产 URL 稍后会出现。这解释了为什么只有在从沙箱连接时才会出现问题,以及为什么它以前可以工作但现在不行。更多关于这个here

问题 #2) 我本地安装的 Python 不支持 TLS 1.2。这是一个简单的检查方法:

$ python
>>> import ssl
>>> print ssl._PROTOCOL_NAMES

如果你没有看到PROTOCOL_TLSv1_2列表,这肯定是问题所在。就我而言,我在 Mac OS X 10.11 上使用 Python 上的内置版本,它在 OpenSSL 上内置了一个相当旧的版本。

那么如何解决呢?好吧,就我而言,这工作得很好(主要从这里复制):

$ brew update
$ brew install openssl
$ brew link openssl --force 
$ brew install python --with-brewed-openssl
$ sudo ln -s /usr/local/Cellar/python/2.7.11/bin/python /usr/local/bin/python

现在,如果您运行我上面列出的测试,您应该会看到列出的 1.2 协议。

这应该使一切再次正常,祝你好运!

于 2016-02-27T07:16:09.723 回答