跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaWeChatPayjava

微信支付商家转账常见问题及 Java 调用示例

总结了微信支付商家转账接口常见的六个错误场景及其解决方案,包括 IP 白名单设置、AppID 关联、转账场景权限获取、用户收款感知配置、场景报备信息填写以及运营账户资金不足等问题。同时提供了基于 OkHttp 和 Gson 的 Java 调用示例代码,帮助开发者快速排查问题并完成对接。

禅心发布于 2026/3/29更新于 2026/7/2764 浏览

微信支付商家转账常见问题及解决方案

1. 此 IP 地址不允许调用接口,请按开发指引设置

错误信息:

{
    "code": "INVALID_REQUEST",
    "message": "此 IP 地址不允许调用接口,请按开发指引设置"
}

解决方案: 需在商户平台设置接口 IP 白名单。

  1. 扫码登录商户平台。
  2. 进入路径:产品中心 -> 运营工具 -> 商家转账 -> 前往功能 -> 安全能力 -> 点击「接口 IP」。
  3. 添加开发者 IP 和服务器的 IP。如有 IPv6 地址也需一并填写。

文章配图 文章配图 文章配图

2. APPID 不存在

错误信息:

{
    "code": "INVALID_REQUEST",
    "message": "APPID 不存在"
}

解决方案: 需将调用的小程序或公众号关联到当前商户号。

  1. 打开产品中心 -> AppID 账号管理 -> 账号关联。
  2. 进入授权申请页面提交申请。
  3. 在微信公众平台侧点击接受授权。

参考文档:APPID 授权管理功能介绍 - 微信支付商户平台

文章配图

3. 你尚未获取该转账场景

错误信息:

{
    "code": "INVALID_REQUEST",
    "message": "你尚未获取该转账场景"
}

解决方案: 转账场景指转账的具体用途,不同场景对应不同的参数要求。需先申请并审核通过。

  1. 进入路径:产品中心 > 运营工具 > 商家转账到零钱 > 前往功能 > 转账场景。
  2. 选择对应场景并提交申请,等待审核。

文章配图 文章配图

4. 暂不支持展示当前传入的用户收款感知

错误信息:

{
    "code": "INVALID_REQUEST",
    "message": "暂不支持展示当前传入的用户收款感知"
}

解决方案: 用户收款感知(字段 user_recv_perception)用于在微信端展示款项来源提示(如'现金奖励'、'拉新红包'等)。各场景支持的内容不同,需严格对照官方文档填写。

例如佣金报酬场景(transfer_scene_id = 1005),仅支持【劳务报酬】、【报销款】、【企业补贴】、【开工利是】,不传则默认为【劳务报酬】。若填入不支持的内容会报错。

参考文档:现金营销_商家转账 | 微信支付商户文档中心

文章配图

5. 未传入完整且对应的转账场景报备信息,请根据接口文档检查

错误信息:

{
    "code": "PARAM_ERROR",
    "message": "未传入完整且对应的转账场景报备信息,请根据接口文档检查"
}

解决方案: 转账场景报备信息(字段 transfer_scene_report_infos)用于向微信说明转账用途,符合政策才允许交易。不同场景所需参数不同,需包含转账原因、场景说明、奖励类型等。

以佣金报酬为例,必须传递岗位类型和报酬说明。

文章配图 文章配图

6. 商户运营账户资金不足

错误信息:

{
    "code": "NOT_ENOUGH",
    "message": "商户运营账户资金不足,充值后可以原单号发起重试,请勿更换商户单号"
}

解决方案: 需确保商户运营账户余额充足。注意充值至运营账户而非基本账户。

文章配图

Java 调用示例

package co.yixiang.modules.transferToUser.utils;

import com.google.gson.annotations.SerializedName;
import lombok.Data;
import okhttp3.*;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.List;

/**
 * 发起转账
 */
public class TransferToUser {
    private static String HOST = "https://api.mch.weixin.qq.com";
    private static String METHOD = "POST";
    private static String PATH = "/v3/fund-app/mch-transfer/transfer-bills";

    public static void main(String[] args) {
        // TODO: 请准备商户开发必要参数
        TransferToUser client = new TransferToUser(
                "12321321", // 商户号
                "12321321321321312", // 商户 API 证书序列号
                "E:\\Java_project_self\\privateKey.pem" // 商户 API 证书私钥文件路径
        );

        TransferToUserRequest request = new TransferToUserRequest();
        request.appid = "wx213123213";
        request.outBillNo = "plfk212DS" + System.currentTimeMillis();
        request.transferSceneId = "1005";
        request.openid = "21321321321213";
        request.transferAmount = 10L;
        request.transferRemark = "佣金提现到账";
        request.notifyUrl = "https://www.weixin.qq.com/wxpay/pay.php";

        List<TransferSceneReportInfo> list = new ArrayList<>();
        TransferSceneReportInfo info1 = new TransferSceneReportInfo();
        info1.infoType = "岗位类型";
        info1.infoContent = "分享有礼";
        list.add(info1);

        TransferSceneReportInfo info2 = new TransferSceneReportInfo();
        info2.infoType = "报酬说明";
        info2.infoContent = "用户推广获得佣金";
        list.add(info2);

        request.userRecvPerception = "劳务报酬";
        request.transferSceneReportInfos = list;

        try {
            TransferToUserResponse response = client.run(request);
            // TODO: 请求成功,继续业务逻辑
            System.out.println(response);
        } catch (Exception e) {
            // TODO: 请求失败,根据状态码执行不同的逻辑
            e.printStackTrace();
        }
    }

