华为荣耀微信支付报错

今天遇到一个错误:华为荣耀无法调用微信支付,这是表面现象,在跑测试的过程中出现了报错。

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。

感谢你能看到这里,也抱歉一声没有给出原理层的解决方案。后续加油了。

<think>好的,用户遇到了白屏和Uncaught TypeError的问题,需要解决。首先,我要分析错误信息。主要的错误是“Cannot read property 'sendBeacon' of undefined”,还有提到createInstanceContext失败。这可能是因为某个对象未定义就调用其方法。 根据提供的引用,类似的问题比如引用[2]提到荣耀机白屏是因为组件属性未正确定义,导致访问undefined的name属性。引用[3]则是node版本过高导致的问题。所以首先应该检查代码中是否有访问未定义对象属性的情况,特别是在生命周期钩子或API调用中。 接下来,用户提到eportJSException,可能是指reportJSException,这通常是在小程序运行时的JavaScript异常。需要检查是否有在组件或页面加载时未正确初始化变量。例如,可能在onLoad或attached生命周期阶段访问了还未初始化的数据。 另外,错误信息中的sendBeacon可能涉及navigator.sendBeacon方法,但在小程序环境中,这个方法可能不可用或者需要特定的权限。需要确认是否在小程序中误用了浏览器特有的API,导致undefined错误。 解决方案可能包括:检查所有可能调用sendBeacon的地方,确保对象存在;检查组件的properties和data是否正确初始化;降级node版本到稳定版,如引用[3]所述;更新依赖库,引用[4]提到修改vendor.js,可能涉及第三方库的兼容性问题。 还需要检查小程序的基础库版本是否过低,导致某些API不支持。更新开发者工具和基础库版本可能解决兼容性问题。此外,真机调试和日志输出可以帮助定位具体出错的位置,尤其是在荣耀机上复现问题,引用[2]的例子说明不同机型可能有不同的严格检查机制。 最后,建议用户分步骤排查:代码审查、环境检查、依赖更新、真机测试,逐步缩小问题范围,找到根本原因。</think>### 白屏与`Uncaught TypeError: Cannot read property 'sendBeacon' of undefined`问题解析与解决方案 #### **问题原因分析** 1. **对象未定义直接调用属性/方法** - 错误`Cannot read property 'sendBeacon' of undefined`表明代码中尝试访问`undefined`对象的`sendBeacon`属性,通常由以下原因导致: - 未正确初始化对象(如`navigator`相关API在小程序中未支持)。 - 异步操作中未处理变量未定义的情况。 - 第三方库未正确引入或版本不兼容[^2][^4]。 2. **组件生命周期与数据初始化问题** - 类似荣耀机型白屏问题,可能是组件`properties`或`data`未正确定义,导致组件加载时读取未定义的属性[^2]。 3. **运行环境兼容性问题** - Node.js版本过高可能引发依赖库兼容性问题(如报错`Cannot read properties of undefined (reading 'modules')`)[^3]。 - 小程序基础库版本过低可能导致API未实现。 --- #### **分步解决方案** 1. **定位错误源头** - 通过微信开发者工具的**真机调试**和**Sources面板**查看完整错误堆栈,确认错误发生的具体文件和代码行。 - 检查是否在小程序中调用了浏览器专有API(如`navigator.sendBeacon`),替换为小程序支持的API(如`wx.request`)[^4]。 2. **检查组件与数据初始化** - 在`Component`或`Page`中,确保所有`properties`和`data`已正确定义: ```javascript Component({ properties: { // 显式定义属性类型和默认值 appName: { type: String, value: 'defaultName' } }, data: { userInfo: {} // 避免访问未初始化的对象 } }) ``` 3. **处理异步操作中的未定义风险** - 使用可选链操作符(`?.`)或条件判断避免访问未定义对象: ```javascript // 使用可选链 const beacon = navigator?.sendBeacon(url, data); // 条件判断 if (navigator && navigator.sendBeacon) { navigator.sendBeacon(url, data); } ``` 4. **降级Node.js版本与更新依赖** - 若错误与构建工具相关(如`npm run dev`报错),将Node.js版本降级至LTS版本(如v18.x)[^3]: ```bash nvm install 18.18.2 nvm use 18.18.2 ``` - 更新第三方库(如`jsencrypt`)至兼容版本,参考社区修复方案修改`vendor.js`。 5. **更新开发者工具与基础库** - 确保微信开发者工具为最新版本。 - 在`app.json`中指定最低基础库版本(如`"libVersion": "2.25.0"`)。 --- #### **验证与测试** 1. **本地模拟测试** - 使用开发者工具的**模拟器**验证基础功能是否正常。 2. **多机型真机测试** - 在荣耀、华为等易现问题的机型上复测,观察白屏是否消失[^2]。 3. **监控与日志** - 通过`wx.onError`捕获全局错误,记录到后台分析: ```javascript wx.onError((error) => { console.error('全局错误:', error); wx.request({ url: 'https://api.example.com/log', data: { error } }); }); ``` --- #### **相关技术点** - **小程序生命周期与异步加载** - `onLoad`阶段避免同步访问未初始化的数据,使用`Promise`或`async/await`管理异步流程。 - **环境差异处理** - 使用`wx.getSystemInfo`判断运行环境,动态调整API调用逻辑。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值