django项目接入paypal支付功能(python完整版)

您所在的位置:网站首页 对接paypal支付 django项目接入paypal支付功能(python完整版)

django项目接入paypal支付功能(python完整版)

2023-09-09 13:56| 来源: 网络整理| 查看: 265

最近用django搭建了个网站,这里主要介绍下paypal支付功能的接入,搜一下主要都是java版的。

开始上代码:Django官网教程:https://pypi.org/project/django-paypal/

环境:

本人使用IPN接入,django==1.11.11,python==3.6.6

首先注册paypal账户:“https://www.paypal.com”

选择“创建个人账户”,根据要求填写信息,注册完去邮箱激活

注册paypal开发者账户:“https://developer.paypal.com”(创建一个买家和一个卖家就可以了。)

在项目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.com/paypalview/, "return": request.build_absolute_uri(reverse('your-return-view')), # "notify_url": www.baidu.com/ret_paypal/, "cancel_return": request.build_absolute_uri(reverse('your-cancel-view')), # "notify_url": www.baidu.com/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,所以自己要写一个模板

{{form}} document.pay_form.submit();

这个是配置支付环境  

 

正式上线地址(我一直用的这个,测试的太卡,根本进不去)

https://www.paypal.com/cgi-bin/webscr

测试地址

https://www.sandbox.paypal.com/cgi-bin/webscr

觉得这个前端没什么说的主要说下这个

 

这个标签主要是设置币种,这个你去paypal上查下,不同币种value不同

这是第一步。用户点击paypal支付,前端请求获取到这个html,引导用户跳转。

当用户支付成功后,这个时候就该我们去验证了。刚才也说了,用户支付成功后会直接向我们服务器发送请求。路径就是刚才notify_url,这个我们写的路径。

所以在这个路径下写个post方法就行。

class PaypalReturnView(APIView): def post(self, request): paypal_data = request.data maijia_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返回的,值为verified if 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

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3