一、说在前面的话

这两天遇到一个特别让我DT的问题,估计大家通过标题就能知道问题了。没错,就是在应用中集成了微信SDK后,它自动支持了微信分享、登录、收藏、支付等功能。这一点没啥,TM的关键点就是在上传到应用宝时,他们既然提示了未通过,问题如下:

我集成微信SDK,主要是想使用登录和分享功能,支付功能压根不是我想集成的,但是这两个功能也没有单独的SDK,这就很让人DT了,关键这两个平台都是腾讯的,他们是要闹那样呀,不知道一家人要相亲相爱吗。尽给我们添麻烦,算了不说,吐槽没有用,继续搬砖吧

二、炁体源流(回归主题)

接入的流程在这里就不说了,不知道请自行查看教程。
现在我们怀疑他们是根据特定的关键字以作为是否具有支付功能。而微信SDK中的支付关键字为PayReq,而在集成微信SDK时,他们明确说明在 proguard.cfg需要配置:

-keep class com.tencent.mm.opensdk.** {*;
}-keep class com.tencent.wxop.** {*;
}-keep class com.tencent.mm.sdk.** {*;
}

但是我反编译时,并未发现他们有携带相关的so库,那为什么需要keep那么多包中的类那,我就把所有防混淆的配置全部移除,并验证登录功能发现完全没有问题,我找了好多手机都验证完全没有问题。
然后提交到应用宝后台后,果然通过了,看来他们就是根据一些Pay关键字做的校验。自此问题。。。

在上线后之前未注意的点暴露了问题,那就是主要使用两个功能点:登录分享,而当时只是测试了登录并未测试分享,所以就出问题了。
既然这样那肯定是不该混淆的类被混淆了,那我们就通过微信SDK源码分析吧。

我们在编写分享时代码一般如下:

   LocalBroadcastManager.getInstance(mContext).registerReceiver(wxBroadcastReceiver, new IntentFilter(Constants.WX_OPTIONS_RESULT_ACTION));//初始化 WXImageObject 和 WXMediaMessage 对象WXImageObject imgObj = new WXImageObject(bitmap);WXMediaMessage msg = new WXMediaMessage();msg.mediaObject = imgObj;//构造一个ReqSendMessageToWX.Req req = new SendMessageToWX.Req();req.transaction = String.valueOf(System.currentTimeMillis());req.message = msg;req.scene = shareFlag == 0 ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;//调用api接口,发送数据到微信iwxapi.sendReq(req);

也就是说主要的关键接口是IWXAPI,而它的实现类是BaseWXApiImplV10,那我就看它的sendReq具体实现:

 public boolean sendReq(BaseReq var1) {...} else {com.tencent.mm.opensdk.modelmsg.SendMessageToWX.Req var3;int var4;if (var1.getType() == 2 && d.a(var4 = (var3 = (com.tencent.mm.opensdk.modelmsg.SendMessageToWX.Req)var1).message.getType())) {WXWebpageObject var9;if (this.getWXAppSupportAPI() < 620756993) {(var9 = new WXWebpageObject()).webpageUrl = var2.getString("_wxminiprogram_webpageurl");var3.message.mediaObject = var9;} else if (var4 == 46 && this.getWXAppSupportAPI() < 620953856) {(var9 = new WXWebpageObject()).webpageUrl = var2.getString("_wxminiprogram_webpageurl");var3.message.mediaObject = var9;} else {WXMiniProgramObject var8 = (WXMiniProgramObject)var3.message.mediaObject;var8.userName = var8.userName + "@app";String var5;if (!d.b(var5 = var8.path)) {String[] var11;if ((var11 = var5.split("\\?")).length > 1) {var5 = var11[0] + ".html?" + var11[1];} else {var5 = var11[0] + ".html";}var8.path = var5;}}if (var3.scene != 3 && var3.scene != 1) {var3.scene = 0;}var1.toBundle(var2);}Args var7;(var7 = new Args()).bundle = var2;var7.content = "weixin://sendreq?appid=" + this.appId;var7.targetPkgName = "com.tencent.mm";var7.targetClassName = "com.tencent.mm.plugin.base.stub.WXEntryActivity";if (var1.getType() == 2) {try {String var10 = this.getTokenFromWX(this.context);var7.token = var10;} catch (Exception var6) {Log.e("MicroMsg.SDK.WXApiImplV10", "getTokenFromWX fail, exception = " + var6.getMessage());}}return MMessageActV2.send(this.context, var7);}} else {return this.sendPayReq(this.context, var2);}}}

