1. 程式人生 > >java.lang.IncompatibleClassChangeError: BasicHttpParams

java.lang.IncompatibleClassChangeError: BasicHttpParams

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;
    }

#####注意:以上沒簡化。簽名過程

最後登入裡面解析用了BasicHttpParams這個的全部替換。

最後完美解決。