Google Pay接入流程

yanghai發表於2019-06-02
應用建立

建立應用需要上傳一個簽名後的包。可以是個空包,也就是說,可以上傳一個和正式包一樣包名和簽名的就可以提前獲得回覆的key。

GooglePay內購及訂閱概念

1.GoogleInapp(內購)

GoogleInapp也叫google內購,內購分為兩個步驟,第一步為購買。購買成功後,需要消耗該商品。如果該商品未消耗,那麼當前裝置下次購買該商品將會失敗,返回code碼為7.使用者如果第一次購買該商品,在兩小時內可以不通過開發者同意進行退款(該規則同樣適用於訂閱功能)。在伺服器校驗流程中,可以根據code碼判斷是否退款。

2.GoogleSubs(訂閱)

googleSubs也叫google訂閱。定期的扣除使用者的費用。直到使用者到googlePlay中接觸訂閱。

/**
     * 用於訂閱商品
     *
     * @param context
     * @param productId Google play store 後臺定義的商品的id。如果錯誤的話,將提示檢索失敗
     * @param payload   該欄位隨機生成一定長度的字串,用於生成的訂單支付成功後根據google返回的訂單資訊關聯。
     */
    public void subsGoods(Activity context, String productId, String payload)
複製程式碼

業務接入流程

整體接入流程圖

  1. 呼叫queryProductDetails(productId,listener)方查詢google後臺是否擁有該商品id。如果有該商品id,同時返回該商品價格,貨幣,描述資訊等資訊
  2. 根據返回資訊到伺服器建立預支付訂單。
  3. 建立成功後,呼叫googlePay.buyGoods(activity,productId,developerPayload)購買方法,下面分為兩種情況,一種是購買成功,觸發onBuySuccess(OrderParam orderParam)方法(下一步驟為4),一種是購買失敗,而失敗中如果是由於未消耗造成的會返回狀態碼為7(下一步驟為6);觸發haveGoodsUnConsume()方法。
  4. 購買成功,到伺服器校驗該商品.
  5. 如果商品校驗成功,呼叫googlePay.consumeAsync(mPurchasingItemType,purchaseData, dataSignature)方法消耗該商品,如果消耗失敗,那麼下次購買時,到步驟1,直到消耗成功後才能進行下一次支付,這樣可以百分百的保證不丟單.
  6. 根據返回的狀態碼為7時,會觸發haveGoodsUnConsume方法,在該方法中呼叫handQueryInventoryAsync()方法查詢未消耗商品的資訊
  7. 根據查詢到的資訊,到伺服器校驗該商品資訊;(下一步驟為5)。

GooglePay接入方法說明

初始化GooglePay物件

/**
     * 初始化Google pay
     *
     * @param context                上下文引數
     * @param base64EncodedPublicKey 購買需要的公鑰
     * @param listener               初始化和購買的回撥
     */
    public GooglePay(Activity context, String base64EncodedPublicKey, GooglePayStatus listener)
複製程式碼

GooglePayStatus中包含購買過程會用到的方法

/**
     * 初始化失敗是,呼叫該方法。在呼叫購買時,需要對該引數進行判斷
     * https://www.jianshu.com/p/87ffdb7bc439
     * 該文章有提到解決方法
     *
     * @param boo
     */
    public abstract void initFailed(boolean boo);

    /**
     * 各種的支付過程中的狀態
     *
     * @param code
     */
    public abstract void onGgStatus(int code);

    /**
     * 呼叫購買或訂閱成功時會回撥該方法
     *
     * @param data 返回Google  pay購買成功返回的引數
     */
    public abstract void onBuySuccess(OrderParam data);

    /**
     * 呼叫消耗商品成功
     */
    public abstract void onConsumeSuccess();

    /**
     * <p>
     * public void setIsAutoConsume(boolean isAutoConsume) {
     * this.isAutoConsume = isAutoConsume;
     * }
     * <p>
     * 當setIsAutoConsume 設定為true時,
     * 將會回撥該方法,根據自己的業務邏輯進行處理消耗商品邏輯
     *
     * @param purchase
     */
    public void unConsumeAsync(Purchase purchase) {

    }

    public void cancelPurchase() {

    }

    /**
     * 購買時,有未消耗的商品,回撥該方法
     */
    public void haveGoodsUnConsume() {

    }

    /**
     * 其他錯誤
     * @param status
     * @param error
     */
    public void ohterError(int status, String error) {

    }
複製程式碼

購買成功後的回撥,需要在onActivityResult方法中處理

