申请公益捐赠预算

更新时间:2025.07.10

申请公益捐赠预算
注:单个商户的接口频率限制为50次/s

接口说明

支持商户:【普通服务商】

请求方式:【POST】/v3/fund-app/mch-transfer/partner/charity-budget

请求域名:【主域名】https://api.mch.weixin.qq.com 使用该域名将访问就近的接入点

     【备域名】https://api2.mch.weixin.qq.com 使用该域名将访问异地的接入点 ,指引点击查看

请求参数

Header HTTP头参数

Authorization  必填 string

请参考签名认证生成认证信息


Accept  必填 string

请设置为application/json


Content-Type  必填 string

请设置为application/json


body 包体参数

out_budget_no  必填 string(32)

【商户预算单号】 服务商系统内部预算单号,此参数只能由数字、大小写字母组成,在服务商系统内部唯一。


sponsor_mchid  必填 string(32)

【出资商户号】 出资捐款的商户号。


sponsor_subject_name  必填 string(64)

【出资企业主体名称】 出资捐款的企业主体。


activity_name  必填 string(32)

【活动名称】 公益活动名称,同时会在出资商户确认出资时展示,字数不超过32个字 符。中英文数字均算作1个字符。


activity_remark  必填 string(64)

【活动说明】 活动备注信息,用于描述活动时间等,同时会在出资商户确认出资时展示。 字数不超过64个字符。中英文数字均算作1个字符。


amount  必填 integer

【预算总金额】 预先锁定的活动预算总金额,同时会在出资商户确认出资时展示,金额单位为“分”。


notify_url  选填 string(256)

【回调地址】 接收预算锁定申请结果通知,通知url必须为公网可访问的URL,必须为HTTPS,不能携带参数,不填则不通知商户。

请求示例

Java
Go
curl

需配合微信支付工具库 WXPayUtility 使用,请参考 Java 

