Example #1
0
def payment_view(request):
    echeck = False
    if 'token' in request.params: # paypal return
        token = request.params['token']
        order = DBSession.query(Order).filter(Order.paypal_token==token).one()
        paypal = _get_paypal(request.registry.settings)
        try:
            result = paypal.get_express_checkout_details(token=token)
            payerid = result['PAYERID']
            result = paypal.do_express_checkout_payment(token=token, payerid=payerid,
                PAYMENTACTION='SALE',
                PAYMENTREQUEST_0_PAYMENTACTION='SALE',
                PAYMENTREQUEST_0_AMT=str(order.total)
                )
            status = result['PAYMENTINFO_0_PAYMENTSTATUS']
            if  status == 'Completed':
                order.confirm()
            elif status == 'Pending' and result['PAYMENTINFO_0_PAYMENTTYPE'] == 'echeck':
                order.paypal_transaction = result['PAYMENTINFO_0_TRANSACTIONID']
                echeck = True
            else:
                log.warn(str(result))
                return render_to_response('templates/error.pt',
                    {'message': 'PayPal returns: ' + str(result), 'url': request.application_url})
        except PayPalAPIResponseError, e:
            return render_to_response('templates/error.pt',
                {'message': str(e), 'url': request.application_url})
Example #2
0
def notify_view(request):
    paypal = _get_paypal(request.registry.settings)
    response = urllib2.urlopen(paypal.config.PAYPAL_URL_BASE,
                    'cmd=_notify-validate&' + urllib.urlencode(request.params)).read()
    if response == 'VERIFIED':
        transaction = request.params['txn_id']
        try:
            order = DBSession.query(Order).filter(Order.paypal_transaction==transaction).one()
        except:
            log.warn('Wrong transaction: $s', str(request))
        else:
            if request.params['payment_status'] == 'Completed':
                order.confirm()
                row = anlicenses.select().where(anlicenses.c.pdserial==order.pdserial
                                                                ).execute().fetchone()
                params = {'order': order, 'regid': row['regid'],
                          'new': row['sequence'] == 1, 'echeck': False}
                _send_mail(request, params)
            else:
                log.warn('Useless IPN: %s' % str(request))
    else:
        log.warn('Invalid IPN request %s', str(request))
    return Response(body='', content_type='text/plain')
Example #3
0
 def confirm_order(order_id):
     order = DBSession.query(Order).filter(Order.order_id==order_id).one()
     order.confirm()
     return order
Example #4
0
def cancel_view(request):
    token = request.params['token']
    order = DBSession.query(Order).filter(Order.paypal_token==token).one()
    order.status = 'canceled'
    message = 'Order canceled'
    return {'message': message, 'url': request.application_url}
Example #5
0
def order_view(request):
    if request.POST:
        v = request.POST
        order = Order()
        order.first_name = v['first_name']
        order.last_name = v['last_name']
        order.email = v['email']
        if v['lic'] == 'upgrade':
            row = anlicenses.select().where(anlicenses.c.regid==v['license']).execute().fetchone()
            order.pdserial = row['pdserial']
        order.total = 0
        order.payment = v['method']
        order.status = 'pending'
        order.created = datetime.now()
        DBSession.add(order)
        DBSession.flush()

        if v['bundle'] != '0':
            bundle = Items()
            bundle.order_id = order.order_id
            bundle.sku = v['bundle']
            DBSession.add(bundle)
            DBSession.flush()
            order.total = bundle.product.price
        for sku in v.getall('module'):
            module = Items()
            module.order_id = order.order_id
            module.sku = sku
            DBSession.add(module)
            DBSession.flush()
            order.total = order.total + module.product.price
        if v['method'] == 'paypal': # Paypal processing
            paypal = _get_paypal(request.registry.settings)
            #order = DBSession.query(Order).filter(Order.order_id==v['order']).one()
            description = ', '.join(i.product.name for i in order.items)
            result = paypal.set_express_checkout(
                PAYMENTREQUEST_0_AMT=str(order.total),
                PAYMENTREQUEST_0_ITEMAMT=str(order.total),
                PAYMENTREQUEST_0_DESC='Total: $' + str(order.total) + ' ' + description,
                PAYMENTREQUEST_0_PAYMENTACTION='SALE',
                RETURNURL=request.application_url + '/payment',
                CANCELURL=request.application_url + '/cancel',
            )
            if result.success:
                token = result['TOKEN']
                order.paypal_token = token
                return HTTPFound(location=paypal.generate_express_checkout_redirect_url(token))

        if v['method'] == 'card':
            settings = request.registry.settings
            if settings['braintree.environment'] == 'Production':
                env = braintree.Environment.Production
            else:
                env = braintree.Environment.Sandbox
            braintree.Configuration.configure(env,
                merchant_id=settings['braintree.merchant_id'],
                public_key=settings['braintree.public_key'],
                private_key=settings['braintree.private_key'])
            tr_data = braintree.Transaction.tr_data_for_sale(
                {"transaction": {"type": "sale",
                                 "order_id": str(order.order_id),
                                 "amount": str(order.total),
                                 "options": {"submit_for_settlement": True}}},
                request.application_url + '/payment')
            braintree_url = braintree.TransparentRedirect.url()
            return render_to_response('templates/payment.pt',
                {'order': order, 'v': v, 'tr_data':tr_data, 'braintree_url': braintree_url},
                request=request)
    try:
        bundles = DBSession.query(Product).filter(Product.bundle).order_by(Product.display_order).all()
        modules = DBSession.query(Product).filter(~Product.bundle).order_by(Product.display_order).all()
    except DBAPIError:
        return Response(conn_err_msg, content_type='text/plain', status_int=500)
    return {'bundles': bundles, 'modules': modules}