def api_shop_web_top_up_callback_post(): params = ctx.request.input() logging.info("[WEB/APP]Alipay callback request-params=%s." % params) result = web_trade_notice_handler(params) # 充值成功: 记录result到对应的充值记录; 记录到流水表; 更新商户余额 if result['result'] == 'success': FlowLogic.top_up_success(**result) # 充值失败: 记录result到对应的充值记录; else: FlowLogic.notified_of_failure(**result) return 'success'
def api_shop_wxpay_top_up_callback(): # 给微信支付的第三方回调 body = ctx.request.get_body() logging.info('[WX-TOP-UP]wxPay callback request-body=%s' % body) # result, out_trade_no => transact_num result = wx_callback(body) if result['result'] == 'success': msg = FlowLogic.top_up_success(**result) return {'ret': generate_xml({'return_code': 'SUCCESS'}), 'msg': msg} else: msg = FlowLogic.notified_of_failure(**result) return {'ret': generate_xml({'return_code': 'FAIL'}), 'msg': msg}
def api_shop_wap_transfer_callback(): kw = ctx.request.input() logging.info("[WAP-TRANSFER]Alipay callback request-body=%s." % kw) result = wap_transfer_notice_handler(kw) if result['result'] == 'success': FlowLogic.transfer_success(**result) logging.info('[WAP-TRANSFER] success.') else: FlowLogic.notified_of_failure(**result) logging.info('[WAP-TRANSFER] failure.') return 'success'
def api_shop_cash_flow(): """ @api {post} /shop/cash_flow [商户]扣款/退款 @apiName api_shop_cash_flow @apiGroup shop @apiParam {string(6)} transact_type 交易类型, 只能是(`PAY`, `REFUND`)中的任意一个. @apiParam {string(24)} shop_id 商户id, 如 "56c2d708a785c90ab0014d00". @apiParam {decimal} cash 充值金额(元),精确到小数点后2位, ROUND_DOWN. @apiParamExample {json} 请求示例: Request Method: POST Request URL: http://123.57.45.209:9099/shop/cash_flow Request Body: { "transact_type": "pay", "shop_id": "56c2d708a785c90ab0014d00", "cash": 0.01 } @apiSuccessExample {string} 扣款/退款成功返回交易流水号示例: HTTP/1.1 200 OK "20160301151746" @apiErrorExample {json} 失败示例: HTTP 400 ValueError: { "message": "error message" } """ params = ctx.request.input() # 交易类型检查: 'PAY', 'REFUND' if safe_str(params.transact_type).strip().upper() not in ('PAY', 'REFUND'): raise ValueError("transact_type[%s] should be in ('PAY', 'REFUND')." % params.transact_type) params.transact_type = safe_str(params.transact_type).strip() # 金额检查: if 'cash' not in params: raise ValueError( "Should provide me with params [cash] and [shop_id] in body.") cash = round(decimal.Decimal(params.cash, 2), 2) if cash <= 0.0: raise ValueError("cash[%s] should be at least [0.01]." % params.cash) params.cash = cash # 扣款: 记录到流水表; 更新商户余额; params.transact_num = gen_transact_num() params.transact_type = str(params.transact_type).upper() if params.transact_type == TRANSACT_TYPE.PAY: return FlowLogic.deduct(**params) elif params.transact_type == TRANSACT_TYPE.REFUND: return FlowLogic.refund(**params)
def api_shop_wap_top_up_callback_post(): # 给支付宝充值的第三方回调 params = ctx.request.input() logging.info("[WAP-TOP-UP]Alipay callback request-params=%s." % params) # result,out_trade_no=>transact_num result = wap_trade_notice_handler(params) # 充值成功: 记录result到对应的充值记录; 记录到流水表; 更新商户余额 if result['result'] == 'success': FlowLogic.top_up_success(**result) # 充值失败: 记录result到对应的充值记录; else: FlowLogic.notified_of_failure(**result) return 'success'
def api_shop_native_alipay_callback(): # 给支付宝扫二维码支付的第三方回调 body = ctx.request.get_body() logging.info('[ALI-PAY]AliPay callback request-body=%s' % body) result = alipay_native_callback(body) if result['result'] == 'success': msg = FlowLogic.transfer_success(**result) return { 'ret': 'success', 'msg': msg, 'transact_num': result['transact_num'], 'trade_no': result['trade_no'] } else: msg = FlowLogic.notified_of_failure(**result) return {'ret': 'success', 'msg': msg}
def api_shop_native_wx_pay_callback(): # 给微信支付的第三方回调 body = ctx.request.get_body() logging.info('[WX-PAY]wxPay callback request-body=%s' % body) result = wx_callback(body) if result['result'] == 'success': msg = FlowLogic.transfer_success(**result) return { 'ret': generate_xml({'return_code': 'SUCCESS'}), 'msg': msg, 'transact_num': result['transact_num'], 'trade_no': result['trade_no'] } else: msg = FlowLogic.notified_of_failure(**result) return {'ret': generate_xml({'return_code': 'FAIL'}), 'msg': msg}
def api_outsource_cash_flow(cash_flow_type): # 参数处理 cash_flow_type = str(cash_flow_type).upper().strip() kw = ctx.request.input() transact_num = utc_8_day().replace( '-', '') + shortuuid.ShortUUID().random(length=6) kw['transact_num'] = kw.get('transact_num', transact_num) kw['type'] = cash_flow_type # 数据1: 可提现can_cash = VALIDATED - APPLY_WITHDRAW # 数据2: 待财务处理finance = APPLY_WITHDRAW - PAID - DECLINE # 数据3: 财务已打款paid = PAID # 数据4: 财务已拒绝decline = DECLINE # 后台已审核的派件员运单 if cash_flow_type == CASH_FLOW.VALIDATED: # 提现流水 {transact_num, man_id, type, cash, expr_num, operator, create_time} FlowLogic.push_validated(**kw) # 申请提现 elif cash_flow_type == CASH_FLOW.APPLY_WITHDRAW: # 限制1: 如果是系统有效全职,不可提现. ==>暂时通过登录来控制 # 限制2: 限额设为sum(VALIDATED)-sum(APPLY_WITHDRAW) # 提现流水 {transact_num, man_id, type, cash, create_time} FlowLogic.push_apply_withdraw(**kw) # 财务打款 elif cash_flow_type == CASH_FLOW.PAID: # 根据transact_num拿对应的man_id # 提现流水更新 {transact_num, "PAID", cash, <operator>, update_time} FlowLogic.paid(**kw) # 财务拒绝 elif cash_flow_type == CASH_FLOW.DECLINE: # 提现流水更新 {transact_num, "DECLINE", cash, <operator>, update_time, remark} FlowLogic.decline(**kw) else: raise ValueError("CASH_FLOW[%s] should be in CASH_FLOW%s." % (cash_flow_type, CASH_FLOW)) return kw['transact_num']
def api_retrieve_flow(): filter_col_str, where, group_by_limit, args = complex_query( ctx.request.input()) return FlowLogic.find_by(filter_col_str, where, group_by_limit, *args)
def api_retrieve_flow(): """ @api {post} /shop/flow/complex_query/:page [商户]资金流水复杂查询 @apiDescription 查询商户余额,消费金额等. @apiName api_retrieve_flow @apiGroup shop @apiParam {list} filter_col `["shop_id", "cash" ...]`. 表`flow`中的字段列表. `[]`表示取所有字段. @apiParam {str} [group_by] 按照什么来group by. 表`flow`中的字段. 如`shop_id`. @apiParam {str} op `AND`或者`OR`. 表示如何组合过滤条件. @apiParam {int} is_not 如果有这个key, 则表示该字段上的过滤条件要取非. @apiParam {int} page 2. 表示第二页, 从1开始. [1:2147483648), 分页查. <=20条数据, 一次返回所有; >20条, 一次返回20条. @apiParamExample {json} 请求body示例: { "filter_col": ["shop_id", "sum(cash) as paid"], "query": { "op": "AND", "exprs": [ {"shop_id": {"in": ["56c2d708a785c90ab0014d00", "56c2d708a785c90ab0014d00"]}}, {"type": {"like": "%PAY%"}}, {"is_not":1, "shop_name": {"like": "%测试%"}} ] }, "group_by": "shop_id" } @apiParamExample {json} 对于"query"部分的解释 expr_json_example: expr_json_atom = { "op": "AND", "exprs": [ {"shop_id": {"in": ["56c2d708a785c90ab0014d00", "56c2d708a785c90ab0014d00"]}}, {"type": {"like": "%PAY%"}}, {"is_not":1, "shop_name": {"like": "%测试%"}} ] } expr_json_level_2 = { "op": "OR", "exprs": [ expr_json_atom, # expr_json_atom, ] } @apiSuccessExample {json} 成功示例(filter_col列表长度是1,即查询单个值时): HTTP/1.1 200 OK [0.01, 0.02, 0.5, 0.0] @apiSuccessExample {json} 成功示例(filter_col列表长度大于1,即查询多个值时): HTTP/1.1 200 OK [ { "shop_id": "56c2d708a785c90ab0014d00", "paid": 0.23 } ] """ filter_col_str, where, limit, args = complex_query(ctx.request.input()) flows = FlowLogic.find_by(filter_col_str, where, limit, *args) _count = FlowLogic.found_rows(filter_col_str, where, *args) ctx.response.set_header("X-Resource-Count".encode('utf-8'), _count) return flows