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真的是少的可怜,开发起来都要从头到尾看一遍。看的是都以为自己是腾讯人员的开发人员一样,要从头到尾的来读你的源码。
下载电子回单接口调用问题[以解决]最近对接这个批量转账到零钱的文档,其他的接口都对接好了卡在了这个 下载电子回单接口 问题描述: 我对接的这些接口都是通过一样的签名方式,但是就是这个接口一直返回 "code":"INVALID REQUEST","message":"错误的签名,导致验签失败" 我仔细看了这个接口的签名方式是正确的 文档描述这个接口的GET请求的URL是通过 查询转账电子回单 查询过来的down_url后面有带token参数 我签名的时候也是把这个参数都加上了的 就是过不了签名 请问有人之前碰到过一样的问题吗!!!
2021-12-18package 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真的是少的可怜,开发起来都要从头到尾看一遍。看的是都以为自己是腾讯人员的开发人员一样,要从头到尾的来读你的源码。
下载电子回单API 签名成功,status code = 200,但是没有文件流?https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transfer_partner/chapter4_3.shtml 在下载电子回单API 中,接口状态 status code = 200,但是业务请求400是什么原因呢?[图片]
2021-12-18