当前位置: 首页 > 后端技术 > Node.js

节点微信扫码支付(一)

时间:2023-04-03 16:52:52 Node.js

版权声明:本文为博主原创文章,未经博主许可不得转载。概述目前微信官方的微信支付demo没有node版本。这几天一直在折腾微信支付,记录下来做个笔记;参考微信支付官方文档签名微信支付的签名是用MD5加密的。下面统一微信支付的签名算法。命令:先创建一个wechatPay.js文件(包含签名算法,统一命令等)/****导入依赖包**/varconfig=require('../config');varrequest=require("request");varmoment=require('moment'),_=require('underscore'),https=require('https'),fs=require('fs'),URL=require('url'),CryptoJS=require("crypto-js"),jsontoxml=require('jsontoxml'),xml2js=require('xml2js');varcrypto=require('crypto');/****签名算法**/vargenerateSign=exports.genrateSign=function(obj){vartmpObj={};//获取一个非空键_.each(obj,function(value,key){if(value){tmpObj[key]=value;}});varkeys=_.keys(tmpObj);//键字典排序keys=keys.sort();vartmpArr=[];_.each(keys,function(key){tmpArr.push(key+"="+tmpObj[key])})tmpArr.push("key="+config.wxmcn.mcnsecret);////key在微商平台(pay.weixin.qq.com)->账户设置-->API安全-->密钥设置vartmpStr=tmpArr.join('&');//拼接字符串varsign=crypto.createHash('md5').update(tmpStr,'utf8').digest('hex');returnsign.toUpperCase();}//统一排序,获取code_url稍后生成二维码varpaysign=exports.paysign=function(params,callback){if(_.isEmpty(params)){callback('参数不能是空的');}varcurrentTime=moment().valueOf().toString();varnonce_str=[config.wxmcn.mcnid,currentTime].join('');//随机字符串varmch_billno=[config.wxmcn.mcnid,moment().format("YYYYMMDD"),moment().unix()].join('');//订单号varret={appid:config.H5.appid,body:params.body,//产品描述attach:params.attach,//用户身份intidmch_id:config.wxmcn.mcnid,//商家IDnonce_str:nonce_str,//随机字符串notify_url:params.notify_url,//通知地址out_trade_no:mch_billno,//商户订单号spbill_create_ip:params.spbill_create_ip,//终端iptotal_fee:params.total_fee,//价格金额trade_type:params.trade_type//交易类型};if(!_.isEmpty(params.openid)){_.extend(ret,{openid:params.openid});}varsign=generateSign(ret);_.extend(ret,{sign:sign});varbody=jsontoxml(ret);body=''+body+'';request({url:'https://api.mch.weixin.qq.com/pay/unifiedorder',method:'POST',body:body},function(err,response,body){if(!err&&response.statusCode==200){//xml2js将返回的xml转成json,但是后面都是数组xml2js.parseString(body,function(err,json){if(err){callback(newError("parsingxmlerror"));}else{varresult=formMessage(json.xml);//转换为普通json数据if(result.return_code==='SUCCESS'&&result.result_code==='SUCCESS'){callback(空,结果);}else{callback(newError('wechaterr'))}}})}});};//将xml2js转换成json数据进行一步转换varformMessage=function(result){varmessage={};if(typeofresult==='object'){varkeys=Object.keys(result);对于(vari=0;i