微信支付apiv3 for nodejs

先贴出github链接 完整代码点此进入 https://github.com/yangfuhe/node-wxpay

功能概述

  • 完成模块 jsapi,native,h5,app统一下单,付款交易查询,退款,退款交易查询,解密通知参数,公钥获取,验证签名,交易账单,资金账单,下载账单

  • 支付模式支持 付款码/公众号/小程序/APP/H5/扫码支付

使用前必读

版本要求

nodejs >= 8.3.0

安装


npm i wxpay-v3 --save

# 如已安装旧版, 重新安装最新版

npm i wxpay-v3@latest

实例化


const Payment = require('wxpay-v3');

const paymnet = new Payment({

    appid: '公众号ID',

    mchid: '微信商户号',

    private_key: require('fs').readFileSync('*_key.pem证书文件路径').toString(),//或者直接复制证书文件内容

    serial_no:'证书序列号',

    apiv3_private_key:'api v3密钥',

    notify_url: '支付退款结果通知的回调地址',

})

config说明:

  • appid - 公众号ID(必填)

  • mchid - 微信商户号(必填)

  • private_key - 商户API证书*_key.pem中内容 可在微信支付平台获取(必填, 在微信商户管理界面获取)

  • serial_no - 证书序列号(必填, 证书序列号,可在微信支付平台获取 也可以通过此命令获取(*_cert.pem为你的证书文件) openssl x509 -in *_cert.pem -noout -serial )

  • apiv3_private_key - apiv3密钥 在创建实例时通过apiv3密钥会自动获取平台证书的公钥,以便于验证签名(必填)

  • notify_url - 支付退款结果通知的回调地址(选填)

    • 可以在初始化的时候传入设为默认值, 不传则需在调用相关API时传入

    • 调用相关API时传入新值则使用新值

jsapi统一下单


let result = await payment.jsapi({

    description:'点存云-测试支付',

    out_trade_no:Date.now().toString(),

    amount:{

        total:1

    },

    payer:{

        openid:'ouEJk65CZr8_7eb95RIPDNWZKrvI'

    },

})

console.log(result)

app统一下单


let result = await payment.app({

    description:'点存云-测试支付',

    out_trade_no:Date.now().toString(),

    amount:{

        total:1

    }

})

console.log(result)

h5统一下单


let result = await payment.h5({

    description:'点存云-测试支付',

    out_trade_no:Date.now().toString(),

    amount:{

        total:1

    },

    scene_info:{

        payer_client_ip:'203.205.219.187'

    }

})

console.log(result)

native统一下单


let result = await payment.native({

    description:'点存云-测试支付',

    out_trade_no:Date.now().toString(),

    amount:{

        total:1

    }

})

console.log(result)

通过transaction_id查询订单


let result = await payment.getTransactionsById({

    transaction_id:'4200000928202103013162567337'

})

console.log(result)

通过out_trade_no查询订单


let result = await payment.getTransactionsByOutTradeNo({

    out_trade_no:'1614602083807'

})

console.log(result)

关闭订单


let result = await payment.close({

    out_trade_no:'1614602083807'

})

console.log(result)

退款


let result = await payment.refund({

    transaction_id:'4200000902202103026804947229',

    //out_trade_no:'1614602083807',

    out_refund_no:Date.now().toString(),

    amount:{

        refund:1,

        total:1,

        currency:'CNY'

    }

})

console.log(result)

查询单笔退款订单


let result = await payment.getRefund({

    out_refund_no:'1614757507992',

})

console.log(result)

获取平台证书列表


let result = await payment.getCertificates()

console.log(result)

解密支付退款通知参数


