完整版)"/>
django项目接入paypal支付功能(python完整版)
最近用django搭建了个网站,这里主要介绍下paypal支付功能的接入,搜一下主要都是java版的。
开始上代码:Django官网教程:/
环境:
本人使用IPN接入,django==1.11.11,python==3.6.6
首先注册paypal账户:“”
选择“创建个人账户”,根据要求填写信息,注册完去邮箱激活
注册paypal开发者账户:“”(创建一个买家和一个卖家就可以了。)
在项目settings.py配置中增加
INSTALLED_APPS = [#...'paypal.standard.ipn',#...
]
同时增加卖家账户
# 基于沙箱环境
PAYPAL_TEST = True
# 设置收款的 PayPal 电子邮件账户
PAYPAL_REVEIVER_EMAIL = "你刚注册的收钱人账户"
(这个沙箱环境是真坑,卡,非常卡,卡得不能进去)
更新下数据库
python manage.py migrate
配置到这里就可以了。这个很简单。主要是后面这块。
后端接口这个返回给前端的是html,再由前端引导用户跳转(我是这样做的)
from django.core.urlresolvers import reverse
from django.shortcuts import render
from paypal.standard.forms import PayPalPaymentsForm
from django.conf import settings
def view_that_asks_for_money(request):# What you want the button to do.paypal_dict = {"business": settings.PAYPAL_REVEIVER_EMAIL,"amount": "10000000.00","item_name": request.data['goods'],"invoice": request.data['order_id'],"notify_url": request.build_absolute_uri(reverse('paypal-ipn')),# "notify_url": www.baidu/paypalview/,"return": request.build_absolute_uri(reverse('your-return-view')),# "notify_url": www.baidu/ret_paypal/,"cancel_return": request.build_absolute_uri(reverse('your-cancel-view')),# "notify_url": www.baidu/can_paypal/,"custom": "premium_plan", # Custom command to correlate to some function later (optional)}# Create the instance.form = PayPalPaymentsForm(initial=paypal_dict)context = {"form": form}return render(request, "payment.html", context)
参数介绍:
business:这个就是买家账户,刚才在配置的时候我们配置(根据你的项目目录导进来就行)
amount:价格。本人是由前端传递订单号,通过订单号查询获取的价格(根据你实际情况来)
item_name:这个参数意思是要项目名?我这边是吧商品名称给它了(这个好像没用,随便给个就行)
invoice:这个是订单号(这个后期要拿来验证使用)
notify_url:这个是真坑,paypal支付不想支付宝那样,支付成功后会把参数拼接url里面。他会向你的服务端发送post请求,就是这个你填的路径。
return:支付成功后,有个返回商家按钮。这个参数就是你要再引导用户跳转到那个页面(一般都是显示交易流水号)
cancel_return:也有那种隔路的进去后不买,直接返回。所以这个就是取消交易跳转的页面。
(这三个url要是你没搞懂什么东西,也可以按照注释的那样直接写)
下面的几行就不介绍了,paypal自己完成的。
刚才也说了我返回给前端的是htlm,所以自己要写一个模板
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
</head><form id="pay_form" name="pay_form" action="" method="post"><input type="hidden" name="currency_code" value="USD" id="id_currency_code" />{{form}}</form>
<script language="javascript">document.pay_form.submit();</script>
</html>
这个是配置支付环境
<form id="pay_form" name="pay_form" action="" method="post">
正式上线地址(我一直用的这个,测试的太卡,根本进不去)
测试地址
觉得这个前端没什么说的主要说下这个
<input type="hidden" name="currency_code" value="USD" id="id_currency_code" />
这个标签主要是设置币种,这个你去paypal上查下,不同币种value不同
这是第一步。用户点击paypal支付,前端请求获取到这个html,引导用户跳转。
当用户支付成功后,这个时候就该我们去验证了。刚才也说了,用户支付成功后会直接向我们服务器发送请求。路径就是刚才notify_url,这个我们写的路径。
所以在这个路径下写个post方法就行。
class PaypalReturnView(APIView):def post(self, request):paypal_data = request.datamaijia_email = paypal_data["receiver_email"]# 验证收款人信息if maijia_email != settings.PAYPAL_REVEIVER_EMAIL:return Response({"message": "Incorrect listing"})order_num = paypal_data["invoice"]# 验证订单号(invoice,我们配置的这个参数)try:# 先把数据库保存的订单号表数据拿出来data = OrderInfo.objects.get(order_number=order_num)except:# 订单号有误return Response({"message": "Wrong order number"})# 这个是paypal交易流水号(获取到,保存下)transaction_id = paypal_data["txn_id"]# 验证价格是不是和数据库价格一致price = paypal_data["mc_gross"]if price != data.total_price:# 交易金额有误return Response({"message": "Incorrect transaction amount"})# 这个参数是支付成功paypal返回的,值为verifiedif paypal_data["payer_status"] == "verified":# 都验证完了更新下订单状态就可以了OrderInfo.objects.filter(order_number=order_num).update(status=2)Payment.objects.create(order_id=order_num,trade_id=transaction_id,payment_method=2)return Response({"message": paypal_data})
到这里就结束了。我做的是前端会发送请求获取这个txn_id(交易流水号)给用户看下就行了。
paypal支付很方便,而且支持信用卡,银行卡,总体来说还是很方便的。感谢!!!
吐槽下,这个跟前端什么关系都没,全部都是由后端人员完成。
补充:
paypal_dict = {......# 配置交易币种"currency_code":"AUD"......}对应关系:币种 值(Value)
澳元(A $) AUD
加元(C $) CAD
欧元(€) EUR
英镑(£) GBP
日元(¥) JPY
美元($) USD
新西兰元($) NZD
瑞士法郎 CHF
港币($) HKD
新加坡元($) SGD
瑞典克朗 SEK
丹麦克朗 DKK
波兰兹罗提 PLN
挪威克朗 NOK
匈牙利福林 HUF
捷克克朗 CZK
以色列新谢克尔 ILS
墨西哥比索 MXN
巴西雷亚尔(仅适用于巴西用户) BRL
马来西亚林吉特(仅适用于马来西亚用户) MYR
菲律宾比索 PHP
新台币 TWD
泰铢 THB
土耳其里拉(仅适用于土耳其用户) TRY
印度卢比(仅适用于印度用户) INR
俄罗斯卢布 RUB
更多推荐
django项目接入paypal支付功能(python完整版)
发布评论