小程序nodejs企业付款到微信账户
一、准备
申请商户号,需要申请商户号的appid或商户号绑定的appid以及微信支付分配的商户号
二、接口调用请求说明
请求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
是否需要证书 是(证书及使用说明详见商户证书)
请求方式 POST
接口调用频率限制 30/s
超时时间(同笔订单最短重试时间) 1s
三、请求参数
mch_appid
申请商户号的appid或商户号绑定的appid
mchid
微信支付分配的商户号
nonce_str
随机字符串,不长于32位
sign
签名
partner_trade_no
商户订单号,需保持唯一性
(只能是字母或者数字,不能包含有其它字符)
openid
商户appid下,某用户的openid
check_name
NO_CHECK:不校验真实姓名
FORCE_CHECK:强校验真实姓名
amount
企业付款金额,单位为分
desc
企业付款备注,如 提现
四、代码实现
const parseStringPromise = util.promisify(parseString)
this._refund = {
appid: 'wx3f97d8975d27c9e9', // appid
mch_id: '********', // 微信支付分配的商户号,这里就用*代替
key: '******', //密钥,同样用*代替
}
传入参数有tourguideId 和 money
tourguideId是为了查对应人的openid
async withdrawal (requestBody) { // 提现
const xmlRequest = await this.payRequestXML(requestBody)
const options = {
method: 'POST',
uri: 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',
body: xmlRequest,
json: false,
agentOptions: {
pfx: fs.readFileSync('refundcert/apiclient_cert.p12'), //证书
passphrase: this._refund.mch_id
}
}
const response = await request(options)
const responseJSON = await parseStringPromise(response)
const responseXML = responseJSON.xml
const result = {}
for (let [key, value] of Object.entries(responseXML)) {
result[key] = value[0]
}
return result
}
async payRequestXML (requestBody) { // 提现
console.log(requestBody)
const today = date.format(new Date(), 'YYYY-MM-DD HH:mm:ss') //获取当前时间
const tourguide = await this._TourGuide.findOne({ where: { id: requestBody.tourGuideId } })
const nonceStr = _.upperFirst(_.sampleSize('ABCDEFGHIJKLMNOPQRSTUVWXYZ012356789', 5 + _.random(1, 4)).join('')) //随机字符串
const partner = _.upperFirst(_.sampleSize('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012356789', 5 + _.random(1, 4)).join('')) //商户订单号,也要随机的
const stringSignTemp = `amount=${requestBody.money}&check_name=NO_CHECK&desc=${today} 提现&mch_appid=${this._refund.appid}&mchid=${this._refund.mch_id}&nonce_str=${nonceStr}&openid=${tourguide.openid}&partner_trade_no=${partner}&key=${this._refund.key}` //签名生成算法
const sign = crypto.createHash('md5').update(stringSignTemp).digest('hex').toUpperCase() //签名生成算法
const xmlRequest = `<xml>
<mch_appid>${this._refund.appid}</mch_appid>
<mchid>${this._refund.mch_id}</mchid>
<nonce_str>${nonceStr}</nonce_str>
<sign>${sign}</sign>
<partner_trade_no>${partner}</partner_trade_no>
<openid>${tourguide.openid}</openid>
<check_name>NO_CHECK</check_name>
<amount>${requestBody.money}</amount>
<desc>${today} 提现</desc>
</xml>
`
return xmlRequest
}
好了到这里就成功了 ✌️
来自一名仙女的自述
希望大家看完可以多多交流,并指出我的问题,我们一起学习吖!