成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

node.js怎么實(shí)現(xiàn)微信支付退款功能-創(chuàng)新互聯(lián)

小編給大家分享一下node.js怎么實(shí)現(xiàn)微信支付退款功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、成都網(wǎng)頁設(shè)計、成都微信小程序、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、重慶APP軟件開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!

緣起

有付款就會有退款

注意,退款支持部分退款

左口袋的錢退到右口袋羅

node.js怎么實(shí)現(xiàn)微信支付退款功能

這次發(fā)起的退款請求0.01元是實(shí)時到賬的,因此,用戶在小程序端發(fā)起的退款只是一個請求到后臺,后臺審核人員審核無誤后才后微信發(fā)起退款操作。

引入第三方module

在package.json 中加入"weixin-pay": "^1.1.7"這一條

代碼目錄結(jié)構(gòu)

node.js怎么實(shí)現(xiàn)微信支付退款功能

入?yún)?/strong>

{ transaction_id: '4200000005201712165508745023', // 交易
 out_trade_no: '5b97cba0ae164bd58dfe9e77891d3aaf', // 自己這頭的交易號
 out_refund_no: '6f3240c353934105be34eb9f2d364cec', // 退款訂單,自己生成
 total_fee: 1, // 退款總額
 nonce_str: '1xSZW0op0KcdKoMYxnyxhEuF1fAQefhU', // 隨機(jī)串
 appid: 'wxff154ce14ad59a55', // 小程序 appid
 mch_id: '1447716902', // 微信支付商戶id
 sign: '416FCB62F9B8F03C82E83052CC77524B' // 簽名,weixin-pay這個module幫助生成 }

然后由wxpay為我們生成其余字段,比如nonce_str,sign,當(dāng)然還少不了p12證書,

這個早選在wxpay初始代碼里已經(jīng)配置了,pfx: fs.readFileSync(__dirname + '/../../../cert/apiclient_cert.p12'), //微信商戶平臺證書

lib/wechat/utils/wxpay.js的源碼

const WXPay = require('weixin-pay'); // 引入weixin-pay這個第三方模塊
const {weapp} = require('../../../utils/config'); // 我自己的全局配置文件,包括了appid key 等
const fs = require('fs');
const wxpay = WXPay({
 appid: weapp.APPID,
 mch_id: weapp.MCHID,
 partner_key: weapp.KEY, //微信商戶平臺 API secret,非小程序 secret
 pfx: fs.readFileSync(__dirname + '/../../../cert/apiclient_cert.p12'), 
});

module.exports = wxpay;

另外還有一個util.js工具類

用于驗(yàn)證與錯誤回調(diào)

const wxpay = require('./wxpay');

const validateSign = results => {
 const sign = wxpay.sign(results);
 if (sign !== results.sign) {
 const error = new Error('微信返回參數(shù)簽名結(jié)果不正確');
 error.code = 'INVALID_RESULT_SIGN';
 throw error;
 };
 return results;
};

const handleError = results => {
 if (results.return_code === 'FAIL') {
 throw new Error(results.return_msg);
 }
 if (results.result_code !== 'SUCCESS') {
 const error = new Error(results.err_code_des);
 error.code = results.err_code;
 throw error;
 }
 return results;
};

module.exports = {
 validateSign,
 handleError,
};

發(fā)起退款請求

退款邏輯是這樣的,先從自己這邊的Order數(shù)據(jù)表中查出transaction_id/out_trade_no/total_fee,再拼上自己生成的out_refund_no退款單號,本次退款部分金額refund_fee,最后由weixin-pay這個模塊下的wxpay.refund調(diào)起就可以了,成功就把訂單狀態(tài)改成"退款成功"

// 退款
router.post('/refund', function(req, res) {
 Order.findById(req.body._id, (err, order) => {
  if (err) {
   console.log(err);
  }
  console.log(order);
  // 生成微信設(shè)定的訂單格式
  var data = {
   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(data);
  // 先查詢訂單,再退訂單
  wxpay.refund(data, (err, result) => {
   if (err) {
    console.log(err);
    res.send(
     utils.json({
      code: 500,
      msg: '退款失敗'
     })
    );
   }
   // 返回退款請求成功后,要將訂單狀態(tài)改成REFUNDED
   if (result.result_code === 'SUCCESS') {
    console.log(result);
    order.status = 'REFUNDED';
    order.save((err, response) => {
     res.send(
      utils.json({
       msg: '退款成功'
      })
     );
    });
   } else {
    res.send(
     utils.json({
      code: 500,
      msg: result.err_code_des
     })
    );
   }

  });
 });
});

入?yún)⒌目?/strong>

1.這次遇到的坑是refund_fee忘記傳值,也就是說微信退款是支持部分退款的,如果是全額退款,那么將它賦值為total_fee相同

2.網(wǎng)上說的op_user_id: weapp.MCHID這個參數(shù)是非必選的

3.transaction_id 與 out_trade_no 二選一即可,這樣在沒有記錄transaction_id的情況(比如沒有寫支付成功的callback)下,也能發(fā)起退款;其中優(yōu)先級前者大于后者,在我在分別前其一故意給錯的過程中得到了驗(yàn)證。

4.報了一個appid與商戶號不匹配的報錯,return_code: 'FAIL', return_msg: '商戶號mch_id與appid不匹配'原來是小程序還沒綁定公眾號微信支付,這真是一個烏龍。

成功退款微信返回的數(shù)據(jù)

 appid:"wxff154ce14ad59a55"
 cash_fee:"1"
 cash_refund_fee:"1"
 coupon_refund_count:"0"
 coupon_refund_fee:"0"
 mch_id:"1447716902"
 nonce_str:"c44wOvB6a4bQJfRk"
 out_refund_no:"9ace1466432a4d548065dc8df95d904a"
 out_trade_no:"5b97cba0ae164bd58dfe9e77891d3aaf"
 refund_channel:""
 refund_fee:"1"
 refund_id:"50000705182017121702756172970"
 result_code:"SUCCESS"
 return_code:"SUCCESS"
 return_msg:"OK"
 sign:"5C2E67B3250054E8A665BF1AE2E9BDA3"
 total_fee:"1"
 transaction_id:”4200000005201712165508745023”

重復(fù)退款將返回如下

 appid:"wxff154ce14ad59a55"
 err_code:"ERROR"
 err_code_des:"訂單已全額退款"
 mch_id:"1447716902"
 nonce_str:"KP1YWlU7a5viZEgK"
 result_code:"FAIL"
 return_code:"SUCCESS"
 return_msg:"OK"
 sign:”C2A7DED787BEA644C325E37D96E9F41C”

node.js怎么實(shí)現(xiàn)微信支付退款功能

最后

如果沒有寫退款功能或者不想寫退款功能怎么辦,其實(shí)可以從微信支付的后臺pay.weixin.qq.com,也是能退款出去的,只是不想忘記了要人工將訂單狀態(tài)置為退款狀態(tài)。

以上是“node.js怎么實(shí)現(xiàn)微信支付退款功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享題目:node.js怎么實(shí)現(xiàn)微信支付退款功能-創(chuàng)新互聯(lián)
文章源于:http://jinyejixie.com/article24/icece.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站內(nèi)鏈、建站公司、外貿(mào)建站、移動網(wǎng)站建設(shè)、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

普陀区| 施秉县| 北票市| 康保县| 昭平县| 扶沟县| 华宁县| 华宁县| 平原县| 将乐县| 金溪县| 临江市| 涿州市| 庆城县| 宜川县| 开封县| 阳曲县| 兴安县| 临江市| 丰顺县| 鲜城| 东安县| 岢岚县| 岑溪市| 巴里| 察隅县| 象山县| 吴川市| 高台县| 南投市| 松原市| 淮安市| 南通市| 林州市| 浮梁县| 嘉祥县| 六盘水市| 沁源县| 交口县| 恭城| 博湖县|