小程序
小游戏
企业微信
微信支付
扫描小程序码分享
https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transfer_partner/chapter4_3.shtml
在下载电子回单API 中,接口状态 status code = 200,但是业务请求400是什么原因呢?
4 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
建议您前往微信支付APIV3文档, 点击右下角‘技术咨询’实时寻求技术帮助。
请注意在线技术支持的在线时间:工作日 10:00-12:00;14:00-18:00
若您的问题得到解决,请回社区晒出解决方案,以帮助更多遇到此问题的人,感谢您的支持~
在线咨询主要解决微信支付接口的技术类问题,比如调用接口报错等问题,如遇非此类问题请寻找其他更合适的方式咨询哈。
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
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真的是少的可怜,开发起来都要从头到尾看一遍。看的是都以为自己是腾讯人员的开发人员一样,要从头到尾的来读你的源码。
大佬,你解决了嘛?
根据wechatpay-apache-httpclient里面的方式来下载的,出现来相同的情况,官方能不能给个排查过程???
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
建议您前往微信支付APIV3文档, 点击右下角‘技术咨询’实时寻求技术帮助。
请注意在线技术支持的在线时间:工作日 10:00-12:00;14:00-18:00
若您的问题得到解决,请回社区晒出解决方案,以帮助更多遇到此问题的人,感谢您的支持~
在线咨询主要解决微信支付接口的技术类问题,比如调用接口报错等问题,如遇非此类问题请寻找其他更合适的方式咨询哈。
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真的是少的可怜,开发起来都要从头到尾看一遍。看的是都以为自己是腾讯人员的开发人员一样,要从头到尾的来读你的源码。
大佬,你解决了嘛?
根据wechatpay-apache-httpclient里面的方式来下载的,出现来相同的情况,官方能不能给个排查过程???