29、Android 微信分享checkArgs fail, thumbData is invalid

本文介绍了解决微信分享功能中缩略图过大导致的问题。通过对缩略图大小进行限制并在分享前压缩图片,成功避免了“thumbDataisinvalid”错误。

一、问题现象


在做微信分享功能时,分享网页加缩略图时,点击分享一直没反应。经过查看日志

checkArgs fail, thumbData is invalid  出现这样的一个错误提示。


二、原因分析


经过百度一番:原来微信对缩略图的大小进行了限制。超过32K 就会报参数错误!

 final boolean checkArgs() {
        if(this.getType() != 8 || this.thumbData != null && this.thumbData.length != 0) {
            if(this.getType() == 36 && (this.thumbData == null || this.thumbData.length > 131072)) {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, thumbData should not be null or exceed 128kb");
                return false;
            } else if(this.getType() != 36 && this.thumbData != null && this.thumbData.length > '耀') {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, thumbData is invalid");
                return false;
            } else if(this.title != null && this.title.length() > 512) {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, title is invalid");
                return false;
            } else if(this.description != null && this.description.length() > 1024) {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, description is invalid");
                return false;
            } else if(this.mediaObject == null) {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, mediaObject is null");
                return false;
            } else if(this.mediaTagName != null && this.mediaTagName.length() > 64) {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, mediaTagName is too long");
                return false;
            } else if(this.messageAction != null && this.messageAction.length() > 2048) {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, messageAction is too long");
                return false;
            } else if(this.messageExt != null && this.messageExt.length() > 2048) {
                Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, messageExt is too long");
                return false;
            } else {
                return this.mediaObject.checkArgs();
            }
        } else {
            Log.e("MicroMsg.SDK.WXMediaMessage", "checkArgs fail, thumbData should not be null when send emoji");
            return false;
        }
    }

三、解决方法

修改微信提供的方法:

 public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }

        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

使用这个方法:注意要是还是不行 ----》 将100 调小!!! 至10 试试
 localBitmap.compress(Bitmap.CompressFormat.JPEG, 100,
                    localByteArrayOutputStream);

public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        int i;
        int j;
        if (bmp.getHeight() > bmp.getWidth()) {
            i = bmp.getWidth();
            j = bmp.getWidth();
        }  else {
            i = bmp.getHeight();
            j = bmp.getHeight();
        }

        Bitmap localBitmap = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565);
        Canvas localCanvas =  new Canvas(localBitmap);

        while ( true) {
            localCanvas.drawBitmap(bmp,  new Rect(0, 0, i, j),  new Rect(0, 0,i, j),  null);
            if (needRecycle)
                bmp.recycle();
            ByteArrayOutputStream localByteArrayOutputStream =  new ByteArrayOutputStream();
            localBitmap.compress(Bitmap.CompressFormat.JPEG, 100,
                    localByteArrayOutputStream);
            localBitmap.recycle();
            byte[] arrayOfByte = localByteArrayOutputStream.toByteArray();
            try {
                localByteArrayOutputStream.close();
                return arrayOfByte;
            }  catch (Exception e) {
                // F.out(e);
            }
            i = bmp.getHeight();
            j = bmp.getHeight();
        }
    }




### 微信分享 `config:fail` 和 `invalid signature` 错误解决方案 #### 一、错误原因分析 当遇到微信 JS-SDK 调用失败并显示 `config:fail, invalid signature` 或者仅 `invalid signature` 的情况时,通常是因为签名验证未通过。这可能是由以下几个因素引起的: 1. **时间戳和随机字符串不匹配** 如果服务器端生成的时间戳或随机字符串与前端使用的不同,则会导致签名计算的基础数据差异,从而造成签名校验失败。 2. **URL 不正确** URL 参数中的协议(http/https)、域名大小写敏感度以及路径参数都需严格对应实际请求地址;任何细微差别都会影响最终的签名结果[^1]。 3. **AppID 配置问题** 确认配置项内的 AppID 是否同用于获取 JsapiTicket 的 AppID 完全相同。如果两者不符,在调用接口前即使其他条件均满足也无法完成有效的身份认证过程[^5]。 4. **JsapiTicket 获取异常** 若因网络波动或其他不可控因素导致无法正常取得最新的 jsapi_ticket ,则基于过期票据所构建出来的签名自然也是失效状态。 5. **缓存机制干扰** 浏览器本地存储可能存在旧版本的数据残留现象,特别是对于某些特定用户的环境而言更为明显。尝试更换账户登录可以排除此类可能性[^4]。 #### 二、具体解决方法 针对上述提到的各种潜在诱因,可采取如下措施来逐一排查直至找到根本所在: ##### 1. 时间戳同步处理 确保前后两端采用统一标准的时间源,并且允许一定范围内的误差容忍度(如 ±5 分钟)。可以通过 API 接口返回当前服务端时刻给客户端作为参照依据之一。 ##### 2. 正确拼接 URL 字符串 仔细核对参与签名运算的目标链接是否精确无误地反映了浏览器地址栏内展示的内容,包括但不限于查询参数部分。注意去除不必要的空格字符以免引起混淆。 ##### 3. 双重检验 AppID 合法性 不仅要在初始化阶段认真比对两个位置上的应用标识码,而且在整个业务流程里也要保持一致性检查习惯,防止中途被篡改替换掉原始设定值。 ##### 4. 更新 JsapiTicket 缓存策略 定期刷新 ticket 数据库记录的同时也应适当缩短其有效期限,减少由于长时间不变而导致的安全风险隐患。另外还需考虑加入超时重试逻辑应对偶尔发生的瞬态故障场景。 ##### 5. 清除用户侧缓存文件 指导受影响个体清理个人设备上保存的历史访问痕迹,比如 cookies、localStorage 等项目下的相关内容,以此消除历史遗留下来的不良影响因子。 ```javascript // JavaScript 实现清除 localStorage 示例代码 function clearLocalStorage() { window.localStorage.clear(); } ``` #### 三、预防措施建议 为了避免日后再次遭遇相似难题的发生概率,可以从优化内部架构设计角度出发制定一些长期性的改进计划: - 建立健壮的日志监控体系以便及时捕捉到每一次操作行为背后的细节变化趋势; - 对外提供详尽的技术文档说明帮助第三方开发者快速理解掌握接入要点难点; - 加强团队间沟通协作频率促进跨部门之间的资源共享和技术交流活动开展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值