---Creaked by B.S. 6/26/2017 9:22:40 PM
無聊練手,當作學習Android優秀源碼的筆記
僅供學習研究,請勿用作商業用途,如若喜歡請支持正版!
最新版原程序:(v1.14.1)
百度下載
火柴人聯盟官網: http://huo.hoolaigames.com/
B.S.去簽名去廣告內購破解版:(無限內購)
百度下載 鏈接: https://pan.baidu.com/s/1qXTbuVU 密碼: r9sb
有確認支付的電信接口內購版
也可以去各大安卓市場搜索下載最新版本:(推薦支付接口比較熟悉的移動,咪咕游戲,愛游戲)
愛游戲: http://www.play.cn/
咪咕游戲: http://g.10086.cn/
中國移動應用商城: http://mm.10086.cn/android
騰訊應用寶: http://android.myapp.com/
360手機助手: http://zhushou.360.cn/
百度旗下安卓市場: http://apk.hiapk.com/
安智市場: http://www.anzhi.com/
有圖有真相:
運營商網絡 |
特征碼 |
備注 |
中國移動 |
46000、46002、46007、46020 |
|
中國聯通 |
46001、46006、46010 |
|
中國電信 |
46003、46005、46011 |
|
1. 去簽名驗證:
Android killer不修改直接回編譯后,是有簽名驗證的,檢測提示盜版破解游戲.