1package com.java.demo;
2
3import com.java.utils.WXPayUtility; // 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/partner/4014985777
4
5import com.google.gson.annotations.SerializedName;
6import com.google.gson.annotations.Expose;
7import okhttp3.MediaType;
8import okhttp3.OkHttpClient;
9import okhttp3.Request;
10import okhttp3.RequestBody;
11import okhttp3.Response;
12
13import java.io.IOException;
14import java.io.UncheckedIOException;
15import java.security.PrivateKey;
16import java.security.PublicKey;
17import java.util.ArrayList;
18import java.util.HashMap;
19import java.util.List;
20import java.util.Map;
21
22/**
23 * 申请公益捐赠预算
24 */
25public class CreateBudget {
26  private static String HOST = "https://api.mch.weixin.qq.com";
27  private static String METHOD = "POST";
28  private static String PATH = "/v3/fund-app/mch-transfer/partner/charity-budget";
29
30  public static void main(String[] args) {
31    // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340
32    CreateBudget client = new CreateBudget(
33      "19xxxxxxxx",                    // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340
34      "1DDE55AD98Exxxxxxxxxx",         // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924
35      "/path/to/apiclient_key.pem",    // 商户API证书私钥文件路径,本地文件路径
36      "PUB_KEY_ID_xxxxxxxxxxxxx",      // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589
37      "/path/to/wxp_pub.pem"           // 微信支付公钥文件路径,本地文件路径
38    );
39
40    CreateBudgetRequest request = new CreateBudgetRequest();
41    request.outBudgetNo = "budget202506300102";
42    request.sponsorMchid = "1900001109";
43    request.sponsorSubjectName = "腾讯控股有限公司";
44    request.activityName = "公益企业配捐活动";
45    request.activityRemark = "公益活动开始于9月1日,帮助困难儿童筹款活动";
46    request.amount = 20000000L;
47    request.notifyUrl = "https://www.weixin.qq.com/wxpay/pay.php";
48    try {
49      BudgetInfo response = client.run(request);
50
51      // TODO: 请求成功,继续业务逻辑
52      System.out.println(response);
53    } catch (WXPayUtility.ApiException e) {
54      // TODO: 请求失败,根据状态码执行不同的逻辑
55      e.printStackTrace();
56    }
57  }
58
59  public BudgetInfo run(CreateBudgetRequest request) {
60    String uri = PATH;
61    String reqBody = WXPayUtility.toJson(request);
62
63    Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
64    reqBuilder.addHeader("Accept", "application/json");
65    reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId);
66    reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo,privateKey, METHOD, uri, reqBody));
67    reqBuilder.addHeader("Content-Type", "application/json");
68    RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqBody);
69    reqBuilder.method(METHOD, requestBody);
70    Request httpRequest = reqBuilder.build();
71
72    // 发送HTTP请求
73    OkHttpClient client = new OkHttpClient.Builder().build();
74    try (Response httpResponse = client.newCall(httpRequest).execute()) {
75      String respBody = WXPayUtility.extractBody(httpResponse);
76      if (httpResponse.code() >= 200 && httpResponse.code() < 300) {
77        // 2XX 成功,验证应答签名
78        WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey,
79            httpResponse.headers(), respBody);
80
81        // 从HTTP应答报文构建返回数据
82        return WXPayUtility.fromJson(respBody, BudgetInfo.class);
83      } else {
84        throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers());
85      }
86    } catch (IOException e) {
87      throw new UncheckedIOException("Sending request to " + uri + " failed.", e);
88    }
89  }
90
91  private final String mchid;
92  private final String certificateSerialNo;
93  private final PrivateKey privateKey;
94  private final String wechatPayPublicKeyId;
95  private final PublicKey wechatPayPublicKey;
96
97  public CreateBudget(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) {
98    this.mchid = mchid;
99    this.certificateSerialNo = certificateSerialNo;
100    this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath);
101    this.wechatPayPublicKeyId = wechatPayPublicKeyId;
102    this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath);
103  }
104
105  public static class CreateBudgetRequest {
106    @SerializedName("out_budget_no")
107    public String outBudgetNo;
108  
109    @SerializedName("sponsor_mchid")
110    public String sponsorMchid;
111  
112    @SerializedName("sponsor_subject_name")
113    public String sponsorSubjectName;
114  
115    @SerializedName("activity_name")
116    public String activityName;
117  
118    @SerializedName("activity_remark")
119    public String activityRemark;
120  
121    @SerializedName("amount")
122    public Long amount;
123  
124    @SerializedName("notify_url")
125    public String notifyUrl;
126  }
127  
128  public static class BudgetInfo {
129    @SerializedName("sp_mchid")
130    public String spMchid;
131  
132    @SerializedName("out_budget_no")
133    public String outBudgetNo;
134  
135    @SerializedName("budget_id")
136    public String budgetId;
137  
138    @SerializedName("amount")
139    public Long amount;
140  
141    @SerializedName("sponsor_mchid")
142    public String sponsorMchid;
143  
144    @SerializedName("activity_name")
145    public String activityName;
146  
147    @SerializedName("activity_remark")
148    public String activityRemark;
149  
150    @SerializedName("state")
151    public BudgetOrderState state;
152  
153    @SerializedName("confirm_url")
154    public String confirmUrl;
155  
156    @SerializedName("super_admin_wxid_mask")
157    public String superAdminWxidMask;
158  
159    @SerializedName("remain_amount")
160    public Long remainAmount;
161  
162    @SerializedName("unlock_remark")
163    public String unlockRemark;
164  
165    @SerializedName("locked_time")
166    public String lockedTime;
167  
168    @SerializedName("finished_time")
169    public String finishedTime;
170  
171    @SerializedName("closed_time")
172    public String closedTime;
173  }
174  
175  public enum BudgetOrderState {
176    @SerializedName("PENDING")
177    PENDING,
178    @SerializedName("LOCKED")
179    LOCKED,
180    @SerializedName("FINISHED")
181    FINISHED,
182    @SerializedName("CLOSED")
183    CLOSED
184  }
185  
186}
187

应答参数

200 OK

sp_mchid  必填 string(32)

