npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@mkbkkj/wxpay

v1.1.0

Published

微信支付轻量包,使用 ES2017 async functions 来操作微信支付,接口名称与官方接口对应,轻松上手,文档齐全

Downloads

4

Readme

微信支付

微信支付轻量包,使用 ES2017 async functions 来操作微信支付,接口名称与官方接口对应,轻松上手,文档齐全

安装

npm install @mkbkkj/wxpay

微信支付官网对应API

方法名称 | 描述 | 官网链接 ------------------------|----------------------|-------------------------------- unifiedorder | 统一下单 | 链接 orderquery | 查询订单 | 链接 closeorder | 关闭订单 | 链接 refund | 申请退款 | 链接 refundquery | 查询退款 | 链接 downloadbill | 下载交易账单 | 链接 downloadfundflow | 下载资金账单 | 链接 report | 交易保障 | 链接 batchquerycomment | 拉取订单评价数据 | 链接

内置便捷API

方法名称 | 描述
------------------------|---------------------- signature | 暴露支付签名方法,方便大家使用 getPaymentParams | 获取JSAPI调起支付参数,直接供前端调起支付 koaMiddleware | 静态方法,支付回调koa中间件

测试用例

# 先配置你的/test/resource/wxpay.config.ts文件再测试
# wxpay.config.ts是你微信商户的配置文件
# 1. 配置你的微信支付信息到/test/resource/wxpay.config.default.ts 
# 2. 将 wxpay.config.default.ts  改名为 wxpay.config.ts 
# 如果不使用退款、下载资金账单、拉取订单评价数据功能,可以不填mch_cert、mch_cert_key参数
$ npm test

使用文档

初始化微信支付实例

import WxPay from '@mkbkkj/wxpay';

// 以下文档省略初始化微信支付实例
const wxpay = new WxPay({
    appid: '公众账号ID',
    mch_id: '商户号',
    mch_key: '商户秘钥',
    // 设置API证书,如果不使用退款、下载资金账单、拉取订单评价数据,可以不填
    mch_cert: fs.readFileSync('API证书路径'),
    mch_cert_key: fs.readFileSync('API证书key路径')
});

统一下单

const result = await wxpay.unifiedorder({
    device_info: '013467007045764',
    sign_type: 'MD5',
    body: '微信支付测试',
    detail: '微信支付模块测试',
    // 参数的值为空不参与签名;
    attach: '',
    out_trade_no: Date.now().toString(),
    fee_type: 'CNY',
    total_fee: 1,
    spbill_create_ip: '127.0.0.1',
    time_start: '20210412091010',
    time_expire: '20501227091010',
    goods_tag: 'WXG',
    notify_url: 'http://www.weixin.qq.com/wxpay/pay.php',
    trade_type: 'JSAPI',
    product_id: '12235413214070356458058',
    limit_pay: 'no_credit',
    openid: '<某个用户openid>',
    receipt: 'N',
    profit_sharing: 'N',
    scene_info: '{"store_info" : {"id": "SZTX001","name": "腾大餐厅","area_code": "440305","address": "科技园中一路腾讯大厦" }}'
});

// 返回解析xml后的JSON数据
{
  "return_code": [ "SUCCESS" ],
  "return_msg": [ "OK" ],
  "appid": [ "公众账号" ],
  "mch_id": [ "商户ID" ],
  "device_info": [ "013467007045764" ],
  "nonce_str": [ "sZlBTk5kAKGCqdZ2" ],
  "sign": [ "C467C24B196CDDE58D398885E806C376" ],
  "result_code": [ "SUCCESS" ],
  "prepay_id": [ "wx130101176257317953a5acb7c0254d0000" ],
  "trade_type": [ "JSAPI" ]
}

查询订单

const result = await wxpay.orderquery({
    transaction_id: '微信订单号',
});
// 返回解析xml后的JSON数据
{
  "return_code": [ "SUCCESS" ],
  "return_msg": [ "OK" ],
  "appid": [ "公众账号" ],
  "mch_id": [ "商户号" ],
  "nonce_str": [ "8GpSbHmviv3yPOGu" ],
  "sign": [ "1D6162EA991EF1DB95986E8F753D6EB5" ],
  "result_code": [ "SUCCESS" ],
  "openid": [ "某个用户openid" ],
  "is_subscribe": [ "N" ],
  "trade_type": [ "JSAPI" ],
  "bank_type": [ "OTHERS" ],
  "total_fee": [ "1" ],
  "fee_type": [ "CNY" ],
  "transaction_id": [ "微信订单号" ],
  "out_trade_no": [ "商户订单号" ],
  "attach": [ "" ],
  "time_end": [ "20210411230630" ],
  "trade_state": [ "REFUND" ],
  "cash_fee": [ "1" ],
  "trade_state_desc": [ "订单发生过退款,退款详情请查询退款单" ],
  "cash_fee_type": [ "CNY" ]
}

