Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
ae4126a
Initial plan
Copilot Sep 24, 2025
1d8f143
Add WeChat merchant transfer confirmation-free receipt authorization …
Copilot Sep 24, 2025
559c7e7
Update documentation for WeChat transfer authorization mode feature
Copilot Sep 24, 2025
b774525
:art: #3698 【微信支付】 修复字符编码导致的解析报文异常问题
Copilot Sep 24, 2025
34867cf
:bookmark: 发布 4.7.8.B 测试版本
binarywang Sep 24, 2025
e4effb9
:art: #3634 【微信支付】尝试修复服务商模式分账动账通知非法请求、头部信息验证失败的问题
Copilot Sep 27, 2025
d58c269
:new: #3725【企业微信】 增加markdown_v2的消息类型支持
xiaoyun461 Oct 3, 2025
e436289
:art: WxOpenMessageRouter增加注解ConditionalOnMissingBean
SunnyBoyLJQ Oct 3, 2025
4ab33b9
:art: #3628【企业微信】修复更新用户接口重置用户直属领导字段的问题
Copilot Oct 3, 2025
611754c
:new: #3618 【微信支付】增加境外微信支付的支持
Copilot Oct 3, 2025
4bf16bf
:art: 完善关于开放平台功能的说明文档
Copilot Oct 3, 2025
88ef6ff
:bug: #3640 【微信支付】修复使用连接池后SSL客户端证书未正确发送导致退款接口报错的问题
a810439322 Oct 23, 2025
26401c8
:memo: Revise development instructions with Chinese translations
binarywang Oct 23, 2025
4a6ba0b
:art: #3745 【微信支付】修复请求微信仿真测试系统时验签密钥接口的 Content-Type 问题
AcceptMediocrity Oct 28, 2025
afe4338
:art: 规范mp模块的javadoc接口注释文档
binarywang Oct 28, 2025
b2c5ccd
:new: #3739 【开放平台】补充完善第三方平台小程序快速配置域名的相关接口
Copilot Oct 28, 2025
856f7ce
:art: #3746 【企业微信】获取企业已配置的「联系我」列表接口返回值增加next_cursor字段
Oct 30, 2025
892346b
:art: #3732 Add Quarkus/GraalVM Native Image support - Fix Random ins…
Copilot Nov 2, 2025
fd594ba
:new: #3494 【微信支付】平台收付通提现接口新增回调参数支持及补充日终余额提现API
Copilot Nov 5, 2025
414ac5d
:art: #3757 【微信支付】修复当只设置 privateCertString 或 PrivateCertContent 时 cer…
YaCoHuang Nov 12, 2025
56b9c31
:art: #3756 【企业微信】修复企业微信 API 回调验签过程中 WxCryptUtil.decrypt 方法可能抛出异常的问题
marktech0813 Nov 12, 2025
8bc655d
:art: #3680 【微信支付】修复PEM格式的私钥和证书处理的问题
Copilot Nov 15, 2025
a0c57a3
:art: #3728 【微信支付】修复V3支付公钥转账出现的签名验证失败问题
Copilot Nov 15, 2025
dcdd26a
:bug: #3704 【小程序】修复物流服务-同城配送服务-查询门店余额接口错误的逻辑
Copilot Nov 15, 2025
3c565ec
:new: #3507 【微信支付】实现运营工具-商家转账API相关接口
Copilot Nov 15, 2025
e640bc4
:new: #3720 【微信支付】实现微信押金支付的相关功能接口
Copilot Nov 15, 2025
1825b9b
:new: #3688 【微信支付】 实现预约扣费服务的相关接口
Copilot Nov 15, 2025
663afec
:bug: #3700 修复空指针问题
Copilot Nov 15, 2025
d754fe6
:art: #3376 【小程序】完善事件消息推送对json数据格式的支持
Copilot Nov 17, 2025
2a318e6
:art: 优化小程序配置类的javadoc
binarywang Nov 17, 2025
0de35bf
:memo: 添加自定义agent的文档
binarywang Nov 17, 2025
904e45a
:art: 修复 GsonParser 与低版本 Gson 的兼容性问题
Copilot Nov 17, 2025
fb1675d
:art: #3751 【企业微信】提交审批申请接口增加process参数以支持新版的审批流程信息
Copilot Nov 17, 2025
1be03de
:new: #3736 【小程序】增加解密群入口敏感数据的方法
Copilot Nov 17, 2025
52e46df
:art: #3765 【微信支付】修复从 base64 字符串加载私钥时的双重解码问题
Copilot Nov 27, 2025
fda4d61
:new: #3764 【开放平台】添加小程序类目管理 - 获取类目名称信息的接口
Copilot Nov 27, 2025
fcbf710
:art: #3767 【视频号】微信小店订单详情接口新增会员权益等优惠金额字段
hyf1844 Nov 27, 2025
fa45a39
:bug: #3664: 【微信支付】修复微信支付分订单接口提示“商户暂无权限使用此服务” 的问题
Crow0687 Nov 27, 2025
678264c
:art: #3683 【开放平台】修改component_verify_ticket 的有效时间为12小时
Copilot Nov 27, 2025
ab5f6ea
:new: #3770 【视频号】新增售后单商家协商、换货发货与拒绝发货等接口
chuchengg Nov 27, 2025
f54f382
:bug: #3675 【小程序】修复退货组件 API 接口请求方法错误的问题
Copilot Nov 28, 2025
69a36f0
:art: #3752 修复 Gson 在 Java 9+ 环境下反射访问 java.io.File#path 字段失败的问题
Copilot Nov 28, 2025
aa2284a
:art: #3755 【企业微信】修复会话存档SDK重复初始化导致接口超限问题
Copilot Nov 28, 2025
53b659d
:art: #3738 【微信支付】修复V3新商户完全公钥模式下publicKey为空的问题
Copilot Nov 28, 2025
e93b012
:art: #3753 【微信支付】添加商家转账用户授权免确认模式相关接口
Copilot Nov 28, 2025
34094ec
:new: #3737 【微信支付】增加V3服务商申请退款的接口
Copilot Nov 28, 2025
94498ff
:art: #3750 【微信支付】修复 V2 支付回调签名验证失败的问题
Copilot Nov 28, 2025
2d024eb
:new: #3519 【小程序】实现交易投诉的相关接口
Copilot Nov 28, 2025
7962413
:new: #3678 【小程序】新增客服管理相关接口
Copilot Nov 28, 2025
44dc7f5
:new: #3682 【企业微信】新增智能机器人的接口支持
Copilot Nov 28, 2025
39db036
:memo: 为现有的企业微信流程审批功能添加完整的使用文档
Copilot Nov 28, 2025
848f2c9
:art: #3570 【小程序】添加微信云托管支持
Copilot Nov 28, 2025
4786605
update agent description
binarywang Nov 28, 2025
2f1ff83
:bookmark: 发布 4.7.9.B 测试版本
binarywang Nov 28, 2025
edd1201
:bug: #3515 修复OkHttp请求方式时代理认证头设置错误的问题
Copilot Dec 2, 2025
d884b1b
:art: 修复 WxCpApprovalWorkflowDemo.java 的兼容性和编译错误
Copilot Dec 2, 2025
7037930
:art: 修复支付公钥模式下回调验证serialNumber空指针异常
Copilot Dec 2, 2025
9030c69
:new: #3524 【小程序】添加多端登录 code2VerifyInfo 接口的支持
Copilot Dec 3, 2025
5fe0c18
:art: #3608 【微信支付】修复 fullPublicKeyModel 配置在 Spring Boot Starter 和 Sol…
Copilot Dec 3, 2025
d0b7ad9
:art: #3384 【公众号】为 starter 添加 HttpComponents (httpclient5) 支持
Copilot Dec 4, 2025
5ce81b9
:art: #3620 【小程序】修复同城配送API签名错误问题(添加RSA私钥序列号到签名payload和请求头)
Copilot Dec 4, 2025
48c54ff
:art: #3598 【企业微信】 会话存档接口添加对音视频通话(voiptext)消息类型的支持
Copilot Dec 4, 2025
c312fc8
:bug: #3797 【微信支付】修复商家转账API路径错误,移除多余的operation部分
Copilot Dec 5, 2025
794399b
:art: #3795 【小程序】客服消息API新增了 aimsgcontext 字段,用于AI消息上下文关联
Copilot Dec 5, 2025
d5f495b
:art: #3791 【微信支付】特约商户进件接口添加了小微商户(个体经营者)的数据字段支持
Copilot Dec 5, 2025
4b20b53
:art: #3799 【小程序】发货信息管理功能补充消息推送字段,支持订单发货和结算事件的完整信息接收
buaazyl Dec 10, 2025
9c9b8eb
:art: #3802 【小程序】修复 WxMaExpressOrderCargo 几个字段类型以支持小数值
Copilot Dec 10, 2025
f5978f8
:art: #3806 【视频号】微信小店订单详情接口新增会员权益等优惠金额字段
hyf1844 Dec 11, 2025
078c905
:art: #3800 【微信支付】小微商家进件 API 进行参数结构调整
jarcms Dec 15, 2025
626ca16
修改中文输出和单元测试要求
binarywang Dec 20, 2025
0e6e55a
:new: #3815 【企业微信】增加智能机器人消息接收和主动发送功能
Copilot Dec 20, 2025
1b1cdc6
:new: #3816 【微信支付】增加 V3 医保相关接口的完整支持
xgl6 Dec 20, 2025
7ba7957
:new: #3814 【微信支付】增加实名验证的接口
Copilot Dec 20, 2025
d05d4ba
:art: #3813 【微信支付】修复委托代扣协议字段名拼写错误
Copilot Dec 20, 2025
1ae1d2f
:new: #3811 【小程序】添加小游戏道具直购(present_goods)API的支持
Copilot Dec 20, 2025
5de0b72
:new: #3812 【小程序】实现用工关系API支持
Copilot Dec 21, 2025
17b59a4
Initial plan
Copilot Sep 24, 2025
a1645e6
Merge branch 'develop' into copilot/fix-7d6863c2-75f7-4666-87ef-1dc7e…
binarywang Dec 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions docs/NEW_TRANSFER_API_SUPPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
| **转账方式** | 批量转账 | 单笔转账 |
| **场景支持** | 基础场景 | 丰富场景(如佣金报酬等) |
| **撤销功能** | ❌ 不支持 | ✅ 支持 |
| **授权模式** | 仅需确认模式 | ✅ 支持免确认授权模式 |
| **适用范围** | 所有商户 | **新开通商户必须使用** |

