收藏
回答

下载电子回单API 签名成功,status code = 200,但是没有文件流?

https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transfer_partner/chapter4_3.shtml

在下载电子回单API 中,接口状态 status code = 200,但是业务请求400是什么原因呢?

回答关注问题邀请回答
收藏

4 个回答

  • 支付社区运营
    支付社区运营
    2021-01-14

    建议您前往微信支付APIV3文档, 点击右下角‘技术咨询’实时寻求技术帮助。

    请注意在线技术支持的在线时间:工作日 10:00-12:00;14:00-18:00

    若您的问题得到解决,请回社区晒出解决方案,以帮助更多遇到此问题的人,感谢您的支持~

    在线咨询主要解决微信支付接口的技术类问题,比如调用接口报错等问题,如遇非此类问题请寻找其他更合适的方式咨询哈。


    2021-01-14
    有用
    回复
  • zkinghao
    zkinghao
    2021-12-18
    package com.util;
    
    import cn.hutool.http.HttpRequest;
    import cn.hutool.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    
    import java.io.InputStream;
    import java.security.PrivateKey;
    import java.security.Signature;
    import java.util.Base64;
    import java.util.UUID;
    
    /**
     * @Author zkinghao
     * @Date 2021/12/18 17:50
     */
    public class DownLoadBillUtil {
        //商户号
        private String merchantId;
        //商户序列号
        private String certificateSerialNo;
        //商户私钥
        private PrivateKey privateKey;
    
        public DownLoadBillUtil(String merchantId, String certificateSerialNo, PrivateKey privateKey){
            this.merchantId = merchantId;
            this.certificateSerialNo = certificateSerialNo;
            this.privateKey = privateKey;
        }
    
        public InputStream downloadBill(String downloadUrl) throws Exception{
            String timestamp = String.valueOf(System.currentTimeMillis());
            String nonceStr =  UUID.randomUUID().toString().replace("-", "");;
            HttpGet httpGet = new HttpGet(downloadUrl);
            String path = httpGet.getURI().getPath();
            String canonicalUrl = httpGet.getURI().getQuery();
            if (canonicalUrl != null) {
                path += "?" + canonicalUrl;
            }
            String billSign = this.createBillSign(nonceStr, timestamp, path);
            StringBuilder sb = new StringBuilder("WECHATPAY2-SHA256-RSA2048 mchid=").append("\"").append(this.merchantId).append("\",");
            sb.append("serial_no=").append("\"").append(this.certificateSerialNo).append("\",");
            sb.append("nonce_str=").append("\"").append(nonceStr).append("\",");
            sb.append("timestamp=").append("\"").append(timestamp).append("\",");
            sb.append("signature=").append("\"").append(billSign).append("\"");
            String auth = sb.toString();
            HttpResponse execute = HttpRequest.get(downloadUrl).auth(auth).execute();
            return execute.bodyStream();
        }
    
        public String createBillSign(String nonceStr, String timestamp, String download) throws Exception{
            String plain_text =  "GET" + "\n"
                    + download + "\n"
                    + timestamp + "\n"
                    + nonceStr + "\n";
            Signature sign = Signature.getInstance("SHA256withRSA");
            sign.initSign(this.privateKey);
            sign.update(plain_text.getBytes("utf-8"));
            return Base64.getEncoder().encodeToString(sign.sign());
        }
    }
    



    这是我写的工具源码,downloadUrl是你获取到的下载地址,你用我的这个工具,就可以获取到流了,这个流你要存本地还是存oss都是可以的。

    官方文档写的根本就没有代码,只有一个postman的脚本,还是我自己看脚本,然后看规则,然后自己抓包来看那个Authorization在来自己写一个没有脚本的postman调试出来的,问技术基本也是没有回过声的,

    真的,没有文档的东西,开发起来,真的是让人疲惫,耗时间,希望后面的人可以不要踩坑了。也希望微信能好好更新文档,弄的更通俗易懂,V3版本的demo真的是少的可怜,开发起来都要从头到尾看一遍。看的是都以为自己是腾讯人员的开发人员一样,要从头到尾的来读你的源码。

    2021-12-18
    有用 1
    回复 1
    • 勇敢牛牛
      勇敢牛牛
      2022-07-19
      今天我研究了一天,感谢大佬的工具类,已经成功拿到文件了。下午问了客服,他说签名最后不要换行符号,结果根本和这个没关系
      2022-07-19
      回复
  • Haku
    Haku
    2021-12-08

    大佬,你解决了嘛?

    2021-12-08
    有用
    回复
  • 咚咚锵
    咚咚锵
    2021-04-02

    根据wechatpay-apache-httpclient里面的方式来下载的,出现来相同的情况,官方能不能给个排查过程???

    2021-04-02
    有用
    回复
登录 后发表内容
问题标签