iOS 集成PayPal SDK支付

開發(fā)者文檔

附上幾張支付過程的截圖

1121714459190_.pic.jpg

2.png

1131714459190_.pic.jpg

1141714459190_.pic.jpg

1151714459190_.pic.jpg

1161714459190_.pic.jpg

一. 賬號的配置

1. 在開發(fā)者控制臺選擇 Apps & Credentials

WX20240429-195206@2x.png

2. 可以選擇Create APP,或者直接使用系統(tǒng)默認(rèn)的Default Application,點(diǎn)擊Default Application進(jìn)入詳情

1. API credentials
1.png
  • ClientID發(fā)起支付請求需要這個(gè)去初始化
  • Secret key 生成Authentication的時(shí)候需要
2. Sandbox account info
2.png
  • 更多收付款賬號,點(diǎn)擊這里
    5.png

    6.png

    這邊會有默認(rèn)的收付款賬號,當(dāng)然還可以自己創(chuàng)建
    @personal.example.com結(jié)尾 - 付款 - 【發(fā)起支付請求時(shí)候登錄該賬號付款,之前付款一直用自己注冊Paypal賬號,而不是沙盒里的賬號,導(dǎo)致一直登錄不成功,一般測試都是在Sandbox環(huán)境】
    @business.example.com結(jié)尾 - 收款 - 創(chuàng)建訂單的時(shí)候

3. Features

3.png

這里主要勾選[Log in with PayPal],[Native Checkout SDK],再點(diǎn)擊[Log in with PayPal]Advanced Settings去配置

  • Return URL 目前Paypal固定后綴格式:xxx.xxx.xx://paypalpay,一般xxx.xxx.xx設(shè)置為當(dāng)前App的包名(eg:com.PayPalAPP://paypalpay)
  • Full name和Email勾選,Privacy policy URL和User agreement URL隨便填寫給地址就行
  • PayPal account ID (payer ID)勾選
  • 最底部的Enable customers who have not yet confirmed their email with PayPal to log in to your app.勾選

4. Sandbox Webhooks,可以配置支付完成Paypal通知我們后臺的回調(diào)URL,后臺開發(fā)去關(guān)注即可

二. 代碼集成

文檔中有三種拉起支付的方式 Card、Native payments、Web payments,具體區(qū)別查閱https://developer.paypal.com/docs/checkout/advanced/ios/集成文檔,這里展示下Native payments集成方式,吐槽下,官方集成文檔跟官方Demo演示的流程對不上,文檔上Native payments的登錄是SDK內(nèi)部實(shí)現(xiàn),實(shí)際跑起來,登錄是APP內(nèi)拉系統(tǒng)瀏覽器去登錄的

pod 'PayPal/PayPalNativePayments
import PayPal

let config = CoreConfig(clientID: "CLIENT_ID", environment: .sandbox)
let payPalNativeClient = PayPalNativeCheckoutClient(config: config)
  • CLIENT_ID 替換成自己的clientID**
  • 發(fā)起支付
    @objc func payPalButtonTapped() {
        Task {
            let orderID = "OrderID"
            let request = PayPalNativeCheckoutRequest(orderID: orderID)
            await self.payPalClient.start(request: request)
        }
    }
  • 這里的Task必須加上,要不然會崩潰,這里是參考官方Demo的寫法
orderID生成,后臺還沒搭建的情況
  1. https://developer.paypal.com/api/rest/authentication/ 獲取授權(quán)碼
  • cURL方式,按照提示對Note: Encode CLIENT_ID:CLIENT_SECRET in Base64 before sending it in the API call.進(jìn)行Base64 Encode,一直都是提示404
  • Postman的方式可以正確獲得token
{
    "scope": "https://uri.paypal.com/services/payments/futurepayments",
    "access_token": "A21AAJ09kg1kH6oObs6FS1zTHLg3F-scr8dPDM8Cx7upLHpXvgQUltDbG-_8Lg4UoPXIFCuKGu0Ac0sq4XkHqJzJT0Gc2-lbQ",
    "token_type": "Bearer",
    "app_id": "APP-80W284485P519543T",
    "expires_in": 32246,
    "nonce": "2024-04-30T06:03:15ZYvWdeI2c-t4b1J0bbIGA3qHPCmZkWyPNvl7JoVpGN4o"
}
  1. 把步驟一獲取的授權(quán)碼替換如下,并在終端中執(zhí)行
curl --location --request POST 'https://api-m.sandbox.paypal.com/v2/checkout/orders/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer A21AAKY8fUjjesNQpycLWrkz9lITZoAF6bUaYRZ-JEG1Nbj0F6fiyxI1CtwurwhCt1Uezl5vL2_1VXmz9pkFwQfZwZN-7alVQ' \
  --data-raw '{
    "application_context": {
        "shipping_preference": "NO_SHIPPING",
        "user_action": "PAY_NOW"
    },
    "intent": "AUTHORIZE",   
    "purchase_units": [
      {
        "shipping": {
            "address": {
                "admin_area_2": "ShenZhen City",
                "country_code": "CN",
                "address_line_2": "Apt 9",
                "address_line_1": "LongHuaQu LongHuaJieDaoBan",
                "admin_area_1": "SZ",
                "postal_code": "1111"
            },
            "name": {
                "full_name": "Cook"
            }
        },      
        "payee": {
            "merchant_id": "X5XAHHCG636FA",
            "email_address": "merchant@email.com"
        },       
        "amount": {
          "currency_code": "USD",
          "value": "5.00"
        }
      }
    ]
  }'

應(yīng)答如下,0GW60266PC254253L即是我們需要的訂單號,這樣就是可以愉快的發(fā)起支付請求了

{
    "id": "0GW60266PC254253L",
    "status": "CREATED",
    "links": [{
        "href": "https://api.sandbox.paypal.com/v2/checkout/orders/0GW60266PC254253L",
        "rel": "self",
        "method": "GET"
    }, {
        "href": "https://www.sandbox.paypal.com/checkoutnow?token=0GW60266PC254253L",
        "rel": "approve",
        "method": "GET"
    }, {
        "href": "https://api.sandbox.paypal.com/v2/checkout/orders/0GW60266PC254253L",
        "rel": "update",
        "method": "PATCH"
    }, {
        "href": "https://api.sandbox.paypal.com/v2/checkout/orders/0GW60266PC254253L/capture",
        "rel": "capture",
        "method": "POST"
    }]
}

總結(jié)

1. 發(fā)起支付動作,文檔上的示例
let payPalNativeClient = PayPalNativeCheckoutClient(config: config)

我是這么寫的,運(yùn)行時(shí)直接報(bào)異常

    @objc func payPalButtonTapped() async {
        let orderID = "0H807318BJ781474U"
        let request = PayPalNativeCheckoutRequest(orderID: orderID)
        await self.payPalClient.start(request: request)
    }

看了官方Demo的寫法,修改成如下

    @objc func payPalButtonTapped() {
        Task {
            let orderID = "0H807318BJ781474U"
            let request = PayPalNativeCheckoutRequest(orderID: orderID)
            await self.payPalClient.start(request: request)
        }
    }
2. 拉起支付,進(jìn)行登錄的時(shí)候、這里登錄的是沙盒里的賬號密碼,不是自己注冊的Paypal賬號密碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容