### 2. 新版API功能列表
Expand All @@ -27,6 +28,30 @@
✅ **回调通知** - `parseTransferBillsNotifyResult()`
✅ **RSA加密** - 自动处理用户姓名加密
✅ **场景支持** - 支持多种转账场景ID
✅ **授权模式** - 支持免确认收款授权模式

### 3. 收款授权模式支持

**新增功能:免确认收款授权模式**

- **需确认收款授权模式**(默认):用户需要手动确认才能收款
- **免确认收款授权模式**:用户授权后,收款无需确认,转账直接到账

#### 使用方法

```java
// 免确认授权模式 - 提升用户体验
TransferBillsRequest request = TransferBillsRequest.newBuilder()
.receiptAuthorizationMode(WxPayConstants.ReceiptAuthorizationMode.NO_CONFIRM_RECEIPT_AUTHORIZATION)
// 其他参数...
.build();

// 需确认授权模式(默认)
TransferBillsRequest request2 = TransferBillsRequest.newBuilder()
.receiptAuthorizationMode(WxPayConstants.ReceiptAuthorizationMode.CONFIRM_RECEIPT_AUTHORIZATION)
// 其他参数...
.build();
```

## 快速开始

Expand Down
94 changes: 94 additions & 0 deletions docs/NEW_TRANSFER_API_USAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,100 @@
- **API前缀**: `/v3/fund-app/mch-transfer/transfer-bills`
- **特点**: 单笔转账,支持更丰富的转账场景

