1. 程式人生 > 程式設計 >Paypal支付不完全指北

Paypal支付不完全指北

啥都不說,先吐槽

Paypal 真心坑爹,跟國內支付完全沒法比,能不接入就不接入吧!!!

準備工作

重要事情

Paypal下單支付後,需要主動跟paypal確認收款(capture),否則該筆訂單並不是完成狀態!!!

賬號

自己前往Paypal develop註冊一個吧,注意區分沙箱(sandbox)和正式(live)賬號即可。
用沙盒賬號開發,還可以建立多個沙盒的paypal賬號,可以用於沙盒測試支付。

下單方式

跟國內的支付寶和微信有區別,paypal可以直接在客戶端下單。

支援客服端、服務端下單。各有利弊,看具體需求來定咯

  • 客服端下單,可以調起Paypal APP(ios 和 android), 缺點是服務端無法及時知曉下單過程,需要客戶端及時通知
  • 服務端或者webhooks服務端下單,只能開啟paypal 網頁支付。

無論何種下單,paypal 都沒有采用加密機制,全部都是明文,所以在檢校訂單資訊時需要格外注意

客戶端下單

  • JavaScript
  • ios sdk
  • android sdk

客服端直接下單,需要保證客服端接收到的訂單資訊時準確的(最好後端加密訂單資訊,客戶端解密並檢驗資料完整性)

JavaScript

JavaScript直接接入,是通過paypal js直接生成一個iframe用於支付。
其中需要注意的是,paypal生成的按鈕只有幾個基本樣式可選,無法直接自定義樣式(我是沒有找到相關文件,不排除可以自定義的可能。如果有麻煩也告訴下我)。

使用方式

// 如果預設貨幣不是美元,需要在後面新增貨幣引數
<script src="https://www.paypal.com/sdk/js?client-id=sb"></script> 
paypal.Buttons({
createOrder: function(data,actions) {
 // This function sets up the details of the transaction,including the amount and line item details.
 return actions.order.create({
  purchase_units: [{
   amount: {
    value: '0.01'
   }
  }]
 });
},onApprove: function(data,actions) {},onCancel: function(){},onError: function(){}
}).render('#paypal-button-container');

雖然目前無法自定義按鈕,但是我們可以是paypal生成的按鈕隱藏,用自己的按鈕蓋住,然後是設定css屬性pointer-events:none;來遮蔽事件即可。

Ios || android

Ios 和 andorid 的接入方式與JavaScript類似,只要引入相應的SDK,非常簡單的就可以下單。SDK quickstart

服務端下單(推薦)

因為paypal沒有采用加密機制,同時在弱網情況下無法保證客戶端可以及時通知服務端訂單狀態的改變,選用服務端下單是相對安全的。

建議在下單時,傳送完整的訂單金額資訊,paypal會對相關金額做檢校,如果更方面金額不一致(總價 !== 運費+稅費+商品數量 * 商品單價+…… ),是不能下單的。同時也可以讓買家確認該筆訂單的明細,使用者體驗和安全性都有提高。

順便吐槽下paypal的沙盒環境,如果你請求超時,請不要見怪,這不是你的問題,是沙盒環境太爛。(PS:不知道是不是與服務端語言相關,PHP和nodejs對接paypal,效能差別很大,同一時間,同一個沙盒賬號,nodejs請求基本保持在5s以內,php在15s左右)

基本下單引數

{
  "intent": "CAPTURE","purchase_units": [
    {
      "reference_id": "order_id",// 總價
      "amount": {
        "value": "200","currency_code": "RMB"
      },// 價格明細
      "breakdown": {
        // 商品總價
        "item_total": {
          "value": "180","currency_code": "RMB"
        },// 運費
        "shipping": {
          "value": "20","currency_code": "RMB"
        }
        // …… 還有稅費之類的
      },// 商品明細
      "items": [
        {
          "name": "goods","unit_amount": {
            "value": "90","currency_code": "RMB"
          },"quantity": 2,// 數量
          "sku": "sku"
        }
      ]
      //...地址之類的其他引數
    }
  ],"application_context": {
    "cancel_url": "","return_url": ""
  }
}

支付時序圖

Paypal支付不完全指北
高清線上圖片

再次強調: Paypal下單支付後,需要主動跟paypal確認收款(capture),否則該筆訂單並不是完成狀態!!

notify

支付回撥可以通過IPN或者webhooks,基本和國內支付沒有什麼區別,唯一區別是paypal通知沒有加密,收到回撥需要服務端主動跟paypal確認資訊是否正確

相關連結

PayPal Checkout
PayPal integrate doc
PayPal SDK quickstart
point-events

到此這篇關於Paypal支付不完全指北的文章就介紹到這了,更多相關Paypal支付內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!