收藏
回答

图片上传接口构建签名串计算的签名无法通过签名校验 ,反而不按照文档构建的签名串计算的签名值能通过?

POST\n
/v3/marketing/favor/media/image-upload\n
1739854234\n
aa3ea8f02276438b90a63cfeea0d5c56\n\n


这个签名串计算出的签名值能通过签名校验

POST\n
/v3/marketing/favor/media/image-upload\n
1739854337\n
b08f3dcc57664f308d76615e17766826\n
{"filename":"50d23bdcab1242b68f49e64d41439844.png","sha256":"cfbf7c2a60d18cb397b3ff8155abb04271aea8361feb55ec1a59d76adcdc53b9"}\n

这个按照文档中给的签名串构建计算出的签名通过不了签名校验

{"code":"SIGN_ERROR","detail":{"detail":{"issue":"sign not match"},"field":"signature","location":"authorization","sign_information":{"method":"POST","sign_message_length":89,"truncated_sign_message":"POST\n/v3/marketing/favor/media/image-upload\n1739854337\nb08f3dcc57664f308d76615e17766826\n\n","url":"/v3/marketing/favor/media/image-upload"}},"message":"错误的签名,验签失败"}


  //计算文件摘要
        String sha256 = DigestUtils.sha256Hex(imageBytes);
        System.out.println("SHA-256: " + sha256);
        //构建签名串
        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
        String nonceStr = UUID.randomUUID().toString().replaceAll("-", "");
        Map<String, String> dataMap = new HashMap<>();
        dataMap.put("filename", newFileName);
        dataMap.put("sha256",sha256);
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonBody = objectMapper.writeValueAsString(dataMap); 
        System.out.println("jsonBody:"+jsonBody.toString());
        //生成签名串signatureStr
        String signatureStr = buileSignature("POST",apiurl,timestamp,nonceStr,jsonBody);
//        String signatureStr = buileSignature("POST",apiurl,timestamp,nonceStr);
        System.out.println("signatureStr:"+signatureStr);
        //计算签名值
        String sign = createSign(signatureStr);
        System.out.println("sign:"+sign);

        //构造Authorization
        String authorization = String.format("WECHATPAY2-SHA256-RSA2048 mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%s\",serial_no=\"%s\",signature=\"%s\"",
                mchId,
                nonceStr,
                timestamp,
                certSerialNo,  // 证书序列号
                sign);
回答关注问题邀请回答
收藏

1 个回答

  • 北望沣渭
    北望沣渭
    星期二 15:38
    按照规范,jsonBody.toString() 是要通过multipart/form-data 里的 meta 字段发给服务端,你这个有没有发呢?
    
    星期二 15:38
    有用
    回复 2
    • 晓
      发表于移动端
      星期二 15:45
      有发送,谢谢大佬的回答,目前解决了,好像是因为我是用的hutool的工具发送的请求,我改成了用okhttp那个工具发送了。但是这个还有个问题,就是计算签名值得时候不加那个filename和sha256的值才能验签成功,会不会是文档的问题
      星期二 15:45
      回复
    • 北望沣渭
      北望沣渭
      星期二 15:56回复
      文档没问题,是需要显式声明,如下图,或看在线PHP示例文档 https://wechatpay.im/openapi/v3/marketing/favor/media/image-upload
      星期二 15:56
      回复
登录 后发表内容