【服务商商户号】 服务商商户号


out_budget_no  必填 string(32)

【商户预算单号】 服务商系统内部预算单号,此参数只能由数字、大小写字母组成,在服务商系统内部唯一。


budget_id  必填 string(32)

【微信支付预算单号】 微信支付预算单号,微信系统返回的唯一标识。


amount  必填 integer

【活动总金额】 活动预算总金额,单位为“分”。


sponsor_mchid  必填 string(32)

【出资商户号】 出资商户号


activity_name  必填 string(32)

【活动名称】 活动名称


activity_remark  必填 string(64)

【活动说明】 活动说明


state  必填 string

【预算单状态】 预算单状态

可选取值

  • PENDING: 待锁定,成功申请公益捐赠预算后,但出资商户未确认时,预算单返回该状态

  • LOCKED: 已锁定,出资商户成功确认预算单后,预算单会由PENDING转变为LOCKED状态

  • FINISHED: 已完成(终态),预算捐赠完成或者解锁后,预算单会由LOCKED转变为FINISHED状态

  • CLOSED: 已关闭(终态),预算单超时未被出资商户确认,状态会由PENDING转变为CLOSED状态


confirm_url  选填 string(255)

【确认出资页面地址】 出资商户操作确认的商户平台页面地址,当state是PENDING时返回,供服务商提供跳转路径。


super_admin_wxid_mask  选填 string(32)

【商户号超管微信号掩码】 当state是PENDING时返回,展示首2位、尾2位,供服务商向出资商户提示可操作确认的超管微信号。


remain_amount  选填 integer

【剩余预算金额】 剩余预算金额,仅当state是LOCKED时返回,单位为“分”。


unlock_remark  选填 string(32)

【撤销说明】 预算解锁时,商户传入的解锁说明,仅当state是FINISHED时返回


locked_time  选填 string

【资金锁定时间】 资金锁定时间,仅当state是LOCKED或FINISHED时返回,遵循rfc3339标准格式:yyyy-MM-DDThh:mm:ss+TIMEZONE


finished_time  选填 string

【完成时间】 完成时间,仅当state是FINISHED时返回,遵循rfc3339标准格式:yyyy-MM-DDThh:mm:ss+TIMEZONE


closed_time  选填 string

【关闭时间】 关闭时间,仅当state是CLOSED时返回,遵循rfc3339标准格式:yyyy-MM-DDThh:mm:ss+TIMEZONE

应答示例

200 OK

1{
2  "sp_mchid" : "1900001109",
3  "out_budget_no" : "budget202506300102",
4  "budget_id" : "1182020050700019480001",
5  "amount" : 20000000,
6  "sponsor_mchid" : "1900001109",
7  "activity_name" : "公益企业配捐活动",
8  "activity_remark" : "公益活动开始于9月1日,帮助困难儿童筹款活动",
9  "state" : "PENDING",
10  "confirm_url" : "https://www.weixin.qq.com/wxpay/pay.php",
11  "super_admin_wxid_mask" : "ca***ye",
12  "remain_amount" : 0,
13  "unlock_remark" : "",
14  "locked_time" : "",
15  "finished_time" : "",
16  "closed_time" : ""
17}
18

 

错误码

公共错误码

状态码

错误码

描述

解决方案

400

PARAM_ERROR

参数错误

请根据错误提示正确传入参数

400

INVALID_REQUEST

HTTP 请求不符合微信支付 APIv3 接口规则

请参阅 接口规则

401

SIGN_ERROR

验证不通过

请参阅 签名常见问题

500

SYSTEM_ERROR

系统异常,请稍后重试

请稍后重试

业务错误码

状态码

错误码

描述

解决方案

429

RATELIMIT_EXCEEDED

请求接口频率过快

降低频率,稍后重试

400

INVALID_REQUEST

请求不符合业务规则

请参阅 产品介绍、开发指引 和 接口规则

403

NO_AUTH

没有相关权限

请参阅 产品介绍、开发指引

 

 

反馈
咨询
目录
置顶