WeChat 결제 환불 기능을 구현하는 node.js 정보

不言
풀어 주다: 2018-06-27 10:11:45
원래의
2968명이 탐색했습니다.

이 글에서는 주로 WeChat 결제 환불 기능의 node.js 구현을 소개합니다. WeChat 개발에서는 결제가 있으면 환불이 되는 경우가 많습니다.

Origin 결제하시면 환불됩니다

환불은 부분환불 지원이니 참고하세요

왼쪽 주머니에 있던 돈은 오른쪽 주머니로 돌려드립니다

환불요청금액 0.01위안 이때 시작된 환불은 실시간으로 수신되므로 미니 프로그램에서 사용자가 시작한 환불은 단지 백엔드에 대한 요청일 뿐이며, 백엔드 검토자가 요청이 올바른지 확인한 후에만 WeChat에서 환불 작업이 시작됩니다. .

타사 모듈 도입package.json에 "weixin-pay": "^1.1.7" 추가

코드 디렉터리 구조

매개변수를 입력하세요

{ transaction_id: '4200000005201712165508745023', // 交易
 out_trade_no: '5b97cba0ae164bd58dfe9e77891d3aaf', // 自己这头的交易号
 out_refund_no: '6f3240c353934105be34eb9f2d364cec', // 退款订单,自己生成
 total_fee: 1, // 退款总额
 nonce_str: '1xSZW0op0KcdKoMYxnyxhEuF1fAQefhU', // 随机串
 appid: 'wxff154ce14ad59a55', // 小程序 appid
 mch_id: '1447716902', // 微信支付商户id
 sign: '416FCB62F9B8F03C82E83052CC77524B' // 签名,weixin-pay这个module帮助生成 }
로그인 후 복사

그러면 wxpay는 nonce_str, sign 및 물론 p12 인증서와 같은 나머지 필드를 생성합니다.

이 초기 선택은 wxpay 초기 코드 pfx에 구성되었습니다. fs .readFileSync(__dirname + '/../../../cert/apiclient_cert.p12'), //WeChat 판매자 플랫폼 인증서 소스 코드

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;
로그인 후 복사
a util.js 도구 클래스 확인 및 오류 콜백 콜백 ay
const wxpay = require('./wxpay');

const validateSign = results => {
 const sign = wxpay.sign(results);
 if (sign !== results.sign) {
 const error = new Error('微信返回参数签名结果不正确');
 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,
};
로그인 후 복사
initiatiatiatiationing aferd em as weance : 환불 로직은 다음과 같습니다. 여기 주문 데이터 테이블에서 transaction_id/out_trade_no/total_fee를 찾은 다음, 직접 생성한 out_refund_no 환불 주문 번호를 추가하세요. 마지막으로 weixin-pay 모듈에서 wxpay.refund에 의해 호출됩니다. . 성공했다면 주문 상태를 "환불 성공"으로 변경하세요

// 退款
router.post('/refund', function(req, res) {
 Order.findById(req.body._id, (err, order) => {
  if (err) {
   console.log(err);
  }
  console.log(order);
  // 生成微信设定的订单格式
  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: '退款失败'
     })
    );
   }
   // 返回退款请求成功后,要将订单状态改成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
     })
    );
   }

  });
 });
});
로그인 후 복사

Enter the 함정

1. 이번에 직면한 함정은 Refund_fee가 값을 전달하는 것을 잊어버렸다는 것입니다. 이는 WeChat을 의미합니다. 환불은 부분 환불을 지원합니다. total_fee

2와 동일한 값을 지정하세요. 온라인에 언급된 op_user_id 매개변수: weapp.MCHID는 선택 사항입니다

3. Transaction_id 및 out_trade_no 두 번째 선택이면 충분합니다. transaction_id가 기록되지 않은 경우에도 환불이 시작될 수 있습니다(예: 성공적인 결제에 대한 콜백이 기록되지 않음). 전자의 우선순위가 후자보다 높으며, 고의로 실수를 했을 때 받았습니다. 첫 번째. 4. appid가 가맹점 번호와 일치하지 않는다는 오류가 보고되었습니다. return_code: 'FAIL', return_msg: '가맹점 번호 mch_id가 appid와 일치하지 않습니다' 미니 프로그램이 바인딩되지 않은 것으로 나타났습니다. 공식 계정 WeChat Pay는 정말 사기입니다.

환불 성공을 위해 WeChat에서 반환한 데이터

 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”
로그인 후 복사

반복 환불은 다음과 같이 반환됩니다.

 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”
로그인 후 복사

드디어

만약 당신이 환불 기능이 있거나 환불 기능을 작성하고 싶지 않은 경우 어떻게 해야 할까요? 사실 위챗페이 백엔드 pay.weixin.qq.com을 통해 환불이 가능하지만 그냥 싫을 뿐입니다. 주문 상태를 환불 상태로 수동으로 설정하는 것을 잊어버린 경우.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요! 관련 권장 사항:

JS를 사용하여 WeChat 결제 팝업 기능을 구현하는 방법

WeChat 미니 프로그램에서 맞춤 토스트를 구현하는 방법

위 내용은 WeChat 결제 환불 기능을 구현하는 node.js 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