|
@@ -1,32 +1,35 @@
|
|
|
# -*- coding: utf-8 -*-
|
|
|
# !/usr/bin/env python
|
|
|
+
|
|
|
import datetime
|
|
|
import logging
|
|
|
import traceback
|
|
|
|
|
|
+import arrow
|
|
|
from django.conf import settings
|
|
|
from typing import TYPE_CHECKING, Callable, Union, Optional, cast
|
|
|
|
|
|
from apilib.monetary import RMB
|
|
|
from apilib.utils_sys import memcache_lock
|
|
|
from apps.web.agent.models import Agent
|
|
|
-from apps.web.common.models import Banks
|
|
|
+from apps.web.common.models import WithdrawBanks, WithdrawBankCard
|
|
|
from apps.web.common.transaction import WithdrawStatus, WITHDRAW_PAY_TYPE, WithdrawResult
|
|
|
from apps.web.core import ROLE
|
|
|
from apps.web.core.exceptions import ServiceException, WithdrawError
|
|
|
-from apps.web.core.models import BankCard
|
|
|
from apps.web.core.payment import WithdrawGateway
|
|
|
-from apps.web.core.payment.ali import AliPayWithdrawGateway
|
|
|
+from apps.web.core.payment.ali import AliPayWithdrawGateway, AlipayWithdrawQueryResult
|
|
|
from apps.web.core.payment.wechat import WechatWithdrawGateway
|
|
|
+from apps.web.exceptions import WithdrawOrderNotExist
|
|
|
from library.alipay import AliPayGatewayException
|
|
|
from library.alipay import AliPayServiceException
|
|
|
-from library.wechatbase.exceptions import WechatNetworkException, WeChatPayException, WeChatException
|
|
|
+from library.wechatbase.exceptions import WechatNetworkException, WeChatPayException
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
from contextlib import GeneratorContextManager
|
|
|
from apps.web.common.models import CapitalUser
|
|
|
from apps.web.common.models import WithdrawRecord
|
|
|
from apps.web.core.payment.wechat import WechatWithdrawQueryResult
|
|
|
+ from apps.web.core.payment import WithdrawGatewayT
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
@@ -41,80 +44,137 @@ def withdraw_lock(type_, id_, key_fn = withdraw_lock_key_fn, value = 1, timeout
|
|
|
return memcache_lock(key_fn(type_, id_), value, timeout)
|
|
|
|
|
|
|
|
|
-def withdraw_via_bank_in_ali(gateway, record, bankcard):
|
|
|
- # type: (AliPayWithdrawGateway, WithdrawRecord, BankCard)->WithdrawResult
|
|
|
-
|
|
|
- def error_handler(err_code, err_code_des):
|
|
|
+class AlipayWithdraw(object):
|
|
|
+ @classmethod
|
|
|
+ def service_error_handler(cls, err_code, err_code_des):
|
|
|
# type:(str, str)->WithdrawResult
|
|
|
|
|
|
remarks = u'{err_code_des}({err_code})'.format(err_code = err_code, err_code_des = err_code_des)
|
|
|
|
|
|
- if err_code == 'SYSTEM_ERROR' or err_code == 'PROCESS_FAIL`':
|
|
|
+ if err_code == 'SYSTEM_ERROR' or err_code == 'PROCESS_FAIL':
|
|
|
return WithdrawResult(
|
|
|
False, 0, False, remarks,
|
|
|
- u"商户平台系统错误,无法获取转账状态。后台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1001)")
|
|
|
- elif err_code in ['PAYMENT_MONEY_NOT_ENOUGH', 'PAYER_BALANCE_NOT_ENOUGH', 'BALANCE_IS_NOT_ENOUGH']:
|
|
|
+ u"商户平台系统错误,无法获取转账状态。平台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1021)")
|
|
|
+ elif err_code in ['PAYER_BALANCE_NOT_ENOUGH', 'BALANCE_IS_NOT_ENOUGH']:
|
|
|
from taskmanager.mediator import task_caller
|
|
|
task_caller('withdraw_error_alert', err_type = 'NOTENOUGH')
|
|
|
return WithdrawResult(False, 0, True, remarks,
|
|
|
u"商户平台系统繁忙,请过一小时后再试。验证码每天次数有限,频繁提交提现可能消耗完当天验证码次数(1001)")
|
|
|
- elif err_code in ['INVALID_PARAMETER', 'EXCEED_LIMIT_SM_AMOUNT', 'EXCEED_LIMIT_MM_AMOUNT',
|
|
|
- 'PAYCARD_UNABLE_PAYMENT', 'PAYER_STATUS_ERROR', 'PAYER_CERTIFY_CHECK_FAIL',
|
|
|
- 'PAYER_STATUS_ERROR', 'PAYER_USER_INFO_ERROR', 'PAYMENT_INFO_INCONSISTENCY',
|
|
|
- 'CARD_BIN_ERROR', 'PAYEE_CARD_INFO_ERROR', 'INST_PAY_UNABLE', 'REQUEST_PROCESSING',
|
|
|
- 'MEMO_REQUIRED_IN_TRANSFER_ERROR', 'PERMIT_CHECK_PERM_IDENTITY_THEFT',
|
|
|
- 'REMARK_HAS_SENSITIVE_WORD', 'EXCEED_LIMIT_DM_AMOUNT', 'NO_ACCOUNT_RECEIVE_PERMISSION',
|
|
|
- 'NO_ACCOUNT_PAYMENT_PERMISSION', 'INVALID_PARAMETER', 'PAYER_NOT_EXIST',
|
|
|
- 'PRODUCT_NOT_SIGN', 'PAYMENT_TIME_EXPIRE', 'PAYEE_NOT_EXIST', 'PAYEE_ACCOUNT_STATUS_ERROR',
|
|
|
- 'PERMIT_NON_BANK_LIMIT_PAYEE', 'PERMIT_NON_BANK_LIMIT_PAYEE',
|
|
|
- 'PAYEE_TRUSTEESHIP_ACC_OVER_LIMIT',
|
|
|
- 'NO_PERMISSION_ACCOUNT', 'TRUSTEESHIP_ACCOUNT_NOT_EXIST', 'PAYEE_ACCOUNT_NOT_EXSIT',
|
|
|
- 'ORDER_NOT_EXIST', 'PAYEE_USERINFO_STATUS_ERROR', 'TRUSTEESHIP_RECIEVE_QUOTA_LIMIT',
|
|
|
- 'SECURITY_CHECK_FAILED', 'NO_ORDER_PERMISSION', 'ORDER_STATUS_INVALID',
|
|
|
- 'PERM_AML_NOT_REALNAME_REV', 'PERM_AML_NOT_REALNAME_REV', 'USER_AGREEMENT_VERIFY_FAIL',
|
|
|
- 'PAYER_NOT_EQUAL_PAYEE_ERROR', 'EXCEED_LIMIT_DC_RECEIVED', 'PAYER_PERMLIMIT_CHECK_FAILURE',
|
|
|
- 'PAYEE_ACC_OCUPIED', 'PAYER_PAYEE_CANNOT_SAME', 'PERMIT_CHECK_PERM_LIMITED',
|
|
|
- 'PERMIT_CHECK_PERM_LIMITED', 'RESOURCE_LIMIT_EXCEED', 'INVALID_PAYER_ACCOUNT',
|
|
|
- 'EXCEED_LIMIT_DM_MAX_AMOUNT', 'EXCEED_LIMIT_PERSONAL_SM_AMOUNT',
|
|
|
- 'EXCEED_LIMIT_UNRN_DM_AMOUNT', 'INVALID_CARDNO', 'RELEASE_USER_FORBBIDEN_RECIEVE',
|
|
|
- 'PAYEE_USER_TYPE_ERROR', 'EXCEED_LIMIT_SM_MIN_AMOUNT', 'PERMIT_CHECK_RECEIVE_LIMIT',
|
|
|
- 'NOT_IN_WHITE_LIST', 'MONEY_PAY_CLOSED', 'NO_AVAILABLE_PAYMENT_TOOLS',
|
|
|
- 'PAYEE_NOT_RELNAME_CERTIFY', 'OVERSEA_TRANSFER_CLOSE', 'PAYMENT_FAIL',
|
|
|
- 'ALREADY_WITHDRAW_STD_RED_PACKET', 'BLOCK_USER_FORBBIDEN_RECIEVE', 'REQUEST_PROCESSING',
|
|
|
- 'USER_NOT_EXIST', 'PARAM_ILLEGAL', 'PROCESS_FAIL', 'CURRENCY_NOT_SUPPORT',
|
|
|
- 'PAYER_REQUESTER_RELATION_INVALID']:
|
|
|
+ elif err_code in [
|
|
|
+ 'INVALID_PARAMETER', 'EXCEED_LIMIT_SM_AMOUNT', 'EXCEED_LIMIT_MM_AMOUNT', 'PAYCARD_UNABLE_PAYMENT',
|
|
|
+ 'PAYER_STATUS_ERROR', 'PAYER_CERTIFY_CHECK_FAIL', 'PAYER_USER_INFO_ERROR', 'PAYMENT_INFO_INCONSISTENCY',
|
|
|
+ 'CARD_BIN_ERROR', 'PAYEE_CARD_INFO_ERROR', 'INST_PAY_UNABLE', 'MEMO_REQUIRED_IN_TRANSFER_ERROR',
|
|
|
+ 'PERMIT_CHECK_PERM_IDENTITY_THEFT', 'REMARK_HAS_SENSITIVE_WORD', 'EXCEED_LIMIT_DM_AMOUNT',
|
|
|
+ 'NO_ACCOUNT_RECEIVE_PERMISSION', 'NO_ACCOUNT_PAYMENT_PERMISSION', 'INVALID_PARAMETER',
|
|
|
+ 'PAYER_NOT_EXIST', 'PRODUCT_NOT_SIGN', 'PAYMENT_TIME_EXPIRE', 'PAYEE_NOT_EXIST',
|
|
|
+ 'PAYEE_ACCOUNT_STATUS_ERROR', 'PERMIT_NON_BANK_LIMIT_PAYEE', 'PAYEE_TRUSTEESHIP_ACC_OVER_LIMIT',
|
|
|
+ 'NO_PERMISSION_ACCOUNT', 'TRUSTEESHIP_ACCOUNT_NOT_EXIST', 'PAYEE_ACCOUNT_NOT_EXSIT',
|
|
|
+ 'ORDER_NOT_EXIST', 'PAYEE_USERINFO_STATUS_ERROR', 'TRUSTEESHIP_RECIEVE_QUOTA_LIMIT',
|
|
|
+ 'SECURITY_CHECK_FAILED', 'NO_ORDER_PERMISSION', 'ORDER_STATUS_INVALID', 'PERM_AML_NOT_REALNAME_REV',
|
|
|
+ 'USER_AGREEMENT_VERIFY_FAIL', 'PAYER_NOT_EQUAL_PAYEE_ERROR', 'EXCEED_LIMIT_DC_RECEIVED',
|
|
|
+ 'PAYER_PERMLIMIT_CHECK_FAILURE', 'PAYEE_ACC_OCUPIED', 'PAYER_PAYEE_CANNOT_SAME',
|
|
|
+ 'PERMIT_CHECK_PERM_LIMITED', 'RESOURCE_LIMIT_EXCEED', 'INVALID_PAYER_ACCOUNT',
|
|
|
+ 'EXCEED_LIMIT_DM_MAX_AMOUNT', 'EXCEED_LIMIT_PERSONAL_SM_AMOUNT', 'EXCEED_LIMIT_UNRN_DM_AMOUNT',
|
|
|
+ 'INVALID_CARDNO', 'RELEASE_USER_FORBBIDEN_RECIEVE', 'PAYEE_USER_TYPE_ERROR',
|
|
|
+ 'EXCEED_LIMIT_SM_MIN_AMOUNT', 'PERMIT_CHECK_RECEIVE_LIMIT', 'NOT_IN_WHITE_LIST',
|
|
|
+ 'MONEY_PAY_CLOSED', 'NO_AVAILABLE_PAYMENT_TOOLS', 'PAYEE_NOT_RELNAME_CERTIFY',
|
|
|
+ 'OVERSEA_TRANSFER_CLOSE', 'PAYMENT_FAIL', 'BLOCK_USER_FORBBIDEN_RECIEVE',
|
|
|
+ 'REQUEST_PROCESSING', 'USER_NOT_EXIST', 'PARAM_ILLEGAL', 'CURRENCY_NOT_SUPPORT',
|
|
|
+ 'PAYER_REQUESTER_RELATION_INVALID', 'AUTHOREE_IS_NOT_MATCH', 'NO_ACCOUNT_USER_FORBBIDEN_RECIEVE',
|
|
|
+ 'SIGN_INVALID', 'SIGN_INVOKE_PID_INCONSISTENT', 'SIGN_QUERY_APP_INFO_ERROR',
|
|
|
+ 'SIGN_QUERY_AGGREMENT_ERROR', 'SIGN_AGREEMENT_NO_INCONSISTENT', 'SIGN_PARAM_INVALID',
|
|
|
+ 'SIGN_NOT_ALLOW_SKIP', 'EXCEED_LIMIT_ENT_SM_AMOUNT', 'ISV_AUTH_ERROR', 'PAYER_USERINFO_NOT_EXSIT',
|
|
|
+ 'BLOCK_USER_FORBBIDEN_SEND', 'BIZ_UNIQUE_EXCEPTION', 'NO_ACCOUNTBOOK_PERMISSION',
|
|
|
+ 'PERMIT_CHECK_PERM_AML_CERT_EXPIRED', 'MRCHPROD_QUERY_ERROR', 'PERMIT_PAYER_FORBIDDEN',
|
|
|
+ 'IDENTITY_FUND_RELATION_NOT_FOUND', 'PERMIT_LIMIT_PAYEE', 'PERM_PAY_USER_DAILY_QUOTA_ORG_BALANCE_LIMIT',
|
|
|
+ 'PERM_PAY_USER_MONTH_QUOTA_ORG_BALANCE_LIMIT', 'PERM_PAY_CUSTOMER_DAILY_QUOTA_ORG_BALANCE_LIMIT',
|
|
|
+ 'PERM_PAY_CUSTOMER_MONTH_QUOTA_ORG_BALANCE_LIMIT', 'NOT_SUPPORT_PAYER_ACCOUNT_TYPE',
|
|
|
+ 'EXCEED_LIMIT_MM_MAX_AMOUNT', 'ILLEGAL_OPERATION',
|
|
|
+ ]:
|
|
|
return WithdrawResult(False, 0, True, remarks, err_code_des)
|
|
|
else:
|
|
|
return WithdrawResult(False, 0, False, remarks,
|
|
|
- u"系统异常,无法获取转账状态。后台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1001)")
|
|
|
+ u"系统异常,无法获取转账状态。平台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1001)")
|
|
|
|
|
|
- # 调用付款到银行接口
|
|
|
- try:
|
|
|
- result = gateway.withdraw_via_bank(total_amount = record.actualPay,
|
|
|
- order_no = record.order,
|
|
|
- bank_card = bankcard)
|
|
|
- if result['status'] == 'FAIL':
|
|
|
- return WithdrawResult(False, 0, True, u'支付失败', u'支付失败')
|
|
|
- elif result['status'] == 'REFUND':
|
|
|
- return WithdrawResult(False, 0, True, u'银行退单', u'银行退单')
|
|
|
+ @classmethod
|
|
|
+ def common_error_handler(cls, err_code, err_code_des):
|
|
|
+ # type:(str, str)->WithdrawResult
|
|
|
+
|
|
|
+ remarks = u'{err_code_des}({err_code})'.format(err_code = err_code, err_code_des = err_code_des)
|
|
|
+
|
|
|
+ if err_code in ['isp.unknow-error', 'aop.unknow-error', 'isv.app-call-limited', 'isv.method-call-limited']:
|
|
|
+ return WithdrawResult(False, 0, True, remarks, u"商户平台系统繁忙,请过一小时后再试。验证码每天次数有限,频繁提交提现可能消耗完当天验证码次数(1005)")
|
|
|
+ elif 'aop.' in err_code or 'isv.' in err_code or err_code in ['app-cert-expired', 'invalid-auth-relations']:
|
|
|
+ return WithdrawResult(False, 0, True, remarks, err_code_des)
|
|
|
else:
|
|
|
- return WithdrawResult(True, 1, False, u'提现申请已经受理', u'提现申请已经受理')
|
|
|
+ return WithdrawResult(False, 0, False, remarks,
|
|
|
+ u"系统异常,无法获取转账状态。平台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1002)")
|
|
|
|
|
|
- except AliPayGatewayException as e:
|
|
|
- logger.error(repr(e))
|
|
|
- return error_handler(e.errCode, e.errMsg)
|
|
|
+ @classmethod
|
|
|
+ def withdraw_via_bank_in_ali(cls, gateway, record, bankcard):
|
|
|
+ # type: (AliPayWithdrawGateway, WithdrawRecord, WithdrawBankCard)->WithdrawResult
|
|
|
|
|
|
- except AliPayServiceException as e:
|
|
|
- logger.error(repr(e))
|
|
|
- return error_handler(e.errCode, e.errMsg)
|
|
|
+ try:
|
|
|
+ result = gateway.withdraw_via_bank(total_amount = record.actualPay,
|
|
|
+ order_no = record.order,
|
|
|
+ bank_card = bankcard)
|
|
|
+ if result['status'] == 'FAIL':
|
|
|
+ return WithdrawResult(False, 0, True, u'支付失败', u'支付失败')
|
|
|
+ elif result['status'] == 'REFUND':
|
|
|
+ return WithdrawResult(False, 0, True, u'银行退单', u'银行退单')
|
|
|
+ else:
|
|
|
+ return WithdrawResult(True, 1, False, u'提现申请已经受理', u'提现申请已经受理')
|
|
|
|
|
|
- except Exception as e:
|
|
|
- logger.exception(e)
|
|
|
- return WithdrawResult(False, 0, False, traceback.format_exc(), u'系统异常,无法确定转账是否成功,请联系客服确认结果(1001)')
|
|
|
+ except AliPayGatewayException as e:
|
|
|
+ logger.error(repr(e))
|
|
|
+ return cls.common_error_handler(e.errCode, e.errMsg)
|
|
|
+
|
|
|
+ except AliPayServiceException as e:
|
|
|
+ logger.error(repr(e))
|
|
|
+ return cls.service_error_handler(e.errCode, e.errMsg)
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.exception(e)
|
|
|
+ return WithdrawResult(False, 0, False, traceback.format_exc(), u'系统异常,无法确定转账是否成功,请联系客服确认结果(1006)')
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def withdraw_via_changes_in_ali(cls, gateway, record):
|
|
|
+ # type: (AliPayWithdrawGateway, WithdrawRecord)->WithdrawResult
|
|
|
+ try:
|
|
|
+ result = gateway.withdraw_via_changes(
|
|
|
+ amount = record.actualPay,
|
|
|
+ payOpenId = record.accountCode,
|
|
|
+ order_no = record.order,
|
|
|
+ real_user_name = record.cardUserName)
|
|
|
+
|
|
|
+ if result['status'] == 'SUCCESS':
|
|
|
+ if result['out_biz_no'] != record.order:
|
|
|
+ logger.warning(
|
|
|
+ 'alipay withdraw order not match. {} != {}'.format(result['out_biz_no'], record.order))
|
|
|
+ return WithdrawResult(False, 0, False, u'提现失败(订单号错误)', u'提现失败,请联系平台客服解决')
|
|
|
+ else:
|
|
|
+ return WithdrawResult(True, 1, False, u'提现成功', u'提现成功', result)
|
|
|
+ elif result['status'] == 'FAIL':
|
|
|
+ return WithdrawResult(False, 0, True, u'支付失败', u'支付失败')
|
|
|
+ else:
|
|
|
+ logger.warning('invalid status = {}'.format(result['status']))
|
|
|
+ return WithdrawResult(False, 0, False, u'支付失败(无效状态)', u'支付失败(无效状态)')
|
|
|
+
|
|
|
+ except AliPayGatewayException as e:
|
|
|
+ logger.error(repr(e))
|
|
|
+ return cls.common_error_handler(e.errCode, e.errMsg)
|
|
|
+
|
|
|
+ except AliPayServiceException as e:
|
|
|
+ logger.error(repr(e))
|
|
|
+ return cls.service_error_handler(e.errCode, e.errMsg)
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.exception(e)
|
|
|
+ return WithdrawResult(False, 0, False, traceback.format_exc(), u'系统异常,无法确定转账是否成功,请联系客服确认结果(1001)')
|
|
|
|
|
|
|
|
|
def withdraw_via_bank_in_wechat(gateway, record, bankcard):
|
|
|
- # type: (WechatWithdrawGateway, WithdrawRecord, BankCard)->WithdrawResult
|
|
|
+ # type: (WechatWithdrawGateway, WithdrawRecord, WithdrawBankCard)->WithdrawResult
|
|
|
|
|
|
def error_handler(err_code, err_code_des):
|
|
|
# type:(str, str)->WithdrawResult
|
|
@@ -137,7 +197,7 @@ def withdraw_via_bank_in_wechat(gateway, record, bankcard):
|
|
|
else:
|
|
|
return WithdrawResult(
|
|
|
False, 0, False, remarks,
|
|
|
- u"系统异常,无法获取转账状态。后台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1002)")
|
|
|
+ u"系统异常,无法获取转账状态。平台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1003)")
|
|
|
|
|
|
# 调用付款到银行接口
|
|
|
try:
|
|
@@ -158,16 +218,20 @@ def withdraw_via_bank_in_wechat(gateway, record, bankcard):
|
|
|
logger.error(repr(e))
|
|
|
return error_handler(e.errCode, e.errMsg)
|
|
|
|
|
|
+ except NotImplementedError as e:
|
|
|
+ logger.error(e)
|
|
|
+ return WithdrawResult(False, 0, True, traceback.format_exc(), u'提现失败')
|
|
|
+
|
|
|
except Exception as e:
|
|
|
logger.exception(e)
|
|
|
return WithdrawResult(False, 0, False, traceback.format_exc(), u'系统异常,无法确定转账是否成功,请联系客服确认结果(1002)')
|
|
|
|
|
|
|
|
|
def withdraw_via_bank(gateway, record, bankcard):
|
|
|
- # type: (WithdrawGateway, WithdrawRecord, BankCard)->(basestring, WithdrawResult)
|
|
|
+ # type: (WithdrawGateway, WithdrawRecord, WithdrawBankCard)->(basestring, WithdrawResult)
|
|
|
|
|
|
if isinstance(gateway, AliPayWithdrawGateway):
|
|
|
- return 'alipay', withdraw_via_bank_in_ali(gateway, record, bankcard)
|
|
|
+ return 'alipay', AlipayWithdraw.withdraw_via_bank_in_ali(gateway, record, bankcard)
|
|
|
|
|
|
if isinstance(gateway, WechatWithdrawGateway):
|
|
|
return 'wechat', withdraw_via_bank_in_wechat(gateway, record, bankcard)
|
|
@@ -176,7 +240,7 @@ def withdraw_via_bank(gateway, record, bankcard):
|
|
|
|
|
|
|
|
|
def withdraw_via_wechat(gateway, record, payOpenId, real_user_name):
|
|
|
- # type:(cast[WithdrawGateway], WithdrawRecord, str, str)->WithdrawResult
|
|
|
+ # type:(WechatWithdrawGateway, WithdrawRecord, str, str)->WithdrawResult
|
|
|
|
|
|
"""
|
|
|
微信支付到个人微信
|
|
@@ -219,7 +283,7 @@ def withdraw_via_wechat(gateway, record, payOpenId, real_user_name):
|
|
|
return WithdrawResult(False, 0, True, remarks, err_code_des)
|
|
|
else:
|
|
|
return WithdrawResult(False, 0, False, remarks,
|
|
|
- u"系统异常,无法获取转账状态。后台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1010)")
|
|
|
+ u"系统异常,无法获取转账状态。平台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1005)")
|
|
|
|
|
|
try:
|
|
|
gateway.withdraw_via_changes(amount = record.actualPay,
|
|
@@ -265,7 +329,7 @@ def withdraw_via_wechat(gateway, record, payOpenId, real_user_name):
|
|
|
from taskmanager.mediator import task_caller
|
|
|
task_caller('withdraw_error_alert', err_type = 'NOTENOUGH')
|
|
|
return WithdrawResult(False, 0, True, remarks,
|
|
|
- u"商户平台系统繁忙,请过一小时后再试。验证码每天次数有限,频繁提交提现可能消耗完当天验证码次数(1003)")
|
|
|
+ u"商户平台系统繁忙,请过一小时后再试。验证码每天次数有限,频繁提交提现可能消耗完当天验证码次数(1006)")
|
|
|
elif err_code == 'NAME_MISMATCH':
|
|
|
return WithdrawResult(False, 2, True, remarks, u"实名校验失败,请确保经销商名字与账户登录微信一致后重试。")
|
|
|
elif err_code == 'V2_ACCOUNT_SIMPLE_BAN':
|
|
@@ -277,7 +341,7 @@ def withdraw_via_wechat(gateway, record, payOpenId, real_user_name):
|
|
|
return WithdrawResult(False, 0, True, remarks, err_code_des)
|
|
|
else:
|
|
|
return WithdrawResult(False, 0, False, remarks,
|
|
|
- u"系统异常,无法获取转账状态。后台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1010)")
|
|
|
+ u"系统异常,无法获取转账状态。平台会每日定时重试,如果3个工作日仍然是失败状态,请联系客服确认结果(1006)")
|
|
|
|
|
|
try:
|
|
|
gateway.withdraw_via_changes(amount = record.actualPay,
|
|
@@ -301,13 +365,14 @@ def withdraw_via_wechat(gateway, record, payOpenId, real_user_name):
|
|
|
|
|
|
except Exception as e:
|
|
|
logger.exception(e)
|
|
|
- return WithdrawResult(False, 0, False, traceback.format_exc(), u'系统异常,无法确定转账是否成功,请联系客服确认结果(1003)')
|
|
|
+ return WithdrawResult(False, 0, False, traceback.format_exc(), u'系统异常,无法确定转账是否成功,请联系客服确认结果(1005)')
|
|
|
|
|
|
if gateway.version == 'v3':
|
|
|
return withdraw_via_v3(gateway, record, payOpenId, real_user_name)
|
|
|
else:
|
|
|
return withdraw_via_v1(gateway, record, payOpenId, real_user_name)
|
|
|
|
|
|
+
|
|
|
class WithdrawService(object):
|
|
|
def __init__(self, payee, income_type, amount, pay_type, bank_card_no = None):
|
|
|
# type: (CapitalUser, str, RMB, str, Union[str, Optional[str]]) -> None
|
|
@@ -345,6 +410,9 @@ class WithdrawService(object):
|
|
|
raise ServiceException(
|
|
|
{'result': 0, 'description': u"您的账号权限不足或者异常,暂时不能提现。", 'payload': {}})
|
|
|
|
|
|
+ if self.payee.abnormal:
|
|
|
+ raise ServiceException({'result': 0, 'description': u'该帐号资金异常,请联系客服处理', 'payload': {}})
|
|
|
+
|
|
|
if not self.payee.can_withdraw_today:
|
|
|
raise ServiceException(
|
|
|
{'result': 0, 'description': u"超过每日最大提现次数,请明天再试。", 'payload': {}})
|
|
@@ -354,54 +422,52 @@ class WithdrawService(object):
|
|
|
if self.payee.sub_balance(self.income_type, source_key) < self.amount:
|
|
|
raise ServiceException({'result': 0, 'description': u'余额不足', 'payload': {}})
|
|
|
|
|
|
- withdraw_gateway_list = Agent.withdraw_gateway_list(source_key)
|
|
|
+ is_ledger, withdraw_gateway_list = Agent.withdraw_gateway_list(source_key)
|
|
|
|
|
|
- default_withdraw_gateway = withdraw_gateway_list['wechat'] # type: WechatWithdrawGateway
|
|
|
- if not default_withdraw_gateway.ledger:
|
|
|
+ if not is_ledger:
|
|
|
raise ServiceException({'result': 0, 'description': u'暂时不支持提现(1001)', 'payload': {}})
|
|
|
|
|
|
if self.pay_type == WITHDRAW_PAY_TYPE.WECHAT:
|
|
|
- if default_withdraw_gateway.manual_withdraw:
|
|
|
- logger.debug('gateway<{}> is manual withdraw.'.format(repr(default_withdraw_gateway)))
|
|
|
+ if withdraw_gateway_list['wechat'].manual_withdraw:
|
|
|
+ logger.debug('gateway<{}> is manual withdraw.'.format(repr(withdraw_gateway_list['wechat'])))
|
|
|
raise ServiceException({'result': 0, 'description': u'暂时不支持提现(1002)', 'payload': {}})
|
|
|
|
|
|
- pay_entity = BankCard(
|
|
|
- cardNo = self.payee.withdraw_open_id,
|
|
|
- holderName = self.payee.nickname,
|
|
|
+ pay_entity = WithdrawBankCard(
|
|
|
+ accountCode = self.payee.withdraw_open_id,
|
|
|
+ accountName = self.payee.withdraw_wechat_real_name,
|
|
|
bankName = u'微信',
|
|
|
- branchName = u'微信企业付款'
|
|
|
- )
|
|
|
+ branchBankName = u'微信企业付款')
|
|
|
+
|
|
|
+ wechat_withdraw_gateway = withdraw_gateway_list['wechatV3'] or withdraw_gateway_list['wechat']
|
|
|
|
|
|
self.record = self.payee.new_withdraw_record(
|
|
|
- withdraw_gateway = default_withdraw_gateway,
|
|
|
+ withdraw_gateway = wechat_withdraw_gateway,
|
|
|
pay_entity = pay_entity,
|
|
|
source_key = source_key,
|
|
|
income_type = self.income_type,
|
|
|
amount = self.amount,
|
|
|
pay_type = self.pay_type,
|
|
|
- manual = default_withdraw_gateway.manual_withdraw,
|
|
|
+ manual = False,
|
|
|
recurrent = recurrent)
|
|
|
if not self.record:
|
|
|
raise ServiceException({'result': 0, 'description': u'系统繁忙,请稍后再试', 'payload': {}})
|
|
|
|
|
|
- if self.payee.abnormal:
|
|
|
- raise ServiceException({'result': 0, 'description': u'该帐号资金异常,请联系客服处理', 'payload': {}})
|
|
|
-
|
|
|
handler = self.payee.new_withdraw_handler(self.record)
|
|
|
|
|
|
updated = self.payee.freeze_balance(self.record.incomeType,
|
|
|
self.record.amount,
|
|
|
self.record.source_key,
|
|
|
- self.record.order)
|
|
|
+ self.record.order,
|
|
|
+ self.record.is_new_version)
|
|
|
if not updated:
|
|
|
handler.revoke(remarks = u'扣款失败', description = u'扣款失败')
|
|
|
raise ServiceException({'result': 0, 'description': u'扣款失败', 'payload': {}})
|
|
|
|
|
|
withdraw_result = withdraw_via_wechat(
|
|
|
- gateway = default_withdraw_gateway,
|
|
|
+ gateway = wechat_withdraw_gateway,
|
|
|
record = self.record,
|
|
|
payOpenId = self.payee.withdraw_open_id,
|
|
|
- real_user_name = self.payee.nickname) # type: WithdrawResult
|
|
|
+ real_user_name = self.record.cardUserName) # type: WithdrawResult
|
|
|
|
|
|
logger.debug(
|
|
|
'withdraw via wechat. record = %s; result = %s' % (
|
|
@@ -420,24 +486,30 @@ class WithdrawService(object):
|
|
|
description = withdraw_result.show_message)
|
|
|
|
|
|
raise ServiceException(
|
|
|
- {'result': withdraw_result.err_code, 'description': withdraw_result.show_message,
|
|
|
- 'payload': {}})
|
|
|
+ {
|
|
|
+ 'result': withdraw_result.err_code,
|
|
|
+ 'description': withdraw_result.show_message,
|
|
|
+ 'payload': {}
|
|
|
+ })
|
|
|
+
|
|
|
+ elif self.pay_type == WITHDRAW_PAY_TYPE.BANK:
|
|
|
+ if not self.bank_card_no:
|
|
|
+ raise ServiceException({'result': 0, 'description': u'银行卡号参数错误', 'payload': {}})
|
|
|
|
|
|
- if self.pay_type == WITHDRAW_PAY_TYPE.BANK:
|
|
|
bank_card = self.payee.withdraw_bank_card(self.bank_card_no)
|
|
|
if not bank_card:
|
|
|
raise ServiceException({'result': 0, 'description': u'银行卡不存在', 'payload': {}})
|
|
|
|
|
|
manual = False
|
|
|
- withdraw_gateway = default_withdraw_gateway
|
|
|
+ withdraw_gateway = withdraw_gateway_list['wechat']
|
|
|
|
|
|
if bank_card.manual:
|
|
|
manual = True
|
|
|
|
|
|
- elif bank_card.accountType == BankCard.AccountType.PUBLIC:
|
|
|
+ elif bank_card.accountType == WithdrawBankCard.AccountType.PUBLIC:
|
|
|
if withdraw_gateway_list['alipay']:
|
|
|
- withdraw_gateway = withdraw_gateway_list['alipay'] # type: AliPayWithdrawGateway
|
|
|
- if not Banks.support_public(bank_card.bankName):
|
|
|
+ withdraw_gateway = withdraw_gateway_list['alipay'] # type: WithdrawGateway
|
|
|
+ if not WithdrawBanks.support(bank_card.bankName):
|
|
|
raise ServiceException({
|
|
|
'result': 0,
|
|
|
'description': u'不支持提现到此银行卡或者银行名称错误, 请联系平台客服(1001)',
|
|
@@ -445,15 +517,24 @@ class WithdrawService(object):
|
|
|
else:
|
|
|
manual = True
|
|
|
else:
|
|
|
- if default_withdraw_gateway.manual_withdraw:
|
|
|
- manual = True
|
|
|
- else:
|
|
|
- wechat_bank_code = Banks.get_wechat_bank_code(bank_card.bankName)
|
|
|
- if not wechat_bank_code:
|
|
|
+ # if withdraw_gateway_list['alipay'] and self.payee.supports('withdraw_alipay'):
|
|
|
+ if withdraw_gateway_list['alipay']:
|
|
|
+ withdraw_gateway = withdraw_gateway_list['alipay'] # type: WithdrawGateway
|
|
|
+ if not WithdrawBanks.support(bank_card.bankName):
|
|
|
raise ServiceException({
|
|
|
'result': 0,
|
|
|
'description': u'不支持提现到此银行卡或者银行名称错误, 请联系平台客服(1002)',
|
|
|
'payload': {}})
|
|
|
+ else:
|
|
|
+ if withdraw_gateway_list['wechat'].manual_withdraw:
|
|
|
+ manual = True
|
|
|
+ else:
|
|
|
+ wechat_bank_code = WithdrawBanks.get_wechat_bank_code(bank_card.bankName)
|
|
|
+ if not wechat_bank_code:
|
|
|
+ raise ServiceException({
|
|
|
+ 'result': 0,
|
|
|
+ 'description': u'不支持提现到此银行卡或者银行名称错误, 请联系平台客服(1002)',
|
|
|
+ 'payload': {}})
|
|
|
|
|
|
self.record = self.payee.new_withdraw_record(
|
|
|
withdraw_gateway = withdraw_gateway,
|
|
@@ -473,12 +554,13 @@ class WithdrawService(object):
|
|
|
updated = self.payee.freeze_balance(self.record.incomeType,
|
|
|
self.record.amount,
|
|
|
self.record.source_key,
|
|
|
- self.record.order)
|
|
|
+ self.record.order,
|
|
|
+ self.record.is_new_version)
|
|
|
if not updated:
|
|
|
handler.revoke(remarks = u'扣款失败', description = u'扣款失败')
|
|
|
raise ServiceException({'result': 0, 'description': u'扣款失败', 'payload': {}})
|
|
|
|
|
|
- # 对公的提现, 或者不支持的银行卡(使用manual标记的BankCard 或者 Merchant)
|
|
|
+ # 对公的提现, 或者不支持的银行卡
|
|
|
if manual:
|
|
|
withdraw_result = WithdrawResult(True, 1, False, u'提现申请已经受理', u'提现申请已经受理')
|
|
|
|
|
@@ -518,6 +600,82 @@ class WithdrawService(object):
|
|
|
{'result': withdraw_result.err_code, 'description': withdraw_result.show_message,
|
|
|
'payload': {}})
|
|
|
|
|
|
+ elif self.pay_type == WITHDRAW_PAY_TYPE.ALIPAY:
|
|
|
+ pay_entity = WithdrawBankCard(
|
|
|
+ accountCode = self.payee.withdraw_alipay_login_id,
|
|
|
+ accountName = self.payee.withdraw_alipay_real_name,
|
|
|
+ bankName = u'支付宝',
|
|
|
+ branchBankName = u'支付宝企业付款')
|
|
|
+
|
|
|
+ if not pay_entity.accountCode:
|
|
|
+ raise ServiceException({
|
|
|
+ 'result': 0,
|
|
|
+ 'description': u'不支持提现到支付宝账号或者是配置错误(1001)',
|
|
|
+ 'payload': {}})
|
|
|
+
|
|
|
+ withdraw_gateway = withdraw_gateway_list['alipay'] # type: WithdrawGatewayT
|
|
|
+ if not withdraw_gateway:
|
|
|
+ raise ServiceException({
|
|
|
+ 'result': 0,
|
|
|
+ 'description': u'不支持提现到支付宝账号或者是配置错误(1002)',
|
|
|
+ 'payload': {}})
|
|
|
+
|
|
|
+ self.record = self.payee.new_withdraw_record(
|
|
|
+ withdraw_gateway = withdraw_gateway,
|
|
|
+ pay_entity = pay_entity,
|
|
|
+ source_key = source_key,
|
|
|
+ income_type = self.income_type,
|
|
|
+ amount = self.amount,
|
|
|
+ pay_type = self.pay_type,
|
|
|
+ manual = False,
|
|
|
+ recurrent = recurrent) # type: WithdrawRecord
|
|
|
+
|
|
|
+ if not self.record:
|
|
|
+ raise ServiceException({'result': 0, 'description': u'系统繁忙,请稍后再试(1002)', 'payload': {}})
|
|
|
+
|
|
|
+ handler = self.payee.new_withdraw_handler(self.record)
|
|
|
+
|
|
|
+ updated = self.payee.freeze_balance(self.record.incomeType,
|
|
|
+ self.record.amount,
|
|
|
+ self.record.source_key,
|
|
|
+ self.record.order,
|
|
|
+ self.record.is_new_version)
|
|
|
+ if not updated:
|
|
|
+ handler.revoke(remarks = u'扣款失败', description = u'扣款失败')
|
|
|
+ raise ServiceException({'result': 0, 'description': u'扣款失败', 'payload': {}})
|
|
|
+
|
|
|
+ withdraw_result = AlipayWithdraw.withdraw_via_changes_in_ali(withdraw_gateway, self.record)
|
|
|
+
|
|
|
+ logger.debug(
|
|
|
+ 'withdraw via alipay. record = %s; result = %s' % (
|
|
|
+ self.record.order, repr(withdraw_result)))
|
|
|
+
|
|
|
+ if withdraw_result.result is True:
|
|
|
+ finished_time = arrow.get(withdraw_result.callResult['trans_date'], 'YYYY-MM-DD HH:mm:ss',
|
|
|
+ tzinfo = settings.TIME_ZONE).naive
|
|
|
+ handler.approve(finishedTime = finished_time, extra = {
|
|
|
+ 'order_id': withdraw_result.callResult.get('order_id'),
|
|
|
+ 'pay_fund_order_id': withdraw_result.callResult.get('pay_fund_order_id'),
|
|
|
+ })
|
|
|
+ return {
|
|
|
+ 'result': 1,
|
|
|
+ 'description': u'提现申请已经受理',
|
|
|
+ 'payload': {
|
|
|
+ 'paymentId': str(self.record.id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ if withdraw_result.refund:
|
|
|
+ handler.revoke(remarks = withdraw_result.message,
|
|
|
+ description = withdraw_result.show_message)
|
|
|
+ else:
|
|
|
+ handler.fail(remarks = withdraw_result.message,
|
|
|
+ description = withdraw_result.show_message)
|
|
|
+
|
|
|
+ raise ServiceException(
|
|
|
+ {'result': withdraw_result.err_code, 'description': withdraw_result.show_message,
|
|
|
+ 'payload': {}})
|
|
|
+
|
|
|
raise ServiceException({'result': 0, 'description': u'系统错误,请稍后再试', 'payload': {}})
|
|
|
else:
|
|
|
raise ServiceException({'result': 0, 'description': u'操作频繁,请稍后再试', 'payload': {}})
|
|
@@ -554,8 +712,8 @@ class WithdrawRetryService(object):
|
|
|
end = self.record.postTime + datetime.timedelta(days = 3) # type: datetime
|
|
|
now = datetime.datetime.now()
|
|
|
|
|
|
- if end.year > now.year or end.month > now.month or end.day > now.day:
|
|
|
- handler.revoke(remarks = u'平台退单', description = u'提现失败')
|
|
|
+ if now.year > end.year or now.month > end.month or now.day > end.day:
|
|
|
+ handler.revoke(remarks = u'重试次数超限,平台退单', description = u'提现失败')
|
|
|
raise ServiceException(
|
|
|
{
|
|
|
'result': 0,
|
|
@@ -611,9 +769,9 @@ class WithdrawRetryService(object):
|
|
|
self.record.withdrawGatewayKey,
|
|
|
self.record.extras.get('gateway_version', 'v1')) # type: WithdrawGateway
|
|
|
|
|
|
- if self.record.payType == WITHDRAW_PAY_TYPE.WECHAT:
|
|
|
- handler = payee.new_withdraw_handler(self.record)
|
|
|
+ handler = payee.new_withdraw_handler(self.record)
|
|
|
|
|
|
+ if self.record.payType == WITHDRAW_PAY_TYPE.WECHAT:
|
|
|
try:
|
|
|
query_result = withdraw_gateway.get_transfer_result_via_changes(
|
|
|
self.record.order) # type: WechatWithdrawQueryResult
|
|
@@ -651,17 +809,16 @@ class WithdrawRetryService(object):
|
|
|
'payload': {}
|
|
|
})
|
|
|
|
|
|
- except WeChatPayException as e:
|
|
|
- # 如果业务状态是查不到订单, 需要继续处理, 其他抛出异常
|
|
|
- if e.errCode not in ['ORDERNOTEXIST', 'NOT_FOUND']:
|
|
|
- raise e
|
|
|
+ except WithdrawOrderNotExist:
|
|
|
+ logger.warning('withdraw order<orderNo={}> is not exist.'.format(self.record.order))
|
|
|
|
|
|
self.check_retry_over(handler)
|
|
|
|
|
|
payee.freeze_balance(self.record.incomeType,
|
|
|
self.record.amount,
|
|
|
self.record.source_key,
|
|
|
- self.record.order)
|
|
|
+ self.record.order,
|
|
|
+ self.record.is_new_version)
|
|
|
|
|
|
withdraw_result = withdraw_via_wechat(withdraw_gateway,
|
|
|
self.record,
|
|
@@ -689,18 +846,15 @@ class WithdrawRetryService(object):
|
|
|
'payload': {}
|
|
|
})
|
|
|
|
|
|
- if self.record.payType == WITHDRAW_PAY_TYPE.BANK:
|
|
|
- handler = payee.new_withdraw_handler(self.record)
|
|
|
-
|
|
|
+ elif self.record.payType == WITHDRAW_PAY_TYPE.BANK:
|
|
|
try:
|
|
|
query_result = withdraw_gateway.get_transfer_result_via_bank(
|
|
|
- self.record.order) # type: WechatWithdrawQueryResult
|
|
|
+ self.record.order) # type: Union[WechatWithdrawQueryResult, AlipayWithdrawQueryResult]
|
|
|
|
|
|
errcode, errmsg = query_result.error_desc
|
|
|
|
|
|
- if query_result.is_failed:
|
|
|
- handler.revoke(remarks = errcode,
|
|
|
- description = errmsg)
|
|
|
+ if query_result.is_failed or query_result.is_refund:
|
|
|
+ handler.revoke(remarks = errcode, description = errmsg)
|
|
|
return {
|
|
|
'result': 1,
|
|
|
'description': errmsg,
|
|
@@ -710,7 +864,7 @@ class WithdrawRetryService(object):
|
|
|
}
|
|
|
|
|
|
if query_result.is_successful:
|
|
|
- handler.approve()
|
|
|
+ handler.approve(finishedTime = query_result.finished_time, extra = query_result.extra)
|
|
|
return {
|
|
|
'result': 1,
|
|
|
'description': 'SUCCESS',
|
|
@@ -729,10 +883,8 @@ class WithdrawRetryService(object):
|
|
|
'payload': {}
|
|
|
})
|
|
|
|
|
|
- except (WeChatPayException, AliPayServiceException) as e:
|
|
|
- # 如果业务状态是查不到订单, 需要继续处理, 否则继续抛出异常
|
|
|
- if e.errCode not in ['ORDERNOTEXIST', 'NOT_FOUND', 'ORDER_NOT_EXIST']:
|
|
|
- raise e
|
|
|
+ except WithdrawOrderNotExist:
|
|
|
+ logger.warning('withdraw order<orderNo={}> is not exist.'.format(self.record.order))
|
|
|
|
|
|
self.check_retry_over(handler)
|
|
|
|
|
@@ -748,7 +900,8 @@ class WithdrawRetryService(object):
|
|
|
payee.freeze_balance(self.record.incomeType,
|
|
|
self.record.amount,
|
|
|
self.record.source_key,
|
|
|
- self.record.order)
|
|
|
+ self.record.order,
|
|
|
+ self.record.is_new_version)
|
|
|
|
|
|
gateway_type, withdraw_result = withdraw_via_bank(withdraw_gateway, self.record, bank_card)
|
|
|
|
|
@@ -772,6 +925,93 @@ class WithdrawRetryService(object):
|
|
|
'description': withdraw_result.show_message,
|
|
|
'payload': {}
|
|
|
})
|
|
|
+
|
|
|
+ elif self.record.payType == WITHDRAW_PAY_TYPE.ALIPAY:
|
|
|
+ try:
|
|
|
+ query_result = withdraw_gateway.get_transfer_result_via_changes(
|
|
|
+ self.record.order) # type: AlipayWithdrawQueryResult
|
|
|
+
|
|
|
+ errcode, errmsg = query_result.error_desc
|
|
|
+
|
|
|
+ if query_result.is_failed:
|
|
|
+ handler.revoke(remarks = errcode, description = errmsg)
|
|
|
+ return {
|
|
|
+ 'result': 1,
|
|
|
+ 'description': errmsg,
|
|
|
+ 'payload': {
|
|
|
+ 'paymentId': str(self.record.id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if query_result.is_successful:
|
|
|
+ handler.approve(finishedTime = query_result.finished_time, extra = query_result.extra)
|
|
|
+ return {
|
|
|
+ 'result': 1,
|
|
|
+ 'description': 'SUCCESS',
|
|
|
+ 'payload': {
|
|
|
+ 'paymentId': str(self.record.id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if query_result.is_processing:
|
|
|
+ pass
|
|
|
+ else:
|
|
|
+ raise ServiceException(
|
|
|
+ {
|
|
|
+ 'result': 0,
|
|
|
+ 'description': u'未知订单状态{}'.format(query_result.order_status),
|
|
|
+ 'payload': {}
|
|
|
+ })
|
|
|
+ except WithdrawOrderNotExist:
|
|
|
+ logger.warning('withdraw order<orderNo={}> is not exist.'.format(self.record.order))
|
|
|
+
|
|
|
+ self.check_retry_over(handler)
|
|
|
+
|
|
|
+ updated = payee.freeze_balance(self.record.incomeType,
|
|
|
+ self.record.amount,
|
|
|
+ self.record.source_key,
|
|
|
+ self.record.order,
|
|
|
+ self.record.is_new_version)
|
|
|
+ if not updated:
|
|
|
+ handler.revoke(remarks = u'扣款失败', description = u'扣款失败')
|
|
|
+ raise ServiceException({'result': 0, 'description': u'扣款失败', 'payload': {}})
|
|
|
+
|
|
|
+ withdraw_result = AlipayWithdraw.withdraw_via_changes_in_ali(withdraw_gateway, self.record)
|
|
|
+
|
|
|
+ logger.debug(
|
|
|
+ 'withdraw via alipay. record = %s; result = %s' % (
|
|
|
+ self.record.order, repr(withdraw_result)))
|
|
|
+
|
|
|
+ if withdraw_result.result is True:
|
|
|
+ finished_time = arrow.get(withdraw_result.callResult['trans_date'], 'YYYY-MM-DD HH:mm:ss',
|
|
|
+ tzinfo = settings.TIME_ZONE).naive
|
|
|
+ handler.approve(finishedTime = finished_time, extra = {
|
|
|
+ 'order_id': withdraw_result.callResult.get('order_id'),
|
|
|
+ 'pay_fund_order_id': withdraw_result.callResult.get('pay_fund_order_id'),
|
|
|
+ })
|
|
|
+ return {
|
|
|
+ 'result': 1,
|
|
|
+ 'description': u'提现申请已经受理',
|
|
|
+ 'payload': {
|
|
|
+ 'paymentId': str(self.record.id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ if withdraw_result.refund:
|
|
|
+ handler.revoke(remarks = withdraw_result.message,
|
|
|
+ description = withdraw_result.show_message)
|
|
|
+ else:
|
|
|
+ handler.fail(remarks = withdraw_result.message,
|
|
|
+ description = withdraw_result.show_message)
|
|
|
+
|
|
|
+ raise ServiceException(
|
|
|
+ {
|
|
|
+ 'result': withdraw_result.err_code,
|
|
|
+ 'description': withdraw_result.show_message,
|
|
|
+ 'payload': {}
|
|
|
+ })
|
|
|
+ else:
|
|
|
+ logger.error('invalid withdraw type: {}'.format(self.record.payType))
|
|
|
except WechatNetworkException as e:
|
|
|
logger.exception(e)
|
|
|
return {'result': 0, 'description': e.errMsg, 'payload': {}}
|