基于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+=""+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+=" ";
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;
三、在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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。