基于nodejs实现微信支付功能

本文实例为大家分享了nodejs实现微信支付的具体代码,供大家参考,具体内容如下

通过nodejs使用微信支付最重要的就是微信的签名,在这里md5后的字符必须转化为大写

一、回复微信通知消息模版

message.ejs

<xml>
  <return_code><![CDATA[<%-return_code%>]]></return_code>
  <return_msg><![CDATA[<%=return_msg%>]]></return_msg>
</xml>

二、微信支付model文件代码

wxpay.js

var config = require('../config'); //配置文件 appid 等信息
var Q = require("q");
var request = require("request");
var crypto = require('crypto');
var ejs = require('ejs');
var fs = require('fs');
var key = "此处为申请微信支付的API密码";
var messageTpl = fs.readFileSync(__dirname + '/message.ejs', 'utf-8'); 

var WxPay = {
  getXMLNodeValue: function(node_name, xml) {
    var tmp = xml.split("<" + node_name + ">");
    var _tmp = tmp[1].split("</" + node_name + ">");
    return _tmp[0];
  }, 

  raw: function(args) {
    var keys = Object.keys(args);
    keys = keys.sort()
    var newArgs = {};
    keys.forEach(function(key) {
      newArgs[key] = args[key];
    });
    var string = '';
    for (var k in newArgs) {
      string += '&' + k + '=' + newArgs[k];
    }
    string = string.substr(1);
    return string;
  }, 

  paysignjs: function(appid, nonceStr, package, signType, timeStamp) {
    var ret = {
      appId: appid,
      nonceStr: nonceStr,
      package: package,
      signType: signType,
      timeStamp: timeStamp
    };
    var string = this.raw(ret);
    string = string + '&key=' + key;
    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex');
    return sign.toUpperCase();
  }, 

  paysignjsapi: function(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type) {
    var ret = {
      appid: appid,
      attach: attach,
      body: body,
      mch_id: mch_id,
      nonce_str: nonce_str,
      notify_url: notify_url,
      openid: openid,
      out_trade_no: out_trade_no,
      spbill_create_ip: spbill_create_ip,
      total_fee: total_fee,
      trade_type: trade_type
    };
    var string = this.raw(ret);
    string = string + '&key=' + key; //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
    var crypto = require('crypto');
    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex');
    return sign.toUpperCase();
  }, 

  // 随机字符串产生函数
  createNonceStr: function() {
    return Math.random().toString(36).substr(2, 15);
  }, 

  // 时间戳产生函数
  createTimeStamp: function() {
    return parseInt(new Date().getTime() / 1000) + '';
  }, 
// 此处的attach不能为空值 否则微信提示签名错误
  order: function(attach, body, mch_id, openid, bookingNo, total_fee, notify_url) {
    var deferred = Q.defer();
    var appid = config.member_config.appid;
    var nonce_str = this.createNonceStr();
    var timeStamp = this.createTimeStamp();
    var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    var formData = "<xml>";
    formData += "<appid>" + appid + "</appid>"; //appid
    formData += "<attach>" + attach + "</attach>"; //附加数据
    formData += "<body>" + body + "</body>";
    formData += "<mch_id>" + mch_id + "</mch_id>"; //商户号
    formData += "<nonce_str>" + nonce_str + "</nonce_str>"; //随机字符串,不长于32位。
    formData += "<notify_url>" + notify_url + "</notify_url>";
    formData += "<openid>" + openid + "</openid>";
    formData += "<out_trade_no>" + bookingNo + "</out_trade_no>";
    formData += "<spbill_create_ip>61.50.221.43</spbill_create_ip>";
    formData += "<total_fee>" + total_fee + "</total_fee>";
    formData += "<trade_type>JSAPI</trade_type>";
    formData += "<sign>" + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, '61.50.221.43', total_fee, 'JSAPI') + "</sign>";
    formData += "</xml>";
    var self = this;
    request({
      url: url,
      method: 'POST',
      body: formData
    }, function(err, response, body) {
      if (!err && response.statusCode == 200) {
        console.log(body);
        var prepay_id = self.getXMLNodeValue('prepay_id', body.toString("utf-8"));
        var tmp = prepay_id.split('[');
        var tmp1 = tmp[2].split(']');
        //签名
        var _paySignjs = self.paysignjs(appid, nonce_str, 'prepay_id=' + tmp1[0], 'MD5', timeStamp);
        var args = {
          appId: appid,
          timeStamp: timeStamp,
          nonceStr: nonce_str,
          signType: "MD5",
          package: tmp1[0],
          paySign: _paySignjs
        };
        deferred.resolve(args);
      } else {
        console.log(body);
      }
    });
    return deferred.promise;
  }, 

  //支付回调通知
  notify: function(obj) {
    var output = "";
    if (obj.return_code == "SUCCESS") {
      var reply = {
        return_code: "SUCCESS",
        return_msg: "OK"
      }; 

    } else {
      var reply = {
        return_code: "FAIL",
        return_msg: "FAIL"
      };
    } 

    output = ejs.render(messageTpl, reply);
    return output;
  },
};
module.exports = WxPay;