當然是先跑一遍原程序,看看logcat有沒有敏感信息可以用;現在搜索字符串了,
signatures
getAPPSecretString
有侵權
BLACK_NAME
找到第一條添加黑名單的工具類就是,向上回溯查看哪里引用了getAPPSecretString這個方法
.class public Lcn/mycompany/addblackname/utils/utils;
.super Ljava/lang/Object;
.source "utils.java"
.method public static getAPPSecretString(Landroid/content/Context;)Ljava/lang/String; .prologue .line 21 invoke-virtual {p0}, Landroid/content/Context;->getPackageName()Ljava/lang/String; move-result-object v4 .line 22 .local v4, "pkgname":Ljava/lang/String; const-string v1, "" return-object v1 #去簽名驗證從:try_start_0開始到:catch_0,但里面的返回留著.直接返回空的字符串 .end method
去驗證的修改方法很多種,還可以在下面的類里定位到check方法函數.
根據經驗可以去看看onCreate有沒可用的信息,一般初始化在這里有處理.
.class public Lcom/DBGame/DiabloLOL/DiabloLOL;
.super Lorg/cocos2dx/lib/Cocos2dxActivity;
.source "DiabloLOL.java"
.method protected onCreate(Landroid/os/Bundle;)V #前面還有若干代碼 ###黑名單功能開始 .line 240 new-instance v0, Lcn/mycompany/addblackname/AddBlackName; invoke-direct {v0, p0}, Lcn/mycompany/addblackname/AddBlackName;-><init>(Landroid/content/Context;)V .line 241 .local v0, "blackName":Lcn/mycompany/addblackname/AddBlackName; #invoke-static {}, Lcn/mycompany/addblackname/AddBlackName;->Check()V ###黑名單功能結束 #后面還有若干代碼
順便廣告的也可以看看能不能處理了
#前面還有若干代碼 ###廣告的初始化開始 .line 260 #invoke-static {p0, v7}, Lcn/cmgame/billing/api/game/main/Tool;->adIntervalInit(Landroid/app/Activity;Lcn/cmgame/billing/api/game/main/Listener;)V .line 262 #invoke-static {p0, v7}, Lcn/cmgame/billing/api/game/main/Tool;->adNativeInit(Landroid/app/Activity;Lcn/cmgame/billing/api/game/main/Listener;)V ###廣告的初始化結束 #后面還有若干代碼
看到Lcn/mycompany/addblackname/AddBlackName;->Check()V是在添加黑名單的類里, 查看方法,處理check()V
.method public static Check()V .locals 6 .prologue ######插入代碼開始 coded by B.S. const-string v0, "Lcn/mycompany/addblackname/AddBlackName;->check()V \n -- by B.S." invoke-static {v0}, Lcom/android/BS/Log;->LogStr(Ljava/lang/String;)V ######插入代碼結束 coded by B.S. return-void #直接返回使簽名驗證失效. .end method
2. 去廣告:
去除返回退出的橫幅廣告:
點返回按鈕,logcat找到敏感字符
----- showInterAD --exit
反編譯后,搜索
----- showInterAD
HANDLER_SHOW_INTER_AD
在下面類修改
.class public Lcom/DBGame/Common/BLHelper;
.super Ljava/lang/Object;
.source "BLHelper.java"
不讓他發送顯示廣告的消息
public static final int HANDLER_SHOW_INTER_AD = 211;
.field public static final HANDLER_SHOW_INTER_AD:I = 0xd3
.method public static showInterAD(Ljava/lang/String;)V .locals 6 .param p0, "tag" # Ljava/lang/String; .prologue .line 360 const-string v3, "ad" new-instance v4, Ljava/lang/StringBuilder; invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V const-string v5, "----- showInterAD --" invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-static {v3, v4}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I .line 361 const/4 v1, 0x0 .line 362 .local v1, "index":I const/4 v0, 0x0 .local v0, "i":I :goto_0 sget-object v3, Lcom/DBGame/Common/BLHelper;->adTags:[Ljava/lang/String; array-length v3, v3 if-ge v0, v3, :cond_0 .line 363 sget-object v3, Lcom/DBGame/Common/BLHelper;->adTags:[Ljava/lang/String; aget-object v3, v3, v0 invoke-virtual {v3, p0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v3 if-eqz v3, :cond_1 .line 364 move v1, v0 .line 368 :cond_0 new-instance v2, Landroid/os/Message; invoke-direct {v2}, Landroid/os/Message;-><init>()V .line 369 .local v2, "msg":Landroid/os/Message; const/16 v3, 0xd3 iput v3, v2, Landroid/os/Message;->what:I .line 370 iput v1, v2, Landroid/os/Message;->arg1:I .line 371 sget-object v3, Lcom/DBGame/Common/BLHelper;->sContext:Lcom/DBGame/DiabloLOL/DiabloLOL; #去退出廣告,不讓他發送顯示廣告的消息,下面一句給注釋或刪掉 #invoke-virtual {v3, v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->sendMessage(Landroid/os/Message;)V .line 372 return-void .line 362 .end local v2 # "msg":Landroid/os/Message; :cond_1 add-int/lit8 v0, v0, 0x1 goto :goto_0 .end method
去除選英雄和副本的橫幅廣告:
public static final int HANDLER_SHOWBANNER = 200; public static final int HANDLER_HIDEBANNER = 210; case DiabloLOL.HANDLER_HIDEBANNER /*210*/: DiabloLOL.this.hideBanner(); case 200: DiabloLOL.this.showBanner();
修改下面類里的方法
.class public Lcom/DBGame/Common/BLHelper;
.super Ljava/lang/Object;
.source "BLHelper.java"
.method public static showBanner(Ljava/lang/String;)V .locals 2 .param p0, "tag" # Ljava/lang/String; .prologue .line 375 new-instance v0, Landroid/os/Message; invoke-direct {v0}, Landroid/os/Message;-><init>()V .line 376 .local v0, "msg":Landroid/os/Message; const/16 v1, 0xd2 #const/16 v1, 0xc8 #顯示橫幅廣告的發送消息的代碼 0xc8 200 休改為 0xd2 210 隱藏橫幅 iput v1, v0, Landroid/os/Message;->what:I .line 377 sget-object v1, Lcom/DBGame/Common/BLHelper;->sContext:Lcom/DBGame/DiabloLOL/DiabloLOL; #去橫幅廣告,或者不讓他發送顯示廣告的消息, invoke-virtual {v1, v0}, Lcom/DBGame/DiabloLOL/DiabloLOL;->sendMessage(Landroid/os/Message;)V .line 378 return-void .end method
可以再去下面類里看看,消息處理的地方 .method public handleMessage(Landroid/os/Message;)V
.class Lcom/DBGame/DiabloLOL/DiabloLOL$3;
.super Landroid/os/Handler;
.source "DiabloLOL.java"
case 200: //DiabloLOL.access$400(this.this$0); return; case 210: //DiabloLOL.access$500(this.this$0); return; case 211: Log.e("qq", "HANDLER_SHOW_INTER_AD=========="); //DiabloLOL.access$600(this.this$0, paramMessage.arg1); return;
對應的smali
.line 650 #去除顯示橫幅sswitch_8 :sswitch_8 iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$3;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL; # invokes: Lcom/DBGame/DiabloLOL/DiabloLOL;->showBanner()V #invoke-static {v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$400(Lcom/DBGame/DiabloLOL/DiabloLOL;)V goto :goto_0 .line 654 #去除隱藏橫幅sswitch_9 :sswitch_9 iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$3;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL; # invokes: Lcom/DBGame/DiabloLOL/DiabloLOL;->hideBanner()V #invoke-static {v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$500(Lcom/DBGame/DiabloLOL/DiabloLOL;)V goto :goto_0 .line 658 #去除顯示嵌入式廣告sswitch_a :sswitch_a const-string v2, "qq" const-string v3, "HANDLER_SHOW_INTER_AD==========" invoke-static {v2, v3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I .line 659 iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$3;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL; iget v3, p1, Landroid/os/Message;->arg1:I # invokes: Lcom/DBGame/DiabloLOL/DiabloLOL;->showInterAd(I)V #invoke-static {v2, v3}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$600(Lcom/DBGame/DiabloLOL/DiabloLOL;I)V goto/16 :goto_0
消息處理的代碼如下:
public void handleMessage(Message msg) { switch (msg.what) { case 10: DiabloLOL.this.exitGame(); return; case 11: ((ClipboardManager) Cocos2dxActivity.getContext().getSystemService("clipboard")).setPrimaryClip(ClipData.newPlainText(MiniDefine.ax, BLHelper.copyString)); Toast.makeText(DiabloLOL.this, "拷貝成功!", 0).show(); return; case 30: if (BLHelper.IPAYTAYPE == 1) { DiabloLOL.this.payInDuanXin(); return; } else if (BLHelper.IPAYTAYPE != 2 && DiabloLOL.RECHARGE_CHANNELS.indexOf(String.valueOf(DiabloLOL.this.iFromPay)) != -1) { DiabloLOL.this.payInDuanXin(); return; } else { return; } case 102: OGPub.Instance().closeLoad(); return; case 200: DiabloLOL.this.showBanner(); return; case DiabloLOL.HANDLER_HIDEBANNER /*210*/: DiabloLOL.this.hideBanner(); return; case DiabloLOL.HANDLER_SHOW_INTER_AD /*211*/: Log.e("qq", "HANDLER_SHOW_INTER_AD=========="); DiabloLOL.this.showInterAd(msg.arg1); return; case DiabloLOL.HANDLER_REYUN_EXIT /*400*/: ReYun.exitSdk(); return; case DiabloLOL.HANDLER_SHOWSHARE /*420*/: DiabloLOL.this.showShareDialog(); return; case DiabloLOL.HANDLER_SAVEPIC /*450*/: BLHelper.savePic(); return; case DiabloLOL.HANDLER_MONTHCONTRA /*470*/: DiabloLOL.this.purchaseMonthlyContract(msg.arg1); return; case DiabloLOL.HANDLER_HIDEWEBDATA /*998*/: BLHelper.webout(); return; default: return; } }
順便也解決下其他的函數, .method private showBanner()V和.method private showInterAd(I)V 處理掉直接返回
.class public Lcom/DBGame/DiabloLOL/DiabloLOL;
.super Lorg/cocos2dx/lib/Cocos2dxActivity;
.source "DiabloLOL.java"
.method private showBanner()V .locals 5 .prologue .line 338 return-void #直接返回 const v1, 0x3e4ccccd # 0.2f const v2, 0x3f4ccccd # 0.8f const v3, 0x3f19999a # 0.6f const v4, 0x3e19999a # 0.15f :try_start_0 invoke-static {p0, v1, v2, v3, v4}, Lcn/cmgame/billing/api/game/main/Tool;->adNativeShow(Landroid/app/Activity;FFFF)V :try_end_0 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 .line 342 :goto_0 return-void .line 339 :catch_0 move-exception v0 .line 340 .local v0, "e":Ljava/lang/Exception; invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V goto :goto_0 .end method .method private showInterAd(I)V .locals 1 .param p1, "index" # I .prologue .line 354 return-void #直接返回 :try_start_0 invoke-static {p0, p1}, Lcn/cmgame/billing/api/game/main/Tool;->adIntervalShow(Landroid/app/Activity;I)V :try_end_0 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 .line 358 :goto_0 return-void .line 355 :catch_0 move-exception v0 .line 356 .local v0, "e":Ljava/lang/Exception; invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V goto :goto_0 .end method
3. 內購破解:
去除可能會產生費用的危險權限:
AndroidManifest.xml里搜索
android.permission.SEND_SMS
android.permission.CALL_PHONE
刪掉
<uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.CALL_PHONE"/>
電信支付接口:
logcat字符串定位,
Egame支付成功
Egame支付Cancel
order id:
搜索上面字符串,向上分析,回溯分析.
.class public Lcn/egame/terminal/paysdk/EgamePay;
.super Ljava/lang/Object;
.source "EgamePay.java"
.method public static pay(Landroid/app/Activity;Ljava/util/Map;Lcn/egame/terminal/paysdk/EgamePayListener;)V .locals 1 .param p0, "activity" # Landroid/app/Activity; .param p2, "listener" # Lcn/egame/terminal/paysdk/EgamePayListener; .annotation system Ldalvik/annotation/Signature; value = { "(", "Landroid/app/Activity;", "Ljava/util/Map", "<", "Ljava/lang/String;", "Ljava/lang/String;", ">;", "Lcn/egame/terminal/paysdk/EgamePayListener;", ")V" } .end annotation .prologue .line 78 #注意paySuccess這個函數只有一個參數.method public abstract paySuccess(Ljava/util/Map;)V #而失敗payFailed這個函數有第二個整型參數 .method public abstract payFailed(Ljava/util/Map;I)V # Egame支付成功 invoke-interface {p2, p1}, Lcn/egame/terminal/paysdk/EgamePayListener;->paySuccess(Ljava/util/Map;)V return-void .end method
還可以用paySuccess函數體代替payCancel和payFailed.在下面的類里,
.class Lcom/DBGame/DiabloLOL/DiabloLOL$6;
.super Ljava/lang/Object;
.source "DiabloLOL.java"
聯通支付接口:
logcat字符串定位啊,
Unicom支付成功
Unicom支付cancel
在下面類修改處理,可以用goto大法或者switch大法.
.class Lcom/DBGame/DiabloLOL/DiabloLOL$4;
.super Ljava/lang/Object;
.source "DiabloLOL.java"
.method public PayResult(Ljava/lang/String;IILjava/lang/String;)V .prologue .line 694 goto :pswitch_0 #聯通支付接口,直接JMP無條件跳到支付成功 packed-switch p2, :pswitch_data_0
移動支付接口:
logcat定位字符串,
購買道具:[
] 成功!
] 失敗!
在下面類修改
.class Lcom/DBGame/DiabloLOL/DiabloLOL$5;
.super Ljava/lang/Object;
.source "DiabloLOL.java"
.method public onResult(ILjava/lang/String;Ljava/lang/Object;)V .prologue .line 735 const-string v0, "" .line 736 .local v0, "result":Ljava/lang/String; goto :pswitch_0 #移動支付接口,直接JMP無條件跳到支付成功 packed-switch p1, :pswitch_data_0
4. 統一支付接口:
統一為電信的吧.可以直接成功,沒那么多彈窗支付
定位字符串
電信初始化成功
.method protected onCreate(Landroid/os/Bundle;)V .line 254 invoke-direct {p0}, Lcom/DBGame/DiabloLOL/DiabloLOL;->getSimType()I move-result v4 iput v4, p0, Lcom/DBGame/DiabloLOL/DiabloLOL;->iFromPay:I
進入getSimType方法函數處理結果然后賦值給iFromPay
private int getSimType() { int type = 0; String sOperator = ((TelephonyManager) getSystemService("phone")).getSimOperator().trim(); if (sOperator == null || sOperator.equals("")) { return 0; } switch (Integer.valueOf(sOperator).intValue()) { case 46000: case 46002: case 46007: case 46020: type = 0; break; case 46001: case 46006: type = 2; break; case 46003: case 46005: case 46011: type = 1; break; } return type; }
直接return 1;偽裝為電信,支付接口統一完畢.請參看本文開頭的SIM類型表格
我第一次比較麻煩的改法如下,
.method private getSimType()I .locals 6 .prologue .line 267 const/4 v3, 0x1 #const/4 v3, 0x0 #初始化為0是移動 .line 268 .local v3, "type":I const-string v5, "phone" .line 269 invoke-virtual {p0, v5}, Lcom/DBGame/DiabloLOL/DiabloLOL;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object v2 check-cast v2, Landroid/telephony/TelephonyManager; .line 270 .local v2, "tm":Landroid/telephony/TelephonyManager; invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->getSimOperator()Ljava/lang/String; move-result-object v5 invoke-virtual {v5}, Ljava/lang/String;->trim()Ljava/lang/String; move-result-object v1 ######插入自定義log開始 invoke-static {v1}, Lcom/android/BS/Log;->LogStr(Ljava/lang/String;)V ######插入自定義log結束 ######插入自定義log開始 const-string v0, "\n\u65e0\u9650\u5185\u8d2dB.S.\u7834\u89e3\u7248\n www.appleos.xyz \n-- by B.S." invoke-static {v0}, Lcom/android/BS/Log;->LogStr(Ljava/lang/String;)V ######插入自定義log結束 .line 271 .local v1, "sOperator":Ljava/lang/String; if-eqz v1, :cond_0 const-string v5, "" invoke-virtual {v1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v5 if-eqz v5, :cond_1 :cond_0 move v4, v3 #移動為0 .line 295 .end local v3 # "type":I .local v4, "type":I :goto_0 return v4 .line 274 .end local v4 # "type":I .restart local v3 # "type":I :cond_1 invoke-static {v1}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer; move-result-object v5 invoke-virtual {v5}, Ljava/lang/Integer;->intValue()I move-result v0 .line 275 .local v0, "sCode":I packed-switch v0, :pswitch_data_0 :goto_1 :pswitch_0 move v4, v3 .line 295 .end local v3 # "type":I .restart local v4 # "type":I goto :goto_0 .line 280 .end local v4 # "type":I .restart local v3 # "type":I :pswitch_1 const/4 v3, 0x1 #const/4 v3, 0x0 #移動 .line 281 goto :goto_1 .line 284 :pswitch_2 const/4 v3, 0x1 #const/4 v3, 0x2 #聯通 .line 285 goto :goto_1 .line 289 :pswitch_3 const/4 v3, 0x1 #電信 .line 290 goto :goto_1 .line 275 :pswitch_data_0 .packed-switch 0xb3b0 :pswitch_1 :pswitch_2 :pswitch_1 :pswitch_3 :pswitch_0 :pswitch_3 :pswitch_2 :pswitch_1 :pswitch_0 :pswitch_0 :pswitch_0 :pswitch_3 :pswitch_0 :pswitch_0 :pswitch_0 :pswitch_0 :pswitch_0 :pswitch_0 :pswitch_0 :pswitch_0 :pswitch_1 .end packed-switch .end method
也可以直接return 0,偽裝為移動,統一為移動支付.
.method private getSimType()I .locals 6 ###統一為移動短信支付接口直接返回為0 #const/4 v4, 0x0 #return v4 .end method
然后處理移動短信支付的函數方法payInYidong(),移動短信支付的另外一種破解方法,
.class Lcom/DBGame/DiabloLOL/DiabloLOL$5;
.super Ljava/lang/Object;
.source "DiabloLOL.java"
把移動購買成功的代碼,就是:pswitch_0里兩個goto :goto_0之間的有效代碼,直接搬到payInYidong()里,放到:cond_0和return-void之間.
.line 755 :goto_0 invoke-static {}, Lcom/DBGame/Common/BLHelper;->closeShieldLayer()V .line 756 return-void .line 738 :pswitch_0 const-string v1, "10" invoke-virtual {p3}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v2 invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v1 if-eqz v1, :cond_0 .line 739 const-string v0, "\u77ed\u4fe1\u8ba1\u8d39\u8d85\u65f6" goto :goto_0 .line 741 :cond_0 ###從下面一句開始購買成功,不彈窗. new-instance v1, Ljava/lang/StringBuilder; invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V const-string v2, "\u8d2d\u4e70\u9053\u5177\uff1a[" invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v1 iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL; #和下一語句合并 iget-object v2, v2, Lcom/DBGame/DiabloLOL/DiabloLOL;->PAY_NAME:[Ljava/lang/String; iget-object v3, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL; #和下一語句合并 # getter for: Lcom/DBGame/DiabloLOL/DiabloLOL;->mPayIndex:I invoke-static {v3}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$800(Lcom/DBGame/DiabloLOL/DiabloLOL;)I move-result v3 aget-object v2, v2, v3 invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v1 const-string v2, "] \u6210\u529f\uff01" invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v1 invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 .line 742 iget-object v1, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL; #和下一語句合并 iget-object v1, v1, Lcom/DBGame/DiabloLOL/DiabloLOL;->PRO_ID_Str:[Ljava/lang/String; iget-object v2, p0, Lcom/DBGame/DiabloLOL/DiabloLOL$5;->this$0:Lcom/DBGame/DiabloLOL/DiabloLOL; #和下一語句合并 # getter for: Lcom/DBGame/DiabloLOL/DiabloLOL;->mPayIndex:I invoke-static {v2}, Lcom/DBGame/DiabloLOL/DiabloLOL;->access$800(Lcom/DBGame/DiabloLOL/DiabloLOL;)I move-result v2 aget-object v1, v1, v2 const/4 v2, 0x1 invoke-static {v1, v2}, Lcom/DBGame/Common/BLHelper;->purchaseComplete(Ljava/lang/String;I)V goto :goto_0 ###購買成功不彈窗到goto那邊的closeShieldLayer語句然后返回結束 .line 748 :pswitch_1
最后應該變為java源碼如下面的樣子:
private void payInYidong() { if (LOLConstant.sCMCC_OPEN == 0) { BLHelper.showShieldLayer("正在處理,請稍后....."); } String str = "購買道具:[" + this.PAY_NAME[this.mPayIndex] + "] 成功!"; BLHelper.purchaseComplete(this.PRO_ID_Str[this.mPayIndex], 1); BLHelper.closeShieldLayer(); }
有童靴反應真機內購,會卡在"正在處理,請稍后.....",其實這個要等一會的,等一會兒就消失了. 不愿意等太長時間,那么就干脆干掉她,如下,只要上面說的兩個goto :goto_0夾著那段代碼,另外記得這里面的代碼,需要合并處理this指針問題喲.
private void payInYidong() { String str = "購買道具:[" + this.PAY_NAME[this.mPayIndex] + "] 成功!"; BLHelper.purchaseComplete(this.PRO_ID_Str[this.mPayIndex], 1); }
幾種支付方式如下:(短信,聯通,移動,Egame支付)
其中電信用的是Egame支付
private void payInDuanXin() { if (RECHARGE_CHANNELS.indexOf(String.valueOf(this.iFromPay)) != -1) { if (this.iFromPay == 2) { payInUnicom(); } else if (this.iFromPay == 0) { payInYidong(); } else if (this.iFromPay == 1) { payInEgame(); } } } private void payInUnicom() { Utils.getInstances().pay(this, this.PAY_CODE_UNICOM[this.mPayIndex], new UnipayPayResultListener() { public void PayResult(String arg0, int arg1, int arg2, String arg3) { switch (arg1) { case 1: DiabloLOL.this.setPayment(); BLHelper.purchaseComplete(DiabloLOL.this.PRO_ID_Str[DiabloLOL.this.mPayIndex], 1); BLHelper.closeShieldLayer(); Log.e("qq", "Unicom支付成功"); return; case 2: BLHelper.closeShieldLayer(); Log.e("qq", "Unicom支付Fail"); return; case 3: BLHelper.closeShieldLayer(); Log.e("qq", "Unicom支付cancel"); return; default: Log.e("qq", "Unicom支付Default"); return; } } }); } private void payInYidong() { if (LOLConstant.sCMCC_OPEN == 0) { BLHelper.showShieldLayer("正在處理,請稍后....."); } GameInterface.doBilling(this, true, true, this.PAY_CODE_MM[this.mPayIndex], null, this.payCallback); } public void payInEgame() { HashMap<String, String> payParams = new HashMap(); payParams.put(EgamePay.PAY_PARAMS_KEY_TOOLS_ALIAS, this.PAY_CODE_SMS[this.mPayIndex]); if (this.iOpen == -1) { this.iOpen = BLHelper.getOpenCTCC("ctcc", this, true); } Log.e("qq", "iOpen=" + this.iOpen); if (this.iOpen == 1) { this.gameManager.gameConfig.PaySdkUIForCP = 1; } else { this.gameManager.gameConfig.PaySdkUIForCP = 0; } this.gameManager.EGamePay(payParams, new EgamePayListener() { public void paySuccess(Map<String, String> map) { DiabloLOL.this.setPayment(); BLHelper.purchaseComplete(DiabloLOL.this.PRO_ID_Str[DiabloLOL.this.mPayIndex], 1); BLHelper.closeShieldLayer(); Log.e("qq", "Egame支付成功"); DiabloLOL.this.mPayIndex = -1; } public void payFailed(Map<String, String> map, int arg1) { BLHelper.closeShieldLayer(); Log.e("qq", "Egame支付Fail==" + arg1); DiabloLOL.this.mPayIndex = -1; } public void payCancel(Map<String, String> map) { BLHelper.closeShieldLayer(); Log.e("qq", "Egame支付Cancel"); DiabloLOL.this.mPayIndex = -1; } }); }