1
0
mirror of synced 2026-05-21 09:58:18 +08:00

🆕 #3828 【微信支付】更新商家转账 API 的请求和响应字段,同步官方文档的字段调整,新增转账场景报备信息

This commit is contained in:
HeCG95
2026-01-05 19:33:02 +08:00
committed by GitHub
parent 84b5c4d2d0
commit 521d46d957
4 changed files with 84 additions and 19 deletions

View File

@@ -6,8 +6,10 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* 运营工具-商家转账请求参数 * 运营工具-商家转账请求参数
@@ -37,11 +39,11 @@ public class BusinessOperationTransferRequest implements Serializable {
private String outBillNo; private String outBillNo;
/** /**
* 运营工具转账场景ID * 转账场景ID
* 必须,用于标识运营工具转账的具体业务场景 * 必须,该笔转账使用的转账场景,可前往“商户平台-产品中心-商家转账”中申请。如1000现金营销1006企业报销
*/ */
@SerializedName("operation_scene_id") @SerializedName("transfer_scene_id")
private String operationSceneId; private String transferSceneId;
/** /**
* 用户在直连商户应用下的用户标示 * 用户在直连商户应用下的用户标示
@@ -86,4 +88,36 @@ public class BusinessOperationTransferRequest implements Serializable {
*/ */
@SerializedName("notify_url") @SerializedName("notify_url")
private String notifyUrl; private String notifyUrl;
/**
* 转账场景报备信息
* 必须,需按转账场景准确填写报备信息,参考 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4013774588">转账场景报备信息字段说明</a>
*/
@SerializedName("transfer_scene_report_infos")
private List<TransferSceneReportInfo> transferSceneReportInfos;
/**
* 转账场景报备信息
*/
@Data
@Accessors(chain = true)
public static class TransferSceneReportInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 信息类型
* 必须不能超过15个字符商户所属转账场景下的信息类型此字段内容为固定值需严格按照 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4013774588">转账场景报备信息字段说明</a> 传参。
*/
@SerializedName("info_type")
private String infoType;
/**
* 信息内容
* 必须不能超过32个字符商户所属转账场景下的信息内容商户可按实际业务场景自定义传参需严格按照 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4013774588">转账场景报备信息字段说明</a> 传参。
*/
@SerializedName("info_content")
private String infoContent;
}
} }

View File

