java.lang.IncompatibleClassChangeError: BasicHttpParams
阿新 • • 發佈:2019-01-26
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;
}
#####注意:以上沒簡化。簽名過程