views.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import logging
  4. import simplejson as json
  5. from django.http import HttpResponse
  6. from django.views.generic import View
  7. from typing import Optional
  8. from apilib.bank_card_utils import BankRecognizer
  9. from apilib.img_utils import ImageRecognizer, parse_identify_image, parse_bank_image, parse_business_image
  10. from apilib.utils_sys import memcache_lock
  11. from apps.web.agent.models import Agent
  12. from apps.web.core import ROLE
  13. from apps.web.core.exceptions import InvalidFileSize, InvalidFileName, MerchantError
  14. from apps.web.core.file import AliOssFileUploader
  15. from apps.web.core.messages.sms import jdMerchantSMSProvider
  16. from apps.web.core.utils import JsonErrorResponse, JsonOkResponse
  17. from apps.web.dealer.models import Dealer
  18. from apps.web.merchant.exceptions import JdOpenParamsError
  19. from apps.web.merchant.constant import MerchantStatus, WechatSubjectType, IdentificationType, CertType, MicroBizType, ContactType, ALI_PAY_QR_CODE
  20. from apps.web.merchant.models import MerchantSourceInfo, MerchantAddress, JDOpenApplyInfo
  21. from apps.web.merchant.utils import query_merchant_settle, get_wechat_proxy, JdOpenParamsChecker, get_open_client, query_audit_result, get_merchant_by_version, \
  22. is_wechat_authorized, is_alipay_authorized, get_wechat_auth_info, get_alipay_auth_info
  23. from apps.web.merchant.validation import SettleValidator, BusinessValidator, CertificateValidator
  24. from apps.web.utils import error_tolerate, permission_required
  25. from apilib.exceptions import BaiDuApiImageError, BaiDuApiSysError, AliBankCardParamError, AliBankCardSysError
  26. from library.jdpsi.exceptions import JdPsiException
  27. logger = logging.getLogger(__name__)
  28. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取失败"))
  29. @permission_required(ROLE.dealer, ROLE.agent)
  30. def getMerchantOptions(request):
  31. """
  32. 获取商户的选项信息 在用户选择商户的时候进行加载
  33. """
  34. merchantOptions = WechatSubjectType.to_list()
  35. cardOptions = IdentificationType.to_list()
  36. certOptions = CertType.to_list()
  37. microOptions = MicroBizType.to_list()
  38. contactOptions = ContactType.to_list()
  39. return JsonOkResponse(payload={
  40. "merchantOptions": merchantOptions,
  41. "cardOptions": cardOptions,
  42. "certOptions": certOptions,
  43. "microOptions": microOptions,
  44. "contactOptions": contactOptions
  45. })
  46. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取地址失败"))
  47. @permission_required(ROLE.dealer, ROLE.agent)
  48. def address(request):
  49. addresses = MerchantAddress.get_all()
  50. return JsonOkResponse(payload=addresses)
  51. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"验证码获取失败"))
  52. @permission_required(ROLE.dealer, ROLE.agent)
  53. def sendMerchantSmsCode(request):
  54. if request.user.role == ROLE.dealer:
  55. dealerId = str(request.user.id)
  56. dealer = Dealer.objects.get(id=dealerId)
  57. agent = Agent.objects.get(id=dealer.agentId)
  58. else:
  59. agent = request.user
  60. payload = json.loads(request.body)
  61. mobile = payload["mobile"]
  62. # 防止接口被滥用 加上每日限制
  63. status, msg = jdMerchantSMSProvider.get(
  64. phoneNumber=mobile, productName=agent.productName,
  65. identify='{}_{}'.format(request.user.role, str(request.user.id)))
  66. if not status:
  67. return JsonErrorResponse(description=msg)
  68. return JsonOkResponse()
  69. @error_tolerate(logger = logger, nil = JsonErrorResponse(u"请重试"))
  70. @permission_required(ROLE.dealer, ROLE.agent)
  71. def confirmMerchant(request, version):
  72. """
  73. 确认商户的开通界面
  74. 确认开通前 需要检查该商户是否状态一切就绪
  75. 需要注意的是 返回正确的操作提示
  76. """
  77. owner = request.user
  78. # 获取微信的实名状态
  79. try:
  80. merchant = get_merchant_by_version(owner, version=version) # type: MerchantSourceInfo
  81. wechatAuth = is_wechat_authorized(merchant)
  82. aliPayAuth = is_alipay_authorized(merchant)
  83. except MerchantError as me:
  84. return JsonErrorResponse(description=me.message)
  85. except Exception as e:
  86. logger.error("get wx merchant intention status error = {}".format(e))
  87. return JsonErrorResponse(u"获取实名状态失败,请刷新页面重试")
  88. # 两个实名确认状态是否满足
  89. if not wechatAuth:
  90. return JsonErrorResponse(u"微信实名尚未确认,请前往查看实名确认状态")
  91. if not aliPayAuth:
  92. return JsonErrorResponse(u"支付宝实名尚未确认,请前往查看实名确认状态")
  93. # 检查商户的角色是否已经 满足切换为京东支付
  94. try:
  95. owner.check_merchant_conditions()
  96. except MerchantError as me:
  97. return JsonErrorResponse(description=me.message)
  98. sourceRecord = MerchantSourceInfo.get_source_record(owner)
  99. sourceRecord.to_success()
  100. return JsonOkResponse()
  101. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取信息失败,请重试"))
  102. @permission_required(ROLE.dealer)
  103. def getPartnerMerchantInfo(request):
  104. """
  105. 获取 合伙人的 商户(银行卡)的绑定的状态
  106. :param request:
  107. :return:
  108. """
  109. return JsonErrorResponse(u"请登录合伙人账户进行商户开通")
  110. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"保存信息失败"))
  111. @permission_required(ROLE.dealer)
  112. def savePartnerMerchantInfo(request):
  113. return JsonErrorResponse(u"请登录合伙人账户完成商户开通")
  114. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"信息获取失败"))
  115. @permission_required(ROLE.dealer, ROLE.agent)
  116. def getAccount(request):
  117. user = request.user # type: Dealer
  118. try:
  119. merchant = MerchantSourceInfo.get_source_record(user)
  120. # 没有商户号 说明要么没有开通商户 要么商户是手动切换的 时间就换为大规模切换商户的开始时间
  121. if not merchant.status != MerchantStatus.SUCCESS:
  122. payload = {"merchantNo": "", "startTime": "2022-02-08"}
  123. else:
  124. payload = {"merchantNo": merchant.merchantNo, "startTime": merchant.dateTimeAdded.strftime("%Y-%m-%d")}
  125. except Exception:
  126. return JsonErrorResponse(u"查询商户失败")
  127. return JsonOkResponse(payload=payload)
  128. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"信息获取失败"))
  129. @permission_required(ROLE.dealer, ROLE.agent, ROLE.subaccount)
  130. def getSettle(request):
  131. """
  132. 获取商户的结算 转换为获取一段时间的
  133. """
  134. st = request.GET.get("startTime")
  135. et = request.GET.get("endTime")
  136. if not all([st, et]):
  137. return JsonErrorResponse(description=u"未查询到结算信息(10001)")
  138. # 转换日期格式区间
  139. try:
  140. st = datetime.datetime.strptime(st, "%Y-%m-%d")
  141. et = datetime.datetime.strptime(et, "%Y-%m-%d")
  142. except ValueError:
  143. return JsonErrorResponse(u"未查询到结算信息(10002)")
  144. if st > et:
  145. return JsonErrorResponse(u"未查询到结算信息(10003)")
  146. user = request.user
  147. try:
  148. result = query_merchant_settle(user, st, et)
  149. except JdPsiException as e:
  150. return JsonErrorResponse(description=u"查询失败,{}".format(e.errMsg))
  151. if not result:
  152. return JsonErrorResponse(u"未查询到结算信息(10004)")
  153. # 结构化数据
  154. settleMap = {_['settleDate']: _ for _ in result["dataList"]}
  155. dataList = list()
  156. for i in range((et-st).days + 1):
  157. _timeKey = (et-datetime.timedelta(days=i)).strftime("%Y-%m-%d")
  158. if _timeKey in settleMap:
  159. dataList.append(settleMap[_timeKey])
  160. else:
  161. dataList.append({
  162. u'orderStatus': u'UNKNOWN',
  163. u'remark': u'上日未产生收益',
  164. u'settleAccountNo': u'',
  165. u'settleDate': _timeKey,
  166. u'settlementAmount': u''
  167. })
  168. payload = {
  169. "dataList": dataList
  170. }
  171. return JsonOkResponse(payload=payload)
  172. @error_tolerate(logger=logger, nil=JsonOkResponse())
  173. @permission_required(ROLE.dealer)
  174. def getAuths(request, version):
  175. """
  176. 获取实名信息的列表
  177. """
  178. user = request.user
  179. mer = get_merchant_by_version(user, version) # type: Optional[JDOpenApplyInfo, MerchantSourceInfo]
  180. # 目前来说只有微信和支付宝的实名确认
  181. # 微信
  182. wechat = get_wechat_auth_info(merchant=mer)
  183. # 支付宝
  184. alipay = get_alipay_auth_info(merchant=mer)
  185. return JsonOkResponse(payload={"dataList": [wechat, alipay]})
  186. # ------------------------------- 新的接口 -----------------------------------------
  187. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"图片上传失败"))
  188. @permission_required(ROLE.dealer)
  189. def uploadImage(request):
  190. image = request.FILES.get("file")
  191. _type = request.GET.get("imageType")
  192. ocr = request.GET.get("ocr", False)
  193. cardSide = request.GET.get("cardSide")
  194. logger.info("[uploadImage] type = {}, ocr = {}, cardSide = {}, user = {}".format(_type, ocr, cardSide, request.user.id))
  195. # 防止文件类型上传错误
  196. fileSuffix = image.name.split(".")[1]
  197. if fileSuffix not in ["jpg", "jpeg", "png"]:
  198. return JsonErrorResponse(description = u"图片类型错误,请上传指的的图片类型(jpg,jpeg,png)。")
  199. # 根据类型以及其他参数 进行ocr识别 反馈有效的信息
  200. if int(ocr):
  201. try:
  202. recognizer = ImageRecognizer(request.user.id, inMemFile=image)
  203. if _type == "idCard":
  204. ocrData = recognizer.recognize_identify_card(cardSide, callback=parse_identify_image)
  205. elif _type == "bankCard":
  206. ocrData = recognizer.recognize_bank_card(callback=parse_bank_image)
  207. elif _type == "businessCard":
  208. ocrData = recognizer.recognize_business_license(callback=parse_business_image)
  209. else:
  210. ocrData = dict()
  211. except (BaiDuApiImageError, BaiDuApiSysError) as be:
  212. return JsonErrorResponse(description=be.message)
  213. except BaiDuApiSysError:
  214. return JsonErrorResponse(description=u"图像上传失败,请重试")
  215. else:
  216. logger.debug("[uploadImage] not need ocr!")
  217. ocrData = dict()
  218. # 上传保存图片
  219. uploader = AliOssFileUploader(inputFile=image, uploadType= 'merchant')
  220. try:
  221. outputUrl = uploader.upload()
  222. except InvalidFileSize as e:
  223. return JsonErrorResponse(description=e.message)
  224. except InvalidFileName as e:
  225. return JsonErrorResponse(description=e.message)
  226. payload = {
  227. "ocrData": ocrData,
  228. "url": outputUrl
  229. }
  230. return JsonOkResponse(payload=payload)
  231. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"查找银行失败"))
  232. @permission_required(ROLE.dealer)
  233. def getBankName(request):
  234. card = request.GET.get("card")
  235. try:
  236. result = BankRecognizer(request.user.id).query_bank(card or "")
  237. except AliBankCardParamError as pe:
  238. return JsonErrorResponse(description=pe.message)
  239. except AliBankCardSysError as se:
  240. logger.error("[getBankName] error = {}".format(se))
  241. return JsonErrorResponse(u"查找银行失败")
  242. return JsonOkResponse(payload=result["data"][0])
  243. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"查找银行失败"))
  244. @permission_required(ROLE.dealer)
  245. def getBankList(request):
  246. """
  247. 查询支持的银行
  248. """
  249. search = request.GET.get("search")
  250. if not search:
  251. return JsonErrorResponse(description=u"请输入关键词查询")
  252. try:
  253. result = BankRecognizer(request.user.id).query_all_bank(search)
  254. except AliBankCardParamError as pe:
  255. return JsonErrorResponse(description=pe.message)
  256. except AliBankCardSysError as se:
  257. logger.error("[getBankList] error = {}".format(se))
  258. return JsonErrorResponse(u"查找银行失败")
  259. return JsonOkResponse(payload=result["data"])
  260. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"查找支行失败"))
  261. @permission_required(ROLE.dealer)
  262. def getSubBankCodeList(request):
  263. """
  264. 查询支行列表
  265. """
  266. pageIndex = int(request.GET.get("pageIndex", 1))
  267. queryKey = request.GET.get("queryKey", "")
  268. province = request.GET.get("bankProvince")
  269. city = request.GET.get("bankCity")
  270. bank = request.GET.get("bankName")
  271. card = request.GET.get("bankCardCode")
  272. if not all(["province", "city", "bank", "card"]):
  273. return JsonErrorResponse(description=u"参数错误")
  274. try:
  275. result = BankRecognizer(request.user.id).query_sub_code(
  276. bank=bank, card=card,
  277. province=province, city=city, queryKey=queryKey, page=pageIndex
  278. )
  279. except AliBankCardParamError as pe:
  280. return JsonOkResponse(description=pe.message)
  281. except AliBankCardSysError as se:
  282. logger.error("[getBankList] error = {}".format(se))
  283. return JsonErrorResponse(u"查找银行失败")
  284. return JsonOkResponse(payload=result["data"])
  285. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"查找支行失败"))
  286. @permission_required(ROLE.dealer)
  287. def getSubBankCode(request, subCode):
  288. """
  289. 通过联行号 反查银行的信息
  290. """
  291. try:
  292. result = BankRecognizer(request.user.id).query_sub_bank(subCode)
  293. except AliBankCardParamError as pe:
  294. return JsonErrorResponse(description=pe.message)
  295. except AliBankCardSysError as se:
  296. logger.error("[getBankList] error = {}".format(se))
  297. return JsonErrorResponse(u"查找银行失败")
  298. return JsonOkResponse(payload=result["data"][0])
  299. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取商户信息失败"))
  300. @permission_required(ROLE.dealer)
  301. def getMerchantInfo(request, version):
  302. """
  303. 获取商户的基本信息
  304. """
  305. user = request.user
  306. mer = get_merchant_by_version(user, version)
  307. merInfo = mer.get_merchant_info()
  308. helpInfo = mer.get_help_info()
  309. payload = {
  310. "merchantInfo": merInfo,
  311. "helpInfo": helpInfo
  312. }
  313. return JsonOkResponse(payload=payload)
  314. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取二维码失败"))
  315. @permission_required(ROLE.dealer)
  316. def getAuthQrCode(request, version):
  317. """
  318. 获取微信实名的二维码
  319. """
  320. user = request.user
  321. mer = get_merchant_by_version(user, version)
  322. wechatProxy = get_wechat_proxy()
  323. try:
  324. result = wechatProxy.get_merchant_audit(mer.wxSource.applymentId)
  325. except MerchantError:
  326. logger.error("[getAuthQrCode] ownerId = {} query error!".format(mer.ownerId))
  327. return
  328. if "qrcode_data" not in result:
  329. return JsonOkResponse(u"获取实名二维码失败,请联系平台客服处理")
  330. return JsonOkResponse(payload={"qrCode": "data:image/png;base64,{}".format(result["qrcode_data"])})
  331. class CertificateInfo(View):
  332. """
  333. """
  334. def __init__(self, **kwargs):
  335. super(CertificateInfo, self).__init__(**kwargs)
  336. self._owner = None
  337. self._merchant = None
  338. def dispatch(self, request, *args, **kwargs):
  339. self._owner = request.user
  340. self._merchant = MerchantSourceInfo.get_source_record(self._owner) # type: MerchantSourceInfo
  341. return super(CertificateInfo, self).dispatch(request, *args, **kwargs)
  342. def get(self, request):
  343. """
  344. 获取商户的证件信息
  345. """
  346. data = self._merchant.get_certificate_info()
  347. data["merchantNo"] = self._merchant.merchantNo
  348. data["merchantType"] = self._merchant.wxSource.subjectInfo.mainType
  349. return JsonOkResponse(payload=data)
  350. def post(self, request):
  351. """
  352. 存储商户的证件信息
  353. """
  354. data = json.loads(request.body)
  355. logger.info(
  356. "[CertificateInfo _ post] save merchant certificate info, user = {}, data = {}".format(self._owner.id, data)
  357. )
  358. validator = CertificateValidator(data)
  359. if not validator.is_valid():
  360. return JsonErrorResponse(description=json.dumps(validator.str_errors).decode("unicode-escape"))
  361. if not self._merchant.support_modify():
  362. return JsonErrorResponse(description=u"当前商户状态已锁定,无法进行修改")
  363. with memcache_lock(key="merchant_{}".format(self._owner.id), value="1", expire=10) as acquired:
  364. if not acquired:
  365. return JsonErrorResponse(description=u"当前商户正在修改中,请勿重复提交")
  366. self._merchant = self._merchant.save_certificate_info(validator.validated_data)
  367. data = self._merchant.get_certificate_info()
  368. data["merchantNo"] = self._merchant.merchantNo
  369. data["merchantType"] = self._merchant.wxSource.subjectInfo.mainType
  370. return JsonOkResponse(payload=data)
  371. class SettlementInfo(View):
  372. def __init__(self, **kwargs):
  373. super(SettlementInfo, self).__init__(**kwargs)
  374. self._owner = None
  375. self._merchant = None
  376. def dispatch(self, request, *args, **kwargs):
  377. self._owner = request.user
  378. self._merchant = MerchantSourceInfo.get_source_record(self._owner) # type: MerchantSourceInfo
  379. return super(SettlementInfo, self).dispatch(request, *args, **kwargs)
  380. def get(self, request):
  381. data = self._merchant.get_settlement_info()
  382. data["merchantNo"] = self._merchant.merchantNo
  383. data["merchantType"] = self._merchant.wxSource.subjectInfo.mainType
  384. return JsonOkResponse(payload=data)
  385. def post(self, request):
  386. """
  387. 存储商户的结算信息
  388. """
  389. data = json.loads(request.body)
  390. logger.info(
  391. "[SettlementInfo _ post] save merchant settle info, user = {}, data = {}".format(self._owner.id, data)
  392. )
  393. validator = SettleValidator(data)
  394. if not validator.is_valid():
  395. return JsonErrorResponse(description=json.dumps(validator.str_errors).decode("unicode-escape"))
  396. if not self._merchant.support_modify():
  397. return JsonErrorResponse(description=u"当前商户状态已锁定,无法进行修改结算信息")
  398. with memcache_lock(key="merchant_{}".format(self._owner.id), value="1", expire=10) as acquired:
  399. if not acquired:
  400. return JsonErrorResponse(description=u"当前商户正在修改中,请勿重复提交")
  401. self._merchant = self._merchant.save_settlement_info(validator.validated_data)
  402. data = self._merchant.get_settlement_info()
  403. data["merchantNo"] = self._merchant.merchantNo
  404. data["merchantType"] = self._merchant.wxSource.subjectInfo.mainType
  405. return JsonOkResponse(payload=data)
  406. class BusinessInfo(View):
  407. def __init__(self, **kwargs):
  408. super(BusinessInfo, self).__init__(**kwargs)
  409. self._owner = None
  410. self._merchant = None
  411. def dispatch(self, request, *args, **kwargs):
  412. self._owner = request.user
  413. self._merchant = MerchantSourceInfo.get_source_record(self._owner) # type: MerchantSourceInfo
  414. return super(BusinessInfo, self).dispatch(request, *args, **kwargs)
  415. def get(self, request):
  416. data = self._merchant.get_business_info()
  417. data["merchantNo"] = self._merchant.merchantNo
  418. data["merchantType"] = self._merchant.wxSource.subjectInfo.mainType
  419. return JsonOkResponse(payload=data)
  420. def post(self, request):
  421. """
  422. 存储商户的 营业信息
  423. """
  424. data = json.loads(request.body)
  425. logger.info(
  426. "[BusinessInfo _ post] save merchant settle info, user = {}, data = {}".format(self._owner.id, data)
  427. )
  428. businessInfo = data.get("businessInfo", dict())
  429. mobile = data.get("mobile", "")
  430. smsCode = data.get("SMSCode")
  431. result, msg = jdMerchantSMSProvider.verify(mobile, smsCode)
  432. if not result:
  433. return JsonErrorResponse(description=msg)
  434. validator = BusinessValidator(businessInfo)
  435. if not validator.is_valid():
  436. return JsonErrorResponse(description=json.dumps(validator.str_errors).decode("unicode-escape"))
  437. if not self._merchant.support_modify():
  438. return JsonErrorResponse(description=u"当前商户状态已锁定,无法进行修改")
  439. with memcache_lock(key=str(self._merchant.id), value="1") as acquired:
  440. if not acquired:
  441. return JsonErrorResponse(description=u"当前商户正在修改中,请勿重复提交")
  442. self._merchant = self._merchant.save_business_info(validator.validated_data)
  443. self._merchant = self._merchant.save_mobile_info(mobile)
  444. data = self._merchant.get_business_info()
  445. data["merchantNo"] = self._merchant.merchantNo
  446. data["merchantType"] = self._merchant.wxSource.subjectInfo.mainType
  447. self._merchant.to_waiting()
  448. return JsonOkResponse(payload=data)
  449. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取行业列表失败"))
  450. def getIndustry(request):
  451. num = request.GET.get("parent")
  452. openClient = get_open_client()
  453. if not num:
  454. result = openClient.support.query_industry()
  455. else:
  456. result = openClient.support.query_sub_industry(num)
  457. return JsonOkResponse(payload=result["data"])
  458. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取地址信息失败"))
  459. def getArea(request):
  460. province = request.GET.get("province")
  461. city = request.GET.get("city")
  462. openClient = get_open_client()
  463. if not province and not city:
  464. result = openClient.support.query_province()
  465. elif province:
  466. result = openClient.support.query_city(province)
  467. else:
  468. result = openClient.support.query_district(city)
  469. return JsonOkResponse(payload=result["data"])
  470. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取支付产品失败"))
  471. def getPayType(request):
  472. openClient = get_open_client()
  473. result = openClient.support.query_pay_type()
  474. return JsonOkResponse(payload=result["data"])
  475. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取银行列表失败"))
  476. def getBanks(request):
  477. keyWork = request.GET.get("keyWord")
  478. openClient = get_open_client()
  479. result = openClient.support.query_bank(keyWork)
  480. return JsonOkResponse(payload=result["data"])
  481. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取支行列表"))
  482. def getSubBanks(request):
  483. bankCode = request.GET.get("bankCode")
  484. keyWork = request.GET.get("keyWord")
  485. if not bankCode or not keyWork:
  486. return JsonOkResponse()
  487. openClient = get_open_client()
  488. result = openClient.support.query_sub_bank(bankCode, keyWork)
  489. return JsonOkResponse(payload=result["data"])
  490. @error_tolerate(logger=logger, nil=HttpResponse(status=500))
  491. def auditNotify(request):
  492. customerNum = request.GET.get("customerNum")
  493. auditStatus = request.GET.get("status")
  494. auditOpinion = request.GET.get("auditOpinion")
  495. return HttpResponse(status=200)
  496. class JdOpenMerchant(View):
  497. """
  498. 哆啦宝商户的获取和保存
  499. """
  500. def __init__(self, **kwargs):
  501. super(JdOpenMerchant, self).__init__(**kwargs)
  502. self._owner = None
  503. self._merchant = None
  504. def dispatch(self, request, *args, **kwargs):
  505. self._owner = request.user
  506. self._merchant = JDOpenApplyInfo.get_merchant_by_owner(self._owner) # type: Optional[None, JDOpenApplyInfo]
  507. return super(JdOpenMerchant, self).dispatch(request, *args, **kwargs)
  508. def get(self, request):
  509. if self._merchant is None:
  510. mer = JDOpenApplyInfo()
  511. else:
  512. mer = self._merchant
  513. return JsonOkResponse(payload=mer.get_info())
  514. def post(self, request):
  515. """
  516. 创建商户
  517. """
  518. payload = json.loads(request.body)
  519. logger.info("[{} post] user = {}, request body = {}, ".format(self.__class__.__name__, self._owner, payload))
  520. try:
  521. mer = JdOpenParamsChecker(**payload).create(self._owner)
  522. except JdOpenParamsError as jpe:
  523. return JsonErrorResponse(description=jpe.message)
  524. # 切换商户的资料到提交的状态
  525. mer = mer.to_submit()
  526. return JsonOkResponse()
  527. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"获取商户状态失败"))
  528. def getMerchantAudit(request):
  529. """
  530. 获取商户的审核状态
  531. """
  532. merchantId = request.GET.get("merchantId")
  533. if not merchantId:
  534. return JsonErrorResponse(description=u"商户编号错误,请刷新界面重试(10001)")
  535. mer = JDOpenApplyInfo.get_merchant_by_id(merchantId)
  536. if not mer:
  537. return JsonErrorResponse(description=u"商户编号错误,请刷新界面重试(10002)")
  538. openClient = get_open_client()
  539. result = query_audit_result(mer, openClient)
  540. return JsonOkResponse()