1
0
mirror of synced 2025-12-08 06:48:07 +08:00

Compare commits

...

3 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
559c7e7887 Update documentation for WeChat transfer authorization mode feature
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
2025-09-24 13:56:58 +00:00
copilot-swe-agent[bot]
1d8f1433a5 Add WeChat merchant transfer confirmation-free receipt authorization mode support
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
2025-09-24 13:54:03 +00:00
copilot-swe-agent[bot]
ae4126a8ca Initial plan 2025-09-24 13:41:07 +00:00
5 changed files with 268 additions and 4 deletions

View File

@@ -17,6 +17,7 @@
| **转账方式** | 批量转账 | 单笔转账 |
| **场景支持** | 基础场景 | 丰富场景(如佣金报酬等) |
| **撤销功能** | ❌ 不支持 | ✅ 支持 |
| **授权模式** | 仅需确认模式 | ✅ 支持免确认授权模式 |
| **适用范围** | 所有商户 | **新开通商户必须使用** |
### 2. 新版API功能列表
@@ -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();
```
## 快速开始

View File

@@ -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. 获取服务实例

View File

@@ -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")

View File

@@ -436,4 +436,25 @@ public class WxPayConstants {
}
}
/**
* 收款授权模式
*
* @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";
}
}

View File

@@ -3,6 +3,7 @@ package com.github.binarywang.wxpay.example;
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;
@@ -215,6 +216,100 @@ public class NewTransferApiExample {
}
}
/**
* 使用免确认收款授权模式进行转账示例
* 注意:使用此模式前,用户需要先进行授权
*/
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("- 处理授权相关异常,提供友好的错误提示");
}
/**
* 使用配置示例
*/
@@ -230,20 +325,29 @@ public class NewTransferApiExample {
// 创建示例实例
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();
}
}