基于node . js实现微信支付退款功能

  

  

有付款就会有退款

  

注意,退款支持部分退款

  

左口袋的钱退到右口袋罗

  

基于node . js实现微信支付退款功能”>,</p>
  <p>这次发起的退款请求0.01元是实时到账的,因此,用户在小程序端发起的退款只是一个请求到后台,后台审核人员审核无误后才后微信发起退款操作。</p>
  <p> </p>
  <p>在包中。json中加入“weixin-pay”:“^ 1.1.7”这一条</p>
  <p> </p>
  <p> </p>
  <p> </p>
  
  <pre类=   {transaction_id: ' 4200000005201712165508745023 ',//交易   out_trade_no:“5 b97cba0ae164bd58dfe9e77891d3aaf ',//自己这头的交易号   out_refund_no:“6 f3240c353934105be34eb9f2d364cec ',//退款订单,自己生成   total_fee: 1、//退款总额   nonce_str:‘1 xszw0op0kcdkomyxnyxheuf1faqefhu ',//随机串   appid:“wxff154ce14ad59a55 ',//小程序appid   mch_id: ' 1447716902 ',//微信支付商户id   标志:416年fcb62f9b8f03c82e83052cc77524b//签名,weixin-pay这个模块帮助生成}      

然后由wxpay为我们生成其余字段,比如nonce_str,符号,当然还少不了p12证书,

  

这个早选在wxpay初始代码里已经配置了,可以:fs。readFileSync (__dirname +“/. ./. ./. ./证书/apiclient_cert.p12”),//微信商户平台证书

  

        const WXPay=要求(“weixin-pay”);//引入weixin-pay这个第三方模块   const {weapp}=要求(“. ./. ./. ./跑龙套/配置);//我自己的全局配置文件,包括了appid关键等   const fs=要求(fs);   const wxpay=wxpay ({   appid: weapp.APPID,   mch_id: weapp.MCHID,   partner_key: weapp。键,//微信商户平台API秘密,非小程序的秘密   可以:fs。readFileSync (__dirname +“/. ./. ./. ./证书/apiclient_cert.p12 '),   });      模块。出口=wxpay;      

  

用于验证与错误回调

        const wxpay=要求('/wxpay。');      const validateSign==结果比;{   const标志=wxpay.sign(结果);   如果(标志!==results.sign) {   const错误=new错误(“微信返回参数签名结果不正确的);   错误。代码=癐NVALID_RESULT_SIGN”;   把错误;   };   返回结果;   };      const handleError==结果比;{   如果结果。return_code==='失败'){   把新的错误(results.return_msg);   }   如果结果。result_code !=='成功'){   const错误=new错误(results.err_code_des);   错误。代码=results.err_code;   把错误;   }   返回结果;   };      模块。出口={   validateSign,   handleError,   };      之前      

  

  

退款逻辑是这样的,先从自己这边的顺序数据表中查出transaction_id/out_trade_no/total_fee,再拼上自己生成的out_refund_no退款单号,本次退款部分金额refund_fee,最后由weixin-pay这个模块下的wxpay.refund调起就可以了,成功就把订单状态改成“退款成功”

     //退款   路由器。帖子(/退款,函数(点播,res) {   Order.findById (req.body。_id(呃,顺序)=比;{   如果(err) {   console.log(错);   }   console.log(秩序);//生成微信设定的订单格式   var=https://www.yisu.com/zixun/{数据   transaction_id: order.transactionId,   out_trade_no: order.tradeId,   out_refund_no: uuid () .replace (/?g”),   total_fee: order.amount,   refund_fee: order.amount   };   console.log(数据);//先查询订单,再退订单   wxpay。(呃,结果退款(数据)=比;{   如果(err) {   console.log(错);   res.send (   utils.json ({   代码:500,   味精:“退款失败的   })   );   }//返回退款请求成功后,要将订单状态改成退回   如果结果。result_code==='成功'){   console.log(结果);   秩序。状态=巴嘶埂?   秩序。保存((呃,响应)=比;{   res.send (   utils.json ({   味精:“退款成功的   })   );   });   其他}{   res.send (   utils.json ({   代码:500,   味精:result.err_code_des   })   );   }      });   });   });      

  

1。这次遇到的坑是refund_fee忘记传值,也就是说微信退款是支持部分退款的,如果是全额退款,那么将它赋值为total_fee相同

  

2。网上说的op_user_id: weapp.MCHID这个参数是非必选的

  

基于node . js实现微信支付退款功能