华为荣耀微信支付报错
来源:互联网 发布:ipad淘宝有微淘吗 编辑:程序博客网 时间:2024/04/27 13:55
今天遇到一个错误:华为荣耀无法调用微信支付,这是表面现象,在跑测试的过程中出现了报错。
java.lang.IllegalAccessError: Method 'void org.jdom2.ContentList.sort(java.util.Comparator)' implementing interface method 'void java.util.List.sort(java.util.Comparator)' is not public (declaration of 'org.jdom2.ContentList' appears in /data/data/com.yours/files/instant-run/dex/slice-jdom-2.0.2_014ee80a44c7c143027968a0496d006fe2a71ca2-classes.dex)
首先说明一点的是微信支付回传的带有预支付ID的微信XML在Android端我是用SAX解析的,类似如下代码:
StringReader read = new StringReader(entity); InputSource source = new InputSource(read); SAXBuilder sb = new SAXBuilder(); try { Document doc = sb.build(source); Element weixin = doc.getRootElement(); } catch (Exception e) { }
我不知道这样是不是很low,但是的确这样的编码抗了一阵线上生产。
到了这个新项目,一切本来很好,但是一个偶然发现了问题,就是华为荣耀系列测试机。之前三星系列和华为其他系列包括小米的各种系列都是没有问题的。
我生成的是正式的Android签名包,所以从报错信息来看是在Android的dex文件中解析XML的jdom底层方法出现了无法访问的限制(is not public)。
不过项目面临上线,也没有多考虑,直接换成了Dom解析。代码如下:
InputStream in = new ByteArrayInputStream(entity.getBytes());DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();org.w3c.dom.Document document = builder.parse(in);NodeList weixinList = document.getElementsByTagName("weixin");
然后循环迭代weixinList,分别获取需要的字段信息:
Node weixinNode = weixinList.item(0);if (weixinNode != null) { NodeList weixinChilds = weixinNode.getChildNodes(); for (int j = 0; j < weixinChilds.getLength(); j++) { Node childNode = weixinChilds.item(j); if ("appid".equals(childNode.getNodeName())) { appid = childNode.getTextContent(); } else if ("partnerid".equals(childNode.getNodeName())) { partnerid = childNode.getTextContent(); } else if ("prepayid".equals(childNode.getNodeName())) { prepayId = childNode.getTextContent(); } else if ("package".equals(childNode.getNodeName())) { packageValue = childNode.getTextContent(); } else if ("noncestr".equals(childNode.getNodeName())) { nonceStr = childNode.getTextContent(); } else if ("timestamp".equals(childNode.getNodeName())) { timeStamp = childNode.getTextContent(); } else if ("sign".equals(childNode.getNodeName())) { sign = childNode.getTextContent(); }}
令我汗颜的是没有深入追究这个问题的产生原因,这可能要了解jdom的源码以及其与Android底层调用的关系,我只是用一个解决方案替代之前的方案,掩盖了一个问题,因为时间有限,所以先在此记录,后续要深入追究这个问题。Dom解决方案我在小米、三星和所有的华为系列进行了复测,都没有问题,网友可以放心使用Dom解析方式在Android中拆解XML。
感谢你能看到这里,也抱歉一声没有给出原理层的解决方案。后续加油了。
阅读全文
0 0
- 华为荣耀微信支付报错
- 关于微信支付报错
- 微信支付 常见报错
- 微信支付 常见报错
- 微信支付报错:解析失败
- 微信支付 常见报错
- 微信支付报错:解析失败
- 微信支付 常见报错
- 运行微信支付报错
- 微信支付报错“支付签名验证失败”
- 微信支付SDKDEMO运行编译报错
- php 微信支付sdk报错解决办法
- ios 运行微信支付demo报错
- 微信支付SDKDEMO运行编译报错
- 微信支付,报invalid out_trade_no错误
- 华为荣耀
- iOS 支付宝和微信集成时,用真机编译通过,用模拟器编译报错
- ios 微信支付官方demo编译报错的解决办法
- iOS编程学习十四
- 为什么选择Spring Boot作为微服务的入门级微框架
- c语言编写完数的代码
- 【经验】Windows 安装 Redis服务
- Vjudge-140555(E)--CF(371C)
- 华为荣耀微信支付报错
- 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备
- jquery live() delegate() on() 事件委托的一些区别
- HTTP协议详解
- Web系统大规模并发——电商秒杀与抢购
- RemotingException: “All pipe instances are busy.” or “The system cannot find the file specified.” ★★
- bzoj 4546: codechef XRQRS 可持久化trie
- 信息增益 IG
- 小时候玩的猜数字游戏,原来程序这么简单