Flutter 接入iOS蘋果內購支付踩坑過程

sugood發表於2021-08-06

如何配置內購商品

在這裡插入圖片描述

坑1:專案與價格配置

蘋果內購支付和我們平時接入支付寶或者微信支付有很大的差別。

  1. 蘋果內購支付的價格只能選擇,不能直接設定。如圖:

在這裡插入圖片描述 2. 蘋果內購支付是通過配置專案的模式來實現支付的。我們應該把每個專案看作一個配置在蘋果後臺的商品,而不僅僅是一個支付配置。這樣蘋果內購比較好理解一點。

  1. 專案的型別有很多種,每一種作用不同,甚至還會影響稽核

  2. 第一次配置好一個專案後,需要重新提一個版本後才能生效的。所以,第一次只能通過沙盒測試了。

坑2:內購專案型別

  1. 消耗型商品

可以消耗使用的商品, 比如遊戲中的金幣, 鑽石等, 可以用來購買應用內虛擬物品的貨幣。

  1. 非消耗型商品

無法被消耗的商品,比如一些教育型APP中的課程, 再比如一些賽車遊戲中的賽道, 這類商品需要在稽核新增恢復購買按鈕, 用於使用者購買過後再誤刪除或其他原因解除安裝APP後的恢復流程, 否則提交稽核會被拒絕。

  1. 非續期訂閱

此類商品與消耗型商品類似, 比如一個月的會員, 一個季度的會員等,與消耗型商品的差異在於, 這類商品在驗證憑證時需要傳遞共享祕鑰

  1. 自動續期訂閱

這類商品和其他商品的流程也有些許不同, 應用比如視訊APP中的連續包月會員, 此類商品到期會自動扣費, 伺服器的驗證邏輯也會有所不同

在國內用的比較多的型別應該是消耗型商品,我們一般都是通過自己的伺服器來處理支付邏輯的。而使用訂閱型別商品還要處理一些其他的邏輯。

注意:所有的消耗型商品就需要實現 “恢復購買” 功能的,否則過不了稽核。

消耗型支付流程

在這裡插入圖片描述

坑3:蘋果內購漏單問題處理

  • 蘋果內購支付和微信/支付寶支付的流程有一個很大的不同。

微信/支付寶支付的結果通過notify_url 回撥支付結果到自己的伺服器。這樣就能極大的保證了使用者支付成功後,後臺是能夠接受到支付結果的。 而蘋果內購支付成功後還需要客戶端請求伺服器的驗證的介面,驗證成功後才能判斷支付有效。這個過程中容易因為網路閃退等問題導致漏單情況。

  • 漏單情況的處理

針對上面的分析,我們需要在購買前讓後臺產生一個訂單。在得知蘋果支付成功後,將訂單和蘋果返回的驗證資料儲存到本地。最後請求後臺介面進行驗證,驗證通過了再刪除本地的驗證資料。否者下次開啟APP要自動進行驗證。

坑4:測試時只能使用沙盒來測試,即使是TestFlight上也是沙盒測試

說不上很坑,只是開發完不能通過實際支付來測試,讓人心裡沒底。實際測試要上線之後測,出問題了也只能是重新提一個版本來修改了。不過讓人值得安慰的是在沙盒沒問題上線了一般也沒問題的。

坑5:實際支付測試

由於蘋果內購要收取30%的手續費。那麼實際支付測試就不能用產品的實際金額來支付了。只能配置1元的商品來進行測試。而問題就是小額的支付,蘋果的扣款延時可能比較大。我們就遇到連續的支付三次後,商品購買成功了。不過繫結的支付寶沒有扣款提醒。還以為漏扣錢了,結果幾個小時後才扣款。

Flutter 蘋果內購元件flutter_inapp_purchase 的使用

  1. 下載依賴
  flutter_inapp_purchase: ^3.0.1
複製程式碼
  1. 初始化元件與監聽
    var result = await FlutterInappPurchase.instance.initConnection;
    //設定結果監聽
    // 更新購買訂閱訊息
    _purchaseUpdatedSubscription =
        FlutterInappPurchase.purchaseUpdated.listen((productItem) {
          print('purchase-updated: $productItem');
          if(productItem.transactionStateIOS == TransactionState.purchased) {
            //todo
          }else{
            closeProgressDialog();
          }
        });
    // 購買報錯訂閱訊息
    _purchaseErrorSubscription =
        FlutterInappPurchase.purchaseError.listen((purchaseError) {
          print('purchase-error: $purchaseError');
          closeProgressDialog();
        });
複製程式碼
  1. 獲取蘋果伺服器上的專案列表,即使用不上,支付之前也要獲取一次,否者支付失敗。
List<IAPItem> items = 
await FlutterInappPurchase.instance.getProducts( ['0001', '0002', '0003'] );
複製程式碼
  1. 拉起蘋果支付
var result = FlutterInappPurchase.instance.requestPurchase(‘0001’);
複製程式碼
  1. 獲取需要 “恢復購買” 的列表,消耗型商品需要處理
List<PurchasedItem> items = 
await FlutterInappPurchase.instance.getAvailablePurchases();
複製程式碼

如果建立的是消耗型商品,常用的方法就這些了。

總結

蘋果內購併不復雜,只是對於第一次接觸蘋果內購的人來說,很多配置都莫名其妙的。不過你後面理解了就會煥然大悟。

所以,我這篇文章並不是一個很細緻的教程,不過是把一些坑和一些對蘋果支付的理解寫下來罷了。不過,我相信你看完這篇文章後,再去做蘋果內購會順很多。

相關文章