基于nodejs实现微信支付功能
本文实例为大家分享了nodejs实现微信支付的具体代码,供大家参考,具体内容如下
通过nodejs使用微信支付最重要的就是微信的签名,在这里md5后的字符必须转化为大写
一、回复微信通知消息模版
message.ejs
]]> ]]>
二、微信支付model文件代码
wxpay.js
varconfig=require('../config');//配置文件appid等信息 varQ=require("q"); varrequest=require("request"); varcrypto=require('crypto'); varejs=require('ejs'); varfs=require('fs'); varkey="此处为申请微信支付的API密码"; varmessageTpl=fs.readFileSync(__dirname+'/message.ejs','utf-8'); varWxPay={ getXMLNodeValue:function(node_name,xml){ vartmp=xml.split("<"+node_name+">"); var_tmp=tmp[1].split(""+node_name+">"); return_tmp[0]; }, raw:function(args){ varkeys=Object.keys(args); keys=keys.sort() varnewArgs={}; keys.forEach(function(key){ newArgs[key]=args[key]; }); varstring=''; for(varkinnewArgs){ string+='&'+k+'='+newArgs[k]; } string=string.substr(1); returnstring; }, paysignjs:function(appid,nonceStr,package,signType,timeStamp){ varret={ appId:appid, nonceStr:nonceStr, package:package, signType:signType, timeStamp:timeStamp }; varstring=this.raw(ret); string=string+'&key='+key; varsign=crypto.createHash('md5').update(string,'utf8').digest('hex'); returnsign.toUpperCase(); }, paysignjsapi:function(appid,attach,body,mch_id,nonce_str,notify_url,openid,out_trade_no,spbill_create_ip,total_fee,trade_type){ varret={ 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 }; varstring=this.raw(ret); string=string+'&key='+key;//key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 varcrypto=require('crypto'); varsign=crypto.createHash('md5').update(string,'utf8').digest('hex'); returnsign.toUpperCase(); }, //随机字符串产生函数 createNonceStr:function(){ returnMath.random().toString(36).substr(2,15); }, //时间戳产生函数 createTimeStamp:function(){ returnparseInt(newDate().getTime()/1000)+''; },
//此处的attach不能为空值否则微信提示签名错误 order:function(attach,body,mch_id,openid,bookingNo,total_fee,notify_url){ vardeferred=Q.defer(); varappid=config.member_config.appid; varnonce_str=this.createNonceStr(); vartimeStamp=this.createTimeStamp(); varurl="https://api.mch.weixin.qq.com/pay/unifiedorder"; varformData=""; formData+=" "; varself=this; request({ url:url, method:'POST', body:formData },function(err,response,body){ if(!err&&response.statusCode==200){ console.log(body); varprepay_id=self.getXMLNodeValue('prepay_id',body.toString("utf-8")); vartmp=prepay_id.split('['); vartmp1=tmp[2].split(']'); //签名 var_paySignjs=self.paysignjs(appid,nonce_str,'prepay_id='+tmp1[0],'MD5',timeStamp); varargs={ appId:appid, timeStamp:timeStamp, nonceStr:nonce_str, signType:"MD5", package:tmp1[0], paySign:_paySignjs }; deferred.resolve(args); }else{ console.log(body); } }); returndeferred.promise; }, //支付回调通知 notify:function(obj){ varoutput=""; if(obj.return_code=="SUCCESS"){ varreply={ return_code:"SUCCESS", return_msg:"OK" }; }else{ varreply={ return_code:"FAIL", return_msg:"FAIL" }; } output=ejs.render(messageTpl,reply); returnoutput; }, }; module.exports=WxPay;"+appid+" ";//appid formData+=""+attach+" ";//附加数据 formData+=""+body+""; formData+=""+mch_id+" ";//商户号 formData+=""+nonce_str+" ";//随机字符串,不长于32位。 formData+=""+notify_url+" "; formData+=""+openid+" "; formData+=""+bookingNo+" "; formData+="61.50.221.43 "; formData+=""+total_fee+" "; formData+="JSAPI "; formData+=""+this.paysignjsapi(appid,attach,body,mch_id,nonce_str,notify_url,openid,bookingNo,'61.50.221.43',total_fee,'JSAPI')+" "; formData+="
三、在expressrouter中调用wxpay
//微信支付demo router.get('/order',function(req,res,next){ varattach="1276687601"; varbody="测试支付"; varmch_id="1111111";//商户ID varopenid="111111"; varbookingNo="201501806125346";//订单号 vartotal_fee=10; varnotify_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){ });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。