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

最近用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,所以自己要写一个模板

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
</head>

    <form id="pay_form" name="pay_form" action="https://www.paypal.com/cgi-bin/webscr" 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="https://www.paypal.com/cgi-bin/webscr" method="post">

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

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

测试地址

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

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

  <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.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

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值