Skip to content
This repository was archived by the owner on Jun 10, 2018. It is now read-only.

Commit a11eaba

Browse files
committed
Merge pull request #34 from jnwhiteh/certificate-auth
Add support for certificate-based authentication
2 parents 2a0db11 + 180cdac commit a11eaba

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

paypal/interface.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,20 @@ def _call(self, method, **kwargs):
106106
'VERSION': self.config.API_VERSION,
107107
}
108108

109+
# This dict holds kwarg parameters to pass to the requests API.
110+
requests_kwargs = dict()
111+
109112
if self.config.API_AUTHENTICATION_MODE == "3TOKEN":
110113
url_values['USER'] = self.config.API_USERNAME
111114
url_values['PWD'] = self.config.API_PASSWORD
112115
url_values['SIGNATURE'] = self.config.API_SIGNATURE
113116
elif self.config.API_AUTHENTICATION_MODE == "UNIPAY":
114117
url_values['SUBJECT'] = self.config.UNIPAY_SUBJECT
118+
elif self.config.API_AUTHENTICATION_MODE == "CERTIFICATE":
119+
url_values['USER'] = self.config.API_USERNAME
120+
url_values['PWD'] = self.config.API_PASSWORD
121+
requests_kwargs['cert'] = (self.config.API_CERTIFICATE_FILENAME,
122+
self.config.API_KEY_FILENAME)
115123

116124
# All values passed to PayPal API must be uppercase.
117125
for key, value in kwargs.items():
@@ -126,6 +134,7 @@ def _call(self, method, **kwargs):
126134
data=url_values,
127135
timeout=self.config.HTTP_TIMEOUT,
128136
verify=self.config.API_CA_CERTS,
137+
**requests_kwargs
129138
)
130139

131140
# Call paypal API

paypal/settings.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,15 @@ class PayPalConfig(object):
3131
# Various API servers.
3232
_API_ENDPOINTS = {
3333
# In most cases, you want 3-Token. There's also Certificate-based
34-
# authentication, which uses different servers, but that's not
35-
# implemented.
34+
# authentication, which uses different servers.
3635
'3TOKEN': {
3736
'SANDBOX': 'https://api-3t.sandbox.paypal.com/nvp',
3837
'PRODUCTION': 'https://api-3t.paypal.com/nvp',
39-
}
38+
},
39+
'CERTIFICATE': {
40+
'SANDBOX': 'https://api.sandbox.paypal.com/nvp',
41+
'PRODUCTION': 'https://api.paypal.com/nvp',
42+
},
4043
}
4144

4245
_PAYPAL_URL_BASE = {
@@ -55,6 +58,10 @@ class PayPalConfig(object):
5558
API_PASSWORD = None
5659
API_SIGNATURE = None
5760

61+
# CERTIFICATE credentials
62+
API_CERTIFICATE_FILENAME = None
63+
API_KEY_FILENAME = None
64+
5865
# API Endpoints are just API server addresses.
5966
API_ENDPOINT = None
6067
PAYPAL_URL_BASE = None
@@ -116,9 +123,15 @@ def __init__(self, **kwargs):
116123
# A CA Cert path was specified, but it's invalid.
117124
raise PayPalConfigError('Invalid API_CA_CERTS')
118125

119-
# set the 3TOKEN required fields
120-
if self.API_AUTHENTICATION_MODE == '3TOKEN':
121-
for arg in ('API_USERNAME', 'API_PASSWORD', 'API_SIGNATURE'):
126+
# check authentication fields
127+
if self.API_AUTHENTICATION_MODE in ('3TOKEN', 'CERTIFICATE'):
128+
auth_args = ['API_USERNAME', 'API_PASSWORD']
129+
if self.API_AUTHENTICATION_MODE == '3TOKEN':
130+
auth_args.append('API_SIGNATURE')
131+
elif self.API_AUTHENTICATION_MODE == 'CERTIFICATE':
132+
auth_args.extend(['API_CERTIFICATE_FILENAME', 'API_KEY_FILENAME'])
133+
134+
for arg in auth_args:
122135
if arg not in kwargs:
123136
raise PayPalConfigError('Missing in PayPalConfig: %s ' % arg)
124137
setattr(self, arg, kwargs[arg])

0 commit comments

Comments
 (0)