zoukankan      html  css  js  c++  java
  • 微信App支付 --- NodeJs

     

    引包:

    "dependencies": {
        "crypto": "^1.0.1",
        "express": "^4.16.3",
        "request": "^2.85.0",
        "xmlreader": "^0.2.3"
      }

    工具类 util.js

    var xmlreader = require("xmlreader");
    var fs = require("fs");
     
     
    var wxpay = {
     
        //把金额转为分
        getmoney: function (money) {
            return parseFloat(money) * 100;
        },
     
        // 随机字符串产生函数  
        createNonceStr: function () {
            return Math.random().toString(36).substr(2, 15);
        },
     
        // 时间戳产生函数  
        createTimeStamp: function () {
            return parseInt(new Date().getTime() / 1000) + '';
        },
     
        //签名加密算法
        paysignjsapi: function (appid, body, mch_id, nonce_str, notify_url, out_trade_no, spbill_create_ip, total_fee, trade_type, mchkey) {
            var ret = {
                appid: appid,
                mch_id: mch_id,
                nonce_str: nonce_str,
                body: body,
                notify_url: notify_url,
                out_trade_no: out_trade_no,
                spbill_create_ip: spbill_create_ip,
                total_fee: total_fee,
                trade_type: trade_type
            };
            console.log('ret==', ret);
            var string = raw(ret);
            var key = mchkey;
            string = string + '&key=' + key;
            console.log('string=', string);
            var crypto = require('crypto');
            return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase();
        },
        //签名加密算法,第二次的签名
        paysignjsapifinal: function (appid,mch_id,prepayid,noncestr,timestamp,mchkey) {
            var ret = {
                appid: appid,
                partnerid: mch_id,
                prepayid: prepayid,
                package: 'Sign=WXPay',
                noncestr: noncestr,
                timestamp: timestamp,
            };
            console.log('retretret==', ret);
            var string = raw(ret);
            var key = mchkey;
            string = string + '&key=' + key;
            console.log('stringstringstring=', string);
            var crypto = require('crypto');
            return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase();
        },
        getXMLNodeValue: function (xml) {
            // var tmp = xml.split("<"+node_name+">");
            // console.log('tmp',tmp);
            // var _tmp = tmp[1].split("</"+node_name+">");
            // console.log('_tmp',_tmp);
            // return _tmp[0];
            xmlreader.read(xml, function (errors, response) {
                if (null !== errors) {
                    console.log(errors)
                    return;
                }
                console.log('长度===', response.xml.prepay_id.text().length);
                var prepay_id = response.xml.prepay_id.text();
                console.log('解析后的prepay_id==',prepay_id);
                return prepay_id;
            });
        }
     
    }
    function raw(args) {
        var keys = Object.keys(args);
        keys = keys.sort()
        var newArgs = {};
        keys.forEach(function (key) {
            newArgs[key] = args[key];
        });
        var string = '';
        for (var k in newArgs) {
            string += '&' + k + '=' + newArgs[k];
        }
        string = string.substr(1);
        return string;
    }
     
    module.exports = wxpay;

    调用 app.js

    var express = require('express');
    var request = require('request');
    var xmlreader = require("xmlreader");
    var fs = require("fs");
     
    var app = express();
     
    var wxpay = require('./util');
     
     
    var appid     = '';  
    var appsecret = '';
    var mchid     = ''
    var mchkey    = '';
    var wxurl     = 'http://xxxx';
     
    app.get('/',(req,res)=>{
        
        //首先拿到前端传过来的参数
        let orderCode = 20150806125346;
        let money     = 100;
        let orderID   = 1;
     
        // console.log('APP传过来的参数是',orderCode+'----'+money+'------'+orderID+'----'+appid+'-----'+appsecret+'-----'+mchid+'-----'+mchkey);
     
        //首先生成签名sign
        appid
        let mch_id = mchid;
        let nonce_str = wxpay.createNonceStr();
        let timestamp = wxpay.createTimeStamp();
        let body = '测试微信支付';
        let out_trade_no = orderCode;
        let total_fee = wxpay.getmoney(money);
        let spbill_create_ip = req.connection.remoteAddress;
        let notify_url = wxurl;
        let trade_type = 'JSAPI';
     
        let sign = wxpay.paysignjsapi(appid,body,mch_id,nonce_str,notify_url,out_trade_no,spbill_create_ip,total_fee,trade_type,mchkey);
     
        console.log('sign==',sign);
     
        //组装xml数据
        var formData  = "<xml>";
        formData  += "<appid>"+appid+"</appid>";  //appid
        formData  += "<body><![CDATA["+"测试微信支付"+"]]></body>";
        formData  += "<mch_id>"+mch_id+"</mch_id>";  //商户号
        formData  += "<nonce_str>"+nonce_str+"</nonce_str>"; //随机字符串,不长于32位。
        formData  += "<notify_url>"+notify_url+"</notify_url>";
        formData  += "<out_trade_no>"+out_trade_no+"</out_trade_no>";
        formData  += "<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>";
        formData  += "<total_fee>"+total_fee+"</total_fee>";
        formData  += "<trade_type>"+trade_type+"</trade_type>";
        formData  += "<sign>"+sign+"</sign>";
        formData  += "</xml>";
     
        // console.log('formData===',formData);
    
        var url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
     
        request({url:url,method:'POST',body: formData},function(err,response,body){
            if(!err && response.statusCode == 200){
                // console.log(body);
     
                xmlreader.read(body.toString("utf-8"), function (errors, response) {
                    if (null !== errors) {
                        // console.log(errors)
                        return;
                    }
                    // console.log('长度===', response.xml.prepay_id.text().length);
                    var prepay_id = response.xml.return_code.text();
                    // console.log('解析后的prepay_id==',response.xml.return_code.text());
     
     
                    //将预支付订单和其他信息一起签名后返回给前端
                    let finalsign = wxpay.paysignjsapifinal(appid,mch_id,prepay_id,nonce_str,timestamp,mchkey);
     
                    res.json({'appId':appid,'partnerId':mchid,'prepayId':prepay_id,'nonceStr':nonce_str,'timeStamp':timestamp,'package':'Sign=WXPay','sign':finalsign});
     
                });
     
     
            }
        });
     
    })
     
     
    app.listen(3000,()=>{
        console.log('服务器启动了....');
    });

    然后在 app 调起微信支付页面(详情移步下面链接)

    https://www.cnblogs.com/zyulike/p/10122789.html

  • 相关阅读:
    《最后期限》阅读笔记03
    《最后期限》阅读笔记02
    《最后期限》阅读笔记01
    返回一个二维整数数组中最大联通子数组的和
    软件工程团队开发——第一次冲刺会议总结
    结对项目开发电梯调度
    软件工程课程建议
    第二次冲刺07
    第二次冲刺06
    第二次冲刺05
  • 原文地址:https://www.cnblogs.com/zyulike/p/10170109.html
Copyright © 2011-2022 走看看