【node】实现微信支付 apiv3(wechat-node-v3库)

过程我是定成了一个模块,模块主要分成JSAPI下单和接收通知,2个函数

用到了wechat-node-v3库 ,做微信支付测试的需要有自己的服务器哦而且配备了自己的https证书,没有证书的可以网上免费生成的,腾讯云可以免费生成的,不过前提最重要的是要有自己的服务器!!!,不然接收不到通知去回应微信发的结果的!

//首先是引入库
const WxPay = require('wechatpay-node-v3');
//这个是文件查找的模块,node自带的不用下载
const fs = require('fs');
//获取自己的微信支付下载来的证书,pem格式的
//用fs去读出数据然后填入实例中的私钥和密钥中

// 创建 Wechatpay 实例
const wxpay = new WxPay({
  appid,//小程序的appid
  mchid,//商户号
  privateKey,//私钥
  publicKey,//公钥
  key,//APIv3密钥
});

// 发起支付下单请求(生成prepayId和证书)
const placeOrder = async (openid,Goods) =>{
    try {

    // 构建下单所需要的数据(数据填入自己的,我并没有填入,你们自行填入)
    const description = Goods.text;//商品名字
    const total = Goods.RMB * 100//价格转化为分
    const order = {
      mchid,//商户号
      description,//商品描述
      out_trade_no,//商家自己生成的订单号,就是自己生成一个订单号,最好是数字的
      payer: {
        openid,//微信用户的openid(主要前端获取的)
      },
      amount: {
        total, // 订单总金额,单位为分
        currency,//一般填'CNY',表示人民币,不用更改,不过要填
      },
      notify_url, // 接收支付通知的回调 URL,要公网可以访问的接口
    };

      // 执行下单操作
      const payData = await wxpay.transactions_jsapi(order);
      // 打印下单结果
      console.log('下单结果:', payData);
      return payData

    } catch (error) {
      return error
    }
}

// 接收支付结果通知(记住!这个是微信调用的接口函数,不是你自己调用的,就是填写那个notify_url
// 现在还是函数而已,到时用到真正的接口路由中就好了
const PaymentNotification = async (req, res) => {
  console.log("微信调用啦!")
  //解密通知参数(照搬就好了)
  const decrypted = await wxpay.decipher_gcm(
    req.body.resource.ciphertext, 
    req.body.resource.associated_data, 
    req.body.resource.nonce,
    key//这个是apiv3的密钥,是得去微信支付自己设置的,不是证书里的文件的
  );
//获取请求头方便一些,存成常量
  const headers = req.headers

//获取微信发下来的签名我们需要用自己的apiv3密钥去验证的
  const params = {
    body: req.body, // 请求体 body
    signature: headers['wechatpay-signature'],
    serial: headers['wechatpay-serial'],
    nonce: headers['wechatpay-nonce'],
    timestamp: headers['wechatpay-timestamp'],
  };
  //直接使用库去验证签名(因为wxpay我们前面已经是配置成实例了)
  const ret = await wxpay.verifySign(params);
  //返回验证结果
  console.log('验签结果(bool类型):' + ret)

 //做验证结果处理
  if (ret) {
    // 处理订单逻辑
    console.log("支付成功!!!!")

    //自己数据库的更新订单状态啊什么的.....
    //....
    // 返回成功(一定要返回200)
    res.status(200).send('success');
  } else {
    console.log("支付失败,TWT~~~~")

    // 签名验证失败(一定要返回400)
    res.status(400).send('失败啦!');
  }
}

// 导出模块
module.exports = {
  placeOrder,//下单
  PaymentNotification//接收支付结果通知处理逻辑
}

在接口调用此模块然后传入所需要的值就好了,模块中里面需要修改的参数的话请前往微信支付的开发文档去查看调用他们接口的参数分类配置API字典概览 | 微信支付商户平台文档中心,接口的类型记得要是post哦,我们需要创建的是2个接口哦,一个自己调用,一个微信调用,第一个调用后成功返回参数就可以直接拿取调用小程序的接口了wx.requestPayment(Object object) | 微信开放文档这个是小程序那个支付api接口的介绍,直接将我们这个下单的接口返回的数据给微信小程序支付接口就可以拉起支付了,因为我们签名都在服务器完成了!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值