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})
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')
def confirm_order(order_id): order = DBSession.query(Order).filter(Order.order_id==order_id).one() order.confirm() return order
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}
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}