開發(fā)者文檔
- PayPal開發(fā)者中心,注冊登錄https://developer.paypal.com/home
- iOS SDK集成文檔 https://developer.paypal.com/docs/checkout/advanced/ios/
- iOS 官方Demo https://github.com/paypal/paypal-ios
- 開發(fā)者控制臺https://developer.paypal.com/dashboard
附上幾張支付過程的截圖
1121714459190_.pic.jpg
2.png
1131714459190_.pic.jpg
1141714459190_.pic.jpg
1151714459190_.pic.jpg
1161714459190_.pic.jpg
一. 賬號的配置
1. 在開發(fā)者控制臺選擇 Apps & Credentials
WX20240429-195206@2x.png2. 可以選擇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生成,后臺還沒搭建的情況
- 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"
}
- 把步驟一獲取的授權(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)
}
}











