美文网首页Node.js程序员Node.js
nodejs实现微信支付V3(二)公众号支付

nodejs实现微信支付V3(二)公众号支付

作者: IT小C | 来源:发表于2016-03-16 11:34 被阅读6872次

公众号支付
统一接口中的openid必须的,trade_type设置为JSAPI

exports.jsapipay = function (req, res) {
    var bookingNo = req.query.bookingNo;
    var appid = _appid;
    var attach = _attach;
    var mch_id = _mch_id;
    var nonce_str = _nonce_str;
    var total_fee = _total_fee;
    var notify_url = _notify_url;
    var openid = _openid;
    var body = _body;
    var timeStamp = _timeStamp; 
    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></spbill_create_ip>";
    formData  += "<total_fee>"+total_fee+"</total_fee>";
    formData  += "<trade_type>JSAPI</trade_type>";
    formData  += "<sign>"+paysignjsapi(appid,attach,body,mch_id,nonce_str,notify_url,openid,bookingNo,'',total_fee,'JSAPI')+"</sign>";
    formData  += "</xml>";
    request({url:url,method:'POST',body: formData},function(err,response,body){
        if(!err && response.statusCode == 200){
            console.log(body);
            var prepay_id = getXMLNodeValue('prepay_id',body.toString("utf-8"));
            var tmp = prepay_id.split('[');
            var tmp1 = tmp[2].split(']');
            //签名
            var _paySignjs = paysignjs(appid,nonce_str,'prepay_id='+tmp1[0],'MD5',timeStamp);
            res.render('jsapipay',{prepay_id:tmp1[0],_paySignjs:_paySignjs});
            //res.render('jsapipay',{rows:body});
            //res.redirect(tmp3[0]);
        }
    });
}

签名加密算法

function paysignjsapi(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 = raw(ret);
    var key = _key;
    string = string + '&key='+key;
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string,'utf8').digest('hex');
};

签名算法要注意大小写,里面有很多坑在

function paysignjs(appid,nonceStr,package,signType,timeStamp) {
    var ret = {
        appId: appid,
        nonceStr: nonceStr,
        package:package,
        signType:signType,
        timeStamp:timeStamp
    };
    var string = raw1(ret);
    var key = _key;
    string = string + '&key='+key;
    console.log(string);
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string,'utf8').digest('hex');
};

签名时候的参数不需要转换为小写的

function raw1(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;
};

解析XML

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

客户端直接通过WeixinJSBridge来实现弹出支付的窗口

 function jsApiCall()
 {
     WeixinJSBridge.invoke(
         'getBrandWCPayRequest',
     {
         "appId" : "wxebs20ae8d978330b", //公众号名称,由商户传入
         "timeStamp" : "1414211784", //时间戳,自1970年以来的秒数
         "nonceStr" : "ibuaiVcKdpRxkhJA", //随机串
         "package" : "prepay_id=<%=prepay_id%>",
         "signType" : "MD5", //微信签名方式:
         "paySign" : "<%=_paySignjs%>" //微信签名
     },
         function (res)
     {
         WeixinJSBridge.log(res.err_msg);
         //alert(res.err_code+res.err_desc+res.err_msg);
         //判断支付返回的参数是否支付成功并跳转
     }
     );
 }
 
 function callpay()
 {
     if (typeof WeixinJSBridge == "undefined")
     {
         if (document.addEventListener)
         {
             document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
         }
         else if (document.attachEvent)
         {
             document.attachEvent('WeixinJSBridgeReady', jsApiCall);
             document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
         }
     }
     else
     {
         jsApiCall();
     }
 }

相关文章

  • nodejs实现微信支付V3(二)公众号支付

    公众号支付统一接口中的openid必须的,trade_type设置为JSAPI 签名加密算法 签名算法要注意大小写...

  • NodeJS实现微信公众号内网页支付&沙箱环境测试验收

    本文主要关注在微信公众号内网页支付的NodeJS实现,总结了编码过程中遇到的一些问题。因为在弄微信公众号网页支付的...

  • 微信支付V3 Sdk接入ecshop

    微信公众平台的配置 设置js安全域名 设置支付目录,和支付测试目录 支付回调url 将微信支付V3 Sdk接入ec...

  • nodejs 微信支付 (koa 框架)

    nodejs实现微信支付,koa框架的接入流程,此文档通过测试,在小程序/微信公众号的后端代码中使用, 已经用于生...

  • 微信公众号网页支付summer版

    该文仅对于中间这种支付方式有参考价值哟 一、开发背景 在微信公众号中,需要进行微信支付且为微信公众号网页支付。 二...

  • 2019-08-19

    blog在线点单备案图标微信公众号微信支付微信赞赏支付宝出行红包支付宝支付支付宝红包

  • 微信公众号配置

    微信支付 - 商户平台 商户号 支付证书 微信公众号 appid & appscret 开发 > 基本配置 > ...

  • 【微信】支付

    公众号支付 调用微信js支付接口的页面,必须接口域名授权。在公众平台中设置,最多可以授权3个。 使用微信公众号支付...

  • 微信支付

    公众号支付是指在微信app中访问的页面通过js直接调起微信支付; 一:设置域名 登录微信公众平台; 微信支付中设置...

  • PHP微信公众号支付开发总结

    微信公众号开发是很常见的开发,其中微信支付占有很大的比重。微信公众号分为服务号和订阅号,服务号支持微信支付。 前期...

网友评论

  • 903c54865f33:按照你的方法提示签名不正确 是什么原因呢?
  • d9b905a2cf1e:@隔壁陈叔叔 我的客户端用的是 CocosCreator 怎么调 WeixinJSBridge 啊。
  • 6ce5114a59ab:大神,我有个字段不是很明白,notify_url这个字段怎么样设置这个url,具体再怎么接收回调信息,我是个菜鸟,刚接触这个,最近app要做微信支付,不会弄 :stuck_out_tongue_winking_eye:
  • 7e8ebbc2ab5c:陈叔叔,我是在您的博客特意找过来评论的.前辈好~~~~最近正在接微信支付
    IT小C: @进击的小兵 有遇到什么问题吗
  • 写程式的猫:你好,paysignjs方法里的_key是什么?
    写程式的猫:@隔壁陈叔叔 你好,支付成功后服务器端的回调方法有例子吗?第一次写nodejs的微信支付。
    谢谢!
    IT小C:@小小纸飞机 商户的密钥,在微信商户平台设置
  • e2e884c815af:好深的坑啊
  • 转角遇见一直熊:互相关注一下吧 我也喜欢node
    IT小C: @沈寅 好的,一起学习

本文标题:nodejs实现微信支付V3(二)公众号支付

本文链接:https://www.haomeiwen.com/subject/lbmqlttx.html