    public TransferToUserResponse run(TransferToUserRequest request) {
        String uri = PATH;
        String reqBody = WXPayUtility.toJson(request);
        Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
        reqBuilder.addHeader("Accept", "application/json");
        reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, reqBody));
        reqBuilder.addHeader("Content-Type", "application/json");
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqBody);
        reqBuilder.method(METHOD, requestBody);
        Request httpRequest = reqBuilder.build();

        OkHttpClient client = new OkHttpClient.Builder().build();
        try (Response httpResponse = client.newCall(httpRequest).execute()) {
            String respBody = WXPayUtility.extractBody(httpResponse);
            if (httpResponse.code() >= 200 && httpResponse.code() < 300) {
                return WXPayUtility.fromJson(respBody, TransferToUserResponse.class);
            } else {
                throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers());
            }
        } catch (IOException e) {
            throw new UncheckedIOException("Sending request to " + uri + " failed.", e);
        }
    }

    private final String mchid;
    private final String certificateSerialNo;
    private final PrivateKey privateKey;

    public TransferToUser(String mchid, String certificateSerialNo, String privateKeyFilePath) {
        this.mchid = mchid;
        this.certificateSerialNo = certificateSerialNo;
        this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath);
    }

    @Data
    public static class TransferToUserRequest {
        @SerializedName("appid") public String appid;
        @SerializedName("out_bill_no") public String outBillNo;
        @SerializedName("transfer_scene_id") public String transferSceneId;
        @SerializedName("openid") public String openid;
        @SerializedName("user_name") public String userName;
        @SerializedName("transfer_amount") public Long transferAmount;
        @SerializedName("transfer_remark") public String transferRemark;
        @SerializedName("notify_url") public String notifyUrl;
        @SerializedName("user_recv_perception") public String userRecvPerception;
        @SerializedName("transfer_scene_report_infos") public List<TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<>();
    }

    @Data
    public static class TransferToUserResponse {
        @SerializedName("out_bill_no") public String outBillNo;
        @SerializedName("transfer_bill_no") public String transferBillNo;
        @SerializedName("create_time") public String createTime;
        @SerializedName("state") public TransferBillStatus state;
        @SerializedName("package_info") public String packageInfo;
    }

    @Data
    public static class TransferSceneReportInfo {
        @SerializedName("info_type") public String infoType;
        @SerializedName("info_content") public String infoContent;
    }

    public enum TransferBillStatus {
        @SerializedName("ACCEPTED") ACCEPTED,
        @SerializedName("PROCESSING") PROCESSING,
        @SerializedName("WAIT_USER_CONFIRM") WAIT_USER_CONFIRM,
        @SerializedName("TRANSFERING") TRANSFERING,
        @SerializedName("SUCCESS") SUCCESS,
        @SerializedName("FAIL") FAIL,
        @SerializedName("CANCELING") CANCELING,
        @SerializedName("CANCELLED") CANCELLED
    }
}

目录

  1. 微信支付商家转账常见问题及解决方案
  2. 1. 此 IP 地址不允许调用接口,请按开发指引设置
  3. 2. APPID 不存在
  4. 3. 你尚未获取该转账场景
  5. 4. 暂不支持展示当前传入的用户收款感知
  6. 5. 未传入完整且对应的转账场景报备信息,请根据接口文档检查
  7. 6. 商户运营账户资金不足
  8. Java 调用示例
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2026 AI图像生成模型速度对比:谁才是真正的效率王?
  • 埃斯顿工业机器人仿真与编程快速入门
  • VS Code 中配置 GitHub Copilot 自定义 Skill 的方法
  • ROS2 使用 URDF 和 Xacro 创建机器人模型
  • WebPlotDigitizer 图表数据提取指南:从图像到精准数值的转换
  • SQL Server 安装及使用教程(含远程连接配置)
  • ComfyUI 节点式 AI 绘画工作流详解
  • Windows 10 部署 llama.cpp 环境配置与编译指南
  • OPC 一人公司创业指南:AI 时代的商业闭环与实战
  • C++ NX 二次开发环境配置指南
  • Fooocus 本地部署指南:轻松上手 AI 绘画
  • 本地部署 Wan2.1 视频生成模型全攻略
  • Docker Compose 部署 MySQL 8.4 LTS 生产环境指南
  • C++ STL 算法实战:序列操作、排序与数值处理
  • 架构漫谈:什么是软件架构
  • 使用 OpenClaw 在飞书搭建专属 AI 机器人
  • 基于 DeepSeek-V3.1 的 MATLAB 本地 AI 编程工具实战
  • IntelliJ IDEA 构建进程内存不足导致 OOM 错误排查与设置
  • 数据结构:双向循环链表详解
  • LIBERO:终身机器人学习综合基准测试平台

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online