您好,小程序模板欢迎您。
小程序模板
当前位置 : 首页> 小程序教程> 小程序微信支付发起订单node.js版

小程序微信支付发起订单node.js版

自己闲来无事想试试node.js如何写后端开发,就测试了一下这个微信支付功能,首先,我们想要实现微信支付要有appid,mchid商户号,这些提前需要准备的必要参数我就不多说了,看文档就可APP下单 - App支付 | 微信支付商户文档中心 (qq.com)

下面直接上代码

//我们前端通过调用buy这个接口,告诉后端去发起下单请求

router.post("/buy", (req, res) => {

    let total = 1 

    let out_trade_no = buildShortUUID()  //生成随机字符串方法

   //这是我们需要必传的参数,使用自己的就可

    let requestbody = {

        "appid": appid,

        "mchid": mchid,

        "out_trade_no": out_trade_no,

        "description": "商品",

        "amount": {

            "total": total,

        },

        "notify_url": "http://10.70.23.35/static/index.html",

        "payer": {

            "openid": req.body.openid

        }

    }

    let nonce_str = buildShortUUID() //生成第二个随机字符串

    let data = Math.round(new Date().getTime() / 1000)  //!!!重点 获取时间戳  js获取时间戳是以毫秒为单位所以这里要特别注意!!!这里的时间戳使用变量记录下来,因为后面还会用

    const jsrsasign = require("jsrsasign"); // npm 下载 jsrsasign 加密插件

    let rsa = new jsrsasign.RSAKey()

  // 私钥 !!!注意 这里的私钥是你微信商户平台中 证书里的私钥,每个人是不一样的  

如何获取 可查看文档 如何下载微信支付证书(API证书)_微信支付证书一般放在哪个文件夹-CSDN博客

下载完后我们可直接查看apiclient_key.pem文件,这里就是我们自己的私钥!!!

    let priK = "-----BEGIN PRIVATE KEY-----\n" +

        "xxxxxxxxxxxxxxxxxx\n" +

      "xxxxxxxxxxxxxxxxxxx\n" +

        "-----END PRIVATE KEY-----";

    // 将私钥 转成16进制

    rsa = jsrsasign.KEYUTIL.getKey(priK);

    // 采用SHA256withRSA进行加密

    const sig = new jsrsasign.KJUR.crypto.Signature({

        alg: "SHA256withRSA"

    })

    // 算法初始化

    sig.init(rsa)

str为微信规定的签名方式注意,微信文档中只是个例子,你想用下单接口就需要根据我下面的写,

请求方式为 post,

请求地址为v3/pay/transactions/jsapi

请求时间戳 是上面记录的时间戳data

随机字符串是上面记录的nonce_str

最后将 参数body使用JSON.stringify()方法传入

    let str = `POST\n/v3/pay/transactions/jsapi\n${data}\n${nonce_str}\n${JSON.stringify(requestbody)}\n`

    // 对str进行加密

    sig.updateString(str)

    // 加密后的16进制转成base64,这就是签名了

    const sign = jsrsasign.hextob64(sig.sign())

//到了这步才是发起下单请求,之前全是准备工作

    request({

        url: "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi",

        method: "POST",

        json: true,

        headers: {

            "Accept": "application/json",

            "User-Agent": "Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/63.0.3239.132 Safari/537.36",

            "Authorization": `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",serial_no="${serial_no}",nonce_str="${nonce_str}",timestamp="${data}",signature="${sign}"`,

            "Content-Type": "application/json",

        },

        body: requestbody

    }, function (error, response, body) {

//成功打印body中的prepay_id就代表下单成功了,可以进行下一步的发起支付了 就没有难点了

        console.log(body)

    });

})

下面是完整代码:

 let total = 1
    let out_trade_no = buildShortUUID()
    let requestbody = {
        "appid": appid,
        "mchid": mchid,
        "out_trade_no": out_trade_no,
        "description": "商品",
        "amount": {
            "total": total,
        },
        "notify_url": "http://10.70.23.35/static/index.html",
        "payer": {
            "openid": req.body.openid
        }
    }

    let nonce_str = buildShortUUID()
    let data = Math.round(new Date().getTime() / 1000)

    const jsrsasign = require("jsrsasign");
    // 私钥

    let rsa = new jsrsasign.RSAKey()
    let priK = "-----BEGIN PRIVATE KEY-----\n" +
       
        "56xdvb7rN2fR/49CUSZ1f/I=\n" +
        "-----END PRIVATE KEY-----";

    // 将私钥 转成16进制
    rsa = jsrsasign.KEYUTIL.getKey(priK);
    // 采用SHA256withRSA进行加密
    const sig = new jsrsasign.KJUR.crypto.Signature({
        alg: "SHA256withRSA"
    })
    // 算法初始化
    sig.init(rsa)
    let str = `POST\n/v3/pay/transactions/jsapi\n${data}\n${nonce_str}\n${JSON.stringify(requestbody)}\n`
    // 对123456进行加密
    sig.updateString(str)
    // 加密后的16进制转成base64,这就是签名了
    const sign = jsrsasign.hextob64(sig.sign())

    request({
        url: "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi",
        method: "POST",
        json: true,
        headers: {
            "Accept": "application/json",
            "User-Agent": "Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/63.0.3239.132 Safari/537.36",
            "Authorization": `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",serial_no="${serial_no}",nonce_str="${nonce_str}",timestamp="${data}",signature="${sign}"`,
            "Content-Type": "application/json",
        },
        body: requestbody
    }, function (error, response, body) {
        console.log(body)
    });

联系客服 意见反馈

签到成功!

已连续签到1天,签到3天将获得积分VIP1天

知道了