记一次微信APP支付开发返回-1的坑

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wxx729418277/article/details/81190779

微信APP文档

问题出现在5-6-7环节,当我第一次签名后生成预付单的时候返回很正常,表明我的签名没问题,微信商户数据也没问题,但是接收到预付单号把预付单号结合官方文档再次进行签名的时候却频频-1,官方要的参数是这些

这六个参数其中的一部分 在第一次生成预付单的时候会返回appid,prepayid,noncestr,mch_id(partnerid);这四个参数,我们第一次生成预付单也会有,这时候有人就会直接用了,随后就会出现各种噩梦,

问题一:二次签名的时候

六个字段appid,mch_id是可以通用,不管返回还是自己系统中常量都行,但是noncestr切记不要再次生成随机或者使用第一次的,而必须从预付单返回参数中拿取,

问题二:返回给前端安卓这些参数的时候

不要用实体类对象返回,否则你会发现package字段是标识符而想办法改个名字,然后。。。就GG了,建议使用map存放所有键值,

问题三:感谢各位csdn大佬帮我排查了其他的错误

像timestamp时间戳位数为10,二次签名字段要都小写,不能按照驼峰写法等等,

贴出二次签名的代码(贴太多代码没意义,需要的另找我要Q729418277)

            JSONArray prepay_id = result_xml.getJSONArray("prepay_id");
				String prepayId = (String) prepay_id.get(0);
				SortedMap<Object, Object> map = new TreeMap();
                JSONArray appid = result_xml.getJSONArray("appid");
                JSONArray mchid = result_xml.getJSONArray("mch_id");
                JSONArray nonce_str = result_xml.getJSONArray("nonce_str");
                SortedMap<Object, Object> mapReturn = new TreeMap();

                map.put("appid", appid.get(0));
                map.put("noncestr",nonce_str.get(0));
                map.put("partnerid", mchid.get(0));
                map.put("prepayid",prepayId );
                map.put("timestamp", Long.toString(new Date().getTime()/1000L));
                mapReturn.putAll(map);//存放进要返回的map
                map.put("package", "Sign=WXPay");
                String paySign = WeiXinPayUtil.createSign(map).toUpperCase();//二次签名
                //返回map填充剩余数据
                mapReturn.put("packages", "Sign=WXPay");
                mapReturn.put("sign",paySign);

				log.info("返回给页面的map:" + map);
				ResultUtils.setCustomSuccessState(result, "微信统一订单下单成功");
				result.setResult(mapReturn);
		

 这里返回的package改为packages是因为前端使用的是集成的方式,接收我的数据,不做任何处理直接交给微信,所以他必须定义参数接收,但是参数定义不能是package,但是我做二次签名的还是用package做的, 返回改为packages

至于有大佬说微信签名等数据都要转成大写,我觉得没必要,我试过小写的sign也是可以调起微信的

 

展开阅读全文

没有更多推荐了,返回首页