我们从中并未发现混淆后会导致不可用的地方。
那就继续看发送类型的model类:SendMessageToWX,我们会发现其中有一处:

      public void toBundle(Bundle var1) {super.toBundle(var1);var1.putAll(Builder.toBundle(this.message));var1.putInt("_wxapi_sendmessagetowx_req_scene", this.scene);var1.putInt("_wxapi_sendmessagetowx_req_media_type", this.message.getType());var1.putString("_wxapi_sendmessagetowx_req_use_open_id", this.userOpenId);}

我们在继续查看Builder.toBundle(this.message) 的源码:

       public static Bundle toBundle(WXMediaMessage var0) {Bundle var1;(var1 = new Bundle()).putInt("_wxobject_sdkVer", var0.sdkVer);var1.putString("_wxobject_title", var0.title);var1.putString("_wxobject_description", var0.description);var1.putByteArray("_wxobject_thumbdata", var0.thumbData);if (var0.mediaObject != null) {var1.putString("_wxobject_identifier_", pathNewToOld(var0.mediaObject.getClass().getName()));var0.mediaObject.serialize(var1);}var1.putString("_wxobject_mediatagname", var0.mediaTagName);var1.putString("_wxobject_message_action", var0.messageAction);var1.putString("_wxobject_message_ext", var0.messageExt);return var1;}

这时大家可能已经发现了病毒的所在了,没错就是它:pathNewToOld(var0.mediaObject.getClass().getName())

pathNewToOld方法的源码:

  private static String pathNewToOld(String var0) {if (var0 != null && var0.length() != 0) {return var0.replace("com.tencent.mm.opensdk.modelmsg", "com.tencent.mm.sdk.openapi");} else {Log.e("MicroMsg.SDK.WXMediaMessage", "pathNewToOld fail, newPath is null");return var0;}}

那既然知道了问题的所在了,那就直接防止modelmsg包下的所有类不被混淆即可了。所以我们只需要在proguard.cfg中配置如下即可:

-keep class com.tencent.mm.opensdk.modelmsg.** {*;
}

自此问题就真的解决了。奥利给

三、总结

移除在proguard.cfg中配置的:

-keep class com.tencent.mm.opensdk.** {*;
}-keep class com.tencent.wxop.** {*;
}-keep class com.tencent.mm.sdk.** {*;
}

只需要在proguard.cfg中配置:

-keep class com.tencent.mm.opensdk.modelmsg.** {*;
}

即可,这是凝结的精华,需要慢慢领悟