public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
        if (googlePay != null && googlePay.isSetupDone()) {
            return googlePay.handleActivityResult(requestCode, resultCode, data);
        }
        return false;
    }
複製程式碼

查詢商品是否存在,如果存在,返回該商品id的相關資訊

/**
    * 查詢商品的詳情資訊,同時用於判斷伺服器是否配置了該商品id。
    *
    * @param productId  待查詢的商品id
    * @param listener 回撥資訊
    */
   private void queryItemDetails(String productId, IQueryProductDetailListener listener)複製程式碼
package com.google.pay;

public interface IQueryProductDetailListener {

   /**
    * @param price    價格
    * @param currency 貨幣單位
    * @param other    商品名稱
    */
   void querySuccess(long price, String currency, String other);

   /**
    * 查詢失敗,不存在該商品
    *
    * @param status
    * @param msg
    */
   void queryFailed(int status, String msg);

   /**
    * 查詢失敗
    */
   void queryIdNoExist();

}
複製程式碼

呼叫購買方法


   /**
    * 用於購買商品
    *
    * @param context
    * @param productId Google play store 後臺定義的商品的id。如果錯誤的話,將提示檢索失敗
    * @param payload   該欄位隨機生成一定長度的字串,用於生成的訂單支付成功後根據google返回的訂單資訊關聯。
    */
   public void buyGoods(Activity context, String productId, String payload)
複製程式碼

消耗商品的方法

/**
    * 該方法使用者手動消耗購買的商品。預設情況下,購買成功後不消耗商品。需要呼叫該方法。
    * 下面三個引數都是Purchase獲取到的。
    *
    * @param mPurchasingItemType  
    * @param purchaseData
    * @param dataSignature
    */
   public void consumeAsync(String mPurchasingItemType, String purchaseData, String dataSignature)
複製程式碼

伺服器校驗流程

Purchase purchase = inventory.getPurchase(product);
Log.d(TAG, "Purchase state: " + purchase.getPurchaseState());
// 0 (purchased), 1 (canceled), or 2 (refunded).
複製程式碼

處理退款校驗參考連結

測試相關

www.jianshu.com/p/9d7f3dc7a…

其他問題說明

支付遭拒

1.1 應用商品可能違反了當地的政策,例如vpn在中東很多國家是違法的。 1.2 由於代理的vpn,ip頻繁切換導致過銀行風控 1.3 繫結的銀行卡地址和google後臺註冊的地址不相符和,可以通過修改google的地址進行解決,但是該種方式很複雜,成功率很低。 1.4 出現支付遭拒的訂單號客戶端是由兩串number構成的,如果是成功的情況,訂單號是由GPA.number構成。 1.5 出現支付遭拒是一件正常的事情,我諮詢過很多做遊戲和應用的開發,在國外都有遇到支付遭拒的情況,應該能排查程式碼的問題。 1.6 手機裝置root過,不能支付成功

關於繫結銀行卡支付

  1. 如果使用真實貨幣支付,首先你需要一張支援外幣的信用卡。例如mastcard,visa等。在繫結銀行卡的過程中,你可能需要切換你的賬單地址,否者很難繫結成功,總之,這個過程比較麻煩。測試支付可以新增測試賬號測試。

不能彈出Google 支付的介面

  1. 你是否給Google Service顯示懸浮框許可權
  2. 該賬號是否已經存在購買的商品,但是還未消耗,此時也不會彈出支付框

測試裝置服務不支援

  1. google service版本太低,需要到應用商店的設定中,點選版本號,提示更新。這個過程有點慢,感覺點選沒有反應,實際上是在後臺下載。需要等一會兒,或者需要重啟一下裝置等。反正就是要讓應用商店更新到最新的版本。否者會出現裝置不支援google pay。

關於Google play store 升級

如果手機的Google 服務先關元件是通過三方安裝,那麼很有可能版本比較低。不支援支付的api version3. 此時需要對Google play stroe 進行升級。在選單欄中-->設定-->點選版本號。然後點選確認。需要注意的是,點選確認後,手機可能看試沒有反應。實際上在下載。根據網路情況,等一定時間,重啟手機。應用就更新了。

初始化失敗

如果Google服務的版本已經是最新了還出現出事話失敗的情況,可以通過以下方式解決。

  1. 需要將手機中的google賬號全部刪除

  2. 然後把google service和google play商店中的快取全部清理掉

  3. 重新登入賬號。。

  4. 手機沒有安裝service相關元件,下載go安裝器安裝手機相關的元件,需要手動更新下,預設下載的版本有些老。

Demo地址

其他支付,包括微信,支付寶,支付寶外幣,stripe等

相關文章