我使用django paypal为我的电子商务网站和付款都正常工作,但一旦付款完成它没有重定向回我的网站。在我的localhost.Am使用paypal IPN因为我在我的本地运行machine,以下是向paypal发送数据的代码。
def checkout(request,name):
product=Products.objects.get(name=name)
print "producttttttttttttttttttttt",product
# What you want the button to do.
paypal_dict = {
"business": settings.PAYPAL_RECEIVER_EMAIL,
"amount": product.price,
"item_name": product.name,
"invoice": "unique-invoice-id",
"notify_url": "192.168.5.108:8000" + reverse('paypalipn'),
"return_url": "192.168.5.108:8000/payment-complete/",
"cancel_return": "192.168.5.108:8000",
}
form = PayPalPaymentsForm(initial=paypal_dict)
context = {"form": form}
return render_to_response("payment.html", context)
以下视图是从paypal ipn获取数据:
def paypalipn(request,item_check_callable = None): ''' django paypal视图存储IPN。通知网址对此视图有所了解。 ''' print" haaaaaaaaaaaaaaaaaiiaiiaiiaiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii """ PayPal IPN端点(notify_url)。 由PayPal Payments Pro和Payments Standard用于确认交易。 http://tinyurl.com/d9vu9d
PayPal IPN Simulator:
https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
"""
#TODO: Clean up code so that we don't need to set None here and have a lot
# of if checks just to determine if flag is set.
flag = None
ipn_obj = None
# Clean up the data as PayPal sends some weird values such as "N/A"
# Also, need to cope with custom encoding, which is stored in the body (!).
# Assuming the tolerate parsing of QueryDict and an ASCII-like encoding,
# such as windows-1252, latin1 or UTF8, the following will work:
encoding = request.POST.get('charset', None)
if encoding is None:
flag = "Invalid form - no charset passed, can't decode"
data = None
else:
try:
data = QueryDict(request.body, encoding=encoding)
except LookupError:
data = None
flag = "Invalid form - invalid charset"
if data is not None:
date_fields = ('time_created', 'payment_date', 'next_payment_date',
'subscr_date', 'subscr_effective')
for date_field in date_fields:
if data.get(date_field) == 'N/A':
del data[date_field]
form = PayPalIPNForm(data)
if form.is_valid():
try:
#When commit = False, object is returned without saving to DB.
ipn_obj = form.save(commit=False)
except Exception, e:
flag = "Exception while processing. (%s)" % e
else:
flag = "Invalid form. (%s)" % form.errors
if ipn_obj is None:
ipn_obj = PayPalIPN()
#Set query params and sender's IP address
ipn_obj.initialize(request)
if flag is not None:
#We save errors in the flag field
ipn_obj.set_flag(flag)
else:
# Secrets should only be used over SSL.
if request.is_secure() and 'secret' in request.GET:
ipn_obj.verify_secret(form, request.GET['secret'])
else:
ipn_obj.verify(item_check_callable)
ipn_obj.save()
return HttpResponse("OKAY")
请帮助???
答案 0 :(得分:0)
问题发生了,因为我正在使用localhost,当我搬到开发服务器时,它为我工作。页面被重定向回我的网站。
答案 1 :(得分:0)
我将直接从django-paypal documentation引用此内容:
如果您尝试使用PayPal沙箱在开发中进行测试,并且您的计算机位于防火墙/路由器之后,因此不能在Internet上公开访问(大多数开发人员计算机就是这种情况) ,PayPal将无法发布回您的视图。您将需要使用https://ngrok.com/之类的工具来使您的计算机可公开访问,并确保在notify_url,return和cancel_return字段中向PayPal发送您的公共URL(而不是localhost)。