def receipt(): if not auth.user.paid: session.flash='You have not yet checked out' redirect(URL('index')) auth_user, users, balance, balances = cart_details(db=db, auth_user_id=auth.user.id, q=db(db.auth_user.registered_by==auth.user.id), settings=settings) return dict(balance=balance, balances=balances, user=auth_user)
def invoice(): if auth.user.paid: session.flash='You have no balance' redirect(URL('index')) auth_user, users, balance, balances = cart_details(db=db, auth_user_id=auth.user.id, settings=settings) if not auth_user.payment_invoice: auth_user.update_record(payment_invoice=str(uuid.uuid1())) return dict(balance=balance, balances=balances, user=auth_user)
def ipn(): query = request.body.read() params = request.post_vars if not query or not params.txn_id: return dict() duplicate = False id = db.paypal_txns.insert(txn_id=params.txn_id, ipn_vars=query, tracker=params.custom, status=params.payment_status) if db((db.paypal_txns.tracker==params.custom) & (db.paypal_txns.status!='Completed')).count() > 1: duplicate = True print 'Duplicate IPN notification %s, db row id %s' % (query, id) mail.send(to=setting.administrator, subject='Duplicate IPN transaction', message=settings.invalid_ipn_email % (params.custom, query, id)) try: url = settings.paypal_url + '?cmd=_notify-validate&' + query response = urlopen(url) resp = response.read().lower() except URLError: print 'Could not check IPN notification validity' return dict() if resp != 'verified' or duplicate: print 'invalid or duplicate IPN notification' return dict() user = db(db.auth_user.paypal_tracker==params.custom).select().first() if not user: print 'Unknown tracker id', params.custom return s_user, other_users, balance, balances = cart_details(db=db, s_user=user, settings=settings) if float(params.mc_gross) != float(balance) or \ params.payment_status != 'Completed' or \ params.mc_currency != 'SGD' or \ params.business != settings.paypal_business_email: print 'Invalid IPN notification %s, db row id %s' % (query, id) mail.send(to=settings.administrator, subject='Invalid IPN transaction', message=settings.invalid_ipn_email % (params.custom, query, id)) return print 'IPN notification tracker', params.custom for u in itertools.chain([s_user,], other_users): u.update_record(paid=True, payment_datetime=request.now)
def checkout(): from applications.pycon.modules import paypal # Hack - refresh auth.user so that if ipn notification has come in # the background, we can refresh the outstanding balance auth.user = Storage(db.auth_user._filter_fields(db.auth_user[auth.user.id], id=True)) session.auth.user = auth.user if auth.user.paid: session.flash='You have no balance' redirect(URL('index')) auth_user, users, balance, balances = cart_details(db=db, auth_user_id=auth.user.id, settings=settings) if not auth_user.payment_invoice: auth_user.update_record(payment_invoice=str(uuid.uuid1())) form = SQLFORM.factory(Field('cheque', 'string', requires=IS_NOT_EMPTY()), formstyle='ul') if form.accepts(request.vars, session): auth_user.update_record(cheque=form.vars.cheque) mail.send(to=auth.user.email, bcc='*****@*****.**', message=settings.cheque_email % (dict(first_name=auth.user.first_name, last_name=auth.user.last_name, payment_amount=balance)), subject=settings.cheque_subject) redirect(URL('payment_processed', args=['chq'])) paypal_vars = {} i = 1; for b in balances: paypal_vars['item_name_%d' % i] = b.name paypal_vars['amount_%d' % i] = b.conf if b.disc: paypal_vars['discount_amount_%d' % i] = b.disc i += 1 for t in b.tuts: paypal_vars['item_name_%d' % i] = t paypal_vars['amount_%d' % i] = settings.tutorial_rate i += 1 tracker = str(uuid.uuid1()) auth_user.update_record(paypal_tracker=tracker) paypal_form = paypal.PayPal(request=request, settings=settings, custom=tracker, **paypal_vars).encrypted_form() return dict(form=form, balance=balance, balances=balances, paypal_form=paypal_form)
def invoice_for(): response.view = 'default/invoice.html' auth_user, users, balance, balances = cart_details(db=db, auth_user_id=request.args(0), settings=settings) return dict(balance=balance, balances=balances, user=auth_user)