关闭订单

const result = await wxpay.orderquery({
    out_trade_no: '商户订单号'
});
// 返回解析xml后的JSON数据
{
  "return_code": [ "SUCCESS" ],
  "return_msg": [ "OK" ],
  "appid": [ "公众账号" ],
  "mch_id": [ "商户号" ],
  "sub_mch_id": [ "" ],
  "nonce_str": [ "sIsLToYlgw19Txog" ],
  "sign": [ "019AEAFDFFD234CD9E671D0A73F46C90" ],
  "result_code": [ "FAIL" ],
  "err_code": [ "ORDERPAID" ],
  "err_code_des": [ "order paid" ]
}

查询退款

const result = await wxpay.refundquery({
    transaction_id: '微信订单号',
});

// 返回解析xml后的JSON数据
{
  "appid": [ "公众账号" ],
  "cash_fee": [ "1" ],
  "mch_id": [ "商户号" ],
  "nonce_str": [ "0dFLhH97JkgvDRA1" ],
  "out_refund_no_0": [ "4200000935202104114805145757" ],
  "out_trade_no": [ "商户号订单号" ],
  "refund_account_0": [ "REFUND_SOURCE_RECHARGE_FUNDS" ],
  "refund_channel_0": [ "ORIGINAL" ],
  "refund_count": [ "1" ],
  "refund_fee": [ "1" ],
  "refund_fee_0": [ "1" ],
  "refund_id_0": [ "50301607692021041207900037640" ],
  "refund_recv_accout_0": [ "支付用户的零钱" ],
  "refund_status_0": [ "SUCCESS" ],
  "refund_success_time_0": [ "2021-04-12 16:50:50" ],
  "result_code": [ "SUCCESS" ],
  "return_code": [ "SUCCESS" ],
  "return_msg": [ "OK" ],
  "sign": [ "5F2D3AE192E7B57400E4C3A519FD849F" ],
  "total_fee": [ "1" ],
  "transaction_id": [ "微信订单号" ]
}

下载交易账单

const result = await wxpay.downloadbill({
    bill_date: '20210411',
    bill_type: 'ALL'
});

// 失败时-返回解析xml后的JSON数据
{
  "return_code": [ "FAIL" ],
  "return_msg": [ "missing parameter" ],
  "error_code": [ "20001" ]
}

// 成功时-返回文本表格数据
交易时间,公众账号ID,商户号,特约商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,应结订单金额,代金券金额,微信退款单号,商户退款单号,退款金额,充值券退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率,订单金额,申请退款金额,费率备注
`2021-04-11 22:55:53,`公众账号ID,`商户号,`0,`,`微信订单号,`商户订单号,`用户标识,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`,`,`0.00000,`1.00%,`0.01,`0.00,`

交易保障

const result = await wxpay.report({
    interface_url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
    execute_time_: 1000,
    return_code: 'SUCCESS',
    return_msg: 'OK',
    result_code: 'SUCCESS',
    user_ip: '8.8.8.8'
});

// 返回解析xml后的JSON数据
{
  "return_code": [ "SUCCESS" ],
  "return_msg": [ "" ],
  "result_code": [ "SUCCESS" ],
  "err_code": [ "0" ],
  "err_code_des": [ "" ]
}

申请退款

const result = await wxpay.refund({
    out_trade_no: '商户订单号',
    out_refund_no: '商户退款单号',
    total_fee: 1,
    refund_fee: 1,
});

// 返回解析xml后的JSON数据
{
  "return_code": [ "SUCCESS" ],
  "return_msg": [ "OK" ],
  "appid": [ "公众账号" ],
  "mch_id": [ "商户号" ],
  "nonce_str": [ "yXcPQgpTtAN6GSgJ" ],
  "sign": [ "741F31643926415C6A089A624C46538F" ],
  "result_code": [ "SUCCESS" ],
  "transaction_id": [ "微信订单号" ],
  "out_trade_no": [ "商户订单号" ],
  "out_refund_no": [ "4200000935202104114805145757" ],
  "refund_id": [ "50301607692021041207900037640" ],
  "refund_channel": [ "" ],
  "refund_fee": [ "1" ],
  "coupon_refund_fee": [ "0" ],
  "total_fee": [ "1" ],
  "cash_fee": [ "1" ],
  "coupon_refund_count": [ "0" ],
  "cash_refund_fee": [ "1" ]
}

下载资金账单

const result = await wxpay.downloadfundflow({
    bill_date: '20210411',
    account_type: 'Basic'
});

// 失败时-返回解析xml后的JSON数据
{
  "return_code": [ "FAIL" ],
  "return_msg": [ "Param Error" ]
}

// 返回文本表格数据
记账时间,微信支付业务单号,资金流水单号,业务名称,业务类型,收支类型,收支金额(元),账户结余(元),资金变更提交申请人,备注,业务凭证号
`2021-04-11 21:35:06,`4200000934202104116411967580,`4200000934202104116411967580,`交易,`交易,`收入,`0.01,`0.01,`system,`结算总金额 0.01 元;含手续费 0.00 元,`1618148094082_GT