## 收款授权模式功能

### 授权模式说明

微信支付转账支持两种收款授权模式:

#### 1. 需确认收款授权模式(默认)
- **常量**: `WxPayConstants.ReceiptAuthorizationMode.CONFIRM_RECEIPT_AUTHORIZATION`
- **特点**: 用户收到转账后需要手动点击确认才能到账
- **适用场景**: 一般的转账场景
- **用户体验**: 安全性高,但需要额外操作

#### 2. 免确认收款授权模式
- **常量**: `WxPayConstants.ReceiptAuthorizationMode.NO_CONFIRM_RECEIPT_AUTHORIZATION`
- **特点**: 用户事先授权后,转账直接到账,无需确认
- **适用场景**: 高频转账场景,如佣金发放、返现等
- **用户体验**: 体验流畅,无需额外操作
- **前提条件**: 需要用户事先进行授权

### 使用示例

#### 免确认授权模式转账

```java
TransferBillsRequest request = TransferBillsRequest.newBuilder()
.appid("your_appid")
.outBillNo("NO_CONFIRM_" + System.currentTimeMillis())
.transferSceneId("1005") // 佣金报酬场景
.openid("user_openid")
.transferAmount(200) // 2元
.transferRemark("免确认收款转账")
.receiptAuthorizationMode(WxPayConstants.ReceiptAuthorizationMode.NO_CONFIRM_RECEIPT_AUTHORIZATION)
.userRecvPerception("Y")
.build();

try {
TransferBillsResult result = transferService.transferBills(request);
System.out.println("转账成功,直接到账:" + result.getTransferBillNo());
} catch (WxPayException e) {
if ("USER_NOT_AUTHORIZED".equals(e.getErrCode())) {
System.err.println("用户未授权免确认收款,请先引导用户进行授权");
}
}
```

