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