什么是PayPal

PayPal又称为贝宝,是一种外贸支付方式,目前在国际的贸易支付中有着极高的地位,它就好像中国的支付宝,都是第三方支付平台。

PayPal的优势是,其业务网络遍布全球。目前PayPal的庞大网络覆盖了全球200多个国家,可提供20多种语言服务,并接受100多种货币付款和56种货币提现。

  • 需要注意的一点是,也是我个人感觉非常好的一个地方,PayPal的支付逻辑,是一个事务性的操作,一旦开始,除非获取到支付成功的返回凭证,否则一致就认为没有成功,支付宝就不是这样,它是支付时生成订单,无论是否付款,订单都已经生成了,这样的话,在付款的一瞬间,啪,网断了,支付宝有可能会出现错误,可能是支付状态未修改啊,或者三方卖家没有收到支付成功请求啊一类的。
  • 但是,支付宝也有避免错误的方法,就是对所有唤起收银台交易的状态码10003发起轮询,轮询间隔未3秒,在让用户再次支付前,必须通过查询确认当前订单的 状态

注册PayPal和开发者平台

官网地址

开发者平台


注册成功后,会默认创建两个账号,一个是个人的,一个商户的,如果不想用默认的,可以自己创建

进入应用管理,可以看到,它也给创建了默认的应用

然后获取Client ID和Secret

然后回来修改一下个人账户的余额和密码


开始操作

pip install paypalrestsdk

先安装paypal的sdk

然后新建app,注册好路由和应用,然后view中的代码

import paypalrestsdk
from django.http import HttpResponse
from django.shortcuts import redirect

Client_id = '你的Client_id'

Secret = '你的Secret'

def payment(request):

    paypalrestsdk.configure({
      "mode": "sandbox", # sandbox代表沙盒
      "client_id": Client_id,
      "client_secret": Secret,
    })

    payment = paypalrestsdk.Payment({
        "intent": "sale",
        "payer": {
            "payment_method": "paypal"},
        "redirect_urls": {
            "return_url": "http://192.168.1.157:8000/palpay/pay/", # 支付成功跳转页面
            "cancel_url": "http://192.168.1.157:3000/paypal/cancel/"}, # 取消支付页面
        "transactions": [{
            "amount": {
                "total": "5.00", # 付款金额
                "currency": "USD"}, # 货币类型
            "description": "这是一个订单测试"}]})

    if payment.create():
        print("Payment created successfully")
        for link in payment.links:
            if link.rel == "approval_url":
                approval_url = str(link.href)
                print("Redirect for approval: %s" % (approval_url))
                return redirect(approval_url)
    else:
        print(payment.error)
        return HttpResponse("支付失败")

启动项目,网页访问该视图,即可看到这样

image-20201129112525018

点击继续,可以看到,回调的地址传来了三个参数

http://192.168.1.157:8000/palpay/pay/?paymentId=PAYID-L7BRGHA28162157FN083293V&token=EC-1S659222KF8901217&PayerID=QFV2E28KASNQS

支付id,token和支付者id


然后,我们写一个回调方法,需要通过支付者id进行确认验证支付

def payment_execute(request):

    paymentid = request.GET.get("paymentId") #订单id
    payerid = request.GET.get("PayerID")  #支付者id
    payment = paypalrestsdk.Payment.find(paymentid)
	print(payment)

    if payment.execute({"payer_id": payerid}):
        print("Payment execute successfully")
        return HttpResponse("支付成功")
    else:
        print(payment.error) # Error Hash
        return HttpResponse("支付失败")

然后点击支付即可看到,少了五块钱

然后有些时候需要对交易进行一些核对,也可以通过接口查看交易明细,也就是上面的payment