coa-allin-pay
Version:
通联支付SDK for Node.js
853 lines (852 loc) • 39.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AllinPayOrderService = void 0;
const coa_error_1 = require("coa-error");
const coa_helper_1 = require("coa-helper");
const AllinPayService_1 = require("../libs/AllinPayService");
/**
* 订单接口
* 商户业务系统需将业务订单与支付订单(通商云)以分层的方式处理,即在业务订单需支付时才向通商云请求订单申请
* (1) 可实现业务系统商品订单用户支付失败时,可以再次对商品订单发起支付;
* (2) 可实现业务系统商品订单的自定义有效期;通商云未支付的订单,每天日终(00:30)批量关闭已创建未支付,且创建时间大于 24 小时的订单。
* (3) 可实现业务系统商品订单多次多笔支付。
* (4) 避免渠道端因支付时效控制关闭支付订单后,影响原业务订单的支付。
* (5) 为提升客户订单交易安全性,确保平台业务合理性,对会员订单(含订单状态成功及进行中)频次进行控制
* A-每个个人会员(或企业会员)调用“充值”接口单日限制 10 笔;
* B-每个个人会员(或企业会员)作为付款人调用“消费”接口单日限制 10 笔;
* C-每个个人会员(或企业会员)作为付款人调用“托管代收”接口单日限制 10 笔。
* (6) 订单金额 amount 支持最大金额-9223372036854775807 单位分
* (7) 收银宝 POS 当面付查询模式(支付方式 ORDER_VSPPAY),支持订单申请时上送“summary 摘要”在 POS 机保留字段显示。
*—
*/
class AllinPayOrderService extends AllinPayService_1.AllinPayService {
/**
* 消费申请(微信小程序)
* 1) 消费申请接口请求响应成功后,根据支付方式确认是否调用“支付确认”接口
* 2) 可支持 B2C 商户自营商品的消费收款,收款人为:#yunBizUserId_B2C#
* 3) 收款方需实名才能收款,个人会员需实名认证,企业会员需审核通过;
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param bizOrderNo 商户订单号(支付订单)
* @param amount 订单金额
* @param openId 微信小程序的openId
* @param summary 订单摘要信息
*/
async consumeApplyWxa(bizOrderNo, payerId, openId, amount, summary = '') {
const param = {
payerId,
recieverId: '#yunBizUserId_B2C#',
bizOrderNo,
amount,
fee: 0,
payMethod: {
WECHATPAY_MINIPROGRAM_OPEN: {
wxAppId: this.config.wxMiniPay.appWxaId,
wxMchtId: this.config.wxMiniPay.mchId,
amount,
limitPay: '',
acct: openId,
cusip: '0.0.0.0',
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'trade_pay',
};
const result = await this.bin.service_soa('OrderService', 'consumeApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
return result;
}
/**
* 消费申请(服务商微信小程序)
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param bizOrderNo 商户订单号(支付订单)
* @param amount 订单金额
* @param openId 微信小程序的openId
* @param summary 摘要
*/
async consumeApplyWxaIsv(bizOrderNo, payerId, openId, amount, summary = '') {
const param = {
payerId,
recieverId: '#yunBizUserId_B2C#',
bizOrderNo,
amount,
fee: 0,
payMethod: {
WECHATPAY_MINIPROGRAM_OPEN_SERVICE: {
subAppId: this.config.wxSubMiniPay.appWxaId,
subMchtId: this.config.wxSubMiniPay.mchId,
amount,
limitPay: '',
acct: openId,
cusip: '0.0.0.0',
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'trade_pay',
};
const result = await this.bin.service_soa('OrderService', 'consumeApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
return result;
}
/**
* 消费申请(收银宝H5集团模式)
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param recieverId 收款方商户系统用户标识,商户系统中唯一编号。
* @param bizOrderNo 商户订单号(支付订单)
* @param amount 订单金额
* @param goodsName 商品名称
* @param summary 摘要
* @param extendOption 扩展配置
* @param extendParams 扩展参数
*/
async consumeApplyH5VspOrg(bizOrderNo, payerId, recieverId, amount, goodsName, summary = '', extendOption = {}, extendParams = {}) {
const param = {
payerId,
recieverId,
bizOrderNo,
amount,
fee: 0,
payMethod: {
H5_CASHIER_VSP_ORG: {
vspCusid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.vspCusId) || this.config.wxOrgMiniPay.vspCusId,
limitPay: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.limitPay) || this.config.wxOrgMiniPay.limitPay,
amount,
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'trade_pay',
goodsName: goodsName || '订单' + bizOrderNo,
...extendParams,
};
const result = await this.bin.service_soa('OrderService', 'consumeApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
/**
* 消费申请(通联通集团模式)
* @param bizOrderNo 商户订单号(支付订单)
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param recieverId 收款方商户系统用户标识,商户系统中唯一编号。
* @param openId 微信小程序的openId
* @param amount 订单金额
* @param fee 手续费
* @param goodsName 商品名称
* @param splitRule 分账规则
* @param summary 摘要
* @param extendOption 扩展配置
* @param extendParams 扩展参数
*/
async consumeApplyWxaOrg(bizOrderNo, payerId, recieverId, openId, amount, fee, goodsName, splitRule, summary = '', extendOption = {}, extendParams = {}) {
const param = {
bizOrderNo,
payerId,
recieverId,
amount,
fee,
payMethod: {
WECHATPAY_MINIPROGRAM_ORG: {
vspCusid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.vspCusId) || this.config.wxOrgMiniPay.vspCusId,
subAppid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.subAppWxaId) || this.config.wxOrgMiniPay.subAppWxaId,
limitPay: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.limitPay) || this.config.wxOrgMiniPay.limitPay,
amount,
acct: openId,
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'trade_pay',
goodsName: goodsName || '订单' + bizOrderNo,
...extendParams,
};
splitRule.length &&
coa_helper_1._.assign(param, {
splitRule: coa_helper_1._.map(splitRule, ({ bizUserId, amount, fee }) => {
if (bizUserId === '#yunBizUserId_B2C#') {
return { bizUserId, amount, fee, accountSetNo: '100001' };
}
else {
return { bizUserId, amount, fee };
}
}),
});
const result = await this.bin.service_soa('OrderService', 'consumeApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
async consumeApplyCashierOrg(bizOrderNo, payerId, recieverId, openId, amount, fee, goodsName, splitRule, summary = '', extendOption = {}, extendParams = {}) {
const param = {
bizOrderNo,
payerId,
recieverId,
amount,
fee,
payMethod: {
WECHATPAY_MINIPROGRAM_CASHIER_VSP_ORG: {
vspCusid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.vspCusId) || this.config.wxOrgCashierPay.vspCusId,
limitPay: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.limitPay) || this.config.wxOrgCashierPay.limitPay,
amount,
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'trade_pay',
goodsName: goodsName || '订单' + bizOrderNo,
...extendParams,
};
splitRule.length &&
coa_helper_1._.assign(param, {
splitRule: coa_helper_1._.map(splitRule, ({ bizUserId, amount, fee }) => {
if (bizUserId === '#yunBizUserId_B2C#') {
return { bizUserId, amount, fee, accountSetNo: '100001' };
}
else {
return { bizUserId, amount, fee };
}
}),
});
const result = await this.bin.service_soa('OrderService', 'consumeApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
/**
* 消费申请(H5通联通集团模式)
* @param bizOrderNo 商户订单号(支付订单)
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param recieverId 收款方商户系统用户标识,商户系统中唯一编号。
* @param openId 微信公众号的openId
* @param amount 订单金额
* @param fee 手续费
* @param goodsName 商品名称
* @param splitRule 分账规则
* @param summary 摘要
* @param extendOption 扩展配置
* @param extendParams 扩展参数
*/
async consumeApplyWxbOrg(bizOrderNo, payerId, recieverId, openId, amount, fee, goodsName, splitRule, summary = '', extendOption = {}, extendParams = {}) {
const param = {
bizOrderNo,
payerId,
recieverId,
amount,
fee,
payMethod: {
WECHAT_PUBLIC_ORG: {
vspCusid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.vspCusId) || this.config.wxOrgMiniPay.vspCusId,
subAppid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.subAppWxaId) || this.config.wxOrgMiniPay.subAppWxaId,
limitPay: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.limitPay) || this.config.wxOrgMiniPay.limitPay,
amount,
acct: openId,
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'trade_pay',
goodsName: goodsName || '订单' + bizOrderNo,
...extendParams,
};
splitRule.length &&
coa_helper_1._.assign(param, {
splitRule: coa_helper_1._.map(splitRule, ({ bizUserId, amount, fee }) => {
if (bizUserId === '#yunBizUserId_B2C#') {
return { bizUserId, amount, fee, accountSetNo: '100001' };
}
else {
return { bizUserId, amount, fee };
}
}),
});
const result = await this.bin.service_soa('OrderService', 'consumeApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
/**
* 消费申请(账户内转账)
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param recieverId 收款方商户系统用户标识,商户系统中唯一编号。
* @param bizOrderNo 商户订单号(支付订单)
* @param amount 订单金额
* @param summary 摘要
*/
async consumeApplyInternalTransfer(bizOrderNo, payerId, recieverId, amount, summary = '') {
const param = {
payerId,
recieverId,
bizOrderNo,
amount,
fee: 0,
payMethod: {
BALANCE: [
{
accountSetNo: this.config.accountSetNo,
amount,
},
],
},
validateType: 1,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'transfer_pay',
};
const result = await this.bin.service_soa('OrderService', 'consumeApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
/**
* 重发短信验证码
* @param bizOrderNo 商户订单号(支付订单)
*/
async resendPaySMS(bizOrderNo) {
const param = {
bizOrderNo,
};
const result = await this.bin.service_soa('OrderService', 'resendPaySMS', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('重发验证码异常:' + result.payFailMessage);
return result;
}
/**
* 确认支付(短信验证码确认)
* @param bizOrderNo 商户订单号(支付订单)
* @param bizUserId 商户系统用户标识,商户系统中唯一编号。
* @param verificationCode 短信验证码
*/
async pay(bizOrderNo, bizUserId, verificationCode) {
const param = {
bizOrderNo,
bizUserId,
verificationCode,
consumerIp: this.config.consumerIp,
};
const result = await this.bin.service_soa('OrderService', 'pay', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('确认支付异常:' + result.payFailMessage);
return result;
}
/**
* 托管代收申请(通联通集团模式)
* @param bizOrderNo 商户订单号(支付订单)
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param recieverList 收款列表
* @param openId 微信公众号的openId
* @param amount 订单金额
* @param fee 手续费
* @param goodsName 商品名称
* @param summary 摘要
* @param extendOption 扩展配置
* @param extendParams 扩展参数
*/
async agentCollectApplyWxaOrg(bizOrderNo, payerId, recieverList, openId, amount, fee, goodsName, summary = '', extendOption = {}, extendParams = {}) {
const param = {
bizOrderNo,
payerId,
recieverList,
amount,
fee,
payMethod: {
WECHATPAY_MINIPROGRAM_ORG: {
vspCusid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.vspCusId) || this.config.wxOrgMiniPay.vspCusId,
subAppid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.subAppWxaId) || this.config.wxOrgMiniPay.subAppWxaId,
limitPay: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.limitPay) || this.config.wxOrgMiniPay.limitPay,
amount,
acct: openId,
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'agent_collect',
goodsName: goodsName || '订单' + bizOrderNo,
tradeCode: '3001',
...extendParams,
};
const result = await this.bin.service_soa('OrderService', 'agentCollectApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
async agentCollectApplyCashierOrg(bizOrderNo, payerId, recieverList, openId, amount, fee, goodsName, summary = '', extendOption = {}, extendParams = {}) {
const param = {
bizOrderNo,
payerId,
recieverList,
amount,
fee,
payMethod: {
WECHATPAY_MINIPROGRAM_CASHIER_VSP_ORG: {
vspCusid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.vspCusId) || this.config.wxOrgCashierPay.vspCusId,
limitPay: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.limitPay) || this.config.wxOrgCashierPay.limitPay,
amount,
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'agent_collect',
goodsName: goodsName || '订单' + bizOrderNo,
tradeCode: '3001',
...extendParams,
};
const result = await this.bin.service_soa('OrderService', 'agentCollectApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
/**
* 托管代收申请(H5通联通集团模式)
* @param bizOrderNo 商户订单号(支付订单)
* @param payerId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param recieverList 收款列表
* @param openId 微信公众号的openId
* @param amount 订单金额
* @param fee 手续费
* @param goodsName 商品名称
* @param summary 摘要
* @param extendOption 扩展配置
* @param extendParams 扩展参数
*/
async agentCollectApplyWxbOrg(bizOrderNo, payerId, recieverList, openId, amount, fee, goodsName, summary = '', extendOption = {}, extendParams = {}) {
const param = {
bizOrderNo,
payerId,
recieverList,
amount,
fee,
payMethod: {
WECHAT_PUBLIC_ORG: {
vspCusid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.vspCusId) || this.config.wxOrgMiniPay.vspCusId,
subAppid: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.subAppWxaId) || this.config.wxOrgMiniPay.subAppWxaId,
limitPay: (extendOption === null || extendOption === void 0 ? void 0 : extendOption.limitPay) || this.config.wxOrgMiniPay.limitPay,
amount,
acct: openId,
},
},
validateType: 0,
summary: summary.slice(0, 20),
extendInfo: summary.slice(0, 50),
source: 1,
industryCode: '1910',
industryName: '其他',
backUrl: this.config.notify + 'agent_collect',
goodsName: goodsName || '订单' + bizOrderNo,
tradeCode: '3001',
...extendParams,
};
const result = await this.bin.service_soa('OrderService', 'agentCollectApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('支付消费异常:' + result.payFailMessage);
// 处理payInfo
if (typeof result.payInfo === 'string')
result.payInfo = JSON.parse(result.payInfo);
return result;
}
/**
* 批量托管代付
* @param bizBatchNo 商户批次号
* @param batchPayList 批量代付列表
*/
async batchAgentPay(bizBatchNo, batchPayList) {
const param = {
bizBatchNo,
batchPayList,
tradeCode: '4001',
};
coa_helper_1._.forEach(param.batchPayList, (item) => {
coa_helper_1._.assign(item, {
accountSetNo: this.config.accountSetNo,
backUrl: this.config.notify + 'agent_pay',
});
item.splitRuleList &&
coa_helper_1._.assign(item, {
splitRuleList: coa_helper_1._.map(item.splitRuleList, ({ bizUserId, amount, fee }) => {
if (bizUserId === '#yunBizUserId_B2C#') {
return { bizUserId, amount, fee, accountSetNo: '100001' };
}
else {
return { bizUserId, amount, fee };
}
}),
});
});
const result = await this.bin.service_soa('OrderService', 'batchAgentPay', param);
return result;
}
/**
* 查询订单状态
* @param bizOrderNo 商户订单号(支付订单)
*/
async getOrderDetail(bizOrderNo) {
const param = { bizOrderNo };
const result = await this.bin.service_soa('OrderService', 'getOrderDetail', param);
return result;
}
/**
* 查询付款方资金代付明细
* @param bizOrderNo 商户订单号(托管代收订单号)
*/
async getPaymentInformationDetail(bizOrderNo) {
const param = { bizOrderNo };
const result = await this.bin.service_soa('OrderService', 'getPaymentInformationDetail', param);
return result;
}
/**
* 退款申请
* 1) 支持充值、消费、托管代收(未代付、已代付)、平台转账订单发起退款。
* 2) 支持个人会员、企业会员相关订单的退款,不支持平台发起订单的退款。
* 3) 发起退款时,请确保退款账户(原订单收款账户)中有足够的可用余额;支持全额退款、部分金额退款,但 退款金额不得超过原订单金额。
* 4) 渠道支持退款则退款金额原路返回,可通过字段“refundType 退款方式”指定退款向支付渠道发起时间。
* 5) 不支持通过 SOA 接口发起退款的支付方式:收银宝订单 POS,收银宝当面付;需通过 POS 终端或当面付公众 号内发起退款,系统后台根据终端创建订单后通过“当面付标准模式支付及收银宝 POS 订单支付订单补登” 接口返回商户。查询模式的充值、消费订单支持全额退款和部分退款;托收订单不支持部分退款,仅支持全 额退款;
* 6) 仅支持退款至余额的支付方式:POS 支付-实名付、山东代收。
* 7) 原订单支付方式包含代金券的,将代金券金额原路退回至平台营销账户/平台保证金账户。
* 8) 原订单有分账的也支持退款,但需要原订单收款方承担分账资金。
* 9) 原订单支付收取了手续费的,支持手续费全额退款、部分金额退款、不退款,通过 feeAmount 参数定义。
* 10) 原订单使用组合支付的,先做渠道退款,再做余额退款。
* 11) 退款时 amount 是本次退款总金额,feeAmount 是平台需支付的手续费退款金额 A-平台不退手续费,退款 amount 需小于等于原支付单的 amount 减去 fee 的值;feeAmount 不填 B-平台退手续费,退款 amount 需小于等于原支付单的 amount,退款时 feeAmount 需小于等于原支付单的 fee
* @param bizUserId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param bizOrderNo 商户订单号(支付订单)
* @param oriBizOrderNo 商户原订单号(需要退款的原交易订单号)
* @param amount 订单金额
* @param feeAmount 手续费退款金额
* @param type 退款类型 trade_refund transfer_refund
*/
/**
* 交易退款
* @param bizOrderNo 商户订单号(支付订单)
* @param oriBizOrderNo 商户原订单号(需要退款的原交易订单号)
* @param bizUserId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param refundList 收款人的退款金额
* @param amount 订单金额
* @param feeAmount 手续费退款金额
*/
async trade_refund(bizOrderNo, oriBizOrderNo, bizUserId, refundList, amount, feeAmount) {
const param = {
bizOrderNo,
oriBizOrderNo,
bizUserId,
amount,
feeAmount,
refundType: 'D0',
backUrl: this.config.notify + 'trade_refund',
};
refundList.length &&
coa_helper_1._.assign(param, {
refundList: coa_helper_1._.map(refundList, ({ bizUserId, amount }) => {
return { bizUserId, amount, accountSetNo: this.config.accountSetNo };
}),
});
const result = await this.bin.service_soa('OrderService', 'refund', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('退款申请异常:' + result.payFailMessage);
return result;
}
async trade_splitRefund(bizOrderNo, oriBizOrderNo, bizUserId, orderRefundList, amount, feeAmount) {
const param = {
bizOrderNo,
oriBizOrderNo,
bizUserId,
orderRefundList,
amount,
feeAmount,
refundType: 'D0',
backUrl: this.config.notify + 'trade_refund',
};
coa_helper_1._.forEach(param.orderRefundList, (item) => {
coa_helper_1._.assign(item, {
splitRefundList: coa_helper_1._.map(item.splitRefundList, ({ bizUserId, amount, feeAmount }) => {
if (bizUserId === '#yunBizUserId_B2C#') {
return { bizUserId, amount, feeAmount, accountSetNo: '100001' };
}
else {
return { bizUserId, amount, feeAmount };
}
}),
});
item.totalSplitAmount = coa_helper_1._.sumBy(item.splitRefundList, 'amount');
item.totalSplitfeeAmount = coa_helper_1._.sumBy(item.splitRefundList, 'feeAmount');
});
const result = await this.bin.service_soa('OrderService', 'orderSplitRefund', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('退款申请异常:' + result.payFailMessage);
return result;
}
/**
* 平台转账退款
* @param bizOrderNo 商户订单号(支付订单)
* @param oriBizOrderNo 商户原订单号(需要退款的原交易订单号)
* @param bizUserId 付款方商户系统用户标识,商户 系统中唯一编号。
* @param amount 订单金额
*/
async transfer_refund(bizOrderNo, oriBizOrderNo, bizUserId, amount) {
const param = {
bizOrderNo,
oriBizOrderNo,
bizUserId,
amount,
refundType: 'D0',
backUrl: this.config.notify + 'transfer_refund',
};
const result = await this.bin.service_soa('OrderService', 'refund', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('退款申请异常:' + result.payFailMessage);
return result;
}
/**
* 提现申请
* 1. 创建提现订单需要先绑定手机,个人用户还需完成实名认证,企业用户需通过企业信息审核。
* 2. 个人会员只能提现到绑定的银行卡中,设置了安全卡的,只能提现到安全卡中。
* 3. 企业会员提现交易,默认使用企业对公账户。如需提现到个人银行卡,可通过绑定银行卡相关接口绑定个人银行账户,企业会员最多只允许绑定一张法人个人银行卡。
* 4. 如果平台已设置为“必须使用安全卡提现”,则提现银行卡必须为安全卡。
* 5. 提现订单支付成功的条件为:status = OK 且 payStatus = success。
* 企业用户使用绑定的法人个人银行卡提现流程:
* 1) 企业信息审核成功。
* 2) 通过请求绑定银行卡接口绑定法人个人银行卡。
* 3) 通过确认绑定银行卡接口完成银行预留手机短信校验,绑卡成功。
* 4) 通过提现申请接口发起提现交易。
* 5) 通过支付确认接口确认提现交易(企业用户请使用【后台+短信验证码验证】方式)。
* 个人用户使用绑定的个人银行卡提现流程:
* 1) 通过请求绑定银行卡接口绑定个人银行卡。
* 2) 通过确认绑定银行卡接口完成银行预留手机短信校验,绑卡成功。
* 3) 通过提现申请接口发起提现交易。
* 4) 通过支付确认接口确认提现交易。
* @param bizOrderNo 商户订单号(支付订单)
* @param bizUserId 商户系统用户标识,商户系统中唯一编号
* @param subAcctNo 子账户号
* @param bankCardNo 银行卡号
* @param name 姓名
* @param amount 订单金额
* @param fee 手续费
* @param summary 摘要
*/
async withdrawApplyHT(bizOrderNo, bizUserId, subAcctNo, bankCardNo, name, amount, fee, summary = '') {
const accountSetNo = this.config.accountSetNo;
const withdrawType = 'D0';
const param = {
bizOrderNo,
bizUserId,
accountSetNo,
amount,
fee,
validateType: 0,
bankCardNo,
withdrawType,
payMethod: {
WITHDRAW_HTBANK: {
subAcctNo,
PAYEE_ACCT_NO: bankCardNo,
PAYEE_ACCT_NAME: name,
AMOUNT: amount,
SUMMARY: '',
SIGNED_MSG_MER: this.bin.bank_signer(bankCardNo, name, amount.toString()),
},
},
source: 1,
industryCode: '1910',
industryName: '其他',
summary,
backUrl: this.config.notify + 'withdraw',
};
this.bin.param_encrypt(param, ['bankCardNo']);
const result = await this.bin.service_soa('OrderService', 'withdrawApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('提现申请异常:' + result.payFailMessage);
coa_helper_1._.assign(result, { accountSetNo, withdrawType });
return result;
}
// 申请提现(TLT存管模式)
async withdrawApplyTLT(bizOrderNo, bizUserId, bankCardNo, bankCardPro, amount, fee, summary = '') {
const accountSetNo = this.config.accountSetNo;
const withdrawType = 'D0';
const param = {
bizOrderNo,
bizUserId,
accountSetNo,
amount,
fee,
validateType: 0,
bankCardNo,
bankCardPro,
withdrawType,
payMethod: {
WITHDRAW_TLT: {
payTypeName: 'withdraw_tlt',
},
},
source: 1,
industryCode: '1910',
industryName: '其他',
summary,
backUrl: this.config.notify + 'withdraw',
};
this.bin.param_encrypt(param, ['bankCardNo']);
const result = await this.bin.service_soa('OrderService', 'withdrawApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('提现申请异常:' + result.payFailMessage);
coa_helper_1._.assign(result, { accountSetNo, withdrawType });
return result;
}
// 申请平台提现(TLT存管模式)
async withdrawApplyTLTPlatform(bizOrderNo, bizUserId, bankCardNo, bankCardPro, amount, fee, summary = '') {
const accountSetNo = this.config.platformAccountSetNo;
const withdrawType = 'D0';
const param = {
bizOrderNo,
bizUserId,
accountSetNo,
amount,
fee,
validateType: 0,
bankCardNo,
bankCardPro,
withdrawType,
payMethod: {
WITHDRAW_TLT: {
payTypeName: 'withdraw_tlt',
},
},
source: 1,
industryCode: '1910',
industryName: '其他',
summary,
backUrl: this.config.notify + 'withdraw',
};
this.bin.param_encrypt(param, ['bankCardNo']);
const result = await this.bin.service_soa('OrderService', 'withdrawApply', param);
// 如果支付状态为失败
if (result.payStatus === 'fail')
coa_error_1.die.hint('提现申请异常:' + result.payFailMessage);
coa_helper_1._.assign(result, { accountSetNo, withdrawType });
return result;
}
/**
* 平台转账
* 该接口一般用于平台向用户发红包、各类代金券、体验金、购物返利等营销活动。
* 1. 目前只支持从平台标准余额账户集、保证金账户、营销专用账户、预付卡账户集和自定义 A 帐户转账到用户托管账户余额。
* 2. 源帐户集:标准余额账户集、平台保证金账户、营销专用账户、预付卡账户集和自定义 A 帐户所属的账户集。
* 3. 目标账户集:通商云分配给业务端的托管专用账户集。
* 4. 平台转账无需支付确认,无异步通知。
* @param bizTransferNo 商户系统转账订单号,商户系统唯一
* @param targetBizUserId 目标商户系统用户标识,商户系统中唯一编号。
* @param amount 金额
*/
async applicationTransfer(bizTransferNo, targetBizUserId, amount) {
const param = {
bizTransferNo,
sourceAccountSetNo: '100001',
targetBizUserId,
targetAccountSetNo: this.config.accountSetNo,
amount,
};
const result = await this.bin.service_soa('OrderService', 'applicationTransfer', param);
coa_helper_1._.defaults(result, param);
return result;
}
/**
* 查询用户账户余额
* @param bizUserId
*/
async queryBalance(bizUserId) {
const param = { bizUserId, accountSetNo: this.config.accountSetNo };
const result = await this.bin.service_soa('OrderService', 'queryBalance', param);
return result;
}
/**
* 查询用户账户收支明细
* 返回明细以时间倒序排列
* @param bizUserId 商户系统用户标识,商户系统中唯一编号。
* @param dateStart 开始日期
* @param dateEnd 结束日期 最多允许查1个月内,跨度建议不超过7天
* @param startPosition 起始位置,取值>0 eg:查询第 11 条到 20 条的 记录(start =11)
* @param queryNum 查询条数,eg:查询第 11 条到 20 条的 记录(queryNum =10), 查询条数最多 5000
*/
async queryInExpDetail(bizUserId, dateStart, dateEnd, startPosition = 1, queryNum = 5000) {
const param = {
bizUserId,
startPosition,
queryNum,
dateStart,
dateEnd,
};
const result = await this.bin.service_soa('OrderService', 'queryInExpDetail', param);
return result;
}
}
exports.AllinPayOrderService = AllinPayOrderService;