node.js实现微信公众号支付(统一下单+回调通知)

前言:公司业务逻辑,前后端分离,node.js负责处理一些支付逻辑;

配置那些这里就不讲了(因为不是我配置的)直接从吊起支付开始,上流程图,微信商户平台>开发文档>公众号支付>业务流程

流程.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至此下单加回调已经完成,有没弄懂的地方底下评论,我先去弄到github上面。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容