rapid-ztx
Version:
Rapid ZTX module
153 lines (135 loc) • 4.92 kB
JavaScript
/**
* Copyright (c) 2017 Lucky Byte, Inc.
*/
const debug = require('debug')('ztx');
const uuid = require('uuid');
const rapid_db = require('rapid-db');
const auth = require('../lib/auth');
const utils = require('../lib/utils');
/**
* 变更借记卡信息
*
* 参数:
* info: 绑卡参数,包含下面的数据:
* * sumer: 用户 uuid
* * card_no: 卡号,可选
* * bank_name: 开户行名称,可选
* * bank_city: 开户行城市,可选
*
* 返回:
* 失败抛出异常,成功返回变更后借记卡信息
*/
const alter = async (info) => {
const keys = [
'sumer'
];
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (!info[key]) {
throw new Error(`变更借记卡信息错:参数缺少[${key}]`);
}
}
// 如果提供了开户城市,则验证开户城市是否有效
if (info.bank_city) {
const result = await unique_db.one(`
select count(*) as count from rapid_cities where city_name = $1
`, [
info.bank_city.replace(/市$/, '')
]);
if (result.count == 0) {
throw new Error('变更借记卡信息错:未查询到开户城市');
}
}
// 查询用户信息
const sumer = await unique_db.oneOrNone(`
select uuid, mobile, debit_card
from rapid_ctod_sumers where uuid = $1
`, [
info.sumer
]);
if (!sumer) {
throw new Error('变更借记卡信息错:用户不存在');
}
// 用户未绑借记卡情况下,不能变更借记卡信息
if (!sumer.debit_card) {
throw new Error('变更借记卡信息错:用户未绑定借记卡');
}
// 如果没有提供卡号,或者卡号与原卡号一致,则无需实名认证,直接修改信息后返回
if (!info.card_no || info.card_no == sumer.debit_card.card_no) {
if (!info.bank_name && !info.bank_city) {
return sumer.debit_card;
}
if (info.bank_name) {
sumer.debit_card.bank_name = info.bank_name;
}
if (info.bank_city) {
sumer.debit_card.bank_city = info.bank_city;
}
await unique_db.none(`
update rapid_ctod_sumers set debit_card = $1 where uuid = $2
`, [
sumer.debit_card, sumer.uuid
]);
return sumer.debit_card;
}
// 如果没有提供卡号,则无需更多处理,直接返回
if (!info.card_no) {
return sumer.debit_card;
}
// 查询卡 BIN 信息,如果查询不到,则无法获取发卡行名称等信息
let bin_info = await rapid_db.cardbin.query(info.card_no);
if (!bin_info) {
throw new Error('变更借记卡信息错:查询卡 BIN 信息错,请检查卡号');
}
if (!bin_info.issuer_name) {
throw new Error('变更借记卡信息错:未查询到银行卡开户行名称');
}
// 检查是否为借记卡,卡 BIN 信息中有此标识
if (bin_info.debit_credit_flag != 1) {
throw new Error('变更借记卡信息错:此卡非借记卡(储蓄卡)');
}
// 如果没有提供开户行城市,则查询借记卡开户城市,开户行城市在代付时是必须的
if (!info.bank_city) {
try {
const result = await utils.query_card_city(info.card_no);
bin_info.issuer_city = result.city || '上海';
} catch (err) {
await rapid_db.notify.warn(err.message);
bin_info.issuer_city = '上海';
}
}
// 银行卡实名认证,姓名和证件号码使用原借记卡信息
await auth.card_auth(sumer, Object.assign(info, {
name: sumer.debit_card.name,
idno: sumer.debit_card.idno,
card_type: bin_info.debit_credit_flag,
}));
// 设置新借记卡信息
sumer.debit_card.card_no = info.card_no;
sumer.debit_card.bank_name = info.bank_name || bin_info.issuer_name;
sumer.debit_card.bank_city = info.bank_city || bin_info.issuer_city;
sumer.debit_card.card_type = bin_info.debit_credit_flag;
sumer.debit_card.issuer_code = bin_info.issuer_code;
sumer.debit_card.card_name = bin_info.card_name;
sumer.debit_card.bin_num = bin_info.bin_num;
sumer.debit_card.bin_len = bin_info.bin_len;
// 更新用户借记卡
await unique_db.none(`
update rapid_ctod_sumers set debit_card = $1 where uuid = $2
`, [
sumer.debit_card, sumer.uuid
]);
// 记录绑卡历史
await unique_db.none(`
insert into rapid_ctod_bhist (
uuid, sumer, action, card, notes
) values (
$1, $2, $3, $4, $5
)
`, [
uuid.v4(), sumer.uuid, 5, sumer.debit_card, '变更借记卡'
]);
// 返回新卡信息
return sumer.debit_card;
}
module.exports = alter;