|
16 | 16 | - **API前缀**: `/v3/fund-app/mch-transfer/transfer-bills` |
17 | 17 | - **特点**: 单笔转账,支持更丰富的转账场景 |
18 | 18 |
|
| 19 | +## 收款授权模式功能 |
| 20 | + |
| 21 | +### 授权模式说明 |
| 22 | + |
| 23 | +微信支付转账支持两种收款授权模式: |
| 24 | + |
| 25 | +#### 1. 需确认收款授权模式(默认) |
| 26 | +- **常量**: `WxPayConstants.ReceiptAuthorizationMode.CONFIRM_RECEIPT_AUTHORIZATION` |
| 27 | +- **特点**: 用户收到转账后需要手动点击确认才能到账 |
| 28 | +- **适用场景**: 一般的转账场景 |
| 29 | +- **用户体验**: 安全性高,但需要额外操作 |
| 30 | + |
| 31 | +#### 2. 免确认收款授权模式 |
| 32 | +- **常量**: `WxPayConstants.ReceiptAuthorizationMode.NO_CONFIRM_RECEIPT_AUTHORIZATION` |
| 33 | +- **特点**: 用户事先授权后,转账直接到账,无需确认 |
| 34 | +- **适用场景**: 高频转账场景,如佣金发放、返现等 |
| 35 | +- **用户体验**: 体验流畅,无需额外操作 |
| 36 | +- **前提条件**: 需要用户事先进行授权 |
| 37 | + |
| 38 | +### 使用示例 |
| 39 | + |
| 40 | +#### 免确认授权模式转账 |
| 41 | + |
| 42 | +```java |
| 43 | +TransferBillsRequest request = TransferBillsRequest.newBuilder() |
| 44 | + .appid("your_appid") |
| 45 | + .outBillNo("NO_CONFIRM_" + System.currentTimeMillis()) |
| 46 | + .transferSceneId("1005") // 佣金报酬场景 |
| 47 | + .openid("user_openid") |
| 48 | + .transferAmount(200) // 2元 |
| 49 | + .transferRemark("免确认收款转账") |
| 50 | + .receiptAuthorizationMode(WxPayConstants.ReceiptAuthorizationMode.NO_CONFIRM_RECEIPT_AUTHORIZATION) |
| 51 | + .userRecvPerception("Y") |
| 52 | + .build(); |
| 53 | + |
| 54 | +try { |
| 55 | + TransferBillsResult result = transferService.transferBills(request); |
| 56 | + System.out.println("转账成功,直接到账:" + result.getTransferBillNo()); |
| 57 | +} catch (WxPayException e) { |
| 58 | + if ("USER_NOT_AUTHORIZED".equals(e.getErrCode())) { |
| 59 | + System.err.println("用户未授权免确认收款,请先引导用户进行授权"); |
| 60 | + } |
| 61 | +} |
| 62 | +``` |
| 63 | + |
| 64 | +#### 需确认授权模式转账(默认) |
| 65 | + |
| 66 | +```java |
| 67 | +TransferBillsRequest request = TransferBillsRequest.newBuilder() |
| 68 | + .appid("your_appid") |
| 69 | + .outBillNo("CONFIRM_" + System.currentTimeMillis()) |
| 70 | + .transferSceneId("1005") |
| 71 | + .openid("user_openid") |
| 72 | + .transferAmount(150) // 1.5元 |
| 73 | + .transferRemark("需确认收款转账") |
| 74 | + // .receiptAuthorizationMode(...) // 不设置时使用默认的确认模式 |
| 75 | + .userRecvPerception("Y") |
| 76 | + .build(); |
| 77 | + |
| 78 | +TransferBillsResult result = transferService.transferBills(request); |
| 79 | +System.out.println("转账发起成功,等待用户确认:" + result.getPackageInfo()); |
| 80 | +``` |
| 81 | + |
| 82 | +### 错误处理 |
| 83 | + |
| 84 | +使用免确认授权模式时,需要处理以下可能的错误: |
| 85 | + |
| 86 | +```java |
| 87 | +try { |
| 88 | + TransferBillsResult result = transferService.transferBills(request); |
| 89 | +} catch (WxPayException e) { |
| 90 | + switch (e.getErrCode()) { |
| 91 | + case "USER_NOT_AUTHORIZED": |
| 92 | + // 用户未授权免确认收款 |
| 93 | + System.err.println("请先引导用户进行免确认收款授权"); |
| 94 | + // 可以引导用户到授权页面 |
| 95 | + break; |
| 96 | + case "AUTHORIZATION_EXPIRED": |
| 97 | + // 授权已过期 |
| 98 | + System.err.println("用户授权已过期,请重新授权"); |
| 99 | + break; |
| 100 | + default: |
| 101 | + System.err.println("转账失败:" + e.getMessage()); |
| 102 | + } |
| 103 | +} |
| 104 | +``` |
| 105 | + |
| 106 | +### 使用建议 |
| 107 | + |
| 108 | +1. **高频转账场景**推荐使用免确认模式,提升用户体验 |
| 109 | +2. **首次使用**需引导用户进行授权 |
| 110 | +3. **处理异常**妥善处理授权相关异常,提供友好的错误提示 |
| 111 | +4. **场景选择**根据业务场景选择合适的授权模式 |
| 112 | + |
19 | 113 | ## 使用新版转账API |
20 | 114 |
|
21 | 115 | ### 1. 获取服务实例 |
|
0 commit comments