UNPKG

rapid-ztx

Version:

Rapid ZTX module

153 lines (135 loc) 4.92 kB
/** * 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;