基于node 的微信退款

申请微信退款:微信退款

1.在前端页面访问 /refund

  1. var request = require('request');
  2. var WxPayRefund = require('./WxPayRefund');
  3. var config = require('./../config');
  4. var axios = require('axios')
  5. /* 退款 */
  6. const refund = async(ctx, next) => {
  7. const { request: req, response: res } = ctx
  8. // 退款 参数
  9. var RefundInfo = {
  10. mch_id: config.mch_id, //商户号
  11. out_refund_no: req.query.out_refund_no, //商户退款单号 //商户系统内部的退款单号(自己生成)
  12. out_trade_no: req.query.out_trade_no, //商户系统内部订单号
  13. refund_fee: req.query.refund_fee, //退款金额
  14. total_fee: req.query.total_fee, //订单金额
  15. };
  16. console.log('RefundInfo', RefundInfo);
  17. // 参数成功回调
  18. var result = await WxPayRefund.WxPayRefund(RefundInfo).then(function(data) {
  19. // 成功返回 退款参数
  20. return JSON.stringify(data);
  21. });
  22. ctx.type = 'json';
  23. ctx.body = result;
  24. }
  25. module.exports = { refund };

1.1  WxPayRefund.js

  1. var express = require('express');
  2. var request = require('request');
  3. var Q = require("q");
  4. var crypto = require('crypto');
  5. var ejs = require('ejs');
  6. var fs = require('fs');
  7. // 需要的参数设置 自行定义
  8. var config = require("./../config");
  9. var router = express.Router();
  10.  
  11. /* 微信 申请 退款 */
  12. var key = config.key; //此处为申请微信支付的API密码
  13. var APPID = config.AppID;
  14. var WxPayRefund = {
  15. // 生成微信的xml
  16. getXMLNodeValue: function(node_name, xml) {
  17. var tmp = xml.split("<" + node_name + ">");
  18. var _tmp = tmp[1].split("</" + node_name + ">");
  19. return _tmp[0];
  20. },
  21.  
  22. raw: function(args) {
  23. var keys = Object.keys(args);
  24. keys = keys.sort()
  25. var newArgs = {};
  26. keys.forEach(function(key) {
  27. newArgs[key] = args[key];
  28. });
  29. var string = '';
  30. for (var k in newArgs) {
  31. string += '&' + k + '=' + newArgs[k];
  32. }
  33. string = string.substr(1);
  34. return string;
  35. },
  36.  
  37. paysignjs: function(appid, nonceStr, package, signType, timeStamp) {
  38. var ret = {
  39. appId: appid,
  40. nonceStr: nonceStr,
  41. package: package,
  42. signType: signType,
  43. timeStamp: timeStamp
  44. };
  45. var string = this.raw(ret);
  46. string = string + '&key=' + key;
  47. var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex');
  48. return sign.toUpperCase();
  49. },
  50. //签名
  51. paysignjsapi: function(appid, mch_id, nonce_str, out_refund_no, out_trade_no, refund_fee, total_fee) {
  52. var ret = {
  53. appid: appid,
  54. mch_id: mch_id,
  55. nonce_str: nonce_str,
  56. // notify_url: notify_url,
  57. out_refund_no: out_refund_no,
  58. out_trade_no: out_trade_no,
  59. refund_fee: refund_fee,
  60. total_fee: total_fee,
  61. };
  62. var string = this.raw(ret);
  63. string = string + '&key=' + key; //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
  64. var crypto = require('crypto');
  65. var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex');
  66. return sign.toUpperCase();
  67. },
  68.  
  69. // 随机字符串产生函数
  70. createNonceStr: function() {
  71. return Math.random().toString(36).substr(2, 15);
  72. },
  73.  
  74. // 时间戳产生函数
  75. createTimeStamp: function() {
  76. return parseInt(new Date().getTime() / 1000) + '';
  77. },
  78. // 此处的attach不能为空值 否则微信提示签名错误
  79. WxPayRefund: function(_order) {
  80. var deferred = Q.defer();
  81. var appid = APPID;
  82. var nonce_str = this.createNonceStr();
  83. var timeStamp = this.createTimeStamp();
  84. var url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //
  85. var formData = "<xml>";
  86. formData += "<appid>" + appid + "</appid>"; // 公众账号ID appid
  87. formData += "<mch_id>" + _order.mch_id + "</mch_id>"; // 商户号 mch_id
  88. formData += "<nonce_str>" + nonce_str + "</nonce_str>"; // 随机字符串
  89. // formData += "<notify_url>" + _order.notify_url + "</notify_url>"; // 退款结果通知url
  90. formData += "<out_refund_no>" + _order.out_refund_no + "</out_refund_no>"; // 商户退款单号
  91. formData += "<out_trade_no>" + _order.out_trade_no + "</out_trade_no>"; //商户系统内部订单号
  92. formData += "<refund_fee>" + _order.refund_fee + "</refund_fee>"; // 退款金额
  93. formData += "<total_fee>" + _order.total_fee + "</total_fee>"; // 订单金额
  94. formData += "<sign>" + this.paysignjsapi(appid, _order.mch_id, nonce_str, _order.out_refund_no, _order.out_trade_no, _order.refund_fee, _order.total_fee) + "</sign>"; // 签名 sign
  95. formData += "</xml>";
  96. var self = this;
  97. request({
  98. url: url,
  99. method: 'POST',
  100. body: formData,
  101. agentOptions: {
  102. pfx: fs.readFileSync(__dirname + './../cert/apiclient_cert.p12'),
  103. passphrase: _order.mch_id
  104. }
  105. }, function(err, response, body) {
  106. if (!err && response.statusCode == 200) {
  107. console.log('11', body);
  108. var data = parser(body);
  109. deferred.resolve(data);
  110. } else {
  111. console.log('12', body);
  112. }
  113. });
  114. return deferred.promise;
  115. },
  116. };
  117.  
  118. function parser(_da) {
  119. var xml = _da;
  120. xml = xml.slice('<xml>'.length, xml.indexOf('</xml>'));
  121. var tag = xml.match(/<\w+>/g);
  122. var len = tag.length;
  123. var obj = new Object(); //将微信 支付成功 返回的 xml 数据处理为json格式
  124. for (var i = 0; i < len; i++) {
  125. var node_name = tag[i].replace(/\<|\>/g, '');
  126. var tmp = xml.split("<" + node_name + ">");
  127. var _tmp = tmp[1].split("</" + node_name + ">");
  128. var result = _tmp[0];
  129. if (result.match(/^(?!.*CDATA)/)) {
  130. obj[node_name] = result;
  131. } else {
  132. obj[node_name] = result.split('[')[2].split(']')[0];
  133. }
  134. }
  135. return obj;
  136. }
  137. module.exports = WxPayRefund;

