本次我們首次嘗試用Django2來集成跨境三方支付接口PayPal
首先注冊官網 www.paypal.com 以及開發者平台:developer.paypal.com/developer/a…
注冊成功后,在沙盒的賬號控制頁面:developer.paypal.com/developer/a…
會默認創建兩個賬號,一個是商戶的,另外一個是個人的
我們演示的流程就是以個人賬號登錄三方網站對商戶賬號進行支付業務,當然了,如果你不想使用默認賬號,也可以點擊右邊的Create account的藍色按鈕單獨創建。
隨后進入應用管理頁面:developer.paypal.com/developer/a…
這里已經默認創建好了一個支付應用,記錄下它的client_id和client_secret,一會要用到
隨后,我們可以回到賬號管理頁面修改一下個人賬號的支付余額
額度設置最高
ok,做完了這些,前置任務就搞定了,現在運行命令安裝paypal在python端的sdk
pip3 install paypalrestsdk
現在可以在django中新建一個支付視圖views.py
import paypalrestsdk def payment(request): paypalrestsdk.configure({ "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的沙盒環境,這時候一定要使用沙盒的個人賬號進行登錄和支付
這里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("支付失敗") 作者:劉悅的技術博客 鏈接:https://juejin.cn/post/6844904197708578824 來源:稀土掘金 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
這次交易就愉快的結束了,當然了,某些時候我們需要對交易流水進行一些核對,也可以通過接口查看交易明細
#明細 payment = paypalrestsdk.Payment.find("訂單號") print(payment)
通過傳入訂單id,我們該筆交易的狀態,流水id,以及創建日期。
如果用戶想要退款的話,可以利用交易明細中的流水號進行退款業務
#退款 from paypalrestsdk import Sale sale = Sale.find("流水號") # Make Refund API call # Set amount only if the refund is partial refund = sale.refund({ "amount": { "total": "5.00", "currency": "USD"}}) # Check refund status if 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的都是看中覆蓋外幣業務的地區,費率則是投資人該考慮的問題了。