diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/AbstractApi.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/AbstractApi.java index 50615ec..64c34c8 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/AbstractApi.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/AbstractApi.java @@ -27,6 +27,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; @@ -89,7 +90,7 @@ public abstract class AbstractApi { */ private void applyObjectMapper(ObjectMapper mapper) { mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) // empty string error .configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true) .setSerializationInclusion(JsonInclude.Include.NON_NULL) @@ -217,13 +218,15 @@ public abstract class AbstractApi { throw new PayException("wechat app pay json failed"); } } + /** - * 对账单内容下载,非流文件。 + * 对账单CSV内容下载,非流文件。 * * @param link the link * @return 对账单内容 ,有可能为空字符 “” + * @see AbstractApi#billResource(String) */ - protected String billDownload(String link) { + protected String billCsvDownload(String link) { return this.client().withType(WechatPayV3Type.FILE_DOWNLOAD, link) .function((type, downloadUrl) -> { URI uri = UriComponentsBuilder.fromHttpUrl(downloadUrl) @@ -234,22 +237,6 @@ public abstract class AbstractApi { .download(); } - /** - * 对账单下载,流文件。 - * - * @param link the link - * @return response entity - */ - protected ResponseEntity billResource(String link) { - return this.client().withType(WechatPayV3Type.FILE_DOWNLOAD, link) - .function((type, downloadUrl) -> { - URI uri = UriComponentsBuilder.fromHttpUrl(downloadUrl) - .build() - .toUri(); - return Get(uri); - }) - .resource(); - } /** * 申请交易账单API @@ -267,7 +254,9 @@ public abstract class AbstractApi { * @param tradeBillParams tradeBillParams * @since 1.0.3.RELEASE */ - public final void downloadTradeBill(TradeBillParams tradeBillParams) { + public ResponseEntity downloadTradeBill(TradeBillParams tradeBillParams) { + WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); + this.client().withType(WechatPayV3Type.TRADEBILL, tradeBillParams) .function((wechatPayV3Type, params) -> { MultiValueMap queryParams = new LinkedMultiValueMap<>(); @@ -291,8 +280,12 @@ public abstract class AbstractApi { .build().toUri(); return Get(uri); }) - .consumer(response -> this.billDownload(Objects.requireNonNull(response.getBody()).get("download_url").asText())) + .consumer(wechatResponseEntity::convert) .request(); + String downloadUrl = Objects.requireNonNull(wechatResponseEntity.getBody()) + .get("download_url") + .asText(); + return this.billResource(downloadUrl); } /** @@ -309,7 +302,8 @@ public abstract class AbstractApi { * @param fundFlowBillParams fundFlowBillParams * @since 1.0.3.RELEASE */ - public final void downloadFundFlowBill(FundFlowBillParams fundFlowBillParams) { + public ResponseEntity downloadFundFlowBill(FundFlowBillParams fundFlowBillParams) { + WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); this.client().withType(WechatPayV3Type.FUNDFLOWBILL, fundFlowBillParams) .function((wechatPayV3Type, params) -> { MultiValueMap queryParams = new LinkedMultiValueMap<>(); @@ -328,7 +322,29 @@ public abstract class AbstractApi { .build().toUri(); return Get(uri); }) - .consumer(response -> this.billDownload(Objects.requireNonNull(response.getBody()).get("download_url").asText())) + .consumer(wechatResponseEntity::convert) .request(); + String downloadUrl = Objects.requireNonNull(wechatResponseEntity.getBody()) + .get("download_url") + .asText(); + return this.billResource(downloadUrl); + } + + + /** + * 对账单下载,流文件。 + * + * @param link the link + * @return response entity + */ + protected ResponseEntity billResource(String link) { + return this.client().withType(WechatPayV3Type.FILE_DOWNLOAD, link) + .function((type, downloadUrl) -> { + URI uri = UriComponentsBuilder.fromHttpUrl(downloadUrl) + .build() + .toUri(); + return Get(uri); + }) + .resource(); } } diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatDirectPayApi.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatDirectPayApi.java index 7467dfe..bab1ce0 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatDirectPayApi.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatDirectPayApi.java @@ -87,7 +87,7 @@ public class WechatDirectPayApi extends AbstractApi { .toString() .replaceAll("-", ""); String prepayId = body.get("prepay_id").asText(); - String paySign = signatureProvider.doRequestSign(true,privateKey, appId, timestamp, nonceStr, prepayId); + String paySign = signatureProvider.doRequestSign(true, privateKey, appId, timestamp, nonceStr, prepayId); String mchId = wechatMetaBean.getV3().getMchId(); body.put("appid", appId); @@ -136,7 +136,7 @@ public class WechatDirectPayApi extends AbstractApi { .toString() .replaceAll("-", ""); String packageStr = "prepay_id=" + body.get("prepay_id").asText(); - String paySign = signatureProvider.doRequestSign(true,privateKey, appId, timestamp, nonceStr, packageStr); + String paySign = signatureProvider.doRequestSign(true, privateKey, appId, timestamp, nonceStr, packageStr); body.put("appId", appId); body.put("timeStamp", timestamp); diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatMarketingFavorApi.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatMarketingFavorApi.java index 87d63fe..6f27922 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatMarketingFavorApi.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatMarketingFavorApi.java @@ -493,7 +493,7 @@ public class WechatMarketingFavorApi extends AbstractApi { * * @param stockId the stock id * @return the wechat response entity - * @see AbstractApi#billDownload(String) AbstractApi#billDownload(String)对账单下载api + * @see AbstractApi#billCsvDownload(String) AbstractApi#billDownload(String)对账单下载api */ public WechatResponseEntity downloadStockUseFlow(String stockId) { WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); @@ -501,7 +501,7 @@ public class WechatMarketingFavorApi extends AbstractApi { .function(this::downloadFlowFunction) .consumer(wechatResponseEntity::convert) .request(); - String csv = this.billDownload(wechatResponseEntity.getBody().get("url").asText()); + String csv = this.billCsvDownload(wechatResponseEntity.getBody().get("url").asText()); wechatResponseEntity.getBody().put("csv", csv); return wechatResponseEntity; } @@ -515,7 +515,7 @@ public class WechatMarketingFavorApi extends AbstractApi { * * @param stockId the stock id * @return the wechat response entity - * @see AbstractApi#billDownload(String) AbstractApi#billDownload(String)对账单下载api + * @see AbstractApi#billCsvDownload(String) AbstractApi#billDownload(String)对账单下载api */ public WechatResponseEntity downloadStockRefundFlow(String stockId) { WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); @@ -523,7 +523,7 @@ public class WechatMarketingFavorApi extends AbstractApi { .function(this::downloadFlowFunction) .consumer(wechatResponseEntity::convert) .request(); - String csv = this.billDownload(wechatResponseEntity.getBody().get("url").asText()); + String csv = this.billCsvDownload(wechatResponseEntity.getBody().get("url").asText()); wechatResponseEntity.getBody().put("csv", csv); return wechatResponseEntity; }