Neil,
Sorry it has taken a while to respond. Been away..
Your code is very useful, and helps, thanks.
The ordering of the vars is, according to PayPal, important (and they say 
so often). However, as you say, this is really not the case. Frustrating. 
-  but it was a good opportunity for me to learn:-).
I will certainly use your snippet.
Simon



On Friday, July 19, 2013 7:30:45 AM UTC+1, Neil wrote:
>
> Hi Simon,
>
> I've got a live system working with PayPal. Here's my handler:
>
> def ipn_handler():
>     parameters = request.vars
>     if len(request.vars.keys()) > 0:
>         params = "cmd=_notify-validate&" + urllib.urlencode(parameters)
>         headers = {"Content-type": "application/x-www-form-urlencoded",
>                    "Content-Length": "%s" % (len(params))}
>         
>         r1 = None
>         try:
>             conn = httplib.HTTPSConnection("www.paypal.com")
>             conn.request("POST", "/cgi-bin/webscr", params, headers )
>             r1 = conn.getresponse()
>         except:
>             ... handle error ...
>             return
>         if parameters['payment_status'] == "Completed":
>             ... do stuff ...
>
> It is adapted from code in the web2py cookbook. To be honest, I've never 
> thought about the order of the URL. However, all I can say is that the 
> above code has been running for about a year now without a problem.
>
> Neil
>
> On Thursday, 18 July 2013 21:02:03 UTC+1, SimonD wrote:
>>
>> OK, I think I have stumbled on a solution. Which I thought would be 
>> useful to share here.
>>
>> Playing with request.env, I noted that this too was Storage.
>>
>> Hence: request.env.query_string appears to give me exactly what I need. 
>> i.e. it is essentially the "raw" string of vars. Unaltered and in the 
>> original order, just as PayPal wants to see.
>> So, anyone planning to deploy PayPal's IPN, might like to make a note.
>>
>> This doesn't appear to be detailed  anywhere ??  If it is, then I have 
>> overlooked a useful source of API information (that might have led me this 
>> answer a lot earlier and not wasted forum space). If anyone knows where I 
>> would have found this detailed, I would really appreciate the URLs 
>> please......
>>
>> Thanks
>> Simon
>>
>> On Thursday, July 18, 2013 5:46:23 PM UTC+1, SimonD wrote:
>>>
>>> Hello, I would be sure that someone has come across this already. I hope 
>>> so.
>>> I am writing a handler for PayPal IPN. Actually, a little easier that I 
>>> thought it would be except for one issue: -
>>>
>>> request.vars creates a Storage object, but the key:value pairs are not 
>>> in the same sequence as they are in the URL. It almost seems to be a 
>>> randomised order.
>>> For 99.9% of occasions this is OK. However, as part of the  IPN handler 
>>> authentication, PayPal expects to receive the URL (var) string back exactly 
>>> as they posted it to my application, specifically with the vars in the same 
>>> order. Their documentation re-states this requirement in multiple places !.
>>> I suspect (although I don't know), that PayPal is simply matching the 
>>> return var string to the one it posts. i.e. not actually wasting server 
>>> cycles with intelligent var matching :-(
>>> I am also not on a LIVE server so, although PayPal have a test sandbox, 
>>> it is not a lot of use at this point.
>>>
>>> I cannot identify any other function in web2py to pull the raw URL 
>>> string. I think the only function is request.vars.
>>> I note that request.args has an index method (i.e.  request.args(i) ) so 
>>> that the args can be pulled in sequence. But request.vars does not have 
>>> this method.
>>>
>>> To test my random order theory, here is a test function()
>>>
>>> import urllib
>>> def sample():
>>> #sample of ipn_handler code
>>>     getvars=request.vars
>>>     test1=urllib.urlencode(dict(getvars))
>>>     
>>>     getvars=request.vars
>>>     test2=''
>>>     for item in getvars:
>>>         test2=CAT(test2,'&',item,'=',getvars[item])
>>>     
>>>     test3=request.vars
>>>     
>>>     return dict(test1=test1,test2=test2,test3=test3)
>>>
>>> and the view (extract)....
>>> test1: {{=test1}}<br />
>>> test2: {{=test2}}<br />
>>> test3: {{=test3}}<br />
>>>
>>> So, if my url vars are as follows:-
>>> ?a=11&b=22&c=33&d=44&e=55&f=66&g=77&h=88
>>>
>>> ...this is what the view shows.
>>> test1: a=11&c=33&b=22&e=55&d=44&g=77&f=66&h=88
>>> test2: &a=11&c=33&b=22&e=55&d=44&g=77&f=66&h=88
>>> test3: <Storage {'a': '11', 'c': '33', 'b': '22', 'e': '55', 'd': '44', 
>>> 'g': '77', 'f': '66', 'h': '88'}>
>>>
>>> You can see that I have testing two ways to create a return var string 
>>> (test1 and test2), and also shown the Storage object (test3)
>>> test1, test2 and test3 show an identical sequence. But it is different 
>>> to the actual posted URL var sequence.
>>> BTW - the actual IPN string is not determiistic, so it is not like I can 
>>> manually build a return string.
>>>
>>> Thanks!
>>> Simon
>>>
>>>
>>>
>>> I note that on web2pyslices, there are (I see) two slices (for PayPal 
>>> IPN) that also appear to generate a randomised return string. According to 
>>> the PayPal docs, that string will be rejected.
>>>
>>> So, what on earth am I doing wrong? Or perhaps there is another way to 
>>> pull the vars from the URL? (request.url doesn't pass the vars)
>>> Or has someone a different way to recreate the URL for PayPal IPN?
>>>
>>> Thanks
>>> Simon
>>>
>>>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to