微信SDK中含有的支付功能怎么去掉?相关推荐

  1. APP中的第三方“支付”功能该如何测试

    经过最近几个项目的测试,APP中带有支付功能的产品有很多,那么APP中带有第三方支付功能的产品在这一模块该如何测试才尽可能的测试完整. 正常流程: 正常使用支付宝.微信.银行卡(目前使用最多的第三方支 ...

  2. 微信调用扫码和支付功能是都报错 the permission value is offline verifying

    微信调用扫码和支付功能都报错 the permission value is offline verifying 首先根据官方文档给出的先自我检查: the permission value is o ...

  3. 如何在app应用中添加支付宝支付功能

    推广排名q.q①⑨⑨⑦〇⑦④⑥*如何在app应用中添加支付宝支付功能 作为一枚普通的商户,或者 App 的开发人员,如何在对支付完全不了解的情况下,让 App 成功接入支付功能呢? 1)App 想接入 ...

  4. 微信小程序怎么开通支付功能?

    对于一些想通过小程序卖货的企业商家来说,在申请小程序后需要同时开通微信支付功能,才能在小程序上进行交易.那么关于微信小程序怎么开通支付功能,下面给大家说一说. 一.注册非个人主体的小程序账号 不管你是 ...

  5. 视频美颜sdk中的人脸磨皮功能实现流程

    目前,美白与磨皮几乎已经成了所有使用视频美颜sdk工具的必备,其使用频率与使用次数常居榜首,今天小编将为大家单独讲一下人脸磨皮功能的实现流程,以便于后期更好的应用.简单来讲,视频美颜sdk中的人脸磨皮 ...

  6. 支付宝支付功能实现原理,微信公众号中实现支付宝支付功能开发流程

    这篇文章使用一些简单的代码例子来解释微信接入支付宝支付功能的操作步骤,即使新手也可以轻松参透的. 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对 ...

  7. 微信浏览器中进行支付宝支付

    B端项目使用的是支付宝手机网页支付,微信浏览器中屏蔽了支付宝的功能.上有政策下有对策,支付宝也有应对的办法,下来就来说一说支付宝手机网站支付. 第一步:开发准备工作 登录支付宝平台(需要实名认证的支付 ...

  8. 微信小程序如何开通支付功能?

    微信小程序商城支付方式有哪些,如何开通小程序商城的支付功能,商家开通小程序支付功能的条件有哪些,小程序支付和微商城支付有冲突吗,小程序商城支付方式下商家如何提现,手续费多少? 微信小程序商城支付方式 ...

  9. 让你的微信小程序具有在线支付功能

    最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...

最新文章

  1. python发邮件包含表格,在Python中在电子邮件正文中包含Excel表
  2. [Node.js]常用工具
  3. cesium 加载bim模型_构建统一CIM数字底盘,实现基于BIM的全流程管控
  4. 图像识别中的深度学习【香港中文大学王晓刚】
  5. 如何用ARP欺骗来嗅探主机流量
  6. MySQL 高级 —— 深入理解 InnoDB 与 MyISAM
  7. HTML5:去除IE10中输入框和密码框的X按钮和小眼睛
  8. studioone唱歌效果精调_Sidechain是如何工作的,为什么sidechain可以带来如此酷炫的效果...
  9. 解决SqlServer添加维护计划时出现“代理XP组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用……”
  10. cmd 命令 copy 复制文件
  11. AJRW错误AA707
  12. 企业大数据价值你只发掘了1%!
  13. svg 树状图_树状图(关系图)
  14. 鸿蒙申请银行卡格式错误,办建设银行卡问题
  15. 微信小程序:经典语录大全微信小程序源码
  16. php实现积分加头像排行榜,PHPCMS首页GET调用标签会员积分与头像前十名
  17. 前端开发之走进Vue.js(入门者看过来)
  18. 切割钢条问题(rod cutting problem)
  19. 多源数据 单源数据是什么意思
  20. Axure RP9基本操作

热门文章

  1. ORACLE 习题(一)
  2. 7、LiveCharts--常用属性介绍(三)
  3. 一个简单的拼音输入法,实现常用汉字的输入
  4. 【Java入门基础第10天】Java常用的转义字符
  5. Windows10 CMD SSH登陆不了服务器出现 WARNING: REMOTE HOST
  6. 冲激函数与冲激函数相乘与冲激函数对冲激函数卷积之间的区别
  7. 网络安全行业有哪些认可度比较高的证书呢?
  8. 前端学习-品优购实践
  9. 《信息安全系统设计基础》第1周问题总结
  10. CSTC 2017 要匙