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
  }

好了到这里就成功了 ✌️
来自一名仙女的自述

希望大家看完可以多多交流,并指出我的问题,我们一起学习吖!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值