提交注销提现申请
更新时间:2025.03.13本接口用于商户号注销、商户号注销及提现。当平台二级商户需要注销商户号,或需要注销商户号并提现商户号可用余额的商户,由其所属的平台商户调用此接口发起申请。
注意事项:
仅针对被微信支付管控、且无法解脱该管控的商户,可通过此接口发起注销提现。例如商户营业执照注销吊销。
申请单审核通过并经过商户确认后,账户内所有余额将打款至商户号指定的银行卡账户,如商户有多个账户,将会多笔入账
审核通过后,超过30天未经商户确认的单据将做撤销处理
接口说明
支持商户:【平台商户】
请求方式:【POST】/v3/ecommerce/account/apply-cancel-withdraw
请求域名:【主域名】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
Wechatpay-Serial 必填 string
【微信支付公钥ID】或【微信支付平台证书序列号】 请求参数中的敏感字段,需要使用微信支付公钥加密(推荐),请参考获取微信支付公钥ID说明以及微信支付公钥加密敏感信息指引;也可以使用微信支付平台证书公钥加密,参考获取平台证书序列号、平台证书加密敏感信息指引
body 包体参数
sub_mchid 必填 string(32)
【申请注销的二级商户号】 平台商户的二级商户号,由微信支付生成并下发
out_request_no 必填 string(32)
【商户注销申请单号】 商户注销申请单号,由商户自定义生成,要求在服务商维度下是唯一的,必须仅包含大小写字母与数字
withdraw 选填 string
【是否提取资金】 支持被微信支付平台不收不付管控的二级商户填写此字段,填写后需要填写注销的提现银行卡信息,微信支付会将所有的账户内可提现资金提取至对应银行卡
填写前,建议平台商户查询二级商户是否存在消费者投诉或风险处罚原因冻结的资金,避免错误驳回
可选取值
NOT_APPLY_WITHDRAW: 仅注销,不申请提现APPLY_WITHDRAW: 申请提现
payee_info 选填 object
【收款账号信息】 收款账号
| 属性 | |||||||||
account_type 必填 string 【账户类型】 1、若主体为营业执照未注销吊销的企业,可填写:对公银行账户 可选取值
bank_account_info 必填 object 【银行账户】 对应的银行账户
identity_info 选填 object 【收款人账号对应的证件信息】 当收款账户为付款到对私银行卡时,需要提供对私账户开户人的身份证件信息,必填, 以下
|
proof_medias 选填 array[ProofMedia]
【付款申请材料】 填写条件:
主体为企业,且经营证照注吊撤,必填;
主体为事业单位/政府机关/社会组织,必填;
其他主体类型的商户,即主体为小微商户/个体工商户/经营证照存续的企业,无需填写
| 属性 | |
proof_media_type 必填 string 【付款申请材料类型】 付款申请材料类型 可选取值
proof_media 必填 string(1024) 【证明材料照片】 1、请上传材料对应类型的图片 |
additional_materials 选填 array[string]
【其他补充材料】 不在上述证明材料中的其他需要服务商补充的,请填写通过图片上传接口预先上传图片生成好的MediaID,最多可上传10张图片
remark 选填 string(32)
【备注】 付款申请备注,传入后将展示在收款银行系统中,可供平台与二级商户进行对账。由数字、字母、汉字组成(能否成功展示依赖银行系统支持)。
请求示例
POST
1curl -X POST \ 2 https://api.mch.weixin.qq.com/v3/ecommerce/account/apply-cancel-withdraw \ 3 -H "Authorization: WECHATPAY2-SHA256-RSA2048 mchid=\"1900000001\",..." \ 4 -H "Accept: application/json" \ 5 -H "Wechatpay-Serial: 5157F09EFDC096DE15EBE81A47057A7232F1B8E1" \ 6 -H "Content-Type: application/json" \ 7 -d '{ 8 "sub_mchid" : "1900000109", 9 "out_request_no" : "P202410241010125346", 10 "withdraw" : "APPLY_WITHDRAW", 11 "payee_info" : { 12 "account_type" : "ACCOUNT_TYPE_CORPORATE", 13 "bank_account_info" : { 14 "account_name" : "AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==", 15 "account_bank" : "工商银行", 16 "bank_branch_id" : "402713354941", 17 "bank_branch_name" : "施秉县农村信用合作联社城关信用社", 18 "account_number" : "d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w==" 19 }, 20 "identity_info" : { 21 "id_doc_type" : "IDENTIFICATION_TYPE_ID_CARD", 22 "identification_name" : "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==", 23 "identification_no" : "AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==" 24 } 25 }, 26 "proof_medias" : [ 27 { 28 "proof_media_type" : "WITHDRAWAL_APPLICATION", 29 "proof_media" : "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ" 30 } 31 ], 32 "additional_materials" : [ 33 "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ" 34 ], 35 "remark" : "特殊理由" 36 }' 37
需配合微信支付工具库 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 * 提交注销提现申请API 24 */ 25public class SubmitApply { 26 private static String HOST = "https://api.mch.weixin.qq.com"; 27 private static String METHOD = "POST"; 28 private static String PATH = "/v3/ecommerce/account/apply-cancel-withdraw"; 29 30 public static void main(String[] args) { 31 // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 32 SubmitApply client = new SubmitApply( 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 SubmitRequest request = new SubmitRequest(); 41 request.subMchid = "1900000109"; 42 request.outRequestNo = "P202410241010125346"; 43 request.withdraw = ApplyWithdraw.APPLY_WITHDRAW; 44 request.payeeInfo = new PayeeInfo(); 45 request.payeeInfo.accountType = AccountType.ACCOUNT_TYPE_CORPORATE; 46 request.payeeInfo.bankAccountInfo = new BankAccountInfo(); 47 request.payeeInfo.bankAccountInfo.accountName = client.encrypt("account_name"); 48 request.payeeInfo.bankAccountInfo.accountBank = "工商银行"; 49 request.payeeInfo.bankAccountInfo.bankBranchId = "402713354941"; 50 request.payeeInfo.bankAccountInfo.bankBranchName = "施秉县农村信用合作联社城关信用社"; 51 request.payeeInfo.bankAccountInfo.accountNumber = client.encrypt("account_number"); 52 request.payeeInfo.identityInfo = new IdentityInfo(); 53 request.payeeInfo.identityInfo.idDocType = IdentificationType.IDENTIFICATION_TYPE_ID_CARD; 54 request.payeeInfo.identityInfo.identificationName = client.encrypt("identification_name"); 55 request.payeeInfo.identityInfo.identificationNo = client.encrypt("identification_no"); 56 request.proofMedias = new ArrayList<>(); 57 { 58 ProofMedia proofMediasItem = new ProofMedia(); 59 proofMediasItem.proofMediaType = ProofMediaType.WITHDRAWAL_APPLICATION; 60 proofMediasItem.proofMedia = "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"; 61 request.proofMedias.add(proofMediasItem); 62 }; 63 request.additionalMaterials = new ArrayList<>(); 64 { 65 request.additionalMaterials.add("jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"); 66 }; 67 request.remark = "特殊理由"; 68 try { 69 SubmitResponse response = client.run(request); 70 // TODO: 请求成功,继续业务逻辑 71 System.out.println(response); 72 } catch (WXPayUtility.ApiException e) { 73 // TODO: 请求失败,根据状态码执行不同的逻辑 74 e.printStackTrace(); 75 } 76 } 77 78 public SubmitResponse run(SubmitRequest request) { 79 String uri = PATH; 80 String reqBody = WXPayUtility.toJson(request); 81 82 Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); 83 reqBuilder.addHeader("Accept", "application/json"); 84 reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId); 85 reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo,privateKey, METHOD, uri, reqBody)); 86 reqBuilder.addHeader("Content-Type", "application/json"); 87 RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqBody); 88 reqBuilder.method(METHOD, requestBody); 89 Request httpRequest = reqBuilder.build(); 90 91 // 发送HTTP请求 92 OkHttpClient client = new OkHttpClient.Builder().build(); 93 try (Response httpResponse = client.newCall(httpRequest).execute()) { 94 String respBody = WXPayUtility.extractBody(httpResponse); 95 if (httpResponse.code() >= 200 && httpResponse.code() < 300) { 96 // 2XX 成功,验证应答签名 97 WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, 98 httpResponse.headers(), respBody); 99 100 // 从HTTP应答报文构建返回数据 101 return WXPayUtility.fromJson(respBody, SubmitResponse.class); 102 } else { 103 throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); 104 } 105 } catch (IOException e) { 106 throw new UncheckedIOException("Sending request to " + uri + " failed.", e); 107 } 108 } 109 110 private final String mchid; 111 private final String certificateSerialNo; 112 private final PrivateKey privateKey; 113 private final String wechatPayPublicKeyId; 114 private final PublicKey wechatPayPublicKey; 115 116 public SubmitApply(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) { 117 this.mchid = mchid; 118 this.certificateSerialNo = certificateSerialNo; 119 this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath); 120 this.wechatPayPublicKeyId = wechatPayPublicKeyId; 121 this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath); 122 } 123 124 public String encrypt(String plainText) { 125 return WXPayUtility.encrypt(this.wechatPayPublicKey, plainText); 126 } 127 128 public static class SubmitRequest { 129 @SerializedName("sub_mchid") 130 public String subMchid; 131 132 @SerializedName("out_request_no") 133 public String outRequestNo; 134 135 @SerializedName("withdraw") 136 public ApplyWithdraw withdraw; 137 138 @SerializedName("payee_info") 139 public PayeeInfo payeeInfo; 140 141 @SerializedName("proof_medias") 142 public List<ProofMedia> proofMedias; 143 144 @SerializedName("additional_materials") 145 public List<String> additionalMaterials; 146 147 @SerializedName("remark") 148 public String remark; 149 } 150 151 public static class SubmitResponse { 152 @SerializedName("applyment_id") 153 public String applymentId; 154 155 @SerializedName("out_request_no") 156 public String outRequestNo; 157 } 158 159 public enum ApplyWithdraw { 160 @SerializedName("NOT_APPLY_WITHDRAW") 161 NOT_APPLY_WITHDRAW, 162 @SerializedName("APPLY_WITHDRAW") 163 APPLY_WITHDRAW 164 } 165 166 public static class PayeeInfo { 167 @SerializedName("account_type") 168 public AccountType accountType; 169 170 @SerializedName("bank_account_info") 171 public BankAccountInfo bankAccountInfo; 172 173 @SerializedName("identity_info") 174 public IdentityInfo identityInfo; 175 } 176 177 public static class ProofMedia { 178 @SerializedName("proof_media_type") 179 public ProofMediaType proofMediaType; 180 181 @SerializedName("proof_media") 182 public String proofMedia; 183 } 184 185 public enum AccountType { 186 @SerializedName("ACCOUNT_TYPE_CORPORATE") 187 ACCOUNT_TYPE_CORPORATE, 188 @SerializedName("ACCOUNT_TYPE_PERSONAL") 189 ACCOUNT_TYPE_PERSONAL 190 } 191 192 public static class BankAccountInfo { 193 @SerializedName("account_name") 194 public String accountName; 195 196 @SerializedName("account_bank") 197 public String accountBank; 198 199 @SerializedName("bank_branch_id") 200 public String bankBranchId; 201 202 @SerializedName("bank_branch_name") 203 public String bankBranchName; 204 205 @SerializedName("account_number") 206 public String accountNumber; 207 } 208 209 public static class IdentityInfo { 210 @SerializedName("id_doc_type") 211 public IdentificationType idDocType; 212 213 @SerializedName("identification_name") 214 public String identificationName; 215 216 @SerializedName("identification_no") 217 public String identificationNo; 218 } 219 220 public enum ProofMediaType { 221 @SerializedName("WITHDRAWAL_APPLICATION") 222 WITHDRAWAL_APPLICATION 223 } 224 225 public enum IdentificationType { 226 @SerializedName("IDENTIFICATION_TYPE_ID_CARD") 227 IDENTIFICATION_TYPE_ID_CARD, 228 @SerializedName("IDENTIFICATION_TYPE_OVERSEA_PASSPORT") 229 IDENTIFICATION_TYPE_OVERSEA_PASSPORT, 230 @SerializedName("IDENTIFICATION_TYPE_HONGKONG_PASSPORT") 231 IDENTIFICATION_TYPE_HONGKONG_PASSPORT, 232 @SerializedName("IDENTIFICATION_TYPE_MACAO_PASSPORT") 233 IDENTIFICATION_TYPE_MACAO_PASSPORT, 234 @SerializedName("IDENTIFICATION_TYPE_TAIWAN_PASSPORT") 235 IDENTIFICATION_TYPE_TAIWAN_PASSPORT, 236 @SerializedName("IDENTIFICATION_TYPE_FOREIGN_RESIDENT") 237 IDENTIFICATION_TYPE_FOREIGN_RESIDENT, 238 @SerializedName("IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT") 239 IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT, 240 @SerializedName("IDENTIFICATION_TYPE_TAIWAN_RESIDENT") 241 IDENTIFICATION_TYPE_TAIWAN_RESIDENT 242 } 243 244} 245
需配合微信支付工具库 wxpay_utility 使用,请参考Go
1package main 2 3import ( 4 "bytes" 5 "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/partner/4015119446 6 "encoding/json" 7 "fmt" 8 "net/http" 9 "net/url" 10) 11 12func main() { 13 // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 14 config, err := wxpay_utility.CreateMchConfig( 15 "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340 16 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924 17 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 18 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589 19 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 20 ) 21 if err != nil { 22 fmt.Println(err) 23 return 24 } 25 26 request := &SubmitRequest{ 27 SubMchid: wxpay_utility.String("1900000109"), 28 OutRequestNo: wxpay_utility.String("P202410241010125346"), 29 Withdraw: APPLYWITHDRAW_APPLY_WITHDRAW.Ptr(), 30 PayeeInfo: &PayeeInfo{ 31 AccountType: ACCOUNTTYPE_ACCOUNT_TYPE_CORPORATE.Ptr(), 32 BankAccountInfo: &BankAccountInfo{ 33 AccountName: wxpay_utility.String("AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw=="), /*请传入 wxpay_utility.EncryptOAEPWithPublicKey 加密结果*/ 34 AccountBank: wxpay_utility.String("工商银行"), 35 BankBranchId: wxpay_utility.String("402713354941"), 36 BankBranchName: wxpay_utility.String("施秉县农村信用合作联社城关信用社"), 37 AccountNumber: wxpay_utility.String("d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w=="), /*请传入 wxpay_utility.EncryptOAEPWithPublicKey 加密结果*/ 38 }, 39 IdentityInfo: &IdentityInfo{ 40 IdDocType: IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_ID_CARD.Ptr(), 41 IdentificationName: wxpay_utility.String("pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg=="), /*请传入 wxpay_utility.EncryptOAEPWithPublicKey 加密结果*/ 42 IdentificationNo: wxpay_utility.String("AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw=="), /*请传入 wxpay_utility.EncryptOAEPWithPublicKey 加密结果*/ 43 }, 44 }, 45 ProofMedias: []ProofMedia{ProofMedia{ 46 ProofMediaType: PROOFMEDIATYPE_WITHDRAWAL_APPLICATION.Ptr(), 47 ProofMedia: wxpay_utility.String("jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"), 48 }}, 49 AdditionalMaterials: []string{"jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"}, 50 Remark: wxpay_utility.String("特殊理由"), 51 } 52 53 response, err := SubmitApply(config, request) 54 if err != nil { 55 fmt.Printf("请求失败: %+v\n", err) 56 // TODO: 请求失败,根据状态码执行不同的处理 57 return 58 } 59 60 // TODO: 请求成功,继续业务逻辑 61 fmt.Printf("请求成功: %+v\n", response) 62} 63 64func SubmitApply(config *wxpay_utility.MchConfig, request *SubmitRequest) (response *SubmitResponse, err error) { 65 const ( 66 host = "https://api.mch.weixin.qq.com" 67 method = "POST" 68 path = "/v3/ecommerce/account/apply-cancel-withdraw" 69 ) 70 71 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path)) 72 if err != nil { 73 return nil, err 74 } 75 reqBody, err := json.Marshal(request) 76 if err != nil { 77 return nil, err 78 } 79 httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody)) 80 if err != nil { 81 return nil, err 82 } 83 httpRequest.Header.Set("Accept", "application/json") 84 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId()) 85 httpRequest.Header.Set("Content-Type", "application/json") 86 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody) 87 if err != nil { 88 return nil, err 89 } 90 httpRequest.Header.Set("Authorization", authorization) 91 92 client := &http.Client{} 93 httpResponse, err := client.Do(httpRequest) 94 if err != nil { 95 return nil, err 96 } 97 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse) 98 if err != nil { 99 return nil, err 100 } 101 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 { 102 // 2XX 成功,验证应答签名 103 err = wxpay_utility.ValidateResponse( 104 config.WechatPayPublicKeyId(), 105 config.WechatPayPublicKey(), 106 &httpResponse.Header, 107 respBody, 108 ) 109 if err != nil { 110 return nil, err 111 } 112 response := &SubmitResponse{} 113 if err := json.Unmarshal(respBody, response); err != nil { 114 return nil, err 115 } 116 117 return response, nil 118 } else { 119 return nil, wxpay_utility.NewApiException( 120 httpResponse.StatusCode, 121 httpResponse.Header, 122 respBody, 123 ) 124 } 125} 126 127type SubmitRequest struct { 128 SubMchid *string `json:"sub_mchid,omitempty"` 129 OutRequestNo *string `json:"out_request_no,omitempty"` 130 Withdraw *ApplyWithdraw `json:"withdraw,omitempty"` 131 PayeeInfo *PayeeInfo `json:"payee_info,omitempty"` 132 ProofMedias []ProofMedia `json:"proof_medias,omitempty"` 133 AdditionalMaterials []string `json:"additional_materials,omitempty"` 134 Remark *string `json:"remark,omitempty"` 135} 136 137type SubmitResponse struct { 138 ApplymentId *string `json:"applyment_id,omitempty"` 139 OutRequestNo *string `json:"out_request_no,omitempty"` 140} 141 142type ApplyWithdraw string 143 144func (e ApplyWithdraw) Ptr() *ApplyWithdraw { 145 return &e 146} 147 148const ( 149 APPLYWITHDRAW_NOT_APPLY_WITHDRAW ApplyWithdraw = "NOT_APPLY_WITHDRAW" 150 APPLYWITHDRAW_APPLY_WITHDRAW ApplyWithdraw = "APPLY_WITHDRAW" 151) 152 153type PayeeInfo struct { 154 AccountType *AccountType `json:"account_type,omitempty"` 155 BankAccountInfo *BankAccountInfo `json:"bank_account_info,omitempty"` 156 IdentityInfo *IdentityInfo `json:"identity_info,omitempty"` 157} 158 159type ProofMedia struct { 160 ProofMediaType *ProofMediaType `json:"proof_media_type,omitempty"` 161 ProofMedia *string `json:"proof_media,omitempty"` 162} 163 164type AccountType string 165 166func (e AccountType) Ptr() *AccountType { 167 return &e 168} 169 170const ( 171 ACCOUNTTYPE_ACCOUNT_TYPE_CORPORATE AccountType = "ACCOUNT_TYPE_CORPORATE" 172 ACCOUNTTYPE_ACCOUNT_TYPE_PERSONAL AccountType = "ACCOUNT_TYPE_PERSONAL" 173) 174 175type BankAccountInfo struct { 176 AccountName *string `json:"account_name,omitempty"` 177 AccountBank *string `json:"account_bank,omitempty"` 178 BankBranchId *string `json:"bank_branch_id,omitempty"` 179 BankBranchName *string `json:"bank_branch_name,omitempty"` 180 AccountNumber *string `json:"account_number,omitempty"` 181} 182 183type IdentityInfo struct { 184 IdDocType *IdentificationType `json:"id_doc_type,omitempty"` 185 IdentificationName *string `json:"identification_name,omitempty"` 186 IdentificationNo *string `json:"identification_no,omitempty"` 187} 188 189type ProofMediaType string 190 191func (e ProofMediaType) Ptr() *ProofMediaType { 192 return &e 193} 194 195const ( 196 PROOFMEDIATYPE_WITHDRAWAL_APPLICATION ProofMediaType = "WITHDRAWAL_APPLICATION" 197) 198 199type IdentificationType string 200 201func (e IdentificationType) Ptr() *IdentificationType { 202 return &e 203} 204 205const ( 206 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_ID_CARD IdentificationType = "IDENTIFICATION_TYPE_ID_CARD" 207 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_OVERSEA_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_OVERSEA_PASSPORT" 208 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_HONGKONG_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_HONGKONG_PASSPORT" 209 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_MACAO_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_MACAO_PASSPORT" 210 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_TAIWAN_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_TAIWAN_PASSPORT" 211 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_FOREIGN_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_FOREIGN_RESIDENT" 212 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT" 213 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_TAIWAN_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_TAIWAN_RESIDENT" 214) 215
应答参数
200 OK
applyment_id 选填 string(32)
【微信支付注销提现申请单号】 电商平台提交二级商户注销提现申请后,由微信支付返回的申请单号,作为查询申请状态的唯一标识
out_request_no 选填 string(32)
【商户注销申请单号】 商户注销申请单号,由商户自定义生成,需要全局唯一
应答示例
200 OK
1{ 2 "applyment_id" : "X202410241010125346", 3 "out_request_no" : "P202410241010125346" 4}
错误码
公共错误码
状态码 | 错误码 | 描述 | 解决方案 |
|---|---|---|---|
400 | PARAM_ERROR | 参数错误 | 请根据错误提示正确传入参数 |
400 | INVALID_REQUEST | HTTP 请求不符合微信支付 APIv3 接口规则 | 请参阅 接口规则 |
401 | SIGN_ERROR | 验证不通过 | 请参阅 签名常见问题 |
500 | SYSTEM_ERROR | 系统异常,请稍后重试 | 请稍后重试 |
业务错误码
状态码 | 错误码 | 描述 | 解决方案 |
|---|---|---|---|
400 | BIZ_ERR_NEED_RETRY | 系统异常,请求稍后重试 | 请稍后重试 |
400 | ALREADY_EXISTS | out_request_no已使用 | 更换out_request_no重试 |

