Source code for debits.paypal.form
import abc
import datetime
from django.urls import reverse
from debits.debits_base.processors import BasePaymentProcessor
from debits.debits_base.base import Period
from debits.debits_base.models import BaseTransaction
from django.conf import settings
# TODO:
# https://developer.paypal.com/docs/classic/express-checkout/integration-guide/ECRecurringPayments/
# You can increase the profile amount by only 20% in each 180-day interval after you create the profile.
[docs]class PayPalForm(BasePaymentProcessor):
"""Base class for processing submit of a PayPal form."""
[docs] def amend_hash_new_purchase(self, transaction, hash):
# https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/
cart = hash.pop('arcamens_cart', transaction.purchase.is_aggregate)
items = self.init_items(transaction)
# if transaction.purchase.item.is_subscription():
if hasattr(transaction, 'subscriptiontransaction'):
self.make_subscription(items, transaction, transaction.purchase)
else:
self.make_regular(items, transaction, transaction.purchase, cart)
items.update(hash)
items['bn'] = 'Arcamens_SP_EC' # we don't want this token be changed without changing the code
return items
[docs] def init_items(self, transaction):
debug = settings.PAYPAL_DEBUG
url = 'https://www.sandbox.paypal.com' if debug else 'https://www.paypal.com'
return {'business': settings.PAYPAL_ID,
'arcamens_action': url + "/cgi-bin/webscr",
'cmd': "_xclick-subscriptions" if hasattr(transaction, 'subscriptiontransaction') else "_xclick",
'notify_url': self.ipn_url(),
'custom': BaseTransaction.custom_from_pk(transaction.pk),
'invoice': transaction.invoice_id()}
[docs] def make_subscription(self, items, transaction, purchase):
"""Internal."""
items['item_name'] = self.product_name(purchase)
items['src'] = 1
unit_map = {Period.UNIT_DAYS: 'D',
Period.UNIT_WEEKS: 'W',
Period.UNIT_MONTHS: 'M',
Period.UNIT_YEARS: 'Y'}
if purchase.item.subscriptionitem.trial_period.count > 0:
items['a1'] = 0
items['p1'] = purchase.item.subscriptionitem.trial_period.count
items['t1'] = unit_map[purchase.item.subscriptionitem.trial_period.unit]
items['a3'] = purchase.item.price + purchase.shipping + purchase.tax
items['p3'] = purchase.item.subscriptionitem.payment_period.count
items['t3'] = unit_map[purchase.item.subscriptionitem.payment_period.unit]
[docs] def make_regular(self, items, transaction, purchase, cart):
"""Internal."""
if cart:
items['upload'] = 1
i = 1
for child in purchase.aggregatepurchase.childs.order_by('pk') if purchase.is_aggregate else [purchase]:
items['item_name_' + str(i)] = self.product_name(child)
items['amount_' + str(i)] = child.item.price
items['shipping_' + str(i)] = child.shipping
items['tax_' + str(i)] = child.tax
items['quantity_' + str(i)] = child.item.product_qty
i += 1
else:
items['item_name'] = self.product_name(purchase)[0:127]
items['amount'] = purchase.item.price
items['shipping'] = purchase.shipping
items['tax'] = purchase.tax
items['quantity'] = purchase.item.product_qty
[docs] def subscription_allowed_date(self, purchase):
return max(datetime.date.today(),
purchase.due_payment_date - datetime.timedelta(days=89)) # intentionally one day added to be sure
# TODO: Support Express Checkout
# https://developer.paypal.com/docs/classic/products/express-checkout/