在这里再次感谢在人生路上帮助我的人!谢谢你们。

如果以上代码对您有用,欢迎打赏!如有错误的地方也请您留言指出。

node 微信退款的更多相关文章

  1. C#.NET ,微信退款证书

    微信退款时遇到:基础连接已经关闭 连接被意外关闭. 服务器环境:WIN SERVER 2008 R2.  WINDOWS服务承载的WCF服务,基于.NET FRAMEWORK 3.5. 第一笔交易的退 ...

  2. 微信退款 - tp5

    原文:http://www.upwqy.com/details/19.html 1 微信退款官方文档  https://pay.weixin.qq.com/wiki/doc/api/app/app.p ...

  3. 微信退款证书使用c#

    微信退款需要证书 data为已封装好的xml数据 具体怎么封装>打开 public string get(string data) { string cert = @"D:\certi ...

  4. 微信退款和支付宝退款接口调用(java版)

    项目中需要使用到微信和支付宝的退款功能,在这两天研究了一下这两个平台的退款,有很多坑,在开发中需要留意 1.微信退款接口 相对来说我感觉微信的退款接口还是比较好调用的,直接发送httppost请求即可 ...

  5. 微信小程序支付以及微信退款开发

    最近公司项目急着测试,需要开发微信小程序+微信支付+微信退款,本着这几天的一些研究,决定记录一下开发的过程. 本着知识分享的原则,希望对大家有所帮助. 本篇针对的是微信小程序的支付开发,如果有对微信公 ...

  6. PHP实现微信退款功能

    最近在调微信退款接口,发现有许多坑,更大家分享一下 ① 要是在测试的时候,网页提示 curl 58 说明 证书的路径出现问题(这里要填物理路径,也就是绝对路径) ②网页提示curl 52 说明你的证书 ...

  7. PHP实现微信退款的分析与源码实现

    原文:https://blog.csdn.net/jason19905/article/details/78628349 网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通 ...

  8. 微信退款流程,以及在过程中遇见的错误和解决方式(php 语言)

    官方下载demo 1:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 开发步骤  :    https://pay.weix ...

  9. 微信退款SpringBoot读取resource下的证书

    微信支付退款接口,需要证书双向验证,测试的时候证书暂时放在resource下,上图 起初MyConfig中我是这样,在本机IDE中运行没有问题 但到Linux服务器的docker中运行就IO异常了,查 ...

随机推荐

  1. UVALive 3835:Highway(贪心 Grade D)

    VJ题目链接 题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d.求最少放几个点. 思路:以点为中心作半径为d的圆,交x轴为一个线段.问题转换成用最少 ...

  2. c socket 开发测试

    c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...

  3. 跨越真实和虚拟世界的边界——走近SIGGRAPH 2014大会

    2014大会" title="跨越真实和虚拟世界的边界--走近SIGGRAPH 2014大会"> 作者:孙鑫 微软亚洲研究院研究员 一场大会振奋一座城 温哥华位于加 ...

  4. 精心收集的Hadoop学习资料

    1.<Hadoop技术内幕:深入解析Hadoop Common和HDFS>下载地址:http://download.csdn.net/detail/w397090770/6643259. ...

  5. git pull 显示的冲突---解决办法git stash

    git pull:显示本地仓库与远程仓库有冲突 Please, commit your changes or stash them before you can merge. Aborting 解决办 ...

  6. IOUtils和FileUtils的学习笔记

    pom文件导入依赖import org.apache.commons.io.FileUtils; <dependency> <groupId>commons-io</gr ...

  7. 你相信吗:一加仑汽油可以给iPhone充电20年

    一直以来,苹果公司的iPhone系列手机受到了全世界人民的喜欢,很多人就此成为了果粉.或许是由于我们过于在意iPhone系列手机出彩的外形,所以忽略了很多关于iPhone手机有意思的消息,我们今天就来 ...

  8. JDK1.8新特性Lambda表达式

    /** * Lambda * @date 2019/8/2 10:03 */ public class Lamda { public static void main(String[] args){ ...

  9. Git 常用资源

    库管理 克隆库 git clone https://github.com/php/php-src.git git clone --depth=1 https://github.com/php/php- ...

  10. C:数组习题

    与字符串处理有关的函数: 头文件:<stdio.h>    gets().puts() 头文件:<string.h> (1).字符串长度测量函数  :strlen(字符数组名) ...