@@ -31,15 +31,27 @@ public class BusinessOperationTransferResult implements Serializable {
private String transferBillNo; private String transferBillNo;
/** /**
* 转账状态 * 单据状态
* WAIT_PAY等待确认 * 商家转账订单状态
* PROCESSING转账中 * ACCEPTED转账已受理可原单重试非终态
* SUCCESS:转账成功 * PROCESSING: 转账锁定资金中。如果一直停留在该状态,建议检查账户余额是否足够,如余额不足,可充值后再原单重试(非终态)。
* FAIL转账失败 * WAIT_USER_CONFIRM: 待收款用户确认,当前转账单据资金已锁定,可拉起微信收款确认页面进行收款确认(非终态)。
* REFUND已退款 * TRANSFERING: 转账中,可拉起微信收款确认页面再次重试确认收款(非终态)。
* SUCCESS: 转账成功,表示转账单据已成功(终态)。
* FAIL: 转账失败,表示该笔转账单据已失败。若需重新向用户转账,请重新生成单据并再次发起(终态)。
* CANCELING: 转账撤销中,商户撤销请求受理成功,该笔转账正在撤销中,需查单确认撤销的转账单据状态(非终态)。
* CANCELLED: 转账撤销完成,代表转账单据已撤销成功(终态)。
*/ */
@SerializedName("transfer_state") @SerializedName("state")
private String transferState; private String state;
/**
* 跳转领取页面的package信息
* 跳转微信支付收款页的package信息 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012719576">APP调起用户确认收款</a> 或者 <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716430">JSAPI调起用户确认收款</a> 时需要使用的参数。仅当转账单据状态为WAIT_USER_CONFIRM时返回。<br>
* 单据创建后用户24小时内不领取将过期关闭建议拉起用户确认收款页面前先查单据状态如单据状态为WAIT_USER_CONFIRM可用之前的package信息拉起单据到终态时需更换单号重新发起转账。
*/
@SerializedName("package_info")
private String packageInfo;
/** /**
* 发起转账的时间 * 发起转账的时间

View File

@@ -8,6 +8,8 @@ import com.github.binarywang.wxpay.service.BusinessOperationTransferService;
import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import java.util.Arrays;
/** /**
* 运营工具-商家转账API使用示例 * 运营工具-商家转账API使用示例
* *
@@ -41,10 +43,15 @@ public class BusinessOperationTransferExample {
public void createOperationTransferExample() { public void createOperationTransferExample() {
try { try {
// 构建转账请求 // 构建转账请求
BusinessOperationTransferRequest.TransferSceneReportInfo reportInfo = new BusinessOperationTransferRequest.TransferSceneReportInfo();
reportInfo.setInfoType("活动名称");
reportInfo.setInfoContent("新会员有礼");
BusinessOperationTransferRequest request = BusinessOperationTransferRequest.newBuilder() BusinessOperationTransferRequest request = BusinessOperationTransferRequest.newBuilder()
.appid("your_app_id") // 应用ID .appid("your_app_id") // 应用ID
.outBillNo("OT" + System.currentTimeMillis()) // 商户转账单号 .outBillNo("OT" + System.currentTimeMillis()) // 商户转账单号
.operationSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING) // 运营工具转账场景ID .transferSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING) // 运营工具转账场景ID
.transferSceneReportInfos(Arrays.asList(reportInfo)) // 转账场景报备信息
.openid("user_openid") // 用户openid .openid("user_openid") // 用户openid
.userName("张三") // 用户姓名(可选) .userName("张三") // 用户姓名(可选)
.transferAmount(100) // 转账金额,单位分 .transferAmount(100) // 转账金额,单位分
@@ -59,7 +66,8 @@ public class BusinessOperationTransferExample {
System.out.println("转账成功!"); System.out.println("转账成功!");
System.out.println("商户单号: " + result.getOutBillNo()); System.out.println("商户单号: " + result.getOutBillNo());
System.out.println("微信转账单号: " + result.getTransferBillNo()); System.out.println("微信转账单号: " + result.getTransferBillNo());
System.out.println("转账状态: " + result.getTransferState()); System.out.println("单据状态: " + result.getState());
System.out.println("跳转领取页面的package信息: " + result.getPackageInfo());
System.out.println("创建时间: " + result.getCreateTime()); System.out.println("创建时间: " + result.getCreateTime());
} catch (WxPayException e) { } catch (WxPayException e) {

View File

@@ -7,6 +7,8 @@ import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
@@ -36,10 +38,17 @@ public class BusinessOperationTransferServiceTest {
@Test @Test
public void testRequestBuilder() { public void testRequestBuilder() {
// 构建转账请求
BusinessOperationTransferRequest.TransferSceneReportInfo reportInfo = new BusinessOperationTransferRequest.TransferSceneReportInfo();
reportInfo.setInfoType("test_info_type");
reportInfo.setInfoContent("test_info_content");
BusinessOperationTransferRequest request = BusinessOperationTransferRequest.newBuilder() BusinessOperationTransferRequest request = BusinessOperationTransferRequest.newBuilder()
.appid("test_app_id") .appid("test_app_id")
.outBillNo("OT" + System.currentTimeMillis()) .outBillNo("OT" + System.currentTimeMillis())
.operationSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING) .transferSceneId(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING)
.transferSceneReportInfos(Arrays.asList(reportInfo))
.openid("test_openid") .openid("test_openid")
.transferAmount(100) .transferAmount(100)
.transferRemark("测试转账") .transferRemark("测试转账")
@@ -47,7 +56,7 @@ public class BusinessOperationTransferServiceTest {
.build(); .build();
assertThat(request.getAppid()).isEqualTo("test_app_id"); assertThat(request.getAppid()).isEqualTo("test_app_id");
assertThat(request.getOperationSceneId()).isEqualTo(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING); assertThat(request.getTransferSceneId()).isEqualTo(WxPayConstants.OperationSceneId.OPERATION_CASH_MARKETING);
assertThat(request.getTransferAmount()).isEqualTo(100); assertThat(request.getTransferAmount()).isEqualTo(100);
assertThat(request.getTransferRemark()).isEqualTo("测试转账"); assertThat(request.getTransferRemark()).isEqualTo("测试转账");
} }
@@ -77,11 +86,13 @@ public class BusinessOperationTransferServiceTest {
BusinessOperationTransferResult result = new BusinessOperationTransferResult(); BusinessOperationTransferResult result = new BusinessOperationTransferResult();
result.setOutBillNo("test_out_bill_no"); result.setOutBillNo("test_out_bill_no");
result.setTransferBillNo("test_transfer_bill_no"); result.setTransferBillNo("test_transfer_bill_no");
result.setTransferState("SUCCESS"); result.setState("SUCCESS");
result.setPackageInfo("test_package_info");
assertThat(result.getOutBillNo()).isEqualTo("test_out_bill_no"); assertThat(result.getOutBillNo()).isEqualTo("test_out_bill_no");
assertThat(result.getTransferBillNo()).isEqualTo("test_transfer_bill_no"); assertThat(result.getTransferBillNo()).isEqualTo("test_transfer_bill_no");
assertThat(result.getTransferState()).isEqualTo("SUCCESS"); assertThat(result.getState()).isEqualTo("SUCCESS");
assertThat(result.getPackageInfo()).isEqualTo("test_package_info");
BusinessOperationTransferQueryResult queryResult = new BusinessOperationTransferQueryResult(); BusinessOperationTransferQueryResult queryResult = new BusinessOperationTransferQueryResult();
queryResult.setOperationSceneId("2001"); queryResult.setOperationSceneId("2001");