let result = await payment.decodeParams({

    "original_type":"refund",

    "algorithm":"AEAD_AES_256_GCM",

    "ciphertext":"d2Zi2VToOGXqB3K6bgQaFKktgA3AHm+cJg0vGZPcD22OUZ+CBymtrFJsFtaKKEwebSDN8Habic7NJVpKJpAxZd8ejm32v4UePg139/gj+X7vJtqB39ZkjZXLH973LT5R5yZQ351R3onlpx9JILN2+FNEbrUNenjgEufuQn45b9jwGSBX/sU6n/+gsCdt8+sSkbMy37sSX1bjMicHzte27fR0QSuO1TDjZjjDqP2ou0j7Jb+x9RRtWlbZ1hOYe7AhSTFzOXvkdCq0M6P6ja1cc2olV9xG8UzKxZN0JLnoqIGWwPzTVOPqmt/N3/MrzCK3TT1mNagBnhqEvSXhL9KUjpAIY8J6tkjfoG+9QwnJA8kW48C3nGsgePvNYvikJooQii7rx78Y2paR7cS8Pn8+sxKg4q91DiovBSdW2/ePDruI6SH/FWFrPmLQCG11fCjz/C9o6bqjaSsHKMaSVSAW9e/et04MP6GcZIDweG5AN9FgOXMI",

    "associated_data":"refund",

    "nonce":"AqfRSFm7h9Sa"

})

console.log(result)

验证签名


setTimeout(async ()=>{

    //timestamp,nonce,serial,signature均在HTTP头中获取,body为请求参数

    let result = await payment.verifySign({

        timestamp:'1614829763',

        nonce:'Eeumuhd3zA5TirWeJUCLCpkENYM8PSUA',

        serial:'3DEA336346E96C002B7B0D514D424C8DEDBF9145',

        signature:'ame3lX1y6FeXrlBN973M1Dhg5n77M1wVsD3VgeyZlb8c3dz/hpQ+9vNOMBBHGdv8kDIfZUxKDdfoeUaVJhfqAEn9ZV4x112ntEzCHpJtIXQ3rr8fScY7cO71EN/QyQHtY1Ovt8U2Yr891iYaLujUrBHtWrhiR6UKecRA+/RgsUBYh4D10rrqW5ywNrLVN+PSuG4QB85bz3jSslMvRrSG7HP/Xwo3e2sWMDuQ2Uadefu+8/FK1P3KDLDO2fq5teSaaqs7oof2WpV6zrVtyQ+P4p5t8NJ0ExlOSAs2xGJ0+xi+U996tq3VYZXf/4nVsfGW9rn0m/mOrYTmiST9PF+q1g==',

        body:'{"id":"3b66121d-c9b9-5d61-9d92-eeec248e993d","create_time":"2021-03-04T11:49:23+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"PB305U6jR6TN8mBzbzGts5TaKnDXQt/7C+uJpGnvOT1SyCvI18L4f42eTZtrZv+5XUdOkxwEHGWDVl2MwbvpgLjLdjyisaHc+uRQCDoYlusiaeDJzd515Rl36nqmdPD8xFKZahWZBBkAlCgXLuW3qcdxSISTk/pyqPziwUtFKfMeq3LEEm4z8DfBM9cVXJrN8EiY2WaQsm+lGnZAV4+pxCELj67xmccXs3JgJwHSKE4exqW919atQWTwJHzuP3WNd+Xvp0zwm9RtDPTvZ8egehqqBw+DARC5jg8MmDtlMR2sTgH2xq6b4+QqLXPPIooOyvEZKMOteSI4FmSfPNwDfZ26D4ga9yGRIxSQKkWDq3QRNhOzvmSkCax08t2hdq12NxBSE9y7aZkjKIr4/uMEtKDU/3wcSoVKlawfN1hlCKo2nWbdKH1avRvc6FAFxXHtXRw0Y0MRnSk8gPMF/T+QqEMRJniXbrylt21xR0AEKbIVk0xK9jvhXex0AvST4x3eKM0r4DXkmL/pCjo1XmZLZIMc2uJ1jJEyqWcURXirrxADCATIAEWOu1hNL6PE","associated_data":"transaction","nonce":"KcsMoPx5UW1i"}}'

    })

    console.log(result)

},2000)

申请交易账单


let result = await payment.tradebill({

    bill_date:'2021-03-03'

})

console.log(result)

申请资金账单


let result = await payment.fundflowbill({

    bill_date:'2021-03-03'

})

console.log(result)

下载账单


let result = await payment.downloadbill('https://api.mch.weixin.qq.com/v3/billdownload/file?token=ktWgOuBvGNvmCk0NaOTMF41tG3yWsZrdM4zdgl10r1GRRNo4tG5V9mPi04ku-PY8&tartype=gzip')

console.log(result)

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

推荐阅读更多精彩内容