Maybe you got it solved already, but here is some of my stuff (which works ;-): I looked into PloneMall, but it's code is in some closed CVS and looked very complex. I decided to create my own shop starting from the product Simple Cart Item (by Aaron). In the end it was much expanded. This is the code that does the PayPal checkout - largely stolen from the product Simple Cart Item: from Products.PythonScripts.standard import urlencode '''This is the digester for the cart string. Currently this digester formats a string to be sent to a Pay Pal gateway, but could be modifed for other gateways''' portal_props=context.portal_properties shop_props = portal_props.mshop_properties shop_tool = context.mshop_tool r= context.REQUEST s = r.SESSION # retrieve the cartList cartlist=s.get("cartList", []) # calculate items total cart_total = 0.0 for item in cartlist: item_total = item['item_total'] cart_total += item_total # calculate payment costs (depends on items bought) shipping= shop_tool.getPaymentCosts("paypal", cart_total) shipping += shop_props.shipping #cart preamble cart_commands = {"cmd" : "_cart", "upload" : "1", "business" : shop_props.paypal_business, "currency_code" : "EUR", "invoice" : DateTime(), "no_shipping" : "0", "handling_cart" : shipping, "cancel_return" : context.portal_url() + '/sys/pp_cancel_callback', "return" : context.portal_url() + '/sys/pp_success_callback', "image_url" : context.portal_url() + '/pp_shoplogo.gif', "notify_url" : context.portal_url() + '/pp_ipn', } # formats cart items l = 0 for item in cartlist: cart_item = item l+=1 d ={'item_name_%d' % l : cart_item['name'], 'on0_%d' % l : 'variant', 'os0_%d' % l : cart_item['variant'], 'on1_%d' % l : 'maat', 'os1_%d' % l : cart_item['item_size'], 'amount_%d' % l : cart_item['price'], 'quantity_%d' % l : cart_item['quantity'] } cart_commands.update(d) #points to (sandbox) paypal account if shop_props.paypal_use_sandbox: url = shop_props.paypal_sandbox_url else: url = shop_props.paypal_url context.plone_log("Commands send to paypal url (%s):%s" % (url, str(cart_commands))) redirect_url = '%s?%s' % (url, urlencode(cart_commands)) state.setNextAction('redirect_to:string:'+redirect_url) return state ======================= This script calls into a plone tool (MShopTool): it is only a script to handle the callback from PayPal: # MShopTool does the real work mst = context.mshop_tool result = mst.handlePayPalIpn(context.REQUEST) ======================= This is the relevant code from the tool MShopTool: def handlePayPalIpn(self, request): log("Starting PayPal IPN") portal_props=getToolByName(self, 'portal_properties') shop_props = portal_props.mshop_properties #points to (sandbox) paypal account if shop_props.paypal_use_sandbox: url = shop_props.paypal_sandbox_url else: url = shop_props.paypal_url # copy the incoming form vars formvars = request.form # append validation command formvars['cmd']='_notify-validate' # remove Zope funny var: if '-C' in formvars: del formvars['-C'] data = urllib.urlencode(formvars) response = urllib.urlopen(url,data).read() if response=="VERIFIED": log("PayPal IPN verification call: VERIFIED response. \n", formvars ) self.notifyShopPayPalResult(formvars) elif (response=="INVALID" or formvars['receiver_email']!=shop_props.paypal_business): # message compromised or not intended for us logerror("PayPal IPN verification call: INVALID response. \n", formvars ) else: logerror("PayPal IPN verification call failed. \n", formvars ) HTH M.J. Maré WebToTheMax On 23-jun-05, at 19:47, Ed Colmar wrote:
I found the Bastion Ledger and Bastion Paypal connection, but it is way way overkill for what I want to do. Does anyone have a simple(r) IPN script they can point me towards?
TIA!
-e- _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )
M.J. Maré WebToTheMax T +31-20-4 100 242 F +31-20-4 100 243 W www.webtothemax.com E mjmare@webtothemax.com J mjm@anywise.jabber.com