diff --git a/service/README.md b/service/README.md index de4e088d..2f916356 100644 --- a/service/README.md +++ b/service/README.md @@ -31,3 +31,4 @@ | billdownload | 账单下载 |✔️|✔️| | ecommercesubsidy | 电商收付通补差 | |✔️| | ecommercerefund | 电商收付通退款 | |✔️| +| mchtransfer | 商家转账升级功能 |✔️|| diff --git a/service/src/example/java/com/wechat/pay/java/service/mchtransfer/MchTransferServiceExample.java b/service/src/example/java/com/wechat/pay/java/service/mchtransfer/MchTransferServiceExample.java new file mode 100644 index 00000000..e2ff590f --- /dev/null +++ b/service/src/example/java/com/wechat/pay/java/service/mchtransfer/MchTransferServiceExample.java @@ -0,0 +1,94 @@ +package com.wechat.pay.java.service.mchtransfer; + +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; +import com.wechat.pay.java.service.mchtransfer.model.*; + +/** MchTransferService使用示例 */ +public class MchTransferServiceExample { + + /** 商户号 */ + public static String merchantId = "190000****"; + + /** 商户API私钥路径 */ + public static String privateKeyPath = "/Users/yourname/your/path/apiclient_key.pem"; + + /** 商户证书序列号 */ + public static String merchantSerialNumber = "5157F09EFDC096DE15EBE81A47057A72********"; + + /** 商户APIV3密钥 */ + public static String apiV3Key = "..."; + + public static MchTransferService service; + + public static void main(String[] args) { + // 初始化商户配置 + Config config = + new RSAAutoCertificateConfig.Builder() + .merchantId(merchantId) + // 使用 com.wechat.pay.java.core.util + // 中的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 + .privateKeyFromPath(privateKeyPath) + .merchantSerialNumber(merchantSerialNumber) + .apiV3Key(apiV3Key) + .build(); + + // 初始化服务 + service = new MchTransferService.Builder().config(config).build(); + // ... 调用接口 + } + + /** 微信单号查询转账单 */ + public static TransferBillEntity getTransferBillByNo() { + GetTransferBillByNoRequest request = new GetTransferBillByNoRequest(); + return service.getTransferBillByNo(request); + } + + /** 商户单号查询转账单 */ + public static TransferBillEntity getTransferBillByOutNo() { + GetTransferBillByOutNoRequest request = new GetTransferBillByOutNoRequest(); + return service.getTransferBillByOutNo(request); + } + + /** 发起商家转账 */ + public static InitiateMchTransferResponse initiateMchTransfer() { + InitiateMchTransferRequest request = new InitiateMchTransferRequest(); + return service.initiateMchTransfer(request); + } + + /** 撤销商家转账 */ + public static CancelMchTransferResponse cancelMchTransfer() { + CancelMchTransferRequest request = new CancelMchTransferRequest(); + return service.cancelMchTransfer(request); + } + + /** 微信单号申请电子回单 */ + public static AcceptElecsignResponse acceptElecsignByNo() { + AcceptElecsignByNoRequest request = new AcceptElecsignByNoRequest(); + return service.acceptElecsignByNo(request); + } + + /** 微信单号查询电子回单 */ + public static ElecsignEntity queryElecsignByNo() { + QueryElecsignByNoRequest request = new QueryElecsignByNoRequest(); + return service.queryElecsignByNo(request); + } + + /** 商户单号申请电子回单 */ + public static AcceptElecsignResponse acceptElecsignByOutNo() { + AcceptElecsignByOutNoRequest request = new AcceptElecsignByOutNoRequest(); + return service.acceptElecsignByOutNo(request); + } + + /** 商户单号查询电子回单 */ + public static ElecsignEntity queryElecsignByOutNo() { + QueryElecsignByOutNoRequest request = new QueryElecsignByOutNoRequest(); + return service.queryElecsignByOutNo(request); + } + + /** 下载电子回单 */ + public static DigestElecsignEntity downloadElecsign() { + ElecsignEntity entity = queryElecsignByNo(); + return service.downloadElecsign(entity); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/MchTransferService.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/MchTransferService.java new file mode 100644 index 00000000..8bc6fd83 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/MchTransferService.java @@ -0,0 +1,386 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 商家转账支持微信商户向微信用户转账,为商户提供免费、安全的转账服务。支持集成到商家自有业务系统,需有研发能力可接入。 +// 商户需在用户收款流程中,拉起微信官方页面,由用户确认收款方式后方可成功转账,资金实时到账,转账成功的资金不支持退回。 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012711988](https://pay.weixin.qq.com/doc/v3/merchant/4012711988) +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer; + +import static com.wechat.pay.java.core.http.UrlEncoder.urlEncode; +import static com.wechat.pay.java.core.util.GsonUtil.toJson; +import static java.util.Objects.requireNonNull; + +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.cipher.PrivacyDecryptor; +import com.wechat.pay.java.core.cipher.PrivacyEncryptor; +import com.wechat.pay.java.core.exception.HttpException; +import com.wechat.pay.java.core.exception.MalformedMessageException; +import com.wechat.pay.java.core.exception.ServiceException; +import com.wechat.pay.java.core.exception.ValidationException; +import com.wechat.pay.java.core.http.*; +import com.wechat.pay.java.service.mchtransfer.model.*; +import java.io.InputStream; + +/** MchTransferService服务 */ +public class MchTransferService { + + private final HttpClient httpClient; + private final HostName hostName; + private final PrivacyEncryptor encryptor; + private final PrivacyDecryptor decryptor; + + private MchTransferService( + HttpClient httpClient, + HostName hostName, + PrivacyEncryptor encryptor, + PrivacyDecryptor decryptor) { + this.httpClient = requireNonNull(httpClient); + this.hostName = hostName; + this.encryptor = requireNonNull(encryptor); + this.decryptor = requireNonNull(decryptor); + } + + /** MchTransferService构造器 */ + public static class Builder { + + private HttpClient httpClient; + private HostName hostName; + private PrivacyEncryptor encryptor; + private PrivacyDecryptor decryptor; + + public MchTransferService.Builder config(Config config) { + this.httpClient = new DefaultHttpClientBuilder().config(config).build(); + this.encryptor = config.createEncryptor(); + this.decryptor = config.createDecryptor(); + return this; + } + + public MchTransferService.Builder hostName(HostName hostName) { + this.hostName = hostName; + return this; + } + + public MchTransferService.Builder httpClient(HttpClient httpClient) { + this.httpClient = httpClient; + return this; + } + + public MchTransferService.Builder encryptor(PrivacyEncryptor encryptor) { + this.encryptor = encryptor; + return this; + } + + public MchTransferService.Builder decryptor(PrivacyDecryptor decryptor) { + this.decryptor = decryptor; + return this; + } + + public MchTransferService build() { + return new MchTransferService(httpClient, hostName, encryptor, decryptor); + } + } + + /** + * 微信单号查询转账单 + * + * @param request 请求参数 + * @return TransferBillEntity + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public TransferBillEntity getTransferBillByNo(GetTransferBillByNoRequest request) { + String requestPath = + "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills/transfer-bill-no/{transfer_bill_no}"; + + // 添加 path param + requestPath = + requestPath.replace("{" + "transfer_bill_no" + "}", urlEncode(request.getTransferBillNo())); + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.GET) + .url(requestPath) + .headers(headers) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, TransferBillEntity.class); + return httpResponse.getServiceResponse().cloneWithCipher(decryptor::decrypt); + } + + /** + * 商户单号查询转账单 + * + * @param request 请求参数 + * @return TransferBillEntity + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public TransferBillEntity getTransferBillByOutNo(GetTransferBillByOutNoRequest request) { + String requestPath = + "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills/out-bill-no/{out_bill_no}"; + + // 添加 path param + requestPath = requestPath.replace("{" + "out_bill_no" + "}", urlEncode(request.getOutBillNo())); + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.GET) + .url(requestPath) + .headers(headers) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, TransferBillEntity.class); + return httpResponse.getServiceResponse().cloneWithCipher(decryptor::decrypt); + } + + /** + * 发起商家转账 + * + * @param request 请求参数 + * @return InitiateMchTransferResponse + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public InitiateMchTransferResponse initiateMchTransfer(InitiateMchTransferRequest request) { + String requestPath = "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills"; + + // 加密敏感信息 + InitiateMchTransferRequest realRequest = request.cloneWithCipher(encryptor::encrypt); + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.WECHAT_PAY_SERIAL, encryptor.getWechatpaySerial()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.POST) + .url(requestPath) + .headers(headers) + .body(createRequestBody(realRequest)) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, InitiateMchTransferResponse.class); + return httpResponse.getServiceResponse(); + } + + /** + * 撤销商家转账 + * + * @param request 请求参数 + * @return CancelMchTransferResponse + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public CancelMchTransferResponse cancelMchTransfer(CancelMchTransferRequest request) { + String requestPath = + "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills/out-bill-no/{out_bill_no}/cancel"; + + // 添加 path param + requestPath = requestPath.replace("{" + "out_bill_no" + "}", urlEncode(request.getOutBillNo())); + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.WECHAT_PAY_SERIAL, encryptor.getWechatpaySerial()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.POST) + .url(requestPath) + .headers(headers) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, CancelMchTransferResponse.class); + return httpResponse.getServiceResponse(); + } + + /** + * 微信单号申请电子回单 + * + * @param request 请求参数 + * @return AcceptElecsignResponse + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public AcceptElecsignResponse acceptElecsignByNo(AcceptElecsignByNoRequest request) { + String requestPath = + "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/elecsign/transfer-bill-no"; + + AcceptElecsignByNoRequest realRequest = request; + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.WECHAT_PAY_SERIAL, encryptor.getWechatpaySerial()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.POST) + .url(requestPath) + .headers(headers) + .body(createRequestBody(realRequest)) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, AcceptElecsignResponse.class); + return httpResponse.getServiceResponse(); + } + + /** + * 微信单号查询电子回单 + * + * @param request 请求参数 + * @return ElecsignEntity + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public ElecsignEntity queryElecsignByNo(QueryElecsignByNoRequest request) { + String requestPath = + "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/elecsign/transfer-bill-no/{transfer_bill_no}"; + + // 添加 path param + requestPath = + requestPath.replace("{" + "transfer_bill_no" + "}", urlEncode(request.getTransferBillNo())); + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.GET) + .url(requestPath) + .headers(headers) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, ElecsignEntity.class); + return httpResponse.getServiceResponse(); + } + + /** + * 商户单号申请电子回单 + * + * @param request 请求参数 + * @return AcceptElecsignResponse + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public AcceptElecsignResponse acceptElecsignByOutNo(AcceptElecsignByOutNoRequest request) { + String requestPath = + "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/elecsign/out-bill-no"; + + AcceptElecsignByOutNoRequest realRequest = request; + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.WECHAT_PAY_SERIAL, encryptor.getWechatpaySerial()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.POST) + .url(requestPath) + .headers(headers) + .body(createRequestBody(realRequest)) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, AcceptElecsignResponse.class); + return httpResponse.getServiceResponse(); + } + + /** + * 商户单号查询电子回单 + * + * @param request 请求参数 + * @return ElecsignEntity + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public ElecsignEntity queryElecsignByOutNo(QueryElecsignByOutNoRequest request) { + String requestPath = + "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/elecsign/out-bill-no/{out_bill_no}"; + + // 添加 path param + requestPath = requestPath.replace("{" + "out_bill_no" + "}", urlEncode(request.getOutBillNo())); + + if (this.hostName != null) { + requestPath = requestPath.replaceFirst(HostName.API.getValue(), hostName.getValue()); + } + HttpHeaders headers = new HttpHeaders(); + headers.addHeader(Constant.ACCEPT, MediaType.APPLICATION_JSON.getValue()); + headers.addHeader(Constant.CONTENT_TYPE, MediaType.APPLICATION_JSON.getValue()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.GET) + .url(requestPath) + .headers(headers) + .build(); + HttpResponse httpResponse = + httpClient.execute(httpRequest, ElecsignEntity.class); + return httpResponse.getServiceResponse(); + } + + /** + * 下载电子回单。从 DigestElecsignEntity 得到电子回单的流,应在消费完后验证摘要。 + * + * @param entity 电子回单Entity + * @return DigestElecsignEntity + * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 + * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 + * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 + * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 + */ + public DigestElecsignEntity downloadElecsign(ElecsignEntity entity) { + InputStream stream = httpClient.download(entity.getDownloadUrl()); + return new DigestElecsignEntity(stream, entity.getHashValue(), entity.getHashType()); + } + + private RequestBody createRequestBody(Object request) { + return new JsonRequestBody.Builder().body(toJson(request)).build(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignByNoRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignByNoRequest.java new file mode 100644 index 00000000..2f3d8f34 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignByNoRequest.java @@ -0,0 +1,48 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 申请电子回单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716456](https://pay.weixin.qq.com/doc/v3/merchant/4012716456) +// 商户可以 通过该接口申请 商家转账用户确认模式转账单据 对应的电子回单。 +// 微信支付会在校验满足回单申请条件后受理回单的申请,商户后续可以通过电子回单查询接口查询回单处理进度。 +// 申请回单前,请先确认是否满足回单申请的条件,不满足回单申请条件时,多次重试申请无意义: +// 1. 仅支持付款成功的转账单据申请电子回单. +// 2. 仅支持传入姓名的转账单据申请电子回单. +// 3. 仅支持六个月内的转账单据申请电子回单. +// 回单申请完成后的有效期为90天,过期后需要重新申请。受理成功不表示回单一定能成功生成,以查单结果返回为准。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** AcceptElecsignByNoRequest */ +public class AcceptElecsignByNoRequest { + /** 【微信转账单号】 转账单据对应的微信支付单号 */ + @SerializedName("transfer_bill_no") + private String transferBillNo; + + public String getTransferBillNo() { + return transferBillNo; + } + + public void setTransferBillNo(String transferBillNo) { + this.transferBillNo = transferBillNo; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AcceptElecsignByNoRequest {\n"); + sb.append(" transferBillNo: ").append(toIndentedString(transferBillNo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignByOutNoRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignByOutNoRequest.java new file mode 100644 index 00000000..f6700e73 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignByOutNoRequest.java @@ -0,0 +1,48 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 申请电子回单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716456](https://pay.weixin.qq.com/doc/v3/merchant/4012716456) +// 商户可以 通过该接口申请 商家转账用户确认模式转账单据 对应的电子回单。 +// 微信支付会在校验满足回单申请条件后受理回单的申请,商户后续可以通过电子回单查询接口查询回单处理进度。 +// 申请回单前,请先确认是否满足回单申请的条件,不满足回单申请条件时,多次重试申请无意义: +// 1. 仅支持付款成功的转账单据申请电子回单. +// 2. 仅支持传入姓名的转账单据申请电子回单. +// 3. 仅支持六个月内的转账单据申请电子回单. +// 回单申请完成后的有效期为90天,过期后需要重新申请。受理成功不表示回单一定能成功生成,以查单结果返回为准。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** AcceptElecsignByOutNoRequest */ +public class AcceptElecsignByOutNoRequest { + /** 【商户转账单号】 商户创建转账单据使用的单号 */ + @SerializedName("out_bill_no") + private String outBillNo; + + public String getOutBillNo() { + return outBillNo; + } + + public void setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AcceptElecsignByOutNoRequest {\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignResponse.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignResponse.java new file mode 100644 index 00000000..61e28594 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/AcceptElecsignResponse.java @@ -0,0 +1,69 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 申请电子回单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716456](https://pay.weixin.qq.com/doc/v3/merchant/4012716456) +// 商户可以 通过该接口申请 商家转账用户确认模式转账单据 对应的电子回单。 +// 微信支付会在校验满足回单申请条件后受理回单的申请,商户后续可以通过电子回单查询接口查询回单处理进度。 +// 申请回单前,请先确认是否满足回单申请的条件,不满足回单申请条件时,多次重试申请无意义: +// 1. 仅支持付款成功的转账单据申请电子回单. +// 2. 仅支持传入姓名的转账单据申请电子回单. +// 3. 仅支持六个月内的转账单据申请电子回单. +// 回单申请完成后的有效期为90天,过期后需要重新申请。受理成功不表示回单一定能成功生成,以查单结果返回为准。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** AcceptElecsignResponse */ +public class AcceptElecsignResponse { + /** + * 【申请单状态】 GENERATING:生成中,FINISHED: 已完成,FAILED: 已失败 + * + *
    + *
  • GENERATING: 表示当前电子回单已受理成功并在处理中 + *
  • FINISHED: 表示当前电子回单已处理完成 + *
  • FAILED: 表示当前电子回单生成失败,失败原因字段会返回具体的失败原因 + *
+ */ + @SerializedName("state") + private String state; + + /** 【申请单创建时间】 申请单的创建时间,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */ + @SerializedName("create_time") + private String createTime; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AcceptElecsignResponse {\n"); + sb.append(" state: ").append(toIndentedString(state)).append("\n"); + sb.append(" createTime: ").append(toIndentedString(createTime)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/CancelMchTransferRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/CancelMchTransferRequest.java new file mode 100644 index 00000000..87d81b22 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/CancelMchTransferRequest.java @@ -0,0 +1,42 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 撤销转账 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716458](https://pay.weixin.qq.com/doc/v3/merchant/4012716458) +// 商户通过转账接口发起付款后,在用户确认收款之前可以通过该接口撤销付款。该接口返回成功仅表示撤销请求已受理,系统会异步处理退款等操作,以最终查询单据返回状态为准。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** CancelMchTransferRequest */ +public class CancelMchTransferRequest { + /** 【商户单号】 商户系统内部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 */ + @SerializedName("out_bill_no") + private String outBillNo; + + public String getOutBillNo() { + return outBillNo; + } + + public void setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class CancelMchTransferRequest {\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/CancelMchTransferResponse.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/CancelMchTransferResponse.java new file mode 100644 index 00000000..e58ac881 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/CancelMchTransferResponse.java @@ -0,0 +1,81 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 撤销转账 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716458](https://pay.weixin.qq.com/doc/v3/merchant/4012716458) +// 商户通过转账接口发起付款后,在用户确认收款之前可以通过该接口撤销付款。该接口返回成功仅表示撤销请求已受理,系统会异步处理退款等操作,以最终查询单据返回状态为准。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** CancelMchTransferResponse */ +public class CancelMchTransferResponse { + /** 【商户单号】 商户系统内部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 */ + @SerializedName("out_bill_no") + private String outBillNo; + + /** 【微信转账单号】 商家转账订单的主键,唯一定义此资源的标识 */ + @SerializedName("transfer_bill_no") + private String transferBillNo; + + /** 【单据状态】 CANCELING: 撤销中;CANCELLED:已撤销 */ + @SerializedName("state") + private String state; + + /** 【最后一次单据状态变更时间】 按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */ + @SerializedName("update_time") + private String updateTime; + + public String getOutBillNo() { + return outBillNo; + } + + public void setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + } + + public String getTransferBillNo() { + return transferBillNo; + } + + public void setTransferBillNo(String transferBillNo) { + this.transferBillNo = transferBillNo; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class CancelMchTransferResponse {\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append(" transferBillNo: ").append(toIndentedString(transferBillNo)).append("\n"); + sb.append(" state: ").append(toIndentedString(state)).append("\n"); + sb.append(" updateTime: ").append(toIndentedString(updateTime)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/DigestElecsignEntity.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/DigestElecsignEntity.java new file mode 100644 index 00000000..dbf56b79 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/DigestElecsignEntity.java @@ -0,0 +1,72 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 下载电子回单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4013866774](https://pay.weixin.qq.com/doc/v3/merchant/4013866774) +// 通过该接口,商户可以下载商家转账业务的电子回单。 +// 下载电子回单后,需将实际电子回单的哈希值与从接口返回的哈希值进行比对,以确保数据的完整性。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import com.wechat.pay.java.core.exception.MalformedMessageException; +import com.wechat.pay.java.core.util.ShaUtil; +import java.io.InputStream; +import java.security.DigestInputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; + +/** DigestElecsignEntity */ +public class DigestElecsignEntity { + private final DigestInputStream digestInputStream; + private final String hashValue; + + public DigestElecsignEntity(InputStream inputStream, String hashValue, String hashType) { + MessageDigest md = getMessageDigestInstance(hashType); + this.digestInputStream = new DigestInputStream(inputStream, md); + this.hashValue = hashValue; + } + + private MessageDigest getMessageDigestInstance(String hashType) { + try { + if ("SM3".equals(hashType)) { + return MessageDigest.getInstance("SM3", "Kona"); + } + return MessageDigest.getInstance(hashType); + } catch (NoSuchAlgorithmException | NoSuchProviderException e) { + throw new MalformedMessageException("Unsupported hash_type: " + hashType, e); + } + } + + private String digestAndEncodeHex() { + MessageDigest md = digestInputStream.getMessageDigest(); + byte[] hash = md.digest(); + + return ShaUtil.toHexString(hash); + } + + /** + * 返回下载电子回单的输入流。当电子回单下载完成后,调用方应关闭该输入流。 + * + * @return 下载电子回单的输入流。 + */ + public InputStream getInputStream() { + return this.digestInputStream; + } + + /** + * * 通过计算摘要并同查询电子回单时获得的摘要对比,验证下载账单的完整性 + * + * @return 如果验证结果为真,电子回单是完整准确,未经篡改的。如果为假,电子回单是不完整或被篡改,应清理之前保存的文件。 + */ + public final boolean verifyHash() { + final String digest = digestAndEncodeHex(); + return digest.equalsIgnoreCase(hashValue); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/ElecsignEntity.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/ElecsignEntity.java new file mode 100644 index 00000000..f2cd282d --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/ElecsignEntity.java @@ -0,0 +1,128 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 查询电子回单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716455](https://pay.weixin.qq.com/doc/v3/merchant/4012716455) +// 商户可以通过该接口查看回单申请进度 +// 回单状态 含义 建议处理方式 +// GENERATING 表示电子回单正在生成中 过段时间重试查询,建议查询时间间隔不低于2分钟 +// FINISHED 回单已成功生成,会返回回单文件的下载地址和摘要信息 通过返回的下载地址下载回单文件数据并比较摘要值 +// FAILED 电子回单生成失败,会返回具体的失败原因 停止重试查询,查看具体的失败原因 +// 请务必对比下载的回单文件的摘要值与查询接口返回的摘要值的一致性,确保得到的回单文件的真实性和完整性。 +// 下载地址的有效期为10分钟,超过10分钟后需要重新通过该接口获取下载地址(不需要重新申请)。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** ElecsignEntity */ +public class ElecsignEntity { + /** + * 【申请单状态】 GENERATING:生成中,FINISHED: 已完成,FAILED: 已失败 + * + *
    + *
  • GENERATING: 表示当前电子回单已受理成功并在处理中 + *
  • FINISHED: 表示当前电子回单已处理完成 + *
  • FAILED: 表示当前电子回单生成失败,失败原因字段会返回具体的失败原因 + *
+ */ + @SerializedName("state") + private String state; + + /** 【申请单创建时间】 申请单的创建时间,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */ + @SerializedName("create_time") + public String createTime; + + /** 【申请单更新时间】 申请单最近的更新时间,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */ + @SerializedName("update_time") + public String updateTime; + + /** + * 【回单文件摘要类型】 申请单状态为已完成时返回 + * + *
    + *
  • SHA256: SHA256摘要算法 + *
  • SM3: 国密SM3摘要算法 + *
+ */ + @SerializedName("hash_type") + public String hashType; + + /** 【回单文件摘要值】 申请单状态为已完成时返回,请务必将下载的回单文件摘要值与该值进行对比,以保证回单文件的完整性和真实性 */ + @SerializedName("hash_value") + public String hashValue; + + /** 【回单文件下载地址】 申请单状态为已完成时返回,有效期10分钟,过期后可以重新通过该接口获取;下载地址的域名,路径,参数都可能变化,请不要自行拼接 */ + @SerializedName("download_url") + public String downloadUrl; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getHashType() { + return hashType; + } + + public void setHashType(String hashType) { + this.hashType = hashType; + } + + public String getHashValue() { + return hashValue; + } + + public void setHashValue(String hashValue) { + this.hashValue = hashValue; + } + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ElecsignEntity {\n"); + sb.append(" state: ").append(toIndentedString(state)).append("\n"); + sb.append(" createTime: ").append(toIndentedString(createTime)).append("\n"); + sb.append(" updateTime: ").append(toIndentedString(updateTime)).append("\n"); + sb.append(" hashType: ").append(toIndentedString(hashType)).append("\n"); + sb.append(" hashValue: ").append(toIndentedString(hashValue)).append("\n"); + sb.append(" downloadUrl: ").append(toIndentedString(downloadUrl)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/GetTransferBillByNoRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/GetTransferBillByNoRequest.java new file mode 100644 index 00000000..0ffa35dd --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/GetTransferBillByNoRequest.java @@ -0,0 +1,49 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 查询转账单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716437](https://pay.weixin.qq.com/doc/v3/merchant/4012716437) +// 商家转账用户确认模式下,查询转账单的详细信息。 +// +// 注意 +// API只支持查询最近30天内的转账单,超过30天可以通过资金账单对账确认。 +// 转账单中涉及金额的字段单位为“分”。 +// 如果遇到新的错误码,请务必不要换单重试,请联系客服确认转账情况。如果有新的错误码,会更新到此API文档中。 +// 错误码描述字段message只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。 +// 接口限频: 单个商户 100 QPS,如果超过频率限制,会报错 FREQUENCY_LIMITED,请降低频率请求。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** GetTransferBillByNoRequest */ +public class GetTransferBillByNoRequest { + /** 【微信转账单号】 微信转账单号,微信商家转账系统返回的唯一标识 */ + @SerializedName("transfer_bill_no") + private String transferBillNo; + + public String getTransferBillNo() { + return transferBillNo; + } + + public void setTransferBillNo(String transferBillNo) { + this.transferBillNo = transferBillNo; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class GetTransferBillByNoRequest {\n"); + sb.append(" transferBillNo: ").append(toIndentedString(transferBillNo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/GetTransferBillByOutNoRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/GetTransferBillByOutNoRequest.java new file mode 100644 index 00000000..5399f6cd --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/GetTransferBillByOutNoRequest.java @@ -0,0 +1,49 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 查询转账单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716437](https://pay.weixin.qq.com/doc/v3/merchant/4012716437) +// 商家转账用户确认模式下,查询转账单的详细信息。 +// +// 注意 +// API只支持查询最近30天内的转账单,超过30天可以通过资金账单对账确认。 +// 转账单中涉及金额的字段单位为“分”。 +// 如果遇到新的错误码,请务必不要换单重试,请联系客服确认转账情况。如果有新的错误码,会更新到此API文档中。 +// 错误码描述字段message只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。 +// 接口限频: 单个商户 100 QPS,如果超过频率限制,会报错 FREQUENCY_LIMITED,请降低频率请求。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** GetTransferBillByOutNoRequest */ +public class GetTransferBillByOutNoRequest { + /** 【商户单号】 商户系统内部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 */ + @SerializedName("out_bill_no") + private String outBillNo; + + public String getOutBillNo() { + return outBillNo; + } + + public void setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class GetTransferBillByOutNoRequest {\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/InitiateMchTransferRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/InitiateMchTransferRequest.java new file mode 100644 index 00000000..51c08f36 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/InitiateMchTransferRequest.java @@ -0,0 +1,218 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 发起转账 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716434](https://pay.weixin.qq.com/doc/v3/merchant/4012716434) +// 商家转账用户确认模式下,用户申请收款时,商户可通过此接口申请创建转账单 +// 接口返回的HTTP状态码及错误码,仅代表本次请求的结果,不能代表订单状态。 +// 接口返回的HTTP状态码为200,且状态为WAIT_USER_CONFIRM时,可认为创建转账单成功,可引导用户确认收款。其余状态请参考开发指引中的状态机描述进行处理。 +// 接口返回的HTTP状态码不为200时,请商户务必不要立即更换商户订单号重试。可根据错误码列表中的描述和接口返回的信息进行处理,并在查询原订单结果为失败或者联系客服确认情况后,再更换商户订单号进行重试。否则会有重复转账的资金风险。 +// 注:单个商户的接口频率限制为100次/s +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; +import java.util.List; +import java.util.function.UnaryOperator; + +/** InitiateMchTransferRequest */ +public class InitiateMchTransferRequest { + /** + * 【商户AppID】 是微信开放平台和微信公众平台为开发者的应用程序(APP、小程序、公众号、企业号corpid即为此AppID)提供的一个唯一标识。 + * 此处,可以填写这四种类型中的任意一种APPID,但请确保该appid与商户号有绑定关系。 详见:普通商户模式开发必要参数说明。 + */ + @SerializedName("appid") + private String appid; + + /** 【商户单号】 商户系统内部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 */ + @SerializedName("out_bill_no") + private String outBillNo; + + /** 【转账场景ID】 该笔转账使用的转账场景,可前往“商户平台-产品中心-商家转账”中申请。如:1000(现金营销),1006(企业报销)等 */ + @SerializedName("transfer_scene_id") + private String transferSceneId; + + /** + * 【收款用户OpenID】 用户在商户appid下的唯一标识。 发起转账前需获取到用户的OpenID,获取方式详见 参数说明。 + */ + @SerializedName("openid") + private String openid; + + /** + * 【收款用户姓名】 收款方真实姓名。需要加密传入,支持标准RSA算法和国密算法,公钥由微信侧提供。
+ * 转账金额 >= 2,000元时,该笔明细必须填写
+ * 若商户传入收款用户姓名,微信支付会校验收款用户与输入姓名是否一致,并提供电子回单 + */ + @SerializedName("user_name") + private String userName; + + /** 【转账金额】 转账金额单位为“分”。 */ + @SerializedName("transfer_amount") + private Long transferAmount; + + /** 【转账备注】 转账备注,用户收款时可见该备注信息,UTF8编码,最多允许32个字符 */ + @SerializedName("transfer_remark") + private String transferRemark; + + /** 【通知地址】 异步接收微信支付结果通知的回调地址,通知url必须为公网可访问的URL,必须为HTTPS,不能携带参数。 */ + @SerializedName("notify_url") + private String notifyUrl; + + /** + * 【用户收款感知】 用户收款时感知到的收款原因将根据转账场景自动展示默认内容。如有其他展示需求,可在本字段传入。 各场景展示的默认内容和支持传入的内容,可查看产品文档了解。 + */ + @SerializedName("user_recv_perception") + private String userRecvPerception; + + /** + * 【转账场景报备信息】 各转账场景下需报备的内容,商户需要按照所属转账场景规则传参, 详见转账场景报备信息字段说明。 + */ + @SerializedName("transfer_scene_report_infos") + private List transferSceneReportInfos; + + public String getAppid() { + return appid; + } + + public InitiateMchTransferRequest setAppid(String appid) { + this.appid = appid; + return this; + } + + public String getOutBillNo() { + return outBillNo; + } + + public InitiateMchTransferRequest setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + return this; + } + + public String getTransferSceneId() { + return transferSceneId; + } + + public InitiateMchTransferRequest setTransferSceneId(String transferSceneId) { + this.transferSceneId = transferSceneId; + return this; + } + + public String getOpenid() { + return openid; + } + + public InitiateMchTransferRequest setOpenid(String openid) { + this.openid = openid; + return this; + } + + public String getUserName() { + return userName; + } + + public InitiateMchTransferRequest setUserName(String userName) { + this.userName = userName; + return this; + } + + public Long getTransferAmount() { + return transferAmount; + } + + public InitiateMchTransferRequest setTransferAmount(Long transferAmount) { + this.transferAmount = transferAmount; + return this; + } + + public String getTransferRemark() { + return transferRemark; + } + + public InitiateMchTransferRequest setTransferRemark(String transferRemark) { + this.transferRemark = transferRemark; + return this; + } + + public String getNotifyUrl() { + return notifyUrl; + } + + public InitiateMchTransferRequest setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + return this; + } + + public String getUserRecvPerception() { + return userRecvPerception; + } + + public InitiateMchTransferRequest setUserRecvPerception(String userRecvPerception) { + this.userRecvPerception = userRecvPerception; + return this; + } + + public List getTransferSceneReportInfos() { + return transferSceneReportInfos; + } + + public InitiateMchTransferRequest setTransferSceneReportInfos( + List transferSceneReportInfos) { + this.transferSceneReportInfos = transferSceneReportInfos; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class InitiateMchTransferRequest {\n"); + sb.append(" appid: ").append(toIndentedString(appid)).append("\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append(" transferSceneId: ").append(toIndentedString(transferSceneId)).append("\n"); + sb.append(" openid: ").append(toIndentedString(openid)).append("\n"); + sb.append(" userName: ").append(toIndentedString(userName)).append("\n"); + sb.append(" transferAmount: ").append(toIndentedString(transferAmount)).append("\n"); + sb.append(" transferRemark: ").append(toIndentedString(transferRemark)).append("\n"); + sb.append(" notifyUrl: ").append(toIndentedString(notifyUrl)).append("\n"); + sb.append(" userRecvPerception: ").append(toIndentedString(userRecvPerception)).append("\n"); + sb.append(" transferSceneReportInfos: ") + .append(toIndentedString(transferSceneReportInfos)) + .append("\n"); + sb.append("}"); + return sb.toString(); + } + + public InitiateMchTransferRequest cloneWithCipher(UnaryOperator s) { + InitiateMchTransferRequest copy = new InitiateMchTransferRequest(); + copy.appid = appid; + copy.outBillNo = outBillNo; + copy.transferSceneId = transferSceneId; + copy.openid = openid; + copy.userName = s.apply(userName); + copy.transferAmount = transferAmount; + copy.transferRemark = transferRemark; + copy.notifyUrl = notifyUrl; + copy.userRecvPerception = userRecvPerception; + if (transferSceneReportInfos != null && !transferSceneReportInfos.isEmpty()) { + copy.transferSceneReportInfos = new ArrayList<>(); + for (TransferSceneReportInfo val : transferSceneReportInfos) { + if (val != null) { + copy.transferSceneReportInfos.add(val.cloneWithCipher(s)); + } + } + } + return copy; + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/InitiateMchTransferResponse.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/InitiateMchTransferResponse.java new file mode 100644 index 00000000..f8983cf6 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/InitiateMchTransferResponse.java @@ -0,0 +1,121 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 发起转账 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716434](https://pay.weixin.qq.com/doc/v3/merchant/4012716434) +// 商家转账用户确认模式下,用户申请收款时,商户可通过此接口申请创建转账单 +// 接口返回的HTTP状态码及错误码,仅代表本次请求的结果,不能代表订单状态。 +// 接口返回的HTTP状态码为200,且状态为WAIT_USER_CONFIRM时,可认为创建转账单成功,可引导用户确认收款。其余状态请参考开发指引中的状态机描述进行处理。 +// 接口返回的HTTP状态码不为200时,请商户务必不要立即更换商户订单号重试。可根据错误码列表中的描述和接口返回的信息进行处理,并在查询原订单结果为失败或者联系客服确认情况后,再更换商户订单号进行重试。否则会有重复转账的资金风险。 +// 注:单个商户的接口频率限制为100次/s +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** InitiateMchTransferResponse */ +public class InitiateMchTransferResponse { + /** 【商户单号】 商户系统内部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 */ + @SerializedName("out_bill_no") + private String outBillNo; + + /** 【微信转账单号】 微信转账单号,微信商家转账系统返回的唯一标识 */ + @SerializedName("transfer_bill_no") + private String transferBillNo; + + /** 单据创建时间】 单据受理成功时返回,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */ + @SerializedName("create_time") + private String createTime; + + /** + * 【单据状态】 商家转账订单状态 + * + *
    + *
  • ACCEPTED: 转账已受理 + *
  • PROCESSING: 转账锁定资金中。如果一直停留在该状态,建议检查账户余额是否足够,如余额不足,可充值后再原单重试。 + *
  • WAIT_USER_CONFIRM: 待收款用户确认,可拉起微信收款确认页面进行收款确认 + *
  • TRANSFERING: 转账中,可拉起微信收款确认页面再次重试确认收款 + *
  • SUCCESS: 转账成功 + *
  • FAIL: 转账失败 + *
  • CANCELING: 商户撤销请求受理成功,该笔转账正在撤销中 + *
  • CANCELLED: 转账撤销完成 + *
+ */ + @SerializedName("state") + private String state; + + /** + * 【跳转领取页面的package信息】 跳转微信支付收款页的package信息, APP调起用户确认收款或者 JSAPI调起用户确认收款时需要使用的参数。
+ * 单据创建后,用户24小时内不领取将过期关闭,建议拉起用户确认收款页面前,先查单据状态:如单据状态为待收款用户确认,可用之前的package信息拉起;单据到终态时需更换单号重新发起转账。 + */ + @SerializedName("package_info") + private String packageInfo; + + public String getOutBillNo() { + return outBillNo; + } + + public InitiateMchTransferResponse setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + return this; + } + + public String getTransferBillNo() { + return transferBillNo; + } + + public InitiateMchTransferResponse setTransferBillNo(String transferBillNo) { + this.transferBillNo = transferBillNo; + return this; + } + + public String getCreateTime() { + return createTime; + } + + public InitiateMchTransferResponse setCreateTime(String createTime) { + this.createTime = createTime; + return this; + } + + public String getState() { + return state; + } + + public InitiateMchTransferResponse setState(String state) { + this.state = state; + return this; + } + + public String getPackageInfo() { + return packageInfo; + } + + public InitiateMchTransferResponse setPackageInfo(String packageInfo) { + this.packageInfo = packageInfo; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class InitiateMchTransferResponse {\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append(" transferBillNo: ").append(toIndentedString(transferBillNo)).append("\n"); + sb.append(" createTime: ").append(toIndentedString(createTime)).append("\n"); + sb.append(" state: ").append(toIndentedString(state)).append("\n"); + sb.append(" packageInfo: ").append(toIndentedString(packageInfo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/QueryElecsignByNoRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/QueryElecsignByNoRequest.java new file mode 100644 index 00000000..3b949914 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/QueryElecsignByNoRequest.java @@ -0,0 +1,48 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 查询电子回单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716455](https://pay.weixin.qq.com/doc/v3/merchant/4012716455) +// 商户可以通过该接口查看回单申请进度 +// 回单状态 含义 建议处理方式 +// GENERATING 表示电子回单正在生成中 过段时间重试查询,建议查询时间间隔不低于2分钟 +// FINISHED 回单已成功生成,会返回回单文件的下载地址和摘要信息 通过返回的下载地址下载回单文件数据并比较摘要值 +// FAILED 电子回单生成失败,会返回具体的失败原因 停止重试查询,查看具体的失败原因 +// 请务必对比下载的回单文件的摘要值与查询接口返回的摘要值的一致性,确保得到的回单文件的真实性和完整性。 +// 下载地址的有效期为10分钟,超过10分钟后需要重新通过该接口获取下载地址(不需要重新申请)。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** QueryElecsignByNoRequest */ +public class QueryElecsignByNoRequest { + /** 【微信转账单号】 转账单据对应的微信支付单号 */ + @SerializedName("transfer_bill_no") + private String transferBillNo; + + public String getTransferBillNo() { + return transferBillNo; + } + + public void setTransferBillNo(String transferBillNo) { + this.transferBillNo = transferBillNo; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class QueryElecsignByNoRequest {\n"); + sb.append(" transferBillNo: ").append(toIndentedString(transferBillNo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/QueryElecsignByOutNoRequest.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/QueryElecsignByOutNoRequest.java new file mode 100644 index 00000000..db7fe406 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/QueryElecsignByOutNoRequest.java @@ -0,0 +1,48 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 查询电子回单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716455](https://pay.weixin.qq.com/doc/v3/merchant/4012716455) +// 商户可以通过该接口查看回单申请进度 +// 回单状态 含义 建议处理方式 +// GENERATING 表示电子回单正在生成中 过段时间重试查询,建议查询时间间隔不低于2分钟 +// FINISHED 回单已成功生成,会返回回单文件的下载地址和摘要信息 通过返回的下载地址下载回单文件数据并比较摘要值 +// FAILED 电子回单生成失败,会返回具体的失败原因 停止重试查询,查看具体的失败原因 +// 请务必对比下载的回单文件的摘要值与查询接口返回的摘要值的一致性,确保得到的回单文件的真实性和完整性。 +// 下载地址的有效期为10分钟,超过10分钟后需要重新通过该接口获取下载地址(不需要重新申请)。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; + +/** QueryElecsignByOutNoRequest */ +public class QueryElecsignByOutNoRequest { + /** 【商户转账单号】 商户创建转账单据使用的单号 */ + @SerializedName("out_bill_no") + private String outBillNo; + + public String getOutBillNo() { + return outBillNo; + } + + public void setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class QueryElecsignByOutNoRequest {\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/TransferBillEntity.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/TransferBillEntity.java new file mode 100644 index 00000000..d0e6bceb --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/TransferBillEntity.java @@ -0,0 +1,239 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 查询转账单 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716437](https://pay.weixin.qq.com/doc/v3/merchant/4012716437) +// 商家转账用户确认模式下,查询转账单的详细信息。 +// +// 注意 +// API只支持查询最近30天内的转账单,超过30天可以通过资金账单对账确认。 +// 转账单中涉及金额的字段单位为“分”。 +// 如果遇到新的错误码,请务必不要换单重试,请联系客服确认转账情况。如果有新的错误码,会更新到此API文档中。 +// 错误码描述字段message只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。 +// 接口限频: 单个商户 100 QPS,如果超过频率限制,会报错 FREQUENCY_LIMITED,请降低频率请求。 +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; +import java.util.function.UnaryOperator; + +/** TransferBillEntity */ +public class TransferBillEntity { + /** 【商户号】 微信支付分配的商户号 */ + @SerializedName("mch_id") + private String mchId; + + /** 【商户单号】 商户系统内部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 */ + @SerializedName("out_bill_no") + private String outBillNo; + + /** 【商家转账订单号】 商家转账订单的主键,唯一定义此资源的标识 */ + @SerializedName("transfer_bill_no") + private String transferBillNo; + + /** + * 【商户AppID】 是微信开放平台和微信公众平台为开发者的应用程序(APP、小程序、公众号、企业号corpid即为此AppID)提供的一个唯一标识。 + * 此处,可以填写这四种类型中的任意一种APPID,但请确保该appid与商户号有绑定关系。 详见:普通商户模式开发必要参数说明。 + */ + @SerializedName("appid") + private String appid; + + /** + * 【单据状态】 商家转账订单状态 + * + *
    + *
  • ACCEPTED: 转账已受理 + *
  • PROCESSING: 转账锁定资金中。如果一直停留在该状态,建议检查账户余额是否足够,如余额不足,可充值后再原单重试。 + *
  • WAIT_USER_CONFIRM: 待收款用户确认,可拉起微信收款确认页面进行收款确认 + *
  • TRANSFERING: 转账中,可拉起微信收款确认页面再次重试确认收款 + *
  • SUCCESS: 转账成功 + *
  • FAIL: 转账失败 + *
  • CANCELING: 商户撤销请求受理成功,该笔转账正在撤销中 + *
  • CANCELLED: 转账撤销完成 + *
+ */ + @SerializedName("state") + private String state; + + /** 【转账金额】 转账金额单位为“分”。 */ + @SerializedName("transfer_amount") + private Long transferAmount; + + /** 【转账备注】 单条转账备注(微信用户会收到该备注),UTF8编码,最多允许32个字符 */ + @SerializedName("transfer_remark") + private String transferRemark; + + /** + * 【失败原因】 订单已失败或者已退资金时,会返回订单失败原因 + */ + @SerializedName("fail_reason") + private String failReason; + + /** + * 【收款用户OpenID】 用户在商户appid下的唯一标识。发起转账前需获取到用户的OpenID,获取方式详见 参数说明。 + */ + @SerializedName("openid") + private String openid; + + /** + * 【收款用户姓名】 收款方真实姓名。需要加密传入,支持标准RSA算法和国密算法,公钥由微信侧提供。
+ * 转账金额 >= 2,000元时,该笔明细必须填写
+ * 若商户传入收款用户姓名,微信支付会校验收款用户与输入姓名是否一致,并提供电子回单 + */ + @SerializedName("user_name") + private String userName; + + /** 【单据创建时间】 单据受理成功时返回,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */ + @SerializedName("create_time") + private String createTime; + + /** 【最后一次状态变更时间】 单据最后更新时间,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */ + @SerializedName("update_time") + private String updateTime; + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getOutBillNo() { + return outBillNo; + } + + public void setOutBillNo(String outBillNo) { + this.outBillNo = outBillNo; + } + + public String getTransferBillNo() { + return transferBillNo; + } + + public void setTransferBillNo(String transferBillNo) { + this.transferBillNo = transferBillNo; + } + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Long getTransferAmount() { + return transferAmount; + } + + public void setTransferAmount(Long transferAmount) { + this.transferAmount = transferAmount; + } + + public String getTransferRemark() { + return transferRemark; + } + + public void setTransferRemark(String transferRemark) { + this.transferRemark = transferRemark; + } + + public String getFailReason() { + return failReason; + } + + public void setFailReason(String failReason) { + this.failReason = failReason; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TransferBillEntity {\n"); + sb.append(" mchId: ").append(toIndentedString(mchId)).append("\n"); + sb.append(" outBillNo: ").append(toIndentedString(outBillNo)).append("\n"); + sb.append(" transferBillNo: ").append(toIndentedString(transferBillNo)).append("\n"); + sb.append(" appid: ").append(toIndentedString(appid)).append("\n"); + sb.append(" state: ").append(toIndentedString(state)).append("\n"); + sb.append(" transferAmount: ").append(toIndentedString(transferAmount)).append("\n"); + sb.append(" transferRemark: ").append(toIndentedString(transferRemark)).append("\n"); + sb.append(" failReason: ").append(toIndentedString(failReason)).append("\n"); + sb.append(" openid: ").append(toIndentedString(openid)).append("\n"); + sb.append(" userName: ").append(toIndentedString(userName)).append("\n"); + sb.append(" createTime: ").append(toIndentedString(createTime)).append("\n"); + sb.append(" updateTime: ").append(toIndentedString(updateTime)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + public TransferBillEntity cloneWithCipher(UnaryOperator s) { + TransferBillEntity copy = new TransferBillEntity(); + copy.mchId = mchId; + copy.outBillNo = outBillNo; + copy.transferBillNo = transferBillNo; + copy.appid = appid; + copy.state = state; + copy.transferAmount = transferAmount; + copy.transferRemark = transferRemark; + copy.failReason = failReason; + copy.openid = openid; + if (userName != null && !userName.isEmpty()) { + copy.userName = s.apply(userName); + } + copy.createTime = createTime; + copy.updateTime = updateTime; + return copy; + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/TransferSceneReportInfo.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/TransferSceneReportInfo.java new file mode 100644 index 00000000..100819bb --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/model/TransferSceneReportInfo.java @@ -0,0 +1,189 @@ +// Copyright 2021 Tencent Inc. All rights reserved. +// +// 商家转账对外API(2025年1月15日升级版本) +// +// 发起转账 +// [https://pay.weixin.qq.com/doc/v3/merchant/4012716434](https://pay.weixin.qq.com/doc/v3/merchant/4012716434) +// 商家转账用户确认模式下,用户申请收款时,商户可通过此接口申请创建转账单 +// 接口返回的HTTP状态码及错误码,仅代表本次请求的结果,不能代表订单状态。 +// 接口返回的HTTP状态码为200,且状态为WAIT_USER_CONFIRM时,可认为创建转账单成功,可引导用户确认收款。其余状态请参考开发指引中的状态机描述进行处理。 +// 接口返回的HTTP状态码不为200时,请商户务必不要立即更换商户订单号重试。可根据错误码列表中的描述和接口返回的信息进行处理,并在查询原订单结果为失败或者联系客服确认情况后,再更换商户订单号进行重试。否则会有重复转账的资金风险。 +// 注:单个商户的接口频率限制为100次/s +// +// API version: 1.0.0 + +// Code generated by WechatPay APIv3 Generator based on [OpenAPI +// Generator](https://openapi-generator.tech); DO NOT EDIT. + +package com.wechat.pay.java.service.mchtransfer.model; + +import static com.wechat.pay.java.core.util.StringUtil.toIndentedString; + +import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; +import java.util.List; +import java.util.function.UnaryOperator; + +/** TransferSceneReportInfo */ +public class TransferSceneReportInfo { + /** 信息类型 string[1,15] 必填 */ + @SerializedName("info_type") + private String infoType; + + /** 信息内容 string[1,32] 必填 */ + @SerializedName("info_content") + private String infoContent; + + public TransferSceneReportInfo() {} + + public TransferSceneReportInfo(String infoType, String infoContent) { + this.infoType = infoType; + this.infoContent = infoContent; + } + + public String getInfoType() { + return infoType; + } + + public TransferSceneReportInfo setInfoType(String infoType) { + this.infoType = infoType; + return this; + } + + public String getInfoContent() { + return infoContent; + } + + public TransferSceneReportInfo setInfoContent(String infoContent) { + this.infoContent = infoContent; + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TransferSceneReportInfo {\n"); + sb.append(" infoType: ").append(toIndentedString(infoType)).append("\n"); + sb.append(" infoContent: ").append(toIndentedString(infoContent)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + public TransferSceneReportInfo cloneWithCipher(UnaryOperator s) { + TransferSceneReportInfo copy = new TransferSceneReportInfo(); + copy.infoType = infoType; + copy.infoContent = infoContent; + return copy; + } + + /** + * 构建现金营销转账场景报备信息 + * + * @param activityName 活动名称,示例:新会员有礼 + * @param rewardDescription 奖励说明,示例:注册会员抽奖一等奖 + * @return 转账场景报备信息 + */ + public static List buildCashMarketing( + String activityName, String rewardDescription) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("活动名称", activityName)); + list.add(new TransferSceneReportInfo("奖励说明", rewardDescription)); + return list; + } + + /** + * 构建企业赔付转账场景报备信息 + * + * @param compensationReason 赔付原因,示例:商品质量问题退款 + * @return 转账场景报备信息 + */ + public static List buildEnterpriseCompensation( + String compensationReason) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("赔付原因", compensationReason)); + return list; + } + + /** + * 构建佣金报酬转账场景报备信息 + * + * @param positionType 岗位类型,示例:外卖员 + * @param compensationDescription 报酬描述,示例:7月份配送费 + * @return 转账场景报备信息 + */ + public static List buildCommissionCompensation( + String positionType, String compensationDescription) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("岗位类型", positionType)); + list.add(new TransferSceneReportInfo("报酬说明", compensationDescription)); + return list; + } + + /** + * 构建采购贷款转账场景报备信息 + * + * @param goodsName 采购商品名称,示例:戴尔笔记本电脑 + * @return 转账场景报备信息 + */ + public static List buildProcurementLoan(String goodsName) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("采购商品名称", goodsName)); + return list; + } + + /** + * 构建二手回收转账场景报备信息 + * + * @param goodsName 回收商品名称,示例:塑料瓶 + * @return 转账场景报备信息 + */ + public static List buildSecondHandRecycling(String goodsName) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("回收商品名称", goodsName)); + return list; + } + + /** + * 构建公益补助转账场景报备信息 + * + * @param activityName 公益活动名称,在民政部的备案名称 + * @param recordNumber 公益活动备案编号,在民政部的备案编号 + * @return 转账场景报备信息 + */ + public static List buildPublicWelfareSubsidy( + String activityName, String recordNumber) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("公益活动名称", activityName)); + list.add(new TransferSceneReportInfo("公益活动备案编号", recordNumber)); + return list; + } + + /** + * 构建行政补贴转账场景报备信息 + * + * @param subsidyType 补贴类型,示例:购车补贴 + * @return 转账场景报备信息 + */ + public static List buildAdministrativeSubsidy(String subsidyType) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("补贴类型", subsidyType)); + return list; + } + + /** + * 构建保险理赔转账场景报备信息 + * + * @param recordNumber 保险产品备案编号,示例:01212121212 + * @param insuranceName 保险名称,示例:意外险 + * @param operationNumber 保险操作单号,示例:12121245442 + * @return 转账场景报备信息 + */ + public static List buildInsuranceClaim( + String recordNumber, String insuranceName, String operationNumber) { + List list = new ArrayList<>(); + list.add(new TransferSceneReportInfo("保险产品备案编号", recordNumber)); + list.add(new TransferSceneReportInfo("保险名称", insuranceName)); + list.add(new TransferSceneReportInfo("保险操作单号", operationNumber)); + return list; + } +} diff --git a/service/src/main/java/com/wechat/pay/java/service/mchtransfer/package-info.java b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/package-info.java new file mode 100644 index 00000000..7b85c905 --- /dev/null +++ b/service/src/main/java/com/wechat/pay/java/service/mchtransfer/package-info.java @@ -0,0 +1,2 @@ +/** 商家转账对外API(2025年1月15日上线版本) */ +package com.wechat.pay.java.service.mchtransfer;