微信支付的提现功能,通常是通过调用 企业付款到零钱 API 或 企业付款到银行卡 API 来实现的。以下是如何使用微信支付提现 API 的详细教程,包括其前置条件、接口调用以及注意事项。
1. 准备工作
1.1. 开通微信支付商户号
- 登录 微信支付商户平台。
- 确保你的商户号已开通 企业付款到零钱 或 企业付款到银行卡 功能。如果没有开通,可以联系微信支付客服申请开通。
1.2. 配置证书
- 提现 API 调用需要使用商户的 API 证书 进行身份认证。
- 登录微信支付商户后台,下载以下证书:
- 商户证书(apiclient_cert.pem)
- 私钥文件(apiclient_key.pem)
- CA 证书(rootca.pem)
将这些文件保存在你的服务器上,用于发起 HTTPS 请求。
1.3. 获取 API 密钥
- 在微信支付商户后台,设置并记住 API 密钥(一个 32 字符的字符串),用于生成签名。
2. 企业付款到零钱接口
2.1. 接口说明
- URL:
https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
- 功能:将商户号的资金提现到指定用户的微信零钱。
2.2. 参数说明
参数 | 是否必填 | 类型 | 说明 |
---|---|---|---|
mch_appid | 是 | String | 商户账号对应的小程序或公众号的 AppID |
mchid | 是 | String | 商户号 |
nonce_str | 是 | String | 随机字符串 |
sign | 是 | String | 签名 |
partner_trade_no | 是 | String | 商户订单号(唯一) |
openid | 是 | String | 用户的 OpenID |
check_name | 是 | String | 校验用户姓名选项(NO_CHECK 或 FORCE_CHECK ) |
amount | 是 | Int | 转账金额(单位:分) |
desc | 是 | String | 转账描述信息 |
spbill_create_ip | 是 | String | 调用接口的服务器 IP |
2.3. 调用示例
以下是基于 Node.js
的调用示例:
const fs = require('fs');
const https = require('https');
const crypto = require('crypto');
const { parseString } = require('xml2js');
function generateNonceStr() {
return Math.random().toString(36).substr(2, 15);
}
function generateSign(params, key) {
const stringA = Object.keys(params)
.sort()
.map((k) => `${k}=${params[k]}`)
.join('&');
const stringSignTemp = `${stringA}&key=${key}`;
return crypto.createHash('md5').update(stringSignTemp, 'utf8').digest('hex').toUpperCase();
}
function postXml(url, xml, options) {
return new Promise((resolve, reject) => {
const req = https.request(url, options, (res) => {
let data = '';
res.on('data', (chunk) => (data += chunk));
res.on('end', () => {
parseString(data, { explicitArray: false }, (err, result) => {
if (err) reject(err);
resolve(result.xml);
});
});
});
req.on('error', (e) => reject(e));
req.write(xml);
req.end();
});
}
// 配置参数
const url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
const mch_appid = 'YOUR_APPID';
const mchid = 'YOUR_MCHID';
const key = 'YOUR_API_KEY';
const certPath = '/path/to/apiclient_cert.pem';
const keyPath = '/path/to/apiclient_key.pem';
const params = {
mch_appid,
mchid,
nonce_str: generateNonceStr(),
partner_trade_no: `ORDER${Date.now()}`,
openid: 'USER_OPENID',
check_name: 'NO_CHECK',
amount: 100, // 1元 = 100分
desc: '提现测试',
spbill_create_ip: 'SERVER_IP',
};
params.sign = generateSign(params, key);
// 构造 XML 数据
const xmlData = `
<xml>
${Object.keys(params)
.map((key) => `<${key}>${params[key]}</${key}>`)
.join('')}
</xml>`;
// HTTPS 请求配置
const options = {
method: 'POST',
key: fs.readFileSync(keyPath),
cert: fs.readFileSync(certPath),
ca: fs.readFileSync('/path/to/rootca.pem'),
headers: {
'Content-Type': 'text/xml',
},
};
// 发起请求
postXml(url, xmlData, options)
.then((response) => {
console.log('微信返回数据:', response);
})
.catch((err) => {
console.error('请求失败:', err);
});
3. 企业付款到银行卡接口
3.1. 接口说明
- URL:
https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank
- 功能:将商户号的资金提现到指定用户的银行卡。
3.2. 参数补充
相比零钱接口,提现到银行卡需要提供以下额外信息:
- 银行账号:加密后的银行卡号。
- 开户人姓名:加密后的姓名。
- 开户行编号:具体银行的编号(微信支付文档提供编号列表)。
3.3. RSA 加密银行卡信息
银行卡号和开户人姓名需要通过微信支付提供的 RSA 公钥加密后发送。
加密示例:
const crypto = require('crypto');
const fs = require('fs');
function encryptWithPublicKey(data, publicKeyPath) {
const publicKey = fs.readFileSync(publicKeyPath, 'utf8');
return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64');
}
// 示例
const encryptedAccount = encryptWithPublicKey('银行卡号', '/path/to/wechat_public_key.pem');
4. 注意事项
- 资金流转限制:
- 确保商户号余额充足,且提现金额不超过商户号可用余额。
- 提现手续费:
- 微信支付可能会收取一定比例的手续费,具体费率可以在商户后台查询。
- 敏感信息加密:
- 银行卡号和姓名等敏感信息需要加密处理,使用微信提供的公钥进行 RSA 加密。
- 重复请求:
- 微信支付可能会因网络问题重复发送结果通知。确保商户订单号(
partner_trade_no
)是唯一的,避免重复处理。
- 微信支付可能会因网络问题重复发送结果通知。确保商户订单号(
- 安全性:
- 确保 API 密钥和证书文件的安全,避免泄露。
通过调用微信支付的提现 API,可以实现资金从商户号提现到用户的零钱或银行卡。根据需求选择合适的提现方式,并按照文档规范实现调用逻辑。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4504