node微信小程序支付验证

说明

之前写了一个,单纯的微信小程序支付的接口,这篇介绍一下支付完之后如何验证.

业务流程

Alt

支付验证

我们之前支付的时候有一个参数 nonce_str 这个是验证支付的必要参数所以当支付的时候可以将该订单信息存储到数据库中用于支付验证的时候使用

exports.miniVerify = async (req,res)=> {
	/*因为我写的验证接口是一个get请求,所以客户端会将参数写在url中,可以通过querystring 和url 这两个模块获取到参数
	  这里我需要的两个参数为openid和orderNumber 用户的唯一标识和订单唯一标识,因为将之前的订单信息存入到了数据库,
	  可以通过这两个参数找到订单信息.
	*/
    let arg = url.parse(req.url).query;
    let orderNumber = qs.parse(arg)['orderNumber'];
    let openid = qs.parse(arg)['openid'];
    let orderMsg = await db.findData_2(dbUrl,{orderNumber:orderNumber},'test','test');//数据库查询该订单,我这里用的是mongodb
    if(orderMsg.length!=1){                                     //判断订单号是否存在
            let data = {
                result:"0",
                msg :"该订单不存在,请确认后再次访问"
            };
          res.json(data);
           return
     }else if(orderMsg[0].openid!=openid){
            let data = {
                result:"0",
                msg :"该订单号和openid不匹配请确认后再次访问"
            };
            res.json(data);
            return
      }
      //如果满足以上的条件获取订单的信息 orderNumber 因为之前支付的时候我是把out_trade_no是以orderNumber字段存到数据库的
      //其实这些东西只要和你之前支付的时候参数用的是一个就行
      let appid = orderMsg[0].appid;
      let mch_id = orderMsg[0].mch_id;
      let nonce_str = orderMsg[0].nonce_str;//在统一下单时生成的唯一的随机字符串
      let out_trade_no=orderMsg[0].orderNumber;//订单号      
      //之后会将该方法贴出
      let sign=wechatUtil.querySign(appid,mch_id,nonce_str,out_trade_no);//查询签名,传参需要注意
      let formData  = "<xml>";
          formData  += "<appid>"+appid+"</appid>";  
          formData  += "<mch_id>"+mch_id+"</mch_id>";  
          formData  += "<nonce_str>"+nonce_str+"</nonce_str>"; 
          formData  += "<out_trade_no>"+out_trade_no+"</out_trade_no>";
          formData  += "<sign>"+sign+"</sign>";
          formData  += "</xml>";    
      let regUrl= "https://api.mch.weixin.qq.com/pay/orderquery";  
      /*拿着这些参数和查询到的签名去验证*/
	  request({
            url: regUrl,
            method: 'POST',
            body: formData
        }, async (err, response, body)=> {
            console.log(body.toString());
            //getXMLNodeValue 解析xml的方法
            var trade_state_desc = wechatUtil.getXMLNodeValue('trade_state_desc', body.toString('utf-8'));
            //如果返回的trade_state_desc参数是支付成功则表示支付成功
            if(trade_state_desc=="支付成功"){
            //这里修改订单状态
                let payMsg = await db.updateOneData(dbUrl,{orderNumber:orderNumber},{$set:  {state:1}},'test','test');
                if(payMsg=="修改成功"){//这是我操作数据库的返回数据
                    orderMsg = await db.findData_2(dbUrl,{orderNumber:orderNumber},'ykPay','order');
                    let data = {
                        result:"1",
                        orderMsg:orderMsg[0]
                    };
                    log.info(data);
                    res.json(data);
                }
            }
        })
      }catch (err){
        log.error(err)
      }

};          

辅助方法

//查询签名
exports.querySign=(appid,mch_id,nonce_str,out_trade_no)=>{
    let ret = {
        appid: appid,
        mch_id: mch_id,
        nonce_str:nonce_str,
        out_trade_no:out_trade_no//注意左边参数名
    };
    log.info("查询签名验证的参数",ret);
    let string = raw(ret);
    let key = "*******************";
    string = string + '&key='+key;
    return crypto.createHash('md5').update(string,'utf8').digest('hex').toUpperCase();
};
//解析xml数据
exports.getXMLNodeValue = (node_name,xml)=>{
    log.info(xml)
        let tmp = xml.split("<"+node_name+">");
        if(tmp[1]!=undefined){
            let _tmp = tmp[1].split("</"+node_name+">");
            let tmp1 = _tmp[0].split('[');

            let _tmp1 = tmp1[2].split(']');
            return _tmp1[0];
        }
};

结束

之后会写一个企业支付到零钱的功能

没有更多推荐了,返回首页