日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Google play billing(Google play 内支付)

發布時間:2024/1/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Google play billing(Google play 内支付) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.bubuko.com/infodetail-930440.html

?

[html]?view plaincopy
  • 如billing開發文檔所說,要在你的應用中實現In-app?Billing只需要完成以下幾步就可以了。??
  • ?

    [html]?view plaincopy
  • 第一,把你上篇下載的AIDL文件添加到你的工程里,第二,把??
  • <uses-permission android:name="com.android.vending.BILLING" />

    這個權限加到你工程的AndroidManifest.xml文件中,第三,創建一個ServiceConnection,并把它綁定到IInAppBillingService中。完成上面三條后就可以使用支付了。當然這只是一個簡單的介紹。其實Google的這個支付,大部分都是你手機上的Google Play來進行處理的,你只需要處理購買請求,處理購買結果就行了。文檔寫的很好,先把這個文檔看完,就知道支付流程了。

    ?

    正文:

    1.內購商品相關

    針對我的項目而言,我們在Google后臺設置的是受管理可消耗的商品("managed per user account"),具體的就是游戲里的水晶,玩家可以多次購買。但是Google后臺的這種可重復購買商品(還有一種是只能購買一次的商品"subscription")有個要求,就是你購買成功后需要主動向Google Play請求消耗這個商品,等消耗成功后你才可以再次下單購買。因此,在游戲里的支付會多出一個操作步驟就是請求消耗購買成功的商品。

    2.檢測設備是否支持Google Play Service

    在正式開啟支付前,Google billing會檢查你的手機是否支持Google billing,這個下面會講到。為了更好的用戶體驗,建議在Google billing檢測之前,可以先檢測一下用戶的設備是否支持Google Play Service,其中基本要求就是安裝了Google Play應用商店和Google Play Service。如果用戶的設備不具備這兩個,就可以彈出提示引導用戶去安裝。這里有兩種方式可以用,一種是通過Google Play Service來進行檢測,就是上篇下載的那個Service擴展包,一種是自己寫代碼,遍歷設備上安裝的應用程序,檢查是否有安裝Google Play。先說第一種。

    (1)Google Play Service

    上篇下載的Service包里會有一個庫工程

    把這個庫工程導入你的eclipse,引用到你的工程里就可以用了,具體操作可以參加docs下的文檔,so easy!導入成功后,調用其中的一個方法就可以了。

    /*** Check the device to make sure it has the Google Play Services APK.If* it doesn‘t, display a dialog that allows users to download the APK from* the Google Play Store or enable it in the device‘s system settings*/private boolean checkPlayServices(){int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);if(resultCode != ConnectionResult.SUCCESS){if(GooglePlayServicesUtil.isUserRecoverableError(resultCode)){GooglePlayServicesUtil.getErrorDialog(resultCode, this,PLAY_SERVICES_RESOLUTION_REQUEST).show();}else{Log.i(TAG, "This device is not supported");finish();}return false;}return true;}

    如果當前設備的Google Service不可用,就會彈出提示,引導用戶去設置安裝。如果此設備不支持的話,就也不需要檢測Google billing是否可用了。多說一句,Google Play Service可以做很多事的,如果覺得只用上面的功能太簡單的話,就可以考慮把應用自動更新也加上,當你在Google Play上傳了新版程序后,Google Play會幫你提示用戶更新程序。還有一個比較好玩的就是如果引入了這個庫工程后,就可以加GCM了(Google Cloud Messaging),就是消息推送推送功能,當然這個比較麻煩,有興趣的可以去加加看。

    ?

    (2)遍歷包名

    Google Play的程序包名是"com.Android.vending",運行在設備上的Google Play Service的包名是"com.google.android.gms",可以在程序啟動的時候遍歷下設備上的包名,如果沒有這兩個東西就引導用戶去安裝。

    遍歷包名方法

    //Check Google Playprotected boolean isHaveGooglePlay(Context context, String packageName){//Get PackageManagerfinal PackageManager packageManager = context.getPackageManager();//Get The All Install App Package NameList<PackageInfo> pInfo = packageManager.getInstalledPackages(0);//Create Name ListList<String> pName = new ArrayList<String>();//Add Package Name into Name Listif(pInfo != null){for(int i=0; i<pInfo.size(); i++){String pn = pInfo.get(i).packageName;pName.add(pn);//Log.v("Package Name", "PackAgeName: = " + pn);}}//Check return pName.contains(packageName);}

    提示安裝方法

    Uri uri = Uri.parse("market://details?id=" + "要安裝程序的包名");Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it);

    ?上面這個方法會打開你手機上的應用商店,定位到要安裝的程序。

    ?

    不過還是推薦用Google Play Service來檢測,貌似第二種,即使有的用戶裝了Google Play(像國內用戶),也不支持Google Play Service的。

    3.添加代碼(終于要加支付代碼了)

    把上篇下載的samples里util的代碼全部拷到你的工程里,可以新建一個包,放到里面。

    這個說明一下,其實這個例子的代碼還是不錯的,本著天下代碼一大抄和拿來主義,就直接拿來用吧!當然如果你覺得這個代碼寫的不好,或者不適用你的工程,你就可以依據文檔自己寫適用的代碼。當然文檔里說過,為了防止別人破解你的游戲,最好把里面的變量和方法都改下名字,畢竟這里的代碼任何人都看得到。我的做法是照搬過來了,只是把IabHelper.Java改造了下,因為這個是整個支付的關鍵,其他都是輔助的,可以不管。

    把這里的代碼拷完,把該import的都import了,你就可以照samples中的代碼開寫自己的支付了。針對單機游戲,就需要考慮這個代碼改造和本地的驗證,加密了。針對網絡游戲就要簡單了。因為我其實對java不太熟悉,所以單機的加密,base驗證,混淆什么的就不做介紹了。下面主要說網絡游戲。

    (1)IabHelper.java

    這個是支付的關鍵代碼,其中已經把設置billing,商品查詢,商品購買,商品回調,商品驗證以及回調方法都寫好了,你直接參照samples用就可以了。

    01.設置billing

    就是開篇所說的綁定ServiceConnection到IInAppBillingService。功能很完善,包括成功和失敗都有回調,還有各種異常。在你程序的啟動Activity里檢測完設備是否Google Play Service后,就可以new一個IabHelper,來調用這個方法,根據不同的回調里做相應的處理。

    /*** Starts the setup process. This will start up the setup process asynchronously.* You will be notified through the listener when the setup process is complete.* This method is safe to call from a UI thread.** @param listener The listener to notify when the setup process is complete.*/public void startSetup(final OnIabSetupFinishedListener listener) {// If already set up, can‘t do it again.checkNotDisposed();if (mSetupDone) throw new IllegalStateException("IAB helper is already set up.");// Connection to IAB servicelogDebug("Starting in-app billing setup.");mServiceConn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {logDebug("Billing service disconnected.");mService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {if (mDisposed) return;logDebug("Billing service connected.");mService = IInAppBillingService.Stub.asInterface(service);String packageName = mContext.getPackageName();try {logDebug("Checking for in-app billing 3 support.");// check for in-app billing v3 supportint response = mService.isBillingSupported(3, packageName, ITEM_TYPE_INAPP);if (response != BILLING_RESPONSE_RESULT_OK) {if (listener != null) listener.onIabSetupFinished(new IabResult(response,"Error checking for billing v3 support."));// if in-app purchases aren‘t supported, neither are subscriptions.mSubscriptionsSupported = false;return;}logDebug("In-app billing version 3 supported for " + packageName);// check for v3 subscriptions supportresponse = mService.isBillingSupported(3, packageName, ITEM_TYPE_SUBS);if (response == BILLING_RESPONSE_RESULT_OK) {logDebug("Subscriptions AVAILABLE.");mSubscriptionsSupported = true;}else {logDebug("Subscriptions NOT AVAILABLE. Response: " + response);}mSetupDone = true;}catch (RemoteException e) {if (listener != null) {listener.onIabSetupFinished(new IabResult(IABHELPER_REMOTE_EXCEPTION,"RemoteException while setting up in-app billing."));}e.printStackTrace();return;}if (listener != null) {listener.onIabSetupFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, "Setup successful."));}}};Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");serviceIntent.setPackage("com.android.vending");if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) {// service available to handle that IntentmContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);}else {// no service available to handle that Intentif (listener != null) {listener.onIabSetupFinished(new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE,"Billing service unavailable on device."));}}} [html]?view plaincopy
  • samples中的代碼??
  • // Create the helper, passing it our context and the public key to verify signatures withLog.d(TAG, "Creating IAB helper.");mHelper = new IabHelper(this, base64EncodedPublicKey);// enable debug logging (for a production application, you should set this to false).mHelper.enableDebugLogging(true);// Start setup. This is asynchronous and the specified listener// will be called once setup completes.Log.d(TAG, "Starting setup.");mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {public void onIabSetupFinished(IabResult result) {Log.d(TAG, "Setup finished.");if (!result.isSuccess()) {// Oh noes, there was a problem.complain("Problem setting up in-app billing: " + result);return;}// Have we been disposed of in the meantime? If so, quit.if (mHelper == null) return;// IAB is fully set up. Now, let‘s get an inventory of stuff we own.Log.d(TAG, "Setup successful. Querying inventory.");mHelper.queryInventoryAsync(mGotInventoryListener);}});}

    ?

    02.查詢商品

    在setup方法的最后有一個

    mHelper.queryInventoryAsync(mGotInventoryListener);

    是用來查詢你目前擁有的商品的。其中的回調的代碼如下

    // Listener that‘s called when we finish querying the items and subscriptions we ownIabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {public void onQueryInventoryFinished(IabResult result, Inventory inventory) {Log.d(TAG, "Query inventory finished.");// Have we been disposed of in the meantime? If so, quit.if (mHelper == null) return;// Is it a failure?if (result.isFailure()) {complain("Failed to query inventory: " + result);return;}Log.d(TAG, "Query inventory was successful.");/** Check for items we own. Notice that for each purchase, we check* the developer payload to see if it‘s correct! See* verifyDeveloperPayload().*/// Do we have the premium upgrade?Purchase premiumPurchase = inventory.getPurchase(SKU_PREMIUM);mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));// Do we have the infinite gas plan?Purchase infiniteGasPurchase = inventory.getPurchase(SKU_INFINITE_GAS);mSubscribedToInfiniteGas = (infiniteGasPurchase != null &&verifyDeveloperPayload(infiniteGasPurchase));Log.d(TAG, "User " + (mSubscribedToInfiniteGas ? "HAS" : "DOES NOT HAVE")+ " infinite gas subscription.");if (mSubscribedToInfiniteGas) mTank = TANK_MAX;// Check for gas delivery -- if we own gas, we should fill up the tank immediatelyPurchase gasPurchase = inventory.getPurchase(SKU_GAS);if (gasPurchase != null && verifyDeveloperPayload(gasPurchase)) {Log.d(TAG, "We have gas. Consuming it.");mHelper.consumeAsync(inventory.getPurchase(SKU_GAS), mConsumeFinishedListener);return;}updateUi();setWaitScreen(false);Log.d(TAG, "Initial inventory query finished; enabling main UI.");}};

    因為目前我們的內購商品是可重復購買的,所以在成功查詢到我們已經購買的商品后進行了消耗商品操作。消耗的代碼在這里

    // Check for gas delivery -- if we own gas, we should fill up the tank immediatelyPurchase gasPurchase = inventory.getPurchase(SKU_GAS);if (gasPurchase != null && verifyDeveloperPayload(gasPurchase)) {Log.d(TAG, "We have gas. Consuming it.");mHelper.consumeAsync(inventory.getPurchase(SKU_GAS), mConsumeFinishedListener);return;}

    在講消耗前,先解釋下以上這么操作的原因。在內購商品那里講過,如果是設置的是可重復商品,當你在成功購買這個商品后是需要主動消耗的,只有消耗成功后才可以再次購買。可能有些人覺得這種設定不好,我的商品本來就是可重復購買的,為什么還要在買成功后通知Google Play消耗掉商品呢(可能本身商品沒用消耗掉,這只是一種叫法)?我個人覺得這樣設定,第一,可以避免用戶重復下單購買,第二,可以保證每筆消費訂單的唯一。有了以上兩點就可以很好地處理漏單。 so,上面代碼在成功設置billing后,第一個操作就是查詢擁有的商品,就是做的漏單處理。因為支付過程其實就是你的應用程序----->Google Play程序(通過Google Play Service)------>Google服務器------->Google Play程序(通過Google Play Service)------>你的應用程序。這樣一個交互過程,還需要網絡支持,所以每次支付操作不會保證百分百成功,這樣就會產生漏單現象,就是用戶付費成功了,但是Google Play在通知你的應用程序支付結果時,因為某些原因斷掉了,這樣你的程序就不知道支付是否操作成功了,so,只好在下次進游戲時查查有沒有已經購買的,但是還沒有消耗的商品,有的話就消耗掉,然后再把商品發送給用戶。因為這個商品在消耗之前,用戶是無法再次購買的,所以單個用戶就只會對應單一的漏單,不會有重復的漏單。這些信息都是存到Google服務器上的,直接調代碼里的查詢代碼就可以了。

    ?

    02.消耗商品

    消耗商品會在兩個地方出現。一,查詢商品中所說的漏單中,二,就是你每次購買成功后的消耗。消耗商品也有一個回調,如下

    // Called when consumption is completeIabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {public void onConsumeFinished(Purchase purchase, IabResult result) {Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result);// if we were disposed of in the meantime, quit.if (mHelper == null) return;// We know this is the "gas" sku because it‘s the only one we consume,// so we don‘t check which sku was consumed. If you have more than one// sku, you probably should check...if (result.isSuccess()) {// successfully consumed, so we apply the effects of the item in our// game world‘s logic, which in our case means filling the gas tank a bitLog.d(TAG, "Consumption successful. Provisioning.");mTank = mTank == TANK_MAX ? TANK_MAX : mTank + 1;saveData();alert("You filled 1/4 tank. Your tank is now " + String.valueOf(mTank) + "/4 full!");}else {complain("Error while consuming: " + result);}updateUi();setWaitScreen(false);Log.d(TAG, "End consumption flow.");}};

    代碼比較簡單,針對自己的游戲邏輯,在里面稍做改動即可。

    ?

    03.購買商品

    按重要程度,購買商品應該排在第一位的,只是按支付流程走的話,購買商品卻不是第一位,這里就根據支付流程來走吧。

    /*** Initiate the UI flow for an in-app purchase. Call this method to initiate an in-app purchase,* which will involve bringing up the Google Play screen. The calling activity will be paused while* the user interacts with Google Play, and the result will be delivered via the activity‘s* {@link android.app.Activity#onActivityResult} method, at which point you must call* this object‘s {@link #handleActivityResult} method to continue the purchase flow. This method* MUST be called from the UI thread of the Activity.** @param act The calling activity.* @param sku The sku of the item to purchase.* @param itemType indicates if it‘s a product or a subscription (ITEM_TYPE_INAPP or ITEM_TYPE_SUBS)* @param requestCode A request code (to differentiate from other responses --* as in {@link android.app.Activity#startActivityForResult}).* @param listener The listener to notify when the purchase process finishes* @param extraData Extra data (developer payload), which will be returned with the purchase data* when the purchase completes. This extra data will be permanently bound to that purchase* and will always be returned when the purchase is queried.*/public void launchPurchaseFlow(Activity act, String sku, String itemType, int requestCode,OnIabPurchaseFinishedListener listener, String extraData) {checkNotDisposed();checkSetupDone("launchPurchaseFlow");flagStartAsync("launchPurchaseFlow");IabResult result;if (itemType.equals(ITEM_TYPE_SUBS) && !mSubscriptionsSupported) {IabResult r = new IabResult(IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE,"Subscriptions are not available.");flagEndAsync();if (listener != null) listener.onIabPurchaseFinished(r, null);return;}try {logDebug("Constructing buy intent for " + sku + ", item type: " + itemType);Bundle buyIntentBundle = mService.getBuyIntent(3, mContext.getPackageName(), sku, itemType, extraData);int response = getResponseCodeFromBundle(buyIntentBundle);if (response != BILLING_RESPONSE_RESULT_OK) {logError("Unable to buy item, Error response: " + getResponseDesc(response));flagEndAsync();result = new IabResult(response, "Unable to buy item");if (listener != null) listener.onIabPurchaseFinished(result, null);return;}PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode);mRequestCode = requestCode;mPurchaseListener = listener;mPurchasingItemType = itemType;act.startIntentSenderForResult(pendingIntent.getIntentSender(),requestCode, new Intent(),Integer.valueOf(0), Integer.valueOf(0),Integer.valueOf(0));}catch (SendIntentException e) {logError("SendIntentException while launching purchase flow for sku " + sku);e.printStackTrace();flagEndAsync();result = new IabResult(IABHELPER_SEND_INTENT_FAILED, "Failed to send intent.");if (listener != null) listener.onIabPurchaseFinished(result, null);}catch (RemoteException e) {logError("RemoteException while launching purchase flow for sku " + sku);e.printStackTrace();flagEndAsync();result = new IabResult(IABHELPER_REMOTE_EXCEPTION, "Remote exception while starting purchase flow");if (listener != null) listener.onIabPurchaseFinished(result, null);}}

    以上是IabHelper中的支付購買代碼,其中包括了重復購買商品類型和一次購買商品類型的處理。主要的代碼是try里面的這一塊

    try {logDebug("Constructing buy intent for " + sku + ", item type: " + itemType);Bundle buyIntentBundle = mService.getBuyIntent(3, mContext.getPackageName(), sku, itemType, extraData);int response = getResponseCodeFromBundle(buyIntentBundle);if (response != BILLING_RESPONSE_RESULT_OK) {logError("Unable to buy item, Error response: " + getResponseDesc(response));flagEndAsync();result = new IabResult(response, "Unable to buy item");if (listener != null) listener.onIabPurchaseFinished(result, null);return;}PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode);mRequestCode = requestCode;mPurchaseListener = listener;mPurchasingItemType = itemType;act.startIntentSenderForResult(pendingIntent.getIntentSender(),requestCode, new Intent(),Integer.valueOf(0), Integer.valueOf(0),Integer.valueOf(0));} [html]?view plaincopy
  • <br?style="padding:?0px;"?/>一,調用In-app?Billing中的getBuyIntent方法,會傳幾個參數,第一個參數?3?代表的是當前所用的支付API的版本,第二個參數是你的包名,第三個參數就是你內購商品的ID,第四個參數是這次購買的類型,“inapp”和"subs",我們用的是第一個,第二個是只能購買一次的類型,第五個參數是訂單號。需要講的只有第三個和第五個參數。??
  • 第三個參數,商品Id,就是你在Google開發者后臺上設置的內購商品的名字。每個商品的名字要唯一。推薦用商品名字加下劃線加價格的組合,比如"crystal_0.99",這樣你一看名字就知道這個商品的價格是0.99美金,商品是水晶。

    第三個參數,訂單號。如果本地有支付服務器的話,這個訂單號可以由支付服務器生成,然后再傳給客戶端,這樣的話本地服務器也可以記錄下訂單信息,方便以后的查詢和操作。訂單號的格式推薦用時間戳加商品名字和價格,這樣也可以容易看出訂單信息。這個訂單號會傳給Google,購買成功后Google會原樣傳給你,所以也可以在其中加個標示信息,可以做下比對。

    二,在getBuyIntent成功后,返回的Bundle中會有個BILLING_RESPONSE_RESULT_OK返回碼,這就代表成功了。然后再用這個Bundle得到一個PendingIntent.如上面代碼演示。

    三,進行支付

    act.startIntentSenderForResult(pendingIntent.getIntentSender(),requestCode, new Intent(),Integer.valueOf(0), Integer.valueOf(0),Integer.valueOf(0));

    ?這個方法是Activity中的一個方法,調用這個方法后,回有一個回調來接收結果。除了第一個PengdingIntent參數外,其他的可以按參數類型隨便寫。

    ?

    四,支付完成

    ?

    /*** Handles an activity result that‘s part of the purchase flow in in-app billing. If you* are calling {@link #launchPurchaseFlow}, then you must call this method from your* Activity‘s {@link android.app.Activity@onActivityResult} method. This method* MUST be called from the UI thread of the Activity.** @param requestCode The requestCode as you received it.* @param resultCode The resultCode as you received it.* @param data The data (Intent) as you received it.* @return Returns true if the result was related to a purchase flow and was handled;* false if the result was not related to a purchase, in which case you should* handle it normally.*/public boolean handleActivityResult(int requestCode, int resultCode, Intent data) {IabResult result;if (requestCode != mRequestCode) return false;checkNotDisposed();checkSetupDone("handleActivityResult");// end of async purchase operation that started on launchPurchaseFlowflagEndAsync();if (data == null) {logError("Null data in IAB activity result.");result = new IabResult(IABHELPER_BAD_RESPONSE, "Null data in IAB result");if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);return true;}int responseCode = getResponseCodeFromIntent(data);String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA);String dataSignature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE);if (resultCode == Activity.RESULT_OK && responseCode == BILLING_RESPONSE_RESULT_OK) {logDebug("Successful resultcode from purchase activity.");logDebug("Purchase data: " + purchaseData);logDebug("Data signature: " + dataSignature);logDebug("Extras: " + data.getExtras());logDebug("Expected item type: " + mPurchasingItemType);if (purchaseData == null || dataSignature == null) {logError("BUG: either purchaseData or dataSignature is null.");logDebug("Extras: " + data.getExtras().toString());result = new IabResult(IABHELPER_UNKNOWN_ERROR, "IAB returned null purchaseData or dataSignature");if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);return true;}Purchase purchase = null;try {purchase = new Purchase(mPurchasingItemType, purchaseData, dataSignature);String sku = purchase.getSku();// Verify signatureif (!Security.verifyPurchase(mSignatureBase64, purchaseData, dataSignature)) {logError("Purchase signature verification FAILED for sku " + sku);result = new IabResult(IABHELPER_VERIFICATION_FAILED, "Signature verification failed for sku " + sku);if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, purchase);return true;}logDebug("Purchase signature successfully verified.");}catch (JSONException e) {logError("Failed to parse purchase data.");e.printStackTrace();result = new IabResult(IABHELPER_BAD_RESPONSE, "Failed to parse purchase data.");if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);return true;}if (mPurchaseListener != null) {mPurchaseListener.onIabPurchaseFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, "Success"), purchase);}}else if (resultCode == Activity.RESULT_OK) {// result code was OK, but in-app billing response was not OK.logDebug("Result code was OK but in-app billing response was not OK: " + getResponseDesc(responseCode));if (mPurchaseListener != null) {result = new IabResult(responseCode, "Problem purchashing item.");mPurchaseListener.onIabPurchaseFinished(result, null);}}else if (resultCode == Activity.RESULT_CANCELED) {logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode));result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled.");if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);}else {logError("Purchase failed. Result code: " + Integer.toString(resultCode)+ ". Response: " + getResponseDesc(responseCode));result = new IabResult(IABHELPER_UNKNOWN_PURCHASE_RESPONSE, "Unknown purchase response.");if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);}return true;}public Inventory queryInventory(boolean querySkuDetails, List<String> moreSkus) throws IabException {return queryInventory(querySkuDetails, moreSkus, null);}

    支付結果返回后會調用上面這個方法,對于支付失敗和其中的錯誤,代碼寫的很清楚,可以自行處理。現在來關注支付成功后的結果驗證。在上面方法中會從支付結果的數據中取得兩個json數據。

    int responseCode = getResponseCodeFromIntent(data);String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA);String dataSignature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE);

    就是purchaseData和dataSignature。驗證支付就是需要這兩個參數和publicKey,例子里的驗證方法是寫在Security.java里的。里面寫了三個方法來完成支付結果的驗證。

    ?

    對于有本地支付服務器的游戲來說,這個操作就可以放到服務端了,客戶端只需要把purchaseData和dataSignature傳給支付服務器即可。然后有支付服務器把驗證結果傳給客戶端,再做成功和失敗的處理。成功后則要進行消耗商品的操作。對于沒有支付服務器的游戲來說,我個人覺得本地的操作要達到安全,還是比較難的。不過對于服務器驗證支付結果,也是存在風險的,只是風險要小。

    /*** Verifies that the data was signed with the given signature, and returns* the verified purchase. The data is in JSON format and signed* with a private key. The data also contains the {@link PurchaseState}* and product ID of the purchase.* @param base64PublicKey the base64-encoded public key to use for verifying.* @param signedData the signed JSON string (signed, not encrypted)* @param signature the signature for the data, signed with the private key*/public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||TextUtils.isEmpty(signature)) {Log.e(TAG, "Purchase verification failed: missing data.");return false;}PublicKey key = Security.generatePublicKey(base64PublicKey);return Security.verify(key, signedData, signature);}/*** Generates a PublicKey instance from a string containing the* Base64-encoded public key.** @param encodedPublicKey Base64-encoded public key* @throws IllegalArgumentException if encodedPublicKey is invalid*/public static PublicKey generatePublicKey(String encodedPublicKey) {try {byte[] decodedKey = Base64.decode(encodedPublicKey);KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);} catch (InvalidKeySpecException e) {Log.e(TAG, "Invalid key specification.");throw new IllegalArgumentException(e);} catch (Base64DecoderException e) {Log.e(TAG, "Base64 decoding failed.");throw new IllegalArgumentException(e);}}/*** Verifies that the signature from the server matches the computed* signature on the data. Returns true if the data is correctly signed.** @param publicKey public key associated with the developer account* @param signedData signed data from server* @param signature server signature* @return true if the data and signature match*/public static boolean verify(PublicKey publicKey, String signedData, String signature) {Signature sig;try {sig = Signature.getInstance(SIGNATURE_ALGORITHM);sig.initVerify(publicKey);sig.update(signedData.getBytes());if (!sig.verify(Base64.decode(signature))) {Log.e(TAG, "Signature verification failed.");return false;}return true;} catch (NoSuchAlgorithmException e) {Log.e(TAG, "NoSuchAlgorithmException.");} catch (InvalidKeyException e) {Log.e(TAG, "Invalid key specification.");} catch (SignatureException e) {Log.e(TAG, "Signature exception.");} catch (Base64DecoderException e) {Log.e(TAG, "Base64 decoding failed.");}return false;}

    PublicKey:

    這個PublicKey是用來驗證支付結果的,所以這絕對是個Key,不可以讓其他人知道的,這個Key放到支付服務器端,本地不存。

    samples里的這段代碼寫的很有意思,能看出笑點不?

    單機游戲的話,想辦法把這個key存到某個地方加個密什么的,最好不要直接寫到代碼里。(其實對于單機游戲,如果沒有自己的服務器來驗證支付結果,本地不管如何操作,都是很容易被破解的,如果游戲比較大賣,推薦自己寫個支付服務器端來驗證支付結果)。

    /* base64EncodedPublicKey should be YOUR APPLICATION‘S PUBLIC KEY* (that you got from the Google Play developer console). This is not your* developer public key, it‘s the *app-specific* public key.** Instead of just storing the entire literal string here embedded in the* program, construct the key at runtime from pieces or* use bit manipulation (for example, XOR with some other string) to hide* the actual key. The key itself is not secret information, but we don‘t* want to make it easy for an attacker to replace the public key with one* of their own and then fake messages from the server.*/String base64EncodedPublicKey = "CONSTRUCT_YOUR_KEY_AND_PLACE_IT_HERE";// Some sanity checks to see if the developer (that‘s you!) really followed the// instructions to run this sample (don‘t put these checks on your app!)if (base64EncodedPublicKey.contains("CONSTRUCT_YOUR")) {throw new RuntimeException("Please put your app‘s public key in MainActivity.java. See README.");}if (getPackageName().startsWith("com.example")) {throw new RuntimeException("Please change the sample‘s package name! See README.");}

    本地服務器驗證補充:

    ?

    關于支付結果的驗證,本地服務器除了用publicKey做簽名驗證外,還可以到Google后臺請求下支付結果驗證。這個需要本地服務器和Google服務器交互通信。可以參考這個文檔。

    不過對于國內的開發者而言,在Google日益被封鎖加重的情況下,在與Google服務器通信上絕對會有障礙,因為通信阻礙,會導致你驗證失敗,所以這個功能可選,有興趣的可以添加上。

    補充1:

    如果是直接用samples的代碼的話還需要注意幾點。第一,把錯誤提示改成用戶友好型的。因為samples的錯誤提示主要是給開發者看的,所以提示的很詳細,但是用戶不需要,你只要告訴用戶成功,失敗以及簡單的失敗原因就行了。第二,在發布正式版時把打印信息關掉。第三,修改類名和變量名。

    補充2:

    如果在測試支付時遇到一下錯誤,可做的處理。

    1.當前應用程序不支持購買此商品:確定你手機上裝的程序包名和簽名和后臺上傳的一致。p.s.上傳后臺后APK需要等一段時間才能生效。

    2.購買的商品不存在 :確保你代碼里的商品名字和后臺的一致,如果一致,則可能需要等一兩個小時再測試,Google后臺的問題。

    3.loading了很長時間,最后給你提示未知錯誤:這個不管它,Google后臺的問題,等會再測。

    最后國內開發者確保是在vpn下進行測試!!!!

    寫在后面:

    以上就是Google In-app Billing的代碼添加了,其實就是把samples講了一下,所以還是推薦去看下官方文檔和samples吧,在那里你會學到更多。

    總結

    以上是生活随笔為你收集整理的Google play billing(Google play 内支付)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日日夜夜精品 | 久久国产经典视频 | 婷婷六月丁 | 91香蕉视频 | 亚洲乱码精品久久久久 | 综合久久精品 | 久久国产精品第一页 | 国产手机视频在线观看 | 精品国产乱码久久久久久天美 | 天天爱天天舔 | 国产成年人av | 欧美a视频| 999久久久久久久久6666 | 亚洲 精品在线视频 | 婷婷色视频 | 国产精品久久久久久久久软件 | 久久黄色a级片 | 日韩在线中文字幕 | www.狠狠色.com | 五月精品 | 国产精品久久久久久高潮 | 成人午夜精品久久久久久久3d | 在线看日韩av | 亚洲一区视频免费观看 | 国产精品久久久久免费观看 | 亚洲高清资源 | 日韩在线观看你懂的 | 中文字幕在线观看视频免费 | 日韩免费观看高清 | 在线观看理论 | 久草在线视频免赞 | 丁香花中文在线免费观看 | 毛片二区 | japanesexxxhd奶水 91在线精品一区二区 | 黄色精品一区 | 中文字幕久久精品一区 | 久久久久久久久久久久电影 | 国产精品久久久久久久久久白浆 | 欧美激情综合网 | 91麻豆精品国产91久久久久 | 国产精品午夜久久 | 欧美在线视频不卡 | 国产区在线视频 | 六月久久婷婷 | 亚洲精品免费看 | 国产精品成人一区二区 | 亚洲精品美女久久17c | 成年人免费在线观看网站 | 亚洲精品小区久久久久久 | 九九热精品视频在线播放 | 免费看的毛片 | 精品久久久久久久久久久久久久久久久久 | 96亚洲精品久久久蜜桃 | 久久久精品亚洲 | 麻豆视频免费入口 | 久久成视频 | 色播激情五月 | 亚洲精品一区二区三区四区高清 | 色综合婷婷 | 日本久久综合网 | 久久大片 | 久草在线在线视频 | 国产精品一区二区三区在线看 | 免费高清男女打扑克视频 | 久久久99精品免费观看 | 日日夜夜免费精品视频 | 亚洲国产视频网站 | 天天爱天天操 | 麻豆影视网站 | 玖玖精品在线 | 视频在线一区 | 黄色小视频在线观看免费 | 亚洲在线日韩 | 亚洲免费av一区二区 | 亚洲闷骚少妇在线观看网站 | 久久综合狠狠综合久久综合88 | 国产精彩视频一区 | 久久国产精品99国产 | 最近中文字幕mv免费高清在线 | 色播五月激情综合网 | 日韩成人一级大片 | 国产xxxxx在线观看 | 中文视频一区二区 | 久久天天躁狠狠躁亚洲综合公司 | 少妇自拍av | 国产免费一区二区三区最新6 | 欧美伦理电影一区二区 | 米奇四色影视 | 91九色蝌蚪视频网站 | 欧洲亚洲国产视频 | 日韩videos高潮hd | 久久一区二区免费视频 | 麻豆视频国产在线观看 | 国产人在线成免费视频 | 人人干狠狠干 | 久久国产一区二区 | 国产精品久久久久免费观看 | 久久日本视频 | 久久精品久久99精品久久 | 亚洲欧美国产精品18p | av短片在线 | 久久国产影视 | 在线 高清 中文字幕 | 国产夫妻自拍av | 国产精品一区二区三区免费看 | 久久草在线免费 | 福利视频一区二区 | 日韩一区二区免费在线观看 | 久久综合电影 | 国产无套精品久久久久久 | 97人人看 | 免费在线看成人av | 亚洲激情在线观看 | 色综合色综合久久综合频道88 | 蜜臀av在线一区二区三区 | 97超碰人人澡人人爱学生 | 在线观看中文字幕 | 麻豆一区二区 | 精品免费视频123区 午夜久久成人 | 日日夜夜添 | 国产原创91| 人人玩人人爽 | 五月精品 | 亚洲欧洲在线视频 | 久久久久久久久影院 | 最新国产精品久久精品 | 色综合久久综合网 | 欧美孕交vivoestv另类 | 永久免费的av电影 | 日韩精品第一区 | 欧美久久精品 | 免费三级骚 | 波多野结衣一区 | 婷婷丁香花五月天 | 亚洲精品一区二区精华 | 精品久久网站 | 天天躁日日躁狠狠躁av中文 | 日免费视频 | 国产午夜精品一区二区三区欧美 | 久久手机看片 | 久久综合九色综合欧美狠狠 | 亚洲欧美乱综合图片区小说区 | 99久久久久国产精品免费 | 国产午夜精品免费一区二区三区视频 | 国产精品每日更新 | 十八岁以下禁止观看的1000个网站 | 一级成人在线 | 婷婷丁香花五月天 | 欧美男女爱爱视频 | 69性欧美 | 国产精品综合久久久久久 | 成人在线播放视频 | 91成人在线观看喷潮 | 国产亚洲人成网站在线观看 | 2020天天干夜夜爽 | 99c视频高清免费观看 | 91大神电影 | 久久婷婷开心 | 成人黄色免费在线观看 | 国产精品免费在线观看视频 | 97免费视频在线 | 亚洲 欧美 综合 在线 精品 | 揉bbb玩bbb少妇bbb | 在线观看视频一区二区三区 | 黄在线免费看 | 91探花在线视频 | 丁香花在线视频观看免费 | av免费线看 | 激情五月五月婷婷 | 国产小视频在线观看免费 | 激情综合网五月婷婷 | 亚洲少妇自拍 | 亚洲狠狠丁香婷婷综合久久久 | 免费a一级| 国产伦精品一区二区三区无广告 | a级国产片 | 日韩精品一区二区三区免费观看视频 | 最近中文字幕完整高清 | 欧美做受69 | 久久免费视频3 | 久久艹人人| 色婷婷播放 | 亚洲欧美日韩精品久久奇米一区 | 国产福利一区在线观看 | 开心婷婷色 | 国产在线高清视频 | 国产乱对白刺激视频不卡 | 一级成人免费视频 | 91chinese在线 | 色视频网站在线观看一=区 a视频免费在线观看 | 亚洲成人av影片 | 久久欧美精品 | 中文在线字幕免费观 | 九九热99视频| 狠狠干天天射 | av导航福利 | 日韩区欠美精品av视频 | 人人射人人 | 精产嫩模国品一二三区 | 91高清在线看 | 香蕉网站在线观看 | 成人毛片一区二区三区 | 美女黄频视频大全 | 天天在线视频色 | 一区二区视频在线看 | 手机av永久免费 | 久久黄色网| 国产高清成人av | 国产看片 色| 国产精品18videosex性欧美 | 中文字幕av有码 | 亚洲精品18日本一区app | 久 久久影院 | 国产综合91 | 婷婷四房综合激情五月 | 久久精品99精品国产香蕉 | 国产专区视频在线观看 | 91av福利视频 | 免费美女av | 久久不见久久见免费影院 | 欧洲精品二区 | 免费男女羞羞的视频网站中文字幕 | 人人擦| 国产专区一 | 婷婷久久婷婷 | 免费高清在线视频一区· | 黄色在线观看www | 久久天堂亚洲 | 国产精品一区二区av影院萌芽 | www视频在线免费观看 | 亚洲男女精品 | 九九在线视频免费观看 | 日韩一级电影在线观看 | 成人三级视频 | 国产系列精品av | 日韩精品综合在线 | www.亚洲黄色 | 国产美女精品在线 | 亚洲艳情 | 91av99 | 成人sm另类专区 | 国产一级a毛片视频爆浆 | 在线观看免费一区 | 日韩黄色一区 | 黄色亚洲片 | 国产黄色精品 | 国产69精品久久久久9999apgf | 六月天综合网 | 夜夜躁狠狠躁日日躁视频黑人 | 国产成人在线免费观看 | 久久精品电影院 | 国产拍揄自揄精品视频麻豆 | 99在线免费观看视频 | 香蕉视频国产在线 | 久久婷婷国产 | 国产成人久久77777精品 | 免费视频二区 | zzijzzij亚洲日本少妇熟睡 | 久久精品看| 精品二区久久 | 日韩特黄av | 丁香五月网久久综合 | 久久国产电影院 | 亚洲成人二区 | 国产日韩中文字幕 | 国产麻豆果冻传媒在线观看 | 狠狠色丁香久久婷婷综 | 久久久免费网站 | 在线观看免费国产小视频 | 色婷婷综合久久久中文字幕 | 亚洲人人精品 | 免费观看国产精品 | 国产涩涩在线观看 | 久久国产露脸精品国产 | 久久精品中文字幕一区二区三区 | www激情久久 | www.天天干.com | 在线观看国产 | 日韩免费av在线 | 中文字幕在线观看第二页 | 菠萝菠萝蜜在线播放 | 99亚洲国产| 精品国产亚洲在线 | 久久男人影院 | 免费观看成人 | 在线综合 亚洲 欧美在线视频 | 人人盈棋牌 | 国产高清视频在线播放一区 | 国产一区二区在线免费 | 五月天六月婷 | 天堂av在线7 | 国产精品私拍 | 日韩免费电影一区二区 | 在线观看久草 | 亚洲综合色丁香婷婷六月图片 | 亚洲激情中文 | 久久伦理电影 | 精品国产美女 | 国产91影视 | 国产盗摄精品一区二区 | 天天插天天爱 | 国产生活一级片 | 国产在线观看地址 | www.69xx| 午夜精品久久久久久久99水蜜桃 | 久久久久美女 | 国产成人精品女人久久久 | 日本高清dvd | 久章草在线观看 | 国产毛片久久久 | 超碰精品在线 | 国产99re| 人人超碰人人 | 成年人网站免费在线观看 | 精品久久一区 | 成人av在线网 | 涩涩网站在线看 | 欧洲亚洲激情 | 亚洲综合五月天 | 中文字幕精 | 九九在线免费视频 | 中文字幕在线看视频 | 久久久久精| 黄污在线观看 | 日韩视频一区二区 | 国产对白av| 日韩精品久久久久久久电影竹菊 | 国产69精品久久99不卡的观看体验 | 玖玖在线观看视频 | 婷婷综合成人 | 久久综合操| 婷婷激情五月综合 | 日韩精品一区二区三区在线播放 | 婷婷六月丁香激情 | 久99精品| 国产精品露脸在线 | 国产综合片 | 最新中文字幕在线观看视频 | 国产99在线免费 | 日韩视频免费 | 久久久久久国产精品亚洲78 | 日韩精品免费一区二区三区 | 伊人五月天婷婷 | 在线国产高清 | 久久精品久久精品久久精品 | 久久这里精品视频 | 久久久亚洲国产精品麻豆综合天堂 | 成年人视频在线 | 一级黄色大片 | 日韩国产精品一区 | av观看久久久 | www.久久91 | 国产精品亚洲片夜色在线 | 久久国产精品视频 | 久久久成人精品 | 日日夜夜精品视频天天综合网 | 精品人人人 | 欧美一区日韩精品 | 久久97久久97精品免视看 | 亚州日韩中文字幕 | 成年人视频在线免费播放 | 波多野结衣视频一区 | 少妇性xxx | 国产精品久久久久久五月尺 | 日韩国产精品一区 | 亚洲精品高清视频在线观看 | 国产精品美乳一区二区免费 | 日韩欧美在线影院 | 黄色一级大片免费看 | 久热超碰 | 日韩在线免费小视频 | 久久午夜视频 | 在线观看国产永久免费视频 | 免费h精品视频在线播放 | 国产一区二区午夜 | 五月婷婷六月丁香激情 | 日韩欧美中文 | 中午字幕在线 | 91精品久久久久久综合乱菊 | 日韩精品欧美视频 | 欧美大片在线观看一区 | 国产破处在线播放 | 日韩在线视频免费看 | 国产真实精品久久二三区 | 天天干天天天 | 91在线最新| 狠狠狠狠狠狠操 | 在线观看完整版免费 | 国产一区二区成人 | 国产精品美女久久久久久2018 | 在线观看久 | 久久久久久久影视 | 热精品 | 免费视频三区 | 天天玩天天干天天操 | 91精品国产99久久久久久红楼 | 成人播放器 | 四虎影视成人精品 | 四虎影视成人精品 | 成人黄色电影免费观看 | 在线观看亚洲免费视频 | 欧美成人h版电影 | 欧美大荫蒂xxx | 日韩中文在线播放 | 国产精品久久久久久久久大全 | 成人欧美在线 | 很黄很黄的网站免费的 | 超碰97国产精品人人cao | 在线观看黄网站 | 中文字幕在线看视频国产 | 四虎成人精品永久免费av | 91chinesexxx| 国产区在线 | 91麻豆国产| 亚洲成人黄色在线观看 | 色网站在线免费 | 天天干天天操人体 | 一区二区精品在线观看 | 片黄色毛片黄色毛片 | 99久久精品国产欧美主题曲 | 中文字幕在线视频一区 | 91亚洲国产成人久久精品网站 | 啪啪小视频网站 | 91chinesexxx| 日韩理论在线观看 | 国产精品第一页在线观看 | 国产成人精品一区二区三区网站观看 | 又黄又爽的视频在线观看网站 | 日韩av电影手机在线观看 | 人人草天天草 | 久久草在线免费 | 91精品老司机久久一区啪 | 久久国产免 | 亚洲四虎影院 | 波多野结衣一区二区 | 99在线高清视频在线播放 | 成年人在线播放视频 | 亚洲精品国产成人av在线 | 日韩精品第1页 | 摸阴视频 | 精品999| 精品久久久久久亚洲综合网站 | 亚洲第一区精品 | 国产精品美女免费视频 | 日韩毛片在线播放 | 久射网| 玖玖在线观看视频 | 91手机电视 | 麻豆久久一区二区 | 国产精品久久久久久一二三四五 | 欧美日韩精品免费观看视频 | www.香蕉| 人人干人人爽 | 久久精品亚洲综合专区 | 91福利小视频 | 91资源在线免费观看 | 992tv人人网tv亚洲精品 | 一区二区三区四区免费视频 | 91资源在线免费观看 | 一区二区三区 中文字幕 | 国产91小视频 | 国产精品日韩久久久久 | 狠狠操在线| 成人免费视频在线观看 | 超碰在线亚洲 | 三级性生活视频 | 欧美 日韩 国产 成人 在线 | 国产麻豆精品在线观看 | 亚洲女欲精品久久久久久久18 | 精品综合久久久 | 综合伊人av| 亚洲美女在线一区 | 国产视频在线观看一区二区 | 在线免费看黄色 | 成人一区二区三区中文字幕 | 九九热久久久 | 国产一区自拍视频 | 免费视频成人 | 国产一级片直播 | 亚洲精色 | 日日操天天操夜夜操 | 欧美a视频在线观看 | 亚洲精品视频一二三 | 成人在线免费视频 | 日韩av电影网站在线观看 | 日本精品一 | 久久精品久久综合 | 国产亚洲人 | 久久久久久高潮国产精品视 | 免费在线黄色av | 国产免费一区二区三区最新 | 久久最新视频 | 久久成人高清视频 | 久久亚洲精品电影 | 国产精品igao视频网入口 | 97国产情侣爱久久免费观看 | 国产高清一区二区 | 激情视频二区 | 日韩va亚洲va欧美va久久 | 国产成人精品在线播放 | 久久久精品国产一区二区电影四季 | 久久久久婷| 久久久人人爽 | 五月婷网站 | 97av免费视频 | 成人免费看视频 | 99热最新 | 久久久www成人免费毛片麻豆 | 成人欧美一区二区三区黑人麻豆 | 国产精选在线 | 丰满少妇高潮在线观看 | 黄色小说18 | 欧美日韩中文在线 | 久久免费电影网 | 欧美一级免费黄色片 | 四虎成人精品永久免费av九九 | 麻豆精品传媒视频 | 国产h在线观看 | 久久看片网站 | 久久精品影视 | 亚洲国内精品视频 | 久久久久久久久久国产精品 | 成年人视频在线免费观看 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 成人av片在线观看 | 久久精品99 | 开心丁香婷婷深爱五月 | 日韩69av| 国产精品欧美在线 | 97在线观看视频 | 手机av观看 | 亚洲三级在线 | 国产亚洲视频在线免费观看 | 国产a国产a国产a | 国产高清永久免费 | 久久99在线观看 | 亚洲综合导航 | 亚洲一级片av | 欧美成人精品欧美一级乱 | 999精品视频 | 国产精品mv在线观看 | 久久精品久久久精品美女 | 中文字幕亚洲精品日韩 | 在线天堂视频 | 日韩精品免费 | 狠狠撸电影 | 国产精品免费视频观看 | 一 级 黄 色 片免费看的 | 国产a免费| 欧美ⅹxxxxxx | 欧美福利视频一区 | 国产69精品久久久久99 | 精品字幕在线 | 成在人线av| 91最新在线观看 | 免费精品视频在线观看 | 亚洲成人av在线 | 久久久久久高潮国产精品视 | jizzjizzjizz亚洲 | 麻豆系列在线观看 | 在线观看韩日电影免费 | 成人免费xxx在线观看 | 日本久久久久久久久久 | 日韩精品首页 | 91中文字幕在线视频 | 国产精品专区在线 | 国产专区在线播放 | av天天色 | 成人av电影在线 | 国产综合在线视频 | 免费h漫在线观看 | 欧美成人基地 | 成人在线播放网站 | 伊人五月天婷婷 | 亚洲人成在| 在线看中文字幕 | 夜色.com | 操一草| 国产 成人 久久 | 开心激情综合网 | 天天操,夜夜操 | 久久久国产精品成人免费 | 亚洲人成网站精品片在线观看 | 999久久a精品合区久久久 | 久久久久久久久久电影 | 日韩在线国产 | 精品国产一区二区三区久久久 | 91精品第一页 | 亚洲精品成人av在线 | 在线观看成人国产 | 国产精品porn | 六月丁香六月婷婷 | 国产黄色视 | 亚洲色图 校园春色 | 九九视频一区 | 久久久国产精品麻豆 | 成人在线免费av | 手机av电影在线 | 久久视频免费看 | 欧美午夜性生活 | 正在播放一区 | 99re视频在线观看 | 国产中文字幕一区 | 成人久久久久久久久久 | 天天摸天天舔天天操 | 天天做日日做天天爽视频免费 | 国产精品国内免费一区二区三区 | 国产午夜精品理论片在线 | 亚洲成人一区 | 黄色精品在线看 | 日本xxxx.com| 国产精品毛片一区二区三区 | 久草在线观| 日韩亚洲精品电影 | 久久99在线观看 | 人交video另类hd | 久久精品免费播放 | 丁香婷婷色综合亚洲电影 | www国产一区| 色婷婷九月 | 99久高清在线观看视频99精品热在线观看视频 | 国产xvideos免费视频播放 | 国产午夜精品av一区二区 | 国产精品系列在线播放 | 久久高清毛片 | 天天干天天碰 | 日b视频在线观看网址 | 中文字幕免费在线看 | 久久超级碰 | 丰满少妇在线观看资源站 | 水蜜桃亚洲一二三四在线 | 亚洲三级在线免费观看 | 精品亚洲成a人在线观看 | www.久久99 | 懂色av一区二区在线播放 | 久久精品国产成人精品 | 一级片免费视频 | 亚洲dvd| 开心婷婷色 | 国产精品va在线观看入 | 一二区精品 | 午夜精品三区 | 亚洲美女视频网 | av看片网 | 九九九电影免费看 | 激情丁香5月 | 日韩黄色大片在线观看 | 午夜精品久久久99热福利 | 九九热在线视频 | 亚洲精品国产视频 | 四虎在线视频免费观看 | 成人一区电影 | 在线观看色网站 | 欧美 日韩 国产 成人 在线 | 午夜私人影院 | 中文字幕韩在线第一页 | 日韩亚洲欧美中文字幕 | 伊人亚洲综合网 | 9999在线| 国产福利一区二区在线 | 精品一区二区三区在线播放 | 日韩国产精品一区 | 韩国av免费观看 | 五月天伊人 | 国产成人一区二区三区在线观看 | 亚洲欧洲中文日韩久久av乱码 | 99精品免费在线观看 | 97精品国产97久久久久久 | www久| 国产视频一区在线播放 | 久久九九精品久久 | 中文字幕av在线播放 | 国产 日韩 在线 亚洲 字幕 中文 | 2022久久国产露脸精品国产 | 黄色福利网站 | 色资源二区在线视频 | 国产精品一级在线 | 99热精品在线 | 精品96久久久久久中文字幕无 | 三级黄色大片在线观看 | 成人电影毛片 | 国产免费黄视频在线观看 | 久99久视频| 亚洲 欧美 日韩 综合 | 国产精品 中文在线 | 欧美一区在线观看视频 | 亚洲国产精品日韩 | 久久视频一区 | 国产精品美女999 | 又大又硬又黄又爽视频在线观看 | 天天人人综合 | 久久久久久久久久久国产精品 | 久久国语露脸国产精品电影 | 69精品在线观看 | 日本三级吹潮在线 | 免费国产一区二区视频 | 亚洲午夜av电影 | 亚洲 欧美 成人 | 91女人18片女毛片60分钟 | 国产一区电影在线观看 | www在线观看视频 | 激情五月综合 | 国产精品aⅴ | 日韩a在线 | 玖玖玖影院| 成年人网站免费在线观看 | 日韩精品久久久久久中文字幕8 | 超碰在线94| 色先锋av资源中文字幕 | 精品久久99 | 91视频链接 | 国产亚洲成av片在线观看 | 射射色| 91精品中文字幕 | 青草视频在线 | 黄毛片在线观看 | 精品久久久久久久久久久久久 | 日韩中文字幕免费视频 | 欧美日韩精品在线一区二区 | 一级黄色在线免费观看 | av在线专区 | 久久久久久久久国产 | 婷婷综合视频 | 亚洲国产大片 | 福利久久久 | 一级成人网 | 精品999| 五月婷婷综合久久 | 久久99久久99精品中文字幕 | 超碰人人舔 | 中文字幕 影院 | 精品国产理论 | 天天干天天干天天操 | 久草在线在线精品观看 | 九九有精品 | 97综合网 | 国产精品粉嫩 | 手机看片1042 | 免费看三片 | 伊人五月婷| 91av视频免费观看 | 日韩高清无线码2023 | 国产成人精品999在线观看 | 国产精品三级视频 | 精品一区二区电影 | 欧美一区二区三区免费观看 | 国产精品视频一二三 | 精品一区二区日韩 | 一区二区不卡高清 | 天天曰天天干 | 久久激五月天综合精品 | 国产黄在线免费观看 | www.国产毛片 | 最新91在线视频 | 国产精品一区二区久久精品爱微奶 | 成人精品一区二区三区电影免费 | 日韩精品综合在线 | 国产在线精品一区二区 | 国产亚洲午夜高清国产拍精品 | 菠萝菠萝在线精品视频 | 日韩中文字幕视频在线 | 国产在线不卡一区 | 中文字幕一区二区在线播放 | 91理论电影 | 国产午夜小视频 | 婷婷色综合网 | 中文字幕乱偷在线 | 午夜免费视频网站 | 久久久久99精品国产片 | 国产视频一区二区在线 | 91视频在线播放视频 | 91丨九色丨高潮丰满 | 天天玩天天干 | 天天干天天操天天搞 | 免费av片在线 | 久久久久久久久久久电影 | 激情五月婷婷丁香 | 中文字幕av免费 | 久久视频在线视频 | 丁香影院在线 | 免费三及片 | 成人午夜免费剧场 | 麻豆视频一区 | 久久视频在线观看免费 | 在线观看免费色 | 中文一区二区三区在线观看 | 国产日韩欧美中文 | 麻豆 free xxxx movies hd | 超碰人人99| 久久久亚洲网站 | 狠狠伊人 | 人人狠狠| 激情视频免费在线观看 | av中文字幕网 | 免费视频在线观看网站 | 精品国产伦一区二区三区观看体验 | 99se视频在线观看 | 久热国产视频 | 97热视频| 免费看的av片 | 日韩成人精品一区二区 | 婷婷中文字幕 | 又大又硬又黄又爽视频在线观看 | 在线观看日韩视频 | 综合激情网 | 欧美少妇的秘密 | a黄色影院 | 欧美一级淫片videoshd | 亚洲九九爱| 日韩电影久久 | 在线视频手机国产 | 亚洲精品国产麻豆 | 狠狠88综合久久久久综合网 | 国产精品1区2区3区在线观看 | 天天色天| 国产一级精品在线观看 | 狠狠狠色丁香婷婷综合激情 | 亚洲午夜精品在线观看 | 亚洲一区二区三区精品在线观看 | 免费网站v | 日韩免费在线视频观看 | 中文字幕亚洲字幕 | 国产精品一区二区视频 | 久热只有精品 | 日韩视频欧美视频 | 91久久精品一区二区二区 | 亚洲成人影音 | 色综合久久中文综合久久牛 | 日韩一二区在线 | 91最新在线观看 | 在线观看第一页 | 正在播放 国产精品 | 国产黑丝一区二区三区 | 久久一久久 | 亚洲天天摸日日摸天天欢 | 青青久草在线视频 | 最新午夜电影 | 中文字幕色播 | 亚洲精品一区二区久 | 免费av网站观看 | 国产成人久久久77777 | 三级视频片| 视频在线日韩 | 人人干人人超 | 成人在线视频网 | www178ccom视频在线 | 中文字幕在线一区观看 | 成人免费视频网站在线观看 | 狠狠操夜夜 | 日韩视频免费观看高清完整版在线 | 成人91av| 日韩精品免费在线观看 | 国产精品99爱| 国产亚洲精品综合一区91 | 亚洲国产无 | 亚洲国产综合在线 | 中文字幕在线免费看 | 日本 在线 视频 中文 有码 | 在线午夜 | 久久99精品国产99久久6尤 | 性色av一区二区三区在线观看 | 激情综合中文娱乐网 | 狠狠的操 | 国产精品一区在线观看 | 狠狠色狠狠色综合日日小说 | 国产亚洲在线视频 | 91在线免费视频 | 嫩草av在线| 日韩欧美一区二区三区免费观看 | 日日干影院 | 超碰在线官网 | 亚洲美女视频在线观看 | 日韩理论电影在线 | 国产精品久久久久免费观看 | 五月婷婷电影网 | 欧洲精品码一区二区三区免费看 | 日韩一级电影网站 | 免费网站在线观看人 | 亚洲人人爱 | 久久你懂得 | 久久人人爽人人片av | 99爱在线 | 99色在线观看 | 在线观看日韩国产 | 成人免费网站视频 | 亚洲综合小说 | 亚洲a色| 日韩精品免费专区 | 激情电影影院 | 国产午夜精品理论片在线 | 五月开心婷婷网 | 国产一区久久 | 欧美坐爱视频 | 在线国产日韩 | 国内精品久久久久久久影视简单 | 99热最新地址 | 久久久久久久久久毛片 | 91正在播放 | av三区在线| 国产成人精品久久 | 美女av免费看 | 日韩特黄av | 日韩中文字幕网站 | 免费日韩高清 | 久久综合色8888 | 国产精品中文久久久久久久 | 久草在线观看资源 | 91最新在线| 久久综合99 | 亚洲综合情 | 亚州精品一二三区 | 97精品国产97久久久久久春色 | 四虎成人精品在永久免费 | 草 免费视频 | 久久99久国产精品黄毛片入口 | 国产成人精品电影久久久 | 少妇bbw撒尿 | 丁香六月网 | 欧美精品久久久久久久久久 | 亚洲美女视频在线 | 在线看成人 | av电影在线免费观看 | 亚洲天堂网在线视频 | 久精品视频在线观看 | 国产成人精品综合久久久久99 | 夜夜高潮夜夜爽国产伦精品 | 久久免费视频观看 | 9色在线视频 | 九九精品在线观看 | 亚洲伦理中文字幕 | 亚洲成人黄色网址 | 午夜视频黄 | www.色国产 | 亚洲精品国产第一综合99久久 | 久久久久久网站 | 黄色软件在线观看视频 | 国产精品久久久久永久免费观看 | 黄色中文字幕 | 91九色视频导航 | 91福利视频在线 | 欧美精品亚洲精品 | 91热在线| 日一日干一干 | 久久综合色婷婷 | 丁香久久婷婷 | 国产美女在线精品免费观看 | 久久久久久网址 | 日本性生活一级片 | 99精品免费久久久久久久久日本 | 久久久久久久久久久综合 | 日韩精品一区电影 | 久一网站 | 免费亚洲黄色 | 狠狠色丁香婷婷综合久小说久 | 在线播放 日韩专区 | 欧美一级高清片 | av免费在线观看1 | 精品综合久久 | 精品亚洲网 | av片一区二区 | 欧美日韩高清国产 | 一级α片免费看 | 天天激情综合网 | 青青草在久久免费久久免费 | 日本91在线 | 国产一级二级在线观看 | 亚洲一区二区三区在线看 | 中中文字幕av在线 | 日本乱视频 | 五月婷婷六月丁香 | 国产精品成人a免费观看 | 在线观看免费国产小视频 | 天天干天天操天天爱 | 中文字幕av在线 | 亚洲精品久久久久久中文传媒 | а中文在线天堂 | 中文在线字幕免费观看 | 人人看人人 | 成人在线视频论坛 | 久草视频99| 亚洲夜夜网| 亚洲精品在线观看视频 | 又污又黄网站 | 久草影视在线 | 一本一本久久a久久精品综合 | 99热在线国产精品 | 免费在线播放av电影 | 国产精品免费麻豆入口 | 婷婷色社区 | 综合亚洲视频 | 九九热在线观看视频 | 欧美激情第八页 | av一区二区三区在线播放 | 国产精品 中文字幕 亚洲 欧美 | 97网| 97视频播放 | 国产欧美在线一区二区三区 | 公开超碰在线 |