微信支付接口 <xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[签名错误]]></return_msg>

微信下单签名错误

不得不说微信坑确实多
如果有来生希望不要在使用微信接口 太痛苦了铁子

在sign生成签名拼接字符串的时候 排序必须正确。
注意是在生成sign签名的时候,不是在生成xml的时候 我当时就是因为在生成xml的时候排序 结果没有用。

顺序必须像这样 跟着文档走  顺序不能错
appid=xxx&body=xxx&mch_id=xxx ....

原本代码

本想是通过反射来自动生成字符串的拼接 以及sign签名算法。达到一劳永逸 但实际上是我想多了 因为字段没有办法按照微信文档排序

public static String createSign(Object o , String key)throws Exception{

        var buffer = new StringBuilder();


        Field[] fields = o.getClass().getDeclaredFields();


        for (Field field : fields) {

            field.setAccessible(true);
            String name = field.getName();



            if ( field.get(o) instanceof String ) {

                buffer.append("&" + name + "=");
                buffer.append((String) field.get(o));

            }else if ( field.get(o) instanceof Number ){

                buffer.append("&" + name + "=");
                buffer.append((Number) field.get(o));

            }else {
                continue;
            }

        }

        buffer.append("&key=" + key);


        var s = buffer.toString();

        var = s.replaceFirst("&", "");


        var md5 = DigestUtils.md5DigestAsHex(str.getBytes()).toUpperCase();


        return md5;


    }

修改过后代码
没错只能写死 因为居然是因为排序问题 必须跟着文档的排序走

public static String createSgin(Order pay) throws NoSuchAlgorithmException {
        String sign = "appid="+pay.getAppid()+
                "&body="+pay.getBody()+
                "&mch_id="+pay.getMch_id()+
                "&nonce_str="+pay.getNonce_str()+
                "¬ify_url="+pay.getNotify_url()+
                "&openid="+pay.getOpenid()+
                "&out_trade_no="+pay.getOut_trade_no()+
                "&spbill_create_ip="+pay.getSpbill_create_ip()+
                "&total_fee="+pay.getTotal_fee()+
                "&trade_type="+pay.getTrade_type();
        sign += "&key=Yq1qaz2wsx3edc4rfv5tgb6yHJJ123";
        //签名加密
        String md5 = DigestUtils.md5DigestAsHex(sign.getBytes()).toUpperCase();
        return md5;
    }

你可能感兴趣的:(微信支付接口 <xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[签名错误]]></return_msg>)