思路:调用第三方支付 API 接口实现支付功能。本来想用支付宝来实现第三方网站的支付功能的,但是在实际操作中发现支付宝没有 Python 接口,网上虽然有他人二次封装的的 Python 接口,但是对我这个小白白来说上手还是有点难度,后来发现 PayPal 有现成的 Django 模块,想着以学习的目的来实现这一功能(其实还是自己辣鸡),就决定以 PayPal 的电子支付功能来练手。
首先,安装 PayPal 的 Django 模块:django-paypal,具体介绍可以参考 GitHub上说明: https://github.com/spookylukey/django-paypal
pip install django-paypal
然后在 settings.py 中的 INSTALLED_APPS 将 'paypal.standard.ipn' 加入。并在 settings.py 中添加下列语句。
# 此付款机制作为测试用PAYPAL_TEST = True# 设置收款的 PayPal 电子邮件账户PAYPAL_REVEIVER_EMAIL = 'your email'
执行同步数据库操作。
./manage.py migrate
urls.py 中加入下列样式。分别为付款完成通知,处理账务,显示完成付款,取消付款操作。
url(r'^paypal/', include('paypal.standard.ipn.urls')), # 付款完成通知url(r'^payment/(/d+)/$', views.payment),url(r'^done/$', views.payment_done),url(r'^canceled/$', views.payment_canceled),
PayPal 付款操作,建立含有正确数据的付款按钮。
@login_requireddef payment(request, order_id): all_categories = models.Category.objects.all() try: order = models.Order.objects.get(id=order_id) except: messages.add_message(request, messages.WARNING, "订单编号错误,无法处理付款。") return redirect('/myorders/') all_order_items = models.OrderItem.objects.filter(order=order) items = list() total = 0 for order_item in all_order_items: t = dict() t['name'] = order_item.product.name t['price'] = order_item.product.price t['quantity'] = order_item.quantity t['subtotal'] = order_item.product.price * order_item.quantity total = total + order_item.product.price items.append(t) host = request.get_host() paypal_dict = { "business": settings.PAYPAL_REVEIVER_EMAIL, "amount": total, "item_name": "迷你小电商商品编号:{}".format(order_id), "invoice": "invoice-{}".format(order_id), "currency_code": 'CNY', "notify_url": "http://{}{}".format(host, reverse('paypal-ipn')), "return_url": "http://{}/done/".format(host), "cancel_return": "http://{}/canceled/".format(host), } paypal_form = PayPalPaymentsForm(initial=paypal_dict) template = get_template('payment.html') html = template.render(context=locals(), request=request) return HttpResponse(html)
由于用到了 django-paypal 提供的 PayPalPaymentForm 类。因此在 views.py 的前面也要导入这个类。另外,因为用到了 settings.py 中的常数,所以也要导入 settings,语句如下:
from django.conf import settingsfrom paypal.standard.forms import PayPalPaymentsFormfrom django.core.urlresolvers import reverse
新闻热点
疑难解答