#### 需确认授权模式转账(默认)

```java
TransferBillsRequest request = TransferBillsRequest.newBuilder()
.appid("your_appid")
.outBillNo("CONFIRM_" + System.currentTimeMillis())
.transferSceneId("1005")
.openid("user_openid")
.transferAmount(150) // 1.5元
.transferRemark("需确认收款转账")
// .receiptAuthorizationMode(...) // 不设置时使用默认的确认模式
.userRecvPerception("Y")
.build();

TransferBillsResult result = transferService.transferBills(request);
System.out.println("转账发起成功,等待用户确认:" + result.getPackageInfo());
```

### 错误处理

使用免确认授权模式时,需要处理以下可能的错误:

```java
try {
TransferBillsResult result = transferService.transferBills(request);
} catch (WxPayException e) {
switch (e.getErrCode()) {
case "USER_NOT_AUTHORIZED":
// 用户未授权免确认收款
System.err.println("请先引导用户进行免确认收款授权");
// 可以引导用户到授权页面
break;
case "AUTHORIZATION_EXPIRED":
// 授权已过期
System.err.println("用户授权已过期,请重新授权");
break;
default:
System.err.println("转账失败:" + e.getMessage());
}
}
```

### 使用建议

1. **高频转账场景**推荐使用免确认模式,提升用户体验
2. **首次使用**需引导用户进行授权
3. **处理异常**妥善处理授权相关异常,提供友好的错误提示
4. **场景选择**根据业务场景选择合适的授权模式

## 使用新版转账API

### 1. 获取服务实例
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,26 @@ public class TransferBillsRequest implements Serializable {
@SerializedName("transfer_scene_report_infos")
private List<TransferSceneReportInfo> transferSceneReportInfos;

/**
* 收款授权模式
* <pre>
* 字段名:收款授权模式
* 变量名:receipt_authorization_mode
* 是否必填:否
* 类型:string
* 描述:
* 控制收款方式的授权模式,可选值:
* - CONFIRM_RECEIPT_AUTHORIZATION:需确认收款授权模式(默认值)
* - NO_CONFIRM_RECEIPT_AUTHORIZATION:免确认收款授权模式(需要用户事先授权)
* 为空时,默认为需确认收款授权模式
* 示例值:NO_CONFIRM_RECEIPT_AUTHORIZATION
* </pre>
*
* @see com.github.binarywang.wxpay.constant.WxPayConstants.ReceiptAuthorizationMode
*/
@SerializedName("receipt_authorization_mode")
private String receiptAuthorizationMode;


@Data
@Builder(builderMethodName = "newBuilder")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -524,4 +524,25 @@ public static class CASH_MARKETING {
}

}

/**
* 收款授权模式
*
* @see <a href="https://pay.weixin.qq.com/doc/v3/merchant/4014399293">官方文档</a>
*/
@UtilityClass
public static class ReceiptAuthorizationMode {
/**
* 需确认收款授权模式(默认值)
* 用户需要手动确认才能收款
*/
public static final String CONFIRM_RECEIPT_AUTHORIZATION = "CONFIRM_RECEIPT_AUTHORIZATION";

/**
* 免确认收款授权模式
* 用户授权后,收款不需要确认,转账直接到账
*/
public static final String NO_CONFIRM_RECEIPT_AUTHORIZATION = "NO_CONFIRM_RECEIPT_AUTHORIZATION";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
import com.github.binarywang.wxpay.bean.transfer.*;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.TransferService;
import com.github.binarywang.wxpay.service.WxPayService;
Expand Down Expand Up @@ -215,6 +216,100 @@ public void batchTransferExample() {
}
}

