Vue+Node 微信支付前后端流程整理( 四 )

【Vue+Node 微信支付前后端流程整理】以上是整个分享、支付流程,关于支付核心,下面我单独列出 。
支付核心流程
  1. 生成随机数
createNonceStr(){  return Math.random().toString(36).substr(2,15);}
  1. 生成时间戳
createTimeStamp(){  return parseInt(new Date().getTime() / 1000) + ''}
  1. 生成预支付的签名
  getPrePaySign: function (appid, attach, body, openid, total_fee, notify_url, ip, nonce_str, out_trade_no) {    let params = {      appid,      attach,      body,      mch_id: config.mch_id,      nonce_str,      notify_url,      openid,      out_trade_no,      spbill_create_ip: ip,      total_fee,      trade_type: 'JSAPI'    }    let string = util.raw(params) + '&key=' + config.key;    let sign = createHash('md5').update(string).digest('hex');    return sign.toUpperCase();  }
  1. 拼接xml下单数据
wxSendData: function (appid, attach, body, openid, total_fee, notify_url, ip, nonce_str, out_trade_no,sign) {  let data = '<xml>' +     '<appid><![CDATA[' + appid + ']]></appid>' +     '<attach><![CDATA[' + attach + ']]></attach>' +     '<body><![CDATA[' + body + ']]></body>' +     '<mch_id><![CDATA[' + config.mch_id + ']]></mch_id>' +     '<nonce_str><![CDATA[' + nonce_str + ']]></nonce_str>' +     '<notify_url><![CDATA[' + notify_url + ']]></notify_url>' +     '<openid><![CDATA[' + openid + ']]></openid>' +     '<out_trade_no><![CDATA[' + out_trade_no + ']]></out_trade_no>' +     '<spbill_create_ip><![CDATA[' + ip + ']]></spbill_create_ip>' +     '<total_fee><![CDATA[' + total_fee + ']]></total_fee>' +     '<trade_type><![CDATA[JSAPI]]></trade_type>' +     '<sign><![CDATA['+sign+']]></sign>' +   '</xml>'  return data;}
  1. 调用微信统一下单接口
https://api.mch.weixin.qq.com/pay/unifiedorder
let url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';      request({        url,        method: 'POST',        body: sendData      }, function (err, response, body) {        if (!err && response.statusCode == 200) {          xml.parseString(body.toString('utf-8'),(error,res)=>{            if(!error){              let data = res.xml;              if (data.return_code[0] == 'SUCCESS' && data.result_code[0] == 'SUCCESS'){                // 获取预支付的ID                let prepay_id = data.prepay_id || [];                // 此处非常重要,生成前端所需要的支付配置                let payResult = self.getPayParams(appid, prepay_id[0]);                resolve(payResult);              }            }          })        } else {          resolve(util.handleFail(err));        }      })


推荐阅读