Fix #304 -- Send consistent metadata to PayPal

This commit is contained in:
Raphael Michel
2016-11-29 16:50:37 +01:00
parent 2efde1669d
commit 82b68bf7e0
2 changed files with 38 additions and 22 deletions

View File

@@ -7,7 +7,6 @@ from django import forms
from django.contrib import messages from django.contrib import messages
from django.template.loader import get_template from django.template.loader import get_template
from django.utils.translation import ugettext as __, ugettext_lazy as _ from django.utils.translation import ugettext as __, ugettext_lazy as _
from pretix.base.models import Quota from pretix.base.models import Quota
from pretix.base.payment import BasePaymentProvider from pretix.base.payment import BasePaymentProvider
from pretix.base.services.mail import SendMailException from pretix.base.services.mail import SendMailException
@@ -64,23 +63,6 @@ class Paypal(BasePaymentProvider):
def checkout_prepare(self, request, cart): def checkout_prepare(self, request, cart):
self.init_api() self.init_api()
items = []
for cp in cart['positions']:
items.append({
"name": str(cp.item.name),
"description": str(cp.variation) if cp.variation else "",
"quantity": cp.count,
"price": str(cp.price),
"currency": request.event.currency
})
if cart['payment_fee']:
items.append({
"name": __('Payment method fee'),
"description": "",
"quantity": 1,
"currency": request.event.currency,
"price": str(cart['payment_fee'])
})
payment = paypalrestsdk.Payment({ payment = paypalrestsdk.Payment({
'intent': 'sale', 'intent': 'sale',
'payer': { 'payer': {
@@ -93,13 +75,20 @@ class Paypal(BasePaymentProvider):
"transactions": [ "transactions": [
{ {
"item_list": { "item_list": {
"items": items "items": [
{
"name": __('Order for %s') % str(request.event),
"quantity": 1,
"price": str(cart['total']),
"currency": request.event.currency
}
]
}, },
"amount": { "amount": {
"currency": request.event.currency, "currency": request.event.currency,
"total": str(cart['total']) "total": str(cart['total'])
}, },
"description": __('Event tickets for %s') % request.event.name "description": __('Event tickets for {event}').format(event=request.event.name)
} }
] ]
}) })
@@ -163,6 +152,30 @@ class Paypal(BasePaymentProvider):
return self._execute_payment(payment, request, order) return self._execute_payment(payment, request, order)
def _execute_payment(self, payment, request, order): def _execute_payment(self, payment, request, order):
payment.replace([
{
"op": "replace",
"path": "/transactions/0/item_list",
"value": {
"items": [
{
"name": 'Order %s' % order.code,
"quantity": 1,
"price": str(order.total),
"currency": order.event.currency
}
]
}
},
{
"op": "replace",
"path": "/transactions/0/description",
"value": __('Order {order} for {event}').format(
event=request.event.name,
order=order.code
)
}
])
payment.execute({"payer_id": request.session.get('payment_paypal_payer')}) payment.execute({"payer_id": request.session.get('payment_paypal_payer')})
if payment.state == 'pending': if payment.state == 'pending':
@@ -272,7 +285,10 @@ class Paypal(BasePaymentProvider):
"currency": request.event.currency, "currency": request.event.currency,
"total": str(order.total) "total": str(order.total)
}, },
"description": __('Event tickets for %s') % request.event.name "description": __('Order {order} for {event}').format(
event=request.event.name,
order=order.code
)
} }
] ]
}) })

View File

@@ -1,2 +1,2 @@
paypalrestsdk>=1.9,<1.10,<2.0 paypalrestsdk==1.12.*
pycparser==2.13 # https://github.com/eliben/pycparser/issues/147 pycparser==2.13 # https://github.com/eliben/pycparser/issues/147