/**
* 使用免确认收款授权模式进行转账示例
* 注意:使用此模式前,用户需要先进行授权
*/
public void transferWithNoConfirmAuthModeExample() {
try {
// 构建转账请求,使用免确认收款授权模式
TransferBillsRequest request = TransferBillsRequest.newBuilder()
.appid("wx1234567890123456")
.outBillNo("NO_CONFIRM_" + System.currentTimeMillis()) // 商户转账单号
.transferSceneId("1005") // 转账场景ID(佣金报酬)
.openid("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o") // 收款用户的openid
.transferAmount(200) // 转账金额,单位:分(此处为2元)
.transferRemark("免确认收款转账") // 转账备注
.receiptAuthorizationMode(WxPayConstants.ReceiptAuthorizationMode.NO_CONFIRM_RECEIPT_AUTHORIZATION)
.userRecvPerception("Y") // 用户收款感知
.build();

// 发起转账
TransferBillsResult result = transferService.transferBills(request);

System.out.println("=== 免确认授权模式转账成功 ===");
System.out.println("商户单号: " + result.getOutBillNo());
System.out.println("微信转账单号: " + result.getTransferBillNo());
System.out.println("状态: " + result.getState());
System.out.println("说明: 使用免确认授权模式,转账直接到账,无需用户确认");

} catch (WxPayException e) {
System.err.println("免确认授权转账失败: " + e.getMessage());
System.err.println("错误代码: " + e.getErrCode());

// 可能的错误原因
if ("USER_NOT_AUTHORIZED".equals(e.getErrCode())) {
System.err.println("用户未授权免确认收款,请先引导用户进行授权");
}
}
}

/**
* 使用需确认收款授权模式进行转账示例(默认模式)
*/
public void transferWithConfirmAuthModeExample() {
try {
// 构建转账请求,显式设置为需确认收款授权模式
TransferBillsRequest request = TransferBillsRequest.newBuilder()
.appid("wx1234567890123456")
.outBillNo("CONFIRM_" + System.currentTimeMillis()) // 商户转账单号
.transferSceneId("1005") // 转账场景ID
.openid("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o") // 收款用户的openid
.transferAmount(150) // 转账金额,单位:分(此处为1.5元)
.transferRemark("需确认收款转账") // 转账备注
.receiptAuthorizationMode(WxPayConstants.ReceiptAuthorizationMode.CONFIRM_RECEIPT_AUTHORIZATION)
.userRecvPerception("Y") // 用户收款感知
.build();

// 发起转账
TransferBillsResult result = transferService.transferBills(request);

System.out.println("=== 需确认授权模式转账成功 ===");
System.out.println("商户单号: " + result.getOutBillNo());
System.out.println("微信转账单号: " + result.getTransferBillNo());
System.out.println("状态: " + result.getState());
System.out.println("packageInfo: " + result.getPackageInfo());
System.out.println("说明: 使用需确认授权模式,用户需要手动确认才能收款");

} catch (WxPayException e) {
System.err.println("需确认授权转账失败: " + e.getMessage());
}
}

/**
* 权限模式对比示例
* 展示两种权限模式的区别和使用场景
*/
public void authModeComparisonExample() {
System.out.println("\n=== 收款授权模式对比 ===");
System.out.println("1. 需确认收款授权模式 (CONFIRM_RECEIPT_AUTHORIZATION):");
System.out.println(" - 这是默认模式");
System.out.println(" - 用户收到转账后需要手动点击确认才能到账");
System.out.println(" - 适用于一般的转账场景");
System.out.println(" - 转账状态可能包含 WAIT_USER_CONFIRM 等待确认状态");

System.out.println("\n2. 免确认收款授权模式 (NO_CONFIRM_RECEIPT_AUTHORIZATION):");
System.out.println(" - 用户事先授权后,转账直接到账,无需确认");
System.out.println(" - 提升用户体验,减少操作步骤");
System.out.println(" - 适用于高频转账场景,如佣金发放等");
System.out.println(" - 需要用户先进行授权,否则会返回授权错误");

System.out.println("\n使用建议:");
System.out.println("- 高频业务场景推荐使用免确认模式,提升用户体验");
System.out.println("- 首次使用需引导用户进行授权");
System.out.println("- 处理授权相关异常,提供友好的错误提示");
}

/**
* 使用配置示例
*/
Expand All @@ -230,20 +325,29 @@ public static void main(String[] args) {
// 创建示例实例
NewTransferApiExample example = new NewTransferApiExample(config);

// 权限模式对比说明
example.authModeComparisonExample();

// 运行示例
System.out.println("新版商户转账API使用示例");
System.out.println("===============================");

// 1. 发起单笔转账
// 1. 发起转账(使用免确认授权模式)
// example.transferWithNoConfirmAuthModeExample();

// 2. 发起转账(使用需确认授权模式)
// example.transferWithConfirmAuthModeExample();

// 3. 发起单笔转账(默认模式)
example.transferExample();

// 2. 查询转账结果
// 4. 查询转账结果
// example.queryByOutBillNoExample();

// 3. 撤销转账
// 5. 撤销转账
// example.cancelTransferExample();

// 4. 批量转账(传统API)
// 6. 批量转账(传统API)
// example.batchTransferExample();
}
}