node tenpay
1.0.0
通知类中间件
- 결제 결과 알림, 환불 결과 알림前端支付支持
- JSAPI, WeixinJSBridge, 미니 프로그램, APP, H5 지원支付模式支持
- 결제코드/공식계정/미니프로그램/APP/H5/스캔코드결제支付工具支持
- 위챗 빨간봉투, 기업결제(잔돈결제, 은행카드 결제 지원)营销功能支持
- 위챗 바우처对帐账单支持
- WeChat 명세서 및 WeChat 자금 청구서를 지원합니다.服务商模式支持
- 모든 API는 sub_appid, sub_mch_id에서 전달될 수 있습니다.微信支付仿真测试系统
- 결제 승인 프로세스를 완료하는 데 사용되는 샌드박스 모드를 지원합니다. QQ 그룹: 157964097. 사용법 질문, 개발, 코드 기여를 위해 그룹에 가입하세요.
nodejs >= 8.3.0
관련된 금액과 같은 민감한 문제로 인해 API 및 미들웨어는 데이터 필드에 대한 유형 변환을 수행하지 않았습니다.
微信返回值XML做JSON转换之后的字段均为字符串类型, 请自行转换后再进行数据运算
'1' + 0 = '10'
微信支付中传入的金额单位为分
API와 미들웨어 모두 다음을 포함하여 모든 오류를 처리하고 오류를 통해 균일하게 반환합니다.
网络类错误
- 네트워크 중단, 연결 시간 초과 등微信返回值检验错误
- WeChat 반환값이 불법입니다. (위조된 요청 등 가능성이 매우 낮습니다.)业务逻辑错误
- 중복 주문, 환불 금액이 결제 금액보다 큼 등其它错误
- 전달할 매개변수가 전달되지 않았습니다. 일반적으로 오류가 발생하지 않으면 JSON 형식으로 데이터를 반환합니다.
downloadBill
및 downloadFundflow
가 다운로드한 청구서의 반환 값은 문자열 리터럴입니다. npm i tenpay
# 如已安装旧版, 重新安装最新版
npm i tenpay@latest
const tenpay = require ( 'tenpay' ) ;
const config = {
appid : '公众号ID' ,
mchid : '微信商户号' ,
partnerKey : '微信支付安全密钥' ,
pfx : require ( 'fs' ) . readFileSync ( '证书文件路径' ) ,
notify_url : '支付回调网址' ,
spbill_create_ip : 'IP地址'
} ;
// 方式一
const api = new tenpay ( config ) ;
// 方式二
const api = tenpay . init ( config ) ;
// 调试模式(传入第二个参数为true, 可在控制台输出数据)
const api = new tenpay ( config , true ) ;
// 沙盒模式(用于微信支付验收)
const sandboxAPI = await tenpay . sandbox ( config ) ;
appid
- 공식 계정 아이디 (필수)mchid
- WeChat 판매자 번호(필수)partnerKey
- WeChat 결제 보안 키(필수, WeChat 판매자 관리 인터페이스에서 획득)pfx
- 인증서 파일(선택 사항, WeChat 판매자 관리 인터페이스에서 얻음)notify_url
- 결제 결과 알림 콜백 주소(선택 사항)refund_url
- 환불 결과 알림 콜백 주소(선택사항)spbill_create_ip
- IP 주소(선택 사항)127.0.0.1
pay<支付结果通知, 默认>
refund<退款结果通知>
nativePay<扫码支付模式一回调>
app . use ( bodyParser . text ( { type : '*/xml' } ) ) ;
// 支付结果通知/退款结果通知
router . post ( '/xxx' , api . middlewareForExpress ( 'pay' ) , ( req , res ) => {
let info = req . weixin ;
// 业务逻辑...
// 回复消息(参数为空回复成功, 传值则为错误消息)
res . reply ( '错误消息' || '' ) ;
} ) ;
// 扫码支付模式一回调
router . post ( '/xxx' , api . middlewareForExpress ( 'nativePay' ) , ( req , res ) => {
let info = req . weixin ;
// 业务逻辑和统一下单获取prepay_id...
// 响应成功或失败(第二个可选参数为输出错误信息)
res . replyNative ( prepay_id , err_msg ) ;
} ) ;
app . use ( bodyParser ( {
enableTypes : [ 'json' , 'form' , 'text' ] ,
extendTypes : {
text : [ 'text/xml' , 'application/xml' ]
}
} ) ) ;
router . post ( '/xxx' , api . middleware ( 'refund' ) , async ctx => {
let info = ctx . request . weixin ;
// 业务逻辑...
// 回复消息(参数为空回复成功, 传值则为错误消息)
ctx . reply ( '错误消息' || '' ) ;
// 扫码支付模式一模式
ctx . replyNative ( prepay_id ) ;
} ) ;
appid
mchid
는 호출 시 다시 전달할 필요가 없습니다. let result = await api . getPayParams ( {
out_trade_no : '商户内部订单号' ,
body : '商品简单描述' ,
total_fee : '订单金额(分)' ,
openid : '付款用户的openid'
} ) ;
trade_type
- JSAPI // 该方法需先调用api.unifiedOrder统一下单, 获取prepay_id;
let result = await api . getPayParamsByPrepay ( {
prepay_id : '预支付会话标识'
} ) ;
let result = await api . getAppParams ( {
out_trade_no : '商户内部订单号' ,
body : '商品简单描述' ,
total_fee : '订单金额(分)'
} ) ;
trade_type
-APP // 该方法需先调用api.unifiedOrder统一下单<注意传入trade_type: 'APP'>, 获取prepay_id;
let result = await api . getAppParamsByPrepay ( {
prepay_id : '预支付会话标识'
} ) ;
let result = await api . getNativeUrl ( {
product_id : '商品ID'
} ) ;
// 使用统一下单API可直接获取code_url, 需自行生成二维码图片
let { prepay_id , code_url } = await api . unifiedOrder ( {
out_trade_no : '商户内部订单号' ,
body : '商品简单描述' ,
total_fee : '订单金额(分)' ,
openid : '用户openid' ,
trade_type : 'NATIVE' ,
product_id : '商品id'
} ) ;
let result = await api . micropay ( {
out_trade_no : '商户内部订单号' ,
body : '商品简单描述' ,
total_fee : '订单金额(分)' ,
auth_code : '授权码'
} ) ;
let result = await api . unifiedOrder ( {
out_trade_no : '商户内部订单号' ,
body : '商品简单描述' ,
total_fee : '订单金额(分)' ,
openid : '用户openid'
} ) ;
trade_type
- JSAPInotify_url
- 기본값은 초기화 중에 전달된 값이거나 비어 있습니다.spbill_create_ip
- 기본값은 초기화 중에 전달된 값 또는 127.0.0.1
입니다. let result = await api . orderQuery ( {
// transaction_id, out_trade_no 二选一
// transaction_id: '微信的订单号',
out_trade_no : '商户内部订单号'
} ) ;
let result = await api . reverse ( {
// transaction_id, out_trade_no 二选一
// transaction_id: '微信的订单号',
out_trade_no : '商户内部订单号'
} ) ;
let result = await api . closeOrder ( {
out_trade_no : '商户内部订单号'
} ) ;
let result = await api . refund ( {
// transaction_id, out_trade_no 二选一
// transaction_id: '微信的订单号',
out_trade_no : '商户内部订单号' ,
out_refund_no : '商户内部退款单号' ,
total_fee : '订单金额(分)' ,
refund_fee : '退款金额(分)'
} ) ;
op_user_id
- 기본값은 판매자 번호입니다(이 필드는 미니 프로그램 결제 문서에 나타납니다).notify_url
- 기본값은 초기화 중에 전달된 환불 URL입니다. 이 매개변수가 없으면 판매자의 백엔드에 구성된 환불 알림 주소가 사용됩니다. let result = await api . refundQuery ( {
// 以下参数 四选一
// transaction_id: '微信的订单号',
// out_trade_no: '商户内部订单号',
// out_refund_no: '商户内部退款单号',
refund_id : '微信退款单号'
} ) ;
/**
* 新增一个format参数(默认: false), 用于自动转化帐单为json格式
* json.total_title: 统计数据的标题数组 - ["总交易单数","总交易额","总退款金额", ...],
* json.total_data: 统计数据的数组 - ["3", "88.00", "0.00", ...],
* json.list_title: 详细数据的标题数组 - ["交易时间","公众账号ID","商户号", ...],
* json.list_data: 详细数据的二维数据 - [["2017-12-26 19:20:39","wx12345", "12345", ...], ...]
*/
let result = await api . downloadBill ( {
bill_date : '账单日期'
} , true ) ;
bill_type
-ALLformat
-false /**
* 新增一个format参数(默认: false), 用于自动转化帐单为json格式
* json.total_title: 统计数据的标题数组 - ["资金流水总笔数","收入笔数","收入金额", ...],
* json.total_data: 统计数据的数组 - ["20.0", "17.0", "0.35", ...],
* json.list_title: 详细数据的标题数组 - ["记账时间","微信支付业务单号","资金流水单号", ...],
* json.list_data: 详细数据的二维数据 - [["2018-02-01 04:21:23","12345", "12345", ...], ...]
*/
let result = await api . downloadFundflow ( {
bill_date : '账单日期'
} , true ) ;
account_type
-기본format
-false let result = await api . sendCoupon ( {
coupon_stock_id : '代金券批次id' ,
partner_trade_no : '商户单据号' ,
openid : '用户openid'
} ) ;
let result = await api . queryCouponStock ( {
coupon_stock_id : '代金券批次id'
} ) ;
let result = await api . queryCouponInfo ( {
coupon_id : '代金券id' ,
openid : '用户openid' ,
stock_id : '批次号'
} ) ;
let result = await api . transfers ( {
partner_trade_no : '商户内部付款订单号' ,
openid : '用户openid' ,
re_user_name : '用户真实姓名' ,
amount : '付款金额(分)' ,
desc : '企业付款描述信息'
} ) ;
check_name
- FORCE_CHECKspbill_create_ip
- 기본값은 초기화 중에 전달된 값 또는 127.0.0.1
입니다. let result = await api . transfersQuery ( {
partner_trade_no : '商户内部付款订单号'
} ) ;
let result = await api . payBank ( {
partner_trade_no : '商户内部付款订单号' ,
bank_code : '收款方开户行' ,
enc_bank_no : '收款方银行卡号' ,
enc_true_name : '收款方用户名' ,
amount : '付款金额(分)' ,
desc : '企业付款到银行卡描述信息'
} ) ;
let result = await api . queryBank ( {
partner_trade_no : '商户内部付款订单号'
} ) ;
let result = await api . sendRedpack ( {
// mch_billno, mch_autono 二选一
// mch_billno: '商户内部付款订单号',
mch_autono : '10位当日唯一数字, 用于自动生成mch_billno' ,
send_name : '商户名称' ,
re_openid : '用户openid' ,
total_amount : '红包金额(分)' ,
wishing : '红包祝福语' ,
act_name : '活动名称' ,
remark : '备注信息'
} ) ;
mch_billno
- 판매자 내부 주문 번호(전달된 경우 mch_autono가 유효하지 않음)mch_autono
- 판매자의 내부 주문 번호 로직을 자동으로 처리하는 데 사용되는 10자리 당일 고유 번호입니다.total_num
- 1client_ip
- 기본값은 초기화 중 spbill_create_ip 매개변수 값 또는 127.0.0.1
입니다.scene_id
- 비어 있음, 빨간 봉투 금액이 2元
보다 큰 경우 전송해야 함(WeChat 문서에는 200위안이라고 명시되어 있으며 실제 단위는 2위안임) let result = await api . sendGroupRedpack ( {
// mch_billno, mch_autono 二选一
// mch_billno: '商户内部付款订单号',
mch_autono : '10位当日唯一数字, 用于自动生成mch_billno' ,
send_name : '商户名称' ,
re_openid : '种子用户openid' ,
total_amount : '红包金额(分)' ,
wishing : '红包祝福语' ,
act_name : '活动名称' ,
remark : '备注信息'
} ) ;
mch_billno
- 판매자 내부 주문 번호(전달된 경우 mch_autono가 유효하지 않음)mch_autono
- 판매자의 내부 주문 번호 로직을 자동으로 처리하는 데 사용되는 10자리 당일 고유 번호입니다.total_num
- 3, 빨간색 봉투를 분할하는 데 필요한 값은 3에서 20 사이입니다.amt_type
-ALL_RANDscene_id
- 비어 있음, 빨간 봉투 금액이 2元
보다 큰 경우 전달되어야 함(문서에 지정되지 않음) api . redpackQuery ( {
mch_billno : '商户内部付款订单号'
} ) ;
bill_type
-MCHT