PayPal支付的上风便是其业务网络遍布环球。目前PayPal的弘大网络覆盖了环球200多个国家,可供应20多种措辞做事,并接管100多种货币付款和56种货币提现。同时,还许可在账户中持有25种货币余额。换句话说,只要付款人拥有一个PayPal账户,他就拥有了在200多个国家进行电子支付购物,并在须要做事的时候享受到母语支持的各种便捷做事。
之前的几篇文章分别先容了海内的支付宝支付:Python3.7.2+Django2.0.4 美多商城集成最新版支付宝支付接口(2019.04)和微信支付:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能
本次我们首次考试测验用Django2来集成跨境三方支付接口PayPal
首先注册官网 https://www.paypal.com 以及开拓者平台:https://developer.paypal.com/developer/accounts/
注册成功后,在沙盒的账号掌握页面:https://developer.paypal.com/developer/accounts/
会默认创建两个账号,一个是商户的,其余一个是个人的
我们演示的流程便是以个人账号登录三方网站对商户账号进行支付业务,当然了,如果你不想利用默认账号,也可以点击右边的Create account的蓝色按钮单独创建。
随后进入运用管理页面:https://developer.paypal.com/developer/applications/
这里已经默认创建好了一个支付运用,记录下它的client_id和client_secret,一会要用到
随后,我们可以回到账号管理页面修正一下个人账号的支付余额
额度设置最高
如果乐意,也可以修正一下登录密码,由于一会我们会用这个账号进行登录操作,把稳这些登录和支付操作全都会在沙盒环境中完成,完备不会影响生产环境的利用
ok,做完了这些,前置任务就搞定了,现在运行命令安装paypal在python真个sdk
pip3 install paypalrestsdk
现在可以在django中新建一个支付视图views.py
import paypalrestsdkdef payment(request): paypalrestsdk.configure({ 34;mode": "sandbox", # sandbox代表沙盒 "client_id": "你的client_id, "client_secret": "你的client_secret" }) payment = paypalrestsdk.Payment({ "intent": "sale", "payer": { "payment_method": "paypal"}, "redirect_urls": { "return_url": "http://localhost:8000/palpay/pay/",#支付成功跳转页面 "cancel_url": "http://localhost: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("支付失落败")
这里阐明一下重点参数,return_url是支付成功后回调的页面,paypal会将一个支付者id回传,然后做事端须要验证支付才能真的完成支付,total是付款金额,精确到分,currency是币种,支持多钟类型的货币。
当Django的做事端创建好支付订单后,重定向到paypal的沙盒环境,这时候一定要利用沙盒的个人账号进行登录和支付。
支付完成后,会跳回刚刚传过去的回调页面:http://localhost:8000/palpay/pay/?paymentId=PAYID-L3SYORA3C031930S1733650J&token=EC-9TG269735K620131N&PayerID=ETYYRCDN8C3XJ
这里paypal会传过来三个参数,支付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) if payment.execute({"payer_id": payerid}): print("Payment execute successfully") return HttpResponse("支付成功") else: print(payment.error) # Error Hash return HttpResponse("支付失落败")
末了,回到管理页面,创造已经少了5美元,解释支付流程已经走完。
这次交易就愉快的结束了,当然了,某些时候我们须要对交易流水进行一些核对,也可以通过接口查看交易明细
#明细payment = paypalrestsdk.Payment.find("订单号")print(payment)
可以看到,通过传入订单id,我们该笔交易的状态,流水id,以及创建日期。
如果用户想要退款的话,可以利用交易明细中的流水号进行退款业务。
#退款from paypalrestsdk import Salesale = Sale.find("流水号")# Make Refund API call# Set amount only if the refund is partialrefund = sale.refund({ "amount": { "total": "5.00", "currency": "USD"}})# Check refund statusif refund.success(): print("Refund[%s] Success" % (refund.id))else: print("Unable to Refund") print(refund.error)
结语:
总体而言,没有什么特殊的难度,全体支付流程相对于出宝来说,更加的紧凑,但是做支付安全是第一要务,就个人体验(仅是个人体验)层面来说,支付宝在安全方面做的还是要比Paypal略强一些,最少在信用卡敲诈和盗刷方面风控做的更好,在风险保障和赔付方面都有供应保险,当然由于金融环境的差异较大,并不是说Paypal的风控做的不好,只是机制不同,在国外,如果持卡人的信用卡被盗刷,一样平常发卡组织会让商家去承担任务,而海内只能在交易环节设置更多的验证,实质上说是要持卡人承担任务。这也是为什么支付宝的风控看起来更好的缘故原由。
末了便是关于费率问题,Paypal官方给出的费率是每笔交易收取3.9%+$0.3(根据你的交易流水,比例可以优惠,详细下限看接入者的月业务额度),不过这可是美刀,不得不说这个费率是相称的高,但是海内做境外支付的电商,一样平常还是要接入Paypal作为支付办法。支付宝的费率基本上在1.2%旁边,详细的费率也看交易流水,有实力的下限可以做到基本没有,纯挚的看费率彷佛支付宝更有上风,但是别忘却了,这样比拟是不科学的,由于凡是接入Paypal的都是看中覆盖外币业务的地区,费率则是投资人该考虑的问题了。