Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)