三、在express router中调用wxpay

//微信支付demo
router.get('/order', function(req, res, next){
  var attach = "1276687601";
  var body = "测试支付";
  var mch_id = "1111111"; //商户ID
  var openid = "111111";
  var bookingNo = "201501806125346"; //订单号
  var total_fee = 10;
  var notify_url = "http://localhost/wxpay/notify"; //通知地址
  wxpay.order(attach, body, mch_id, openid, bookingNo, total_fee, notify_url).then(function(data){
    res.render('wxpay', {args: data});
  });
});
//微信回调通知 采用数据流形式读取微信返回的xml数据 此处不在累赘
router.post('/notify', function(req, res, next){ 

});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

    在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的需求,那在代码中怎样监听当点击微信.支付宝.百度糯米.百度钱包等app的返回按钮或者浏览器的上一页或后退按钮的事件呢. 我相信很多朋友像我一样,在百度.搜狗里面搜索很久都没找到方法. 下面就来告诉大家怎样监听的方法: 首先我们要了解浏览器的history. 大家知道在页面中我们可以使用javascript window history,后退到前面页面,但是由于安

  • 微信JSAPI支付操作需要注意的细节

    首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK. weixin.senparc SDK 官网:http://weixin.senparc.com/ 先去下载下来Senparc.Weixin SDK. 在调起支付接口之前,需要先要调用统一下单接口,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付. 微信 JsApi支付 在这个目录下 Senparc.Weixin.MP.

  • 前端微信支付js代码

    本文实例为大家分享了前端微信支付js代码,供大家参考,具体内容如下 $('.Save_Patient_Msg').click(function(){ $('.Save_Patient_Msg').off('click'); var hrdfId = getOrderId(); var txnAmt = $('.sum_pay.font-red').html(); var data = {orderId: hrdfId, txnAmt: "0.01", prodDesc: "远

  • 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法

    这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些"暗坑"能不掉就不掉吧,要不然关键时刻出问题,真是让人急的焦头烂额. 双12客户的商城活动正在蓄势进行中,却有用户频频反馈说:支付不了,有问题,并截图如下: 当时问题感觉很奇怪,自己测试多次都ok啊,问题来了都赶紧解决吧,最终找到解决办法: 原因是程序中一个字符串变量被错误的设置为数字类型,解决方法很

  • js微信支付实现代码

    本文实例为大家分享了js微信支付的具体代码,供大家参考,具体内容如下 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0"&g

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

    缘起 有付款就会有退款 注意,退款支持部分退款 左口袋的钱退到右口袋罗 这次发起的退款请求0.01元是实时到账的,因此,用户在小程序端发起的退款只是一个请求到后台,后台审核人员审核无误后才后微信发起退款操作. 引入第三方module 在package.json 中加入"weixin-pay": "^1.1.7"这一条 代码目录结构 入参 { transaction_id: '4200000005201712165508745023', // 交易 out_trade

  • nodejs微信公众号支付开发

    odeJs 微信公众号功能开发,移动端 H5页面调用微信的支付功能.这几天根据公司的需要使用 node 和 h5页面调用微信的支付功能完成支付需求.现在把开发过程重新捋一遍,以帮助更多的开发者顺利的完成微信支付功能的开发.(微信暂时还没有提供 node 的支付功能) 一.请求CODE 请求 code 的目的就是获取用户的 openid(用户相对于当前公众号的唯一标识) 和access_token,请求的API:https://open.weixin.qq.com/connect/oauth2/a

  • 详解用vue.js和laravel实现微信支付

    注:此项是微信公众号开发,请在往下看之前,先实现网页微信授权登陆功能,具体参看我简书的另一篇文章:http://www.jb51.net/article/117004.htm 1.打开app/config/wechat.php,配置微信支付参数: /* * 微信支付 */ 'payment' => [ 'merchant_id' => env('WECHAT_PAYMENT_MERCHANT_ID', 'your-mch-id'),//商家号ID,请将其放在.env文件中 'key' =>

  • 微信支付 JS API支付接口详解

    一.JS API支付接口(getBrandWCPayRequest) 微信JS API只能在微信内置浏览器中使用,其他浏览器调用无效.微信提供getBrandWCPayRequest接口供商户前端网页调用,调用之前微信会鉴定商户支付权限,若商户具有调起支付的权限,则将开始支付流程.这里主要介绍支付前的接口调用规则,支付状态消息通知机制请参加下文.接口需要注意:所有传入参数都是字符串类型! getBrandWCPayRequest参数如下图所示. 参数 名称 必填 格式 说明 appId 公众号i

  • 基于nodejs实现微信支付功能

    本文实例为大家分享了nodejs实现微信支付的具体代码,供大家参考,具体内容如下 通过nodejs使用微信支付最重要的就是微信的签名,在这里md5后的字符必须转化为大写 一.回复微信通知消息模版 message.ejs <xml> <return_code><![CDATA[<%-return_code%>]]></return_code> <return_msg><![CDATA[<%=return_msg%>]]

  • 小程序微信支付功能配置方法示例详解【基于thinkPHP】

    本文实例讲述了小程序微信支付功能配置方法.分享给大家供大家参考,具体如下: ★ 背景 近期进行小程序的开发,毕竟是商城项目的开发,最后牵扯到的微信支付是必要的 个人开发过程中也是遇到各种问题,在此,我根据自己的实际操作,进行了代码的详细配置,以方便小程序新手的快速操作 -  使用语言:PHP             # PHP世界上最好的语言 HaHahahaaha -  使用框架:ThinkPHP 3.2    # 版本有点低而已,没啥大碍 -  测试工具:微信开发者工具    # 其实还挺好

  • Android编程实现的微信支付功能详解【附Demo源码下载】

    本文实例讲述了Android编程实现的微信支付功能.分享给大家供大家参考,具体如下: 最近公司弄Ionic框架,项目中需要微信支付,无奈,把我调过去弄,期间也是几近崩溃,好在皇天不负有心人,在看别人的文档,终于是在项目中集成了微信支付,下面作为一个小白的我,想要把我的经验分享给大家,希望对大家有所帮助. 先给一个可用的demo吧(运行前先看txt文件) demo代码点击此处本站下载. 这个demo是基于eclipse开发的,博主也在Android Studio开发过微信支付,原理都是一样的,大家

  • IOS 集成微信支付功能的实现方法

    IOS 集成微信支付功能的实现方法 第一步:集成微信的SDK https://pay.weixin.qq.com/wiki/doc/api/index.html 点击进入 下载对应SDK或示例,最后可以看看示例程序 第二步:在Xcode中填写微信开放平台申请的Appid Xcode>info>URL Types  中新建加入Appid 第三步:在Appdelegate.m 中注册微信支付 和回调 #import "WXApi.h" 添加 代理 WXApiDelegate -

  • Python使用微信SDK实现的微信支付功能示例

    本文实例讲述了Python使用微信SDK实现的微信支付功能.分享给大家供大家参考,具体如下: 最近一段时间一直在搞微信平台开发,v3.37版本微信支付接口变化贼大,所以就看着php的demo移植为Python版,为了保持一致,所以接口方法基本都没有变,这样的好处就是不用写demo了,看着微信官方的demo照葫芦画瓢就可以了. 代码放到github下载地址:https://github.com/Skycrab/wzhifuSDK 还可以点击此处本站下载. 我主要测试了JsApi调用方式,其它的调用

  • JS通过调用微信API实现微信支付功能的方法示例

    本文实例讲述了JS通过调用微信API实现微信支付功能的方法.分享给大家供大家参考,具体如下: 最近在做微信公众号开发,在微信支付上遇到一些问题,困惑了3天,今天终于搞定.期间要感谢一些大神的帮助,趁热下面分享一下我的经验. 在实现微信支付之前,需要到微信开发平台认证,这些认证和配置信息我就不多说了,这里主要从代码层面实现支付. function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId&quo

  • Thinkphp整合微信支付功能

    先上效果图:我要告诉你我这一篇文章写的是微信支付之中的(普通商户而非服务商商户的统一下单JSPI)微信支付: 其实自己整合SDK失败了,用了一个博客博主整合的代码,在这里写一下笔记: 前面准备: 1.微信公众号: 独特的appid.appscrect.接口权限之中设置可以获取用户ID信息权限的域名(每个用户对于不同公众都会有一个特有ID,通过这个ID获取用户微信账号基本信息.详情看微信开发者文档).在微信支付按钮出设置微信支付授权目录(写到发起请求的控制器那一层).设置开发者微信账号为测试白名单

  • Android实现微信支付功能

    开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对应的商户号.API密钥,这两者缺一不可,并且在APP微信支付中使用 获得商户号.API密钥 在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号.API密钥 >申请微信支付接口 >登录商户平

  • 基于JavaScript实现微信抢红包功能

    金额随机:额度在0.01和(剩余平均值*2)之间. /** * 抢红包 * @param {[number]} totalAmount [总金额] * @param {[number]} totalPeople [总人数] * @return {[Array]} [每个人抢到的金额] */ function assign(totalAmount, totalPeople){ var remainAmount = +totalAmount; var remainPeople = +totalPeo

  • Java编程调用微信支付功能的方法详解

    本文实例讲述了Java编程调用微信支付功能的方法.分享给大家供大家参考,具体如下: 微信开发文档地址:https://mp.weixin.qq.com/wiki/home/ 从调用处开始 我的流程: 1.点击"支付"按钮,去后台 --> 2.后台生成支付所需数据返回页面 --> 3.页面点击"确认支付"调用微信支付js.完成支付功能. 支付按钮 <div class="button" id="pay" onc

随机推荐