java.lang.IncompatibleClassChangeError:
关于上面的异常,基本就是不兼容导致的,也许有时你开发时,没问题,但正式发布release时,出现崩溃了,这种情况也是有的。
我在集成微信和QQ等第三方时,调试没问题,但release时,登录可以拉取权限,但返回崩溃,支付是过一会崩溃,日志如下:
**********2017-05-25 11:09:44**********
java.lang.IncompatibleClassChangeError: Class 'org.apache.http.params.BasicHttpParams' does not implement interface 'org.apache.http.params.c' in call to 'org.apache.http.params.c org.apache.http.params.c.setIntParameter(java.lang.String, int)' (declaration of 'org.apache.http.params.b' appears in
然后发现了这个BasicHttpParams。这个方法我查到是Httpcore里面的方法,我试了换版本,有可能是运气不好,然后想其他方法。
发现,支付里最后拉起支付是api.sendReq(req);这个方法。而BasicHttpParams这个只是生成后键值用做签名而已。既然是key和value的键值对,那Map也可以。所以直接替换Map。
Map<String ,Object> date=new HashMap<>();
date.put("appid", req.appId);
date.put("noncestr", req.nonceStr);
date.put("package", req.packageValue);
date.put("partnerid", req.partnerId);
date.put("prepayid", req.prepayId);
date.put("timestamp", req.timeStamp);
req.sign = genAppSign(date);
sb.append("sign\n" + req.sign + "\n\n");
签名代码:
//获取支付签名Sign
StringBuilder sb = new StringBuilder();
public String genAppSign(Map<String,Object> params) {
StringBuilder sb = new StringBuilder();
sb.append("appid");
sb.append('=');
sb.append( params.get("appid"));
sb.append('&');
sb.append("noncestr");
sb.append('=');
sb.append( params.get("noncestr"));
sb.append('&');
sb.append("package");
sb.append('=');
sb.append( params.get("package"));
sb.append('&');
sb.append("partnerid");
sb.append('=');
sb.append( params.get("partnerid"));
sb.append('&');
sb.append("prepayid");
sb.append('=');
sb.append( params.get("prepayid"));
sb.append('&');
sb.append("timestamp");
sb.append('=');
sb.append( params.get("timestamp"));
sb.append('&');
sb.append("key=");
sb.append(WeiXinConstans.APP_KEY); //WeiXinConstans.APP_KEY
this.sb.append("sign str\n" + sb.toString() + "\n\n");
String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
return appSign;
}
#####注意:以上没简化。签名过程