拉取订单评价数据

const result = await wxpay.batchquerycomment({
    begin_time: '20210411000000',
    end_time: '20210412230000',
    offset: 0,
    limit: 10
});

// 失败时-返回解析xml后的JSON数据
{
  "return_code": [ "FAIL" ],
  "return_msg": [ "商户签名错误" ]
}

// 返回文本表格数据
`33873
`2021-04-12 20:35:37,`4200000935202104114805145757,`5,`哎呦 不错哦
`2021-04-12 20:35:59,`4200000900202104114217622488,`5,`nice

通用请求方法

如果微信支付新出了文档但是此模块未及时更新,可以使用通用请求方法请求

request(url, options, use_cert)

  • url {string} 请求的url
  • options {string} 请求的参数
  • use_cert {boolean} 是否需要证书
// 使用拉取订单评价数据来举例
const options = {
    begin_time: '20210411000000',
    end_time: '20210412230000',
    offset: 0,
    limit: 10
};

// 请求的结果,如果是xml会解析成JSON,否者直接返回
const result = await wxpay.request('https://api.mch.weixin.qq.com/billcommentsp/batchquerycomment', options, true);

支付签名

// 使用拉取订单评价数据来举例
const options = {
    begin_time: '20210411000000',
    end_time: '20210412230000',
    offset: 0,
    limit: 10
};

// 获取签名字符串
const sign = wxpay.signature(options);

获取JSAPI调起支付参数

const { errcode, errmsg, params } = await wxpay.getPaymentParams({
    device_info: '013467007045764',
    sign_type: 'MD5',
    body: '微信支付测试',
    detail: '微信支付模块测试',
    // 参数的值为空不参与签名;
    attach: '',
    out_trade_no: Date.now().toString(),
    fee_type: 'CNY',
    total_fee: 1,
    spbill_create_ip: '127.0.0.1',
    time_start: '20210412091010',
    time_expire: '20501227091010',
    goods_tag: 'WXG',
    notify_url: 'http://www.weixin.qq.com/wxpay/pay.php',
    trade_type: 'JSAPI',
    product_id: '12235413214070356458058',
    limit_pay: 'no_credit',
    openid: '<某个用户openid>',
    receipt: 'N',
    profit_sharing: 'N',
    scene_info: '{"store_info" : {"id": "SZTX001","name": "腾大餐厅","area_code": "440305","address": "科技园中一路腾讯大厦" }}'
});

// errcode: 错误码,成功返回0
// errmsg: 错误消息,成功返回”ok“
// params: JSAPI调起支付参数,成功时返回

支付回调koa中间件

import Koa from 'koa';
import WxPay from '@mkbkkj/wxpay';

const app = new Koa();

app.use(WxPay.koaMiddleware);
app.use(async function (ctx) {
    const {
        // 错误码,0-成功 1-请求的数据不是xml 2-xml参数错误
        errcode,
        // 微信订单号
        transaction_id,
        // 商户订单号
        order_id,
        // xml处理后的json数据
        processed,
        // 原始xml数据
        raw,
    } = ctx.request.body;

    if (errcode !== 0) {
        ctx.status = 400;
        ctx.body = '支付回调错误';
        return;
    }
    // 以下进行业务处理
    ctx.body = '支付成功';
});

app.listen(3000);