Android Studio发送签名时报Value <br无法转JSONObject错误如何解决
问题根源
你直接将byte[]类型的原始签名字节存入JSONObject,而JSON本身不支持原始字节数组类型,Volley序列化JSON时会生成不可预期的乱码内容,导致PHP端接收参数解析异常,输出了带<br>标签的HTML格式报错,Android端收到非JSON结构的返回就触发了类型转换错误。
修复方案
因为二进制内容无法直接在JSON中安全传输,所以需要通过Base64编码将字节转为可传输的字符串,两端分别做编解码处理即可:
1. Android端修改
将生成的signature字节数组转Base64字符串后再存入JSONObject:
// 生成signature字节数组后的代码修改 try { object2.put("id", data); object2.put("key", key); // 新增:字节转Base64字符串,NO_WRAP避免生成多余换行符 String signatureStr = android.util.Base64.encodeToString(signature, android.util.Base64.NO_WRAP); object2.put("signature", signatureStr); } catch (Exception e) { Log.d("ID_DEBUG","Error"); e.printStackTrace(); }
2. PHP端修改
收到签名参数后先做Base64解码,还原为原始字节再做校验,不需要改动原有校验逻辑:
$key=$_POST['key']; $signature=$_POST['signature']; // 新增:Base64解码还原原始签名字节 $signature = base64_decode($signature); $pubkeyid = openssl_pkey_get_public($key); // 原有openssl_verify逻辑保持不变
注意事项
- 确保Android端Base64编码使用
NO_WRAP参数,避免自动添加的换行符导致两端内容不一致 - 如果校验仍然失败,可以分别打印Android端编码后的签名串、PHP端收到的签名串,确认传输过程中内容没有被截断或篡改
内容的提问来源于stack exchange,提问作者Sierra
相关产品推荐
相关产品推荐

