|
@@ -14,8 +14,11 @@ const PAY_URL = '/api/v3/ind/createCollectingOrder';
|
|
|
const QUERY_URL = '/api/v3/ind/query/collectingOrder'
|
|
|
const BALANCE_URL = '/api/v3/ind/query/balance'
|
|
|
const BANK_URL = '/api/v3/ind/query/bank'
|
|
|
+const WITHDRAW_URL = '/api/v3/ind/createTransferOrder';
|
|
|
+const QUERY_WITHDRAW_URL = '/api/v3/ind/query/transferOrder'
|
|
|
|
|
|
const NOTIFY_HOST = `http://157.175.73.225/api/admin/dj/open/hambit/inr/notifyOrder`;
|
|
|
+const WITHDRAW_NOTIFY_HOST = `http://157.175.73.225/api/admin/dj/open/hambit/inr/notifyWithdraw`;
|
|
|
|
|
|
const CHANNEL_TYPE = "BANK";
|
|
|
|
|
@@ -193,4 +196,130 @@ export class HambitInrService extends BaseService {
|
|
|
throw new Error(msg);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ async withdraw(payload) {
|
|
|
+ const param = {
|
|
|
+ currencyAmount: (+payload.amount).toFixed(2),
|
|
|
+ channelType: CHANNEL_TYPE,
|
|
|
+ externalOrderId: payload.orderNo,
|
|
|
+ accountId: payload.accountNo,
|
|
|
+ accountType: 'INR',
|
|
|
+ ifSC: payload.bankCode,
|
|
|
+ notifyUrl: WITHDRAW_NOTIFY_HOST
|
|
|
+ };
|
|
|
+ const timestamp = +moment();
|
|
|
+ const nonce = uuidv4();
|
|
|
+ const signStr = this.utils.signSort({
|
|
|
+ timestamp,
|
|
|
+ nonce,
|
|
|
+ access_key: ACCESS_KEY,
|
|
|
+ ...param
|
|
|
+ });
|
|
|
+ const sign = this.utils.signByHmacSha1(signStr, SECRET_KEY);
|
|
|
+ const res = await this.httpService.post(HOST + WITHDRAW_URL, param, {
|
|
|
+ headers: {
|
|
|
+ 'access_key': ACCESS_KEY,
|
|
|
+ 'timestamp': timestamp,
|
|
|
+ 'nonce': nonce,
|
|
|
+ 'sign': sign
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.logger.info('代付接口返回', param, JSON.stringify(res.data));
|
|
|
+ const { success, msg, desc, data } = res.data;
|
|
|
+ if (success && data.orderId) {
|
|
|
+ return {
|
|
|
+ status: 2,
|
|
|
+ traceNo: data.orderId
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ return {
|
|
|
+ status: 3,
|
|
|
+ message: desc || msg
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ async handleWithdrawNotify(payload, headers) {
|
|
|
+ const sign = headers['sign'];
|
|
|
+ const timestamp = headers['timestamp'];
|
|
|
+ const nonce = headers['nonce'];
|
|
|
+ const signStr = this.utils.signSort({
|
|
|
+ timestamp,
|
|
|
+ nonce,
|
|
|
+ access_key: ACCESS_KEY,
|
|
|
+ ...payload
|
|
|
+ });
|
|
|
+ const validSign = this.utils.signByHmacSha1(signStr, SECRET_KEY);
|
|
|
+ if (sign !== validSign) {
|
|
|
+ throw new Error('sign error');
|
|
|
+ }
|
|
|
+ if (+payload.orderStatusCode !== 8 && +payload.orderStatusCode !== 4 && +payload.orderStatusCode !== 16) {
|
|
|
+ throw new Error('order no result');
|
|
|
+ }
|
|
|
+ let status = 2;
|
|
|
+ if (+payload.orderStatusCode === 8) {
|
|
|
+ status = 8;
|
|
|
+ } else if (+payload.orderStatusCode === 4 || +payload.orderStatusCode === 16) {
|
|
|
+ status = 3;
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ date: new Date(),
|
|
|
+ status: status,
|
|
|
+ message: payload.errorMsg,
|
|
|
+ orderNo: payload.externalOrderId
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ async queryWithdraw(payload) {
|
|
|
+ const param = {
|
|
|
+ externalOrderId: payload.orderNo
|
|
|
+ };
|
|
|
+ const timestamp = +moment();
|
|
|
+ const nonce = uuidv4();
|
|
|
+ const signStr = this.utils.signSort({
|
|
|
+ timestamp,
|
|
|
+ nonce,
|
|
|
+ access_key: ACCESS_KEY,
|
|
|
+ ...param
|
|
|
+ });
|
|
|
+ const sign = this.utils.signByHmacSha1(signStr, SECRET_KEY);
|
|
|
+ const res = await this.httpService.post(HOST + QUERY_WITHDRAW_URL, param, {
|
|
|
+ headers: {
|
|
|
+ 'access_key': ACCESS_KEY,
|
|
|
+ 'timestamp': timestamp,
|
|
|
+ 'nonce': nonce,
|
|
|
+ 'sign': sign
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.logger.info('查询代付接口返回', JSON.stringify(res.data));
|
|
|
+ const { success, msg, data = [] } = res.data;
|
|
|
+ const orderData = data.find(item => item.externalOrderId === payload.orderNo)
|
|
|
+ if (success && orderData) {
|
|
|
+ if (+orderData.orderStatus === 4 || +orderData.orderStatus === 16) {
|
|
|
+ return {
|
|
|
+ date: new Date(),
|
|
|
+ status: 3,
|
|
|
+ message: orderData.errorMsg,
|
|
|
+ orderNo: orderData.externalOrderId
|
|
|
+ };
|
|
|
+ } else if (+orderData.orderStatus === 8) {
|
|
|
+ return {
|
|
|
+ date: new Date(),
|
|
|
+ status: 8,
|
|
|
+ message: orderData.errorMsg,
|
|
|
+ orderNo: orderData.externalOrderId
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ status: 1,
|
|
|
+ traceNo: orderData.orderId,
|
|
|
+ date: new Date()
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ return {
|
|
|
+ status: 3,
|
|
|
+ message: '渠道订单不存在'
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|