node.js实现微信公众号支付


转:https://www.jianshu.com/p/dbbeff1063ac

流程图,微信商户平台>开发文档>公众号支付>业务流程

 
流程.png

从第4步开始,首先创建你自己公司的订单,存到数据库里,上代码

var coll_name = 't_board';//数据库表名 var api_uri = '/' + coll_name + '/0'; var cur_timestamp = Math.floor((new Date()).getTime() / 1000); var body_str = JSON.stringify(req.body); var token = utils.generateAccessToken( module_db_crud_request_headers.ApiCalleeId , module_db_crud_request_headers.ApiAccessKey , cur_timestamp, api_uri, body_str, SECRET_KEY ); module_db_crud_request_headers.ApiTimestamp = cur_timestamp; module_db_crud_request_headers.ApiToken = token; request({ //主要是发这个请求,具体参数都是公司内部的API调用的要求 uri: CONFIG.API_ADDRESS + module_db_crud_request_headers.ApiCalleeId + api_uri, method: 'POST', timeout: 5000, followRedirect: false, headers: module_db_crud_request_headers, body: body_str, }, function(error, response, body) { if (error) { console.log(error); return next(utils.new_err(response.statusCode, body)); } if (response.statusCode != 200) { return next(utils.new_err(response.statusCode, body)); } try { var jdata = JSON.parse(body); res.dp_result = jdata; next();下一步 // go next ===> } catch (e) { return next(utils.new_err(500, 'JSON.parse exception')); } }); 

别慌到这里,你们公司的订单已经完成,基本的订单信息,都应该会返回回来的。接下来调起微信支付

接下来是重点!

1.ip的获取。

2.订单的id,公众号的id。

3.参数的拼接和发送。

1.ip的获取

百度上一堆,由于我们公司用的中间件来管理API所以这个,得需要前端来拿到用户的IP地址,这里需要的实际的IP地址

2.订单的id,公众号的id。

订单的id在你创建完公司的内部订单就直接可以拿到,公众号的id,这个也是前端拿的。。。

 
网站应用.png

微信官方传送门

 

3.参数的拼接和发送。

这个对于细心的认真的朋友并不难,为了防止你们出现意外,直接赋值粘贴,并点个赞,给个星(要求不过分吧。。。)上马!

var pay_parameter = { 'appid' :CONFIG.WECHAT_APPID, 'mch_id' : CONFIG.WECHAT_MCH_ID, 'nonce_str' : Math.random().toString(36).substr(2, 15), 'body' : '大屏自助广告投放-购买位置', 'out_trade_no' : sp_id_string, 'total_fee' : req.body.price, 'spbill_create_ip' : req.body.ip, 'notify_url' : CONFIG.WECHAT_NOTIFY_URL, 'scene_info' : JSON.stringify({"h5_info": {"type":"Wap","wap_url": "","wap_name": "充值"}}), 'trade_type' : 'JSAPI', 'openid' : req.body.owner, }; var ASCII_String = 'appid='+ pay_parameter.appid + '&' + 'body=' + pay_parameter.body +'&' + 'mch_id=' + pay_parameter.mch_id +'&' + 'nonce_str=' + pay_parameter.nonce_str +'&' + 'notify_url=' + pay_parameter.notify_url +'&' + 'openid=' + pay_parameter.openid + '&' + 'out_trade_no=' + pay_parameter.out_trade_no +'&' + 'scene_info=' + pay_parameter.scene_info +'&' + 'spbill_create_ip=' + pay_parameter.spbill_create_ip +'&' + 'total_fee=' + pay_parameter.total_fee +'&' + 'trade_type=' + pay_parameter.trade_type ; console.log('#1.对参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串',ASCII_String); var stringSignTemp = JSON.stringify(ASCII_String + '&key=' + CONFIG.WECHAT_KEY); console.log('#2.连接商户key',stringSignTemp); var sign = utils.md5(JSON.parse(stringSignTemp)).toUpperCase(); console.log('#3.生成sign并转成大写',sign); 

参数值pay_parameter对象里面的东西改成你想要的对应的就可以了,有一些公司保密信息我直接删掉了,这些直接粘贴就好

下一步

把你的参数由JSON转成XML

  var parseString = require('xml2js').parseString;//npm var oa = Object.keys(pay_parameter).sort(); var on = {}; for(var i=0;i<oa.length;i++){ on[oa[i]] = pay_parameter[oa[i]] } on.sign = sign; var xml_parmeter = utils.jsonToxml(on); 

然后,向微信统一下单API发起POST请求,返回给你的是XML转不转JSON看你心情

request({ uri: CONFIG.API_ADDRESS + wechat_unifiedorder.ApiCalleeId , method: 'POST', timeout: 10000, followRedirect: false, headers: wechat_unifiedorder, body: body_xml, }, function(error, response, body) { parseString(body,{ explicitArray : false, ignoreAttrs : true }, function (err, result) { res.dp_result = result }); return next(null, process_list.indexOf(responseResultContent)); // go next ===> }); 

下单成功会有一个回调,通知,你需要有一个对外网的API(内网可收不到)收到的应该是XML你需要在APP.JS添加一段代码,添加完你收到的就是JSON了。

  var bodyParser = require('body-parser'); require('body-parser-xml')(bodyParser); 

OK至此下单加回调已经完成。




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM