def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- 不实现了,废弃,使用detail_course ret_data = { "pass_to_download": 1, # 是否可下载,0 不可下载, 1 可以下载 "down_url": "https://pretty.f8cam.com/static/test.mp4", # 下载链接,pass_to_download==0时为空 "msg": "测试中,不能下载", # pass_to_download==0时提示信息 } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v2'): web.header('Content-Type', 'application/json') if version not in ('v2', 'v3'): return json.dumps({'ret': -999, 'msg': '版本错误!'}) print 'version=', version param = web.input(app_id='', session='', secret='', sign='') if '' in (param.app_id, param.session, param.secret, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.secret]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) db_user = db.app_user.find_one({'uname': uname['uname']}, { 'coupon': 1, 'credit': 1 }) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 返回 return json.dumps({ 'ret': 0, 'data': { 'credit': '%.2f' % db_user.get('credit', 0.0) } }) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self, version='v2'): web.header('Content-Type', 'application/json') if version not in ('v2','v3'): return json.dumps({'ret' : -999, 'msg' : '版本错误!'}) print 'version=',version param = web.input(app_id='', session='', order_id='', star='', sign='') if '' in (param.app_id, param.session, param.order_id, param.star, param.sign): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign([param.app_id, param.session, param.order_id, param.star]) if md5_str!=param.sign: return json.dumps({'ret' : -1, 'msg' : '签名验证错误'}) db_user = db.app_user.find_one({'uname':uname['uname']},{'coupon':1}) if db_user==None: # 不应该发生 return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'}) # 订单打分 db.order_app.update_one({'order_id' : param.order_id, 'user':{'$in':uname.values()}},{ '$set' : { 'star': int(param.star) }, '$push' : { 'history' : (app_helper.time_str(), uname['uname'], '订单打分')}, }) return json.dumps({'ret' : 0, 'msg' : '订单已打分!'}) else: return json.dumps({'ret' : -4, 'msg' : '无效的session'})
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='', userid='', object_id='', action='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, param.tick, param.userid, param.object_id, param.action): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) if param['action'].upper() not in ['AUTH', 'CANCEL']: return json.dumps({'ret': -7, 'msg': '无效的action取值'}) r4 = db.obj_store.find_one({'obj_id': param['object_id']}) if r4 is None: return json.dumps({'ret': -6, 'msg': '无效的object_id'}) # userid 支持多个,用英文逗号分隔 userid_list = param['userid'].split(',') r4 = db.employee_auth.find({ 'owner_userid': uname['userid'], 'employee_userid': { '$in': userid_list } }) #if r3 is None: # return json.dumps({'ret' : -5, 'msg' : '此userid不是当前店主的店员'}) for r3 in r4: # 操作多个店员 if param['action'].upper() == 'AUTH': # 添加 if param['object_id'] not in r3['object_list']: db.employee_auth.update_one( {'_id': r3['_id']}, {'$push': { 'object_list': param['object_id'] }}) else: # 删除 if param['object_id'] in r3['object_list']: r3['object_list'].remove(param['object_id']) db.employee_auth.update_one( {'_id': r3['_id']}, {'$set': { 'object_list': r3['object_list'] }}) # 返回 return json.dumps({ 'ret': 0, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- r2 = credit_helper.check_balance(uname['userid']) ret_data = { "cash": r2, # 余额 单位 分 } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', progress='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, param.progress, param.tick): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if not param.progress.isdigit(): return json.dumps({'ret' : -3, 'msg' : 'progress参数必须是数字'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret' : -4, 'msg' : '无效的session'}) #-------------------------------------------------- r2 = db.obj_store.find_one({'obj_id' : param.object_id}) if r2 is None: return json.dumps({'ret' : -5, 'msg' : '错误的object_id'}) db.progress_info.update({'userid':uname['userid'],'obj_id':param.object_id},{'$set':{ 'progress' : int(param.progress), 'last_time' : app_helper.time_str(), }}, upsert=True) # 返回 return json.dumps({ 'ret' : 0, })
def POST(self, version='v2'): web.header('Content-Type', 'application/json') if version not in ('v2', 'v3'): return json.dumps({'ret': -999, 'msg': '版本错误!'}) print 'version=', version param = web.input(app_id='', session='', voice='', sign='') if '' in (param.app_id, param.session, param.voice, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.voice]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) # 存入db db.customer_voice.insert_one({ 'uname': uname['uname'], 'voice': param.voice, 'time': app_helper.time_str(), }) # 返回 return json.dumps({'ret': 0}) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) r2 = db.app_user.find_one({'userid': uname['userid'], 'type': 1}) if r2 and r2.get('upload_licence', '') == '': return json.dumps({'ret': -5, 'msg': '未上传营业执照照片'}) # 设置店主审核状态 db.app_user.update_one({ 'userid': uname['userid'], 'type': 1 }, {'$set': { 'user_role': 3, 'user_role_status': 'WAIT', }}) # 返回 return json.dumps({ 'ret': 0, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- heart_data = [] r2 = db.heart_info.find({'userid': uname['userid']}) for i in r2: r3 = db.obj_store.find_one({'obj_id': i['obj_id']}) if r3 is None: continue r4 = db.progress_info.find_one({ 'userid': uname['userid'], 'obj_id': i['obj_id'] }) if r4 is None: progress = 0 else: progress = r4['progress'] if len(r3['image']) > 0: # 取第1张图 image_url = app_helper.image_url(r3['image'][0]) else: image_url = '' heart_data.append({ "object_id": i['obj_id'], "title": r3['title'], "type": 1, # 类型: 1 课程, 2 专辑 "object_type": 1 if r3['media'] == 'video' else 2, # 1- 视频 2 - 音频 "length": r3['length'], # 长度,单位 分钟 "progress": progress, # 进度百分比,如果是未购买课程,此字段为-1 "image": image_url, }) ret_data = { "heart": heart_data, } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', order_trade_id='', data='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.order_trade_id, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- # 修改充值订单状态 r2 = db.order_recharge.find_one_and_update( {'recharge_id': param.order_trade_id}, # 实充值订单号 { '$set': { 'status': 'PREPAY' }, '$push': { 'order_paid_data': param.data }, }, ) if r2 is None: return json.dumps({'ret': -3, 'msg': '未找到订单'}) # 如果是IAP订单,使用data数据检查支付情况,backrun异步检查 if r2['pay_type'] == 'iap': if r2['status'] == 'DUE': # 只有DUE才推,防止重复支付 2017-06-21, gt app_helper.event_push_notify('iap', param.data, param.order_trade_id) else: print 'Error: 可疑重复支付', param.order_trade_id ret_data = { "order_trade_id": param.order_trade_id, "due": r2['due'], # 应付金额,单位 分 "paid": r2['due'], # 实付金额 "status": "PENDING", # 订单状态:PAID/PENDING 已支付/待支付 } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='', nickname='', headimage='', image_type='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- update_set = {} if len(param['nickname']) > 0: update_set['nickname'] = param['nickname'] if len(param['headimage']) > 0: if param['image_type'].upper() not in ('JPG', 'PNG'): return json.dumps({'ret': -5, 'msg': 'image_type取值错误'}) data = urllib.unquote_plus(param['headimage']) #print data #print len(data) # 保存图片 filename = app_helper.write_image(param['image_type'], data) update_set['img_url'] = app_helper.image_url(filename) # 图片url if len(update_set) > 0: # 只保存在手机号码账户里 type==1 db.app_user.update_one({ 'userid': uname['userid'], 'type': 1 }, {'$set': update_set}) # 获取当前设置 r4 = app_helper.get_user_detail(uname['userid']) # 返回 return json.dumps({ 'ret': 0, 'data': { 'headimage_url': r4['img_url'], } })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', page_size='', page_index='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.page_size, param.page_index, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.session != '': # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- r2 = db.obj_store.find_one({'obj_id': param.object_id}) if r2 is None: return json.dumps({'ret': -5, 'msg': '错误的object_id'}) r3 = db.comment_info.find( {'obj_id': param.object_id}, sort=[('last_time', -1)], # 按时间倒序 skip=int(param.page_size) * int(param.page_index), limit=int(param.page_size)) comment_data = [] for i in r3: r4 = app_helper.get_user_detail(i['userid']) comment_data.append({ "name": r4['nickname'], "image": r4['img_url'], # 头像 "star": i['star'], # 评的星级 "time": i['last_time'], "comment": i['comment'], }) ret_data = { "comment": comment_data, "total": len(comment_data), # 返回的课程数量,小于 page_size说明到末尾 "page_size": param.page_size, # 分页尺寸,与调用参数相同 "page_index": param.page_index, # 页索引 } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- r2 = db.obj_store.find_one({'obj_id': param['object_id']}) if r2 is None: return json.dumps({'ret': -5, 'msg': 'object_id错误'}) db_exam = db.exam_info.find( { 'obj_id': param['object_id'], 'available': 1 }, sort=[('exam_id', 1)]) exam_data = [] for i in db_exam: option = [] for j in i['option'][:4]: #只返回4个选项, 2017-06-19,gt if len(j.strip()) == 0: break option.append(j) exam_data.append({ "problem": i['question'], "option": option, }) ret_data = { "title": r2['title'], "note": r2.get('exam_note', ''), "question": exam_data, } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v2'): web.header('Content-Type', 'application/json') if version not in ('v2', 'v3'): return json.dumps({'ret': -999, 'msg': '版本错误!'}) print 'version=', version param = web.input(app_id='', session='', shop_id='', order_id='', addr_id='', coupon_id='', use_credit='', cart='', sign='') print param if '' in (param.app_id, param.session, param.shop_id, param.addr_id, param.cart, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign([ param.app_id, param.session, param.order_id, param.shop_id, param.addr_id, param.coupon_id, param.use_credit, param.cart ]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) # 记录版本信息 db.app_user.update_one({'uname': uname['uname']}, {'$set': { 'version': version }}) ret_json = checkout( version, uname, { 'session': param.session, 'order_id': param.order_id, 'shop_id': param.shop_id, 'addr_id': param.addr_id, 'coupon_id': param.coupon_id, 'cart': param.cart, 'app_id': param.app_id, 'use_credit': param.use_credit, }) return json.dumps(ret_json) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', tick='', session='') if '' in (param.app_id, param.dev_id, param.ver_code, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.session != '': # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) else: uname = None #-------------------------------------------------- now_tick = int(time.time()) # 拉取符合条件的类目, 时间区间,是否可用 r2 = db.category_info.find( { 'available': 1, '$and': [{ 'start_tick': { '$lt': now_tick } }, { 'expire_tick': { '$gt': now_tick } }], }, sort=[('sort_weight', 1)]) category_data = [] for i in r2: category_data.append({ 'key': i['cate_id'], 'title': i['title'], }) # 返回 return json.dumps({ 'ret': 0, 'data': { 'category': category_data, } })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) print uname['userid'] # 生成数据 employee = [] r3 = db.employee_auth.find({'owner_userid': uname['userid']}) for i in r3: # 统计此店员完成课程输量 complete_num = 0 for j in i['object_list']: r5 = db.progress_info.find_one({ 'userid': i['employee_userid'], 'obj_id': j }) if r5 and r5['progress'] == 100: complete_num += 1 # 获取店员信息 r4 = app_helper.get_user_detail(i['employee_userid']) employee.append({ 'userid': i['employee_userid'], 'real_name': r4.get('real_name', ''), # 店员真实名称 'nickname': r4.get('nickname', ''), # 昵称 'auth_num': len(i['object_list']), 'complete_num': complete_num, # 完成课程数, 'employee_tel': r4.get('mobile', ''), # 注册的号码 }) # 返回 return json.dumps({ 'ret': 0, 'data': { 'employee': employee }, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- r4 = app_helper.get_user_detail(uname['userid']) ret_data = { "name": r4['nickname'], "image": r4['img_url'], # 用户头像 "tel": r4['mobile'], # 用户注册手机号 "user_type": uname['type'], # 用户类型 # 店员信息 "shop_name": r4['shop_name'], "real_name": r4['real_name'], "shop_nickname": r4['shop_nickname'], "contact_info": r4['contact_info'], # 店主信息 "licence_pic": app_helper.image_url(r4['licence_pic']) if r4['licence_pic'] != '' else r4['licence_pic'], "shop_pic": [app_helper.image_url(x) for x in r4['shop_pic']], } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='', userid='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick, param.userid): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) # 生成数据 object_list = [] r3 = db.employee_auth.find_one({ 'owner_userid': uname['userid'], 'employee_userid': param.userid }) if r3: for i in r3['object_list']: r4 = db.obj_store.find_one({'obj_id': i}) if r4 is None: continue # 已授权店员数,只统计本店主的店员数 auth_num = db.employee_auth.find({ 'owner_userid': uname['userid'], 'object_list': r4['obj_id'] }).count() object_list.append({ 'object_id': r4['obj_id'], 'course_name': r4.get('title'), 'auth_num': auth_num, # 已授权店员数 , }) # 返回 return json.dumps({ 'ret': 0, 'data': { 'course': object_list }, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', pay_type='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, param.pay_type, param.tick): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret' : -4, 'msg' : '无效的session'}) #-------------------------------------------------- print uname # 检查是否可售 r = checkout_helper.checkout_obj(uname, param.object_id) if r['ret']<0: return json.dumps({'ret' : r['ret'], 'msg' : r['msg']}) # 消费余额 r2 = credit_helper.consume_balance(uname['userid'], r['due'], u'购买:'+r['title']) if r2==False: return json.dumps({'ret' : -9, 'msg' : '余额不足'}) # 保存商品到用户资产 db.user_property.update_one({'userid':uname['userid'], 'obj_id':param.object_id}, {'$set':{ 'obj_type' : r['obj_type'], 'status' : 'paid', 'order_trade_id' : r2 }}, upsert=True) # 销量加1 if r['obj_type']=='topic': db.topic_store.update_one({'tpc_id':param.object_id}, {'$inc': {'volume':1}}) else: db.obj_store.update_one({'obj_id':param.object_id}, {'$inc': {'volume':1}}) ret_data = { "pay_type" : 0, # 支付类型 "order_trade_id" : r2, } # 返回 return json.dumps({ 'ret' : 0, 'data' : ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='', shop_name='', real_name='', shop_nickname='', contact_info='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 4个信息字段必须填写 if '' in (param.shop_name.strip(), param.real_name.strip(), param.shop_nickname.strip(), param.contact_info.strip()): return json.dumps({'ret': -3, 'msg': '必填参数不能为空'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- # 只保存在手机号码账户里 type==1 db.app_user.update_one( { 'userid': uname['userid'], 'type': 1 }, { '$set': { 'vip_shopname': param['shop_name'], 'vip_realname': param['real_name'], 'vip_nickname': param['shop_nickname'], 'vip_contact': param['contact_info'], 'user_role': 1, # 店员身份 } }) # 返回 return json.dumps({ 'ret': 0, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='', object_id='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick, param.object_id): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) # 生成数据 user_list = [] # 只返回当前用户为店主的所属用户列表 r3 = db.employee_auth.find({ 'object_list': param.object_id, 'owner_userid': uname['userid'] }) for i in r3: r4 = db.app_user.find_one({ 'userid': i['employee_userid'], 'type': 1 }) # 电话用户 if r4 is None: continue user_list.append({ 'userid': r4['userid'], 'real_name': r4.get('vip_realname', ''), 'mobile_num': r4['uname'], }) # 返回 return json.dumps({ 'ret': 0, 'data': { 'employee': user_list }, })
def POST(self, version='v2'): web.header('Content-Type', 'application/json') if version not in ('v2', 'v3'): return json.dumps({'ret': -999, 'msg': '版本错误!'}) print 'version=', version param = web.input(app_id='', session='', addr_id='', sign='') if '' in (param.app_id, param.session, param.addr_id, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.addr_id]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) # 查找并删除收货地址 r = db.app_user.find_one({'uname': uname['uname']}, {'address': 1}) new_addr = [] for i in r['address']: if i[0] == param.addr_id: continue else: new_addr.append(i) r = db.app_user.update_one({'uname': uname['uname']}, {'$set': { 'address': new_addr }}) # 返回 return json.dumps({ 'ret': 0, 'data': { 'addr_id': param.addr_id, } }) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- r2 = db.order_trade.find({'userid': uname['userid']}, sort=[('_id', -1)]) orders = [] for i in r2: if i['trade_type'] == 'consume': sign = -1 else: sign = 1 orders.append({ "action": i['comment'], "cash": i['total_sum'] * sign, # 金额,单位 分 "date": i['pay_time'], # 发生时间 "order_id": i['order_trade_id'], # 订单号 }) ret_data = {"order": orders} # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- r2 = db.obj_store.find_one({'obj_id': param.object_id}) if r2 is None: return json.dumps({'ret': -5, 'msg': '错误的object_id'}) r3 = db.progress_info.find_one({ 'userid': uname['userid'], 'obj_id': param.object_id }) if r3 is None: progress = 0 else: progress = r3['progress'] ret_data = { "progress": progress, # 课程进度百分比,0表示未上课,100表示已上课 } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- 待实现 # 准备返回值 ret_data = { "info": [ { "info_id": "abcd", # 消息id "title": "测试消息1", "content": "消息内容", "time_str": "2017-08-09 20:20:20", # 时间 }, { "info_id": "abef", "title": "测试消息2", "content": "消息内容", "time_str": "2017-08-09 12:12:12", }, ] } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', tick='') if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, param.tick): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- r = checkout_helper.checkout_obj(uname, param.object_id) if r['ret'] < 0: return json.dumps({'ret': r['ret'], 'msg': r['msg']}) ret_data = { "object_id": param.object_id, # 唯一代码 "type": 1 if r['obj_type'] == 'course' else 2, # 类型: 1 课程, 2 专辑 "title": r['title'], "due": r['due'], # 应付金额,单位 分 , 默认1分 } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })
def POST(self, version='v3'): web.header('Content-Type', 'application/json') if version not in ('v2', 'v3'): return json.dumps({'ret': -999, 'msg': '版本错误!'}) print 'version=', version param = web.input(app_id='', session='', secret='', sign='') if '' in (param.app_id, param.session, param.secret, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.secret]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) #db_shop = db.base_shop.find_one({'_id':ObjectId(setting.default_shop)},{'name':1}) # 清除用户购物车信息 db_history = db.app_user.find_one({'uname': uname['uname']}, {'credit_history': 1}) data = [] for i in db_history.get('credit_history', []): data.insert(0, { 'date': i[0], 'title': i[1], 'title2': i[3], 'sum': i[2] }) return json.dumps({'ret': 0, 'data': data}) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self, version='v2'): web.header('Content-Type', 'application/json') if version not in ('v2','v3'): return json.dumps({'ret' : -999, 'msg' : '版本错误!'}) print 'version=',version param = web.input(app_id='', session='', order_id='', pay_type='', data='', sign='') print param if '' in (param.app_id, param.session, param.order_id, param.pay_type, param.sign): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign([param.app_id, param.session, param.order_id, param.pay_type, param.data]) if md5_str!=param.sign: return json.dumps({'ret' : -1, 'msg' : '签名验证错误'}) db_user = db.app_user.find_one({'uname':uname['uname']},{'coupon':1, 'credit':1}) if db_user==None: # 不应该发生 return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'}) # 支付操作:1,记录订单支付,2.改变订单状态,3.修改库存显示 !!!!!! # 获得订单 db_order = db.order_app.find_one( {'order_id' : param.order_id}, #{'status':1, 'cart':1, 'due':1, 'shop':1} ) if db_order==None: return json.dumps({'ret' : -3, 'msg' : '未找到订单!'}) # 支付宝和微信支付订单,已PAID说明提前收到异步通知 if db_order['status']=='PAID' and param.pay_type in ('ALIPAY','WXPAY'): # 记录此次调用 db.order_app.update_one( { 'order_id' : param.order_id, }, { '$set' : { 'pay_type' : param.pay_type, 'pay' : db_order.get('due3', db_order['due']), 'paid2_time' : app_helper.time_str(), 'paid2_tick' : int(time.time()), }, '$push' : { 'history' : (app_helper.time_str(), uname['uname'], '提交付款')}, } ) return json.dumps({'ret' : 0, 'data' : { 'order_id' : param.order_id, 'due' : db_order.get('due3', db_order['due']), 'paid' : db_order.get('due3', db_order['due']), 'status' : '已支付', 'alert' : False, 'message' : '测试信息, 已经收到异步通知了', 'url' : 'http://app-test.urfresh.cn' }}) # 只能处理未支付订单 if db_order['status']!='DUE': return json.dumps({'ret' : -3, 'msg' : '不是待付款订单!'}) # 余额支付和支付宝/微信支付未到账处理 if param.pay_type=='CREDIT': # 余额支付0元提交的问题,原因未知 2015.08.20 if round(float(db_order['due']),2)<=0.0: return json.dumps({'ret' : -2, 'msg' : '参数错误'}) # 检查余额是否够支付 if float(db_order['due'])>db_user.get('credit',0.0): return json.dumps({'ret' : -6, 'msg' : '余额不足!'}) # 使用的优惠券失效 #db_user = db.app_user.find_one({'uname':r['uname']}) coupon = [] if db_order['coupon']!=None: for i in db_user['coupon']: if i[0]==db_order['coupon'][0]: # 这次使用 #coupon.append((i[0],i[1],i[2],0)) i2=list(i) i2[3]=0 coupon.append(i2) else: coupon.append(i) else: coupon = db_user['coupon'] # 未处理首单送券的逻辑 # 更新优惠券 db.app_user.update_one({'uname':db_order['uname']}, {'$set':{'coupon':coupon}}) # 邀请码用户送抵用券 2015-10-24 invitation = db_user.get('invitation', '') if invitation!='' and db_user.get('invite_coupon_has_sent', 0)==0: # 已填邀请码并且未送过券 coupon_user = db.app_user.find_one({'my_invit_code':invitation},{'uname':1}) if coupon_user: # 送邀请码用户抵用券 print '送邀请码用户抵用券' valid = app_helper.time_str(time.time()+3600*24*30, 1) db.app_user.update_one({'uname':coupon_user['uname']},{'$push':{ 'coupon' : (app_helper.my_rand(), valid, '5.00', 1, 19.9, 'apple') }}) # 设置已送标志 db.app_user.update_one({'uname':r['uname']}, {'$set':{'invite_coupon_has_sent':1}}) # 正常减库存! # item = [ product_id, num, num2, price] # k - num 库存数量 print "修改库存." b2 = [] # C端商品 b3 = [] # B3整箱预售商品 b3_total = 0.0 for item in db_order['cart']: # 记录销售量 db.sku_store.update_one({'product_id' : item['product_id']}, {'$inc' : {'volume' : float(item['num2'])}} ) #r3 = db.sku_store.find_one({'product_id' : item['product_id']}, # {'list_in_app':1}) #if r3['list_in_app']==3: # B3商品不需要改库存 # b3_total += float(item['price']) # b3.append(item) # item['title'] = item['title']+u'(整箱预售,次日送达)' # b2.append(item) # continue # 买一送一 if item.has_key('numyy'): # v3 2015-10-25 if item['product_id'] in app_helper.buy_X_give_Y.keys(): print '买X送Y' #item['num2'] = int(float(item['num2']) + float(item['numyy'])) #item['title'] = item['title'] + u'特惠活动' else: if item['product_id'] in app_helper.buy_1_give_1: print '买一送一' lc_num2 = float(item['num2']) item['num2'] = int(lc_num2 + lc_num2) item['title'] = item['title'].replace(u'买一送一',u'特惠活动') # 过滤数量价格为零的 if item['num2']==0 and float(item['price'])==0.0: continue # num2 实际购买数量, numyy 赠送数量, v3之后才有munyy 2015-10-20 num_to_change = float(item['num2']) + float(item.get('numyy', 0.0)) r = db.inventory.find_one_and_update( # 不检查库存,有可能负库存 { 'product_id' : item['product_id'], 'shop' : db_order['shop'], }, { '$inc' : { 'num' : 0-num_to_change, # num2 实际购买数量 'pre_pay_num' : num_to_change, # 记录预付数量 } #'$push' : { 'history' : (helper.time_str(), # helper.get_session_uname(), '售出 %s' % str(item['num']))}, }, {'_id':1} ) #print r if r==None: # 不应该发生 return json.dumps({'ret' : -9, 'msg' : '修改库存失败,请联系管理员!'}) else: b2.append(item) # 更新第3方库存 2015-10-10 app_helper.elm_modify_num(db_order['shop'], item['product_id']) # 检查是否有b3商品, 3种情况 # 1. b2, b3 都有,拆单 # 2. 只有b3,站点改为B3站点,保留收货站点 # 3. 只有b2,保持订单不变 #print b2 #print b3 if len(b3)>0 and (len(b2)-len(b3))>0: # 情况1 print "拆单" r4 = db_order.copy() r4['order_id'] = r4['order_id']+u'-b3' r4['shop_0'] = db_order['shop'] r4['shop'] = ObjectId(setting.B3_shop) r4['cart'] = b3 r4['status'] = 'PAID' r4['ali_trade_no'] = param.get('trade_no') r4['paid_time'] = param.get('gmt_payment') r4['paid_tick'] = int(time.time()) r4['history'] = [(app_helper.time_str(), 'credit', '余额付款-拆单')] r4['total'] = '%.2f' % b3_total r4['cost'] = '0.00' r4['coupon_disc'] = '0.00' r4['first_disc'] = '0.00' r4['delivery_fee'] = '0.00' r4['due'] = '0.00' db.order_app.insert_one(r4) # 增加子订单 elif len(b3)>0: # 情况 2 print "订单改到B3站点" # 如果订单地址不再配送范围,则由b3直接发出, 2015-10-18 if db_order.get('poly_shop', 1)==1: # 默认到店配送 print 'b3配送到店' shop_0 = db_order['shop'] else: print 'b3直接发货' shop_0 = ObjectId(setting.B3_shop) db.order_app.update_one({'order_id':param.order_id},{'$set' : { 'shop_0' : shop_0, 'shop' : ObjectId(setting.B3_shop), }}) else: # 情况3,什么都不做 print "订单保持不变" # 推送通知 #if len(db_order['uname'])==11 and db_order['uname'][0]=='1': # jpush.jpush('已收到您的付款,我们会尽快处理。', db_order['uname']) # 更新销货单信息 db.order_app.update_one({'order_id' : param.order_id},{ '$set' : { 'status' : 'PAID', 'cart' : b2, # 更新购物车 2015-09-11 'pay_type' : param.pay_type, 'pay' : db_order['due'], 'paid_time' : app_helper.time_str(), 'paid_tick' : int(time.time()), 'credit_total' : db_order['due'], # 2015-11-24 }, '$push' : { 'history' : (app_helper.time_str(), uname['uname'], '余额付款')}, }) # 消费余额 db.app_user.update_one({'uname' : uname['uname'],},{ '$inc' : { 'credit' : 0-float(db_order['due']), }, '$push' : { 'credit_history' : ( # 专门记录余额消费 app_helper.time_str(), '消费余额', '-%.2f' % float(db_order['due'].encode('utf-8')), '订单: %s' % param.order_id.encode('utf-8') ) }, }) elif param.pay_type in ('ALIPAY', 'WXPAY'): # 更新销货单信息, r = db.order_app.find_one_and_update( { 'order_id' : param.order_id, 'status' : 'DUE' }, { '$set' : { 'status' : 'PREPAID', 'pay_type' : param.pay_type, 'pay' : db_order.get('due3', db_order['due']), 'paid2_time' : app_helper.time_str(), 'paid2_tick' : int(time.time()), 'pay_data' : param.data, }, '$push' : { 'history' : (app_helper.time_str(), uname['uname'], '提交付款')}, }, {'status':1} ) # 如果不是DUE,说明已收到异步通知 if r==None: db.order_app.update_one( { 'order_id' : param.order_id, }, { '$set' : { 'pay_type' : param.pay_type, 'pay' : db_order.get('due3', db_order['due']), 'paid2_time' : app_helper.time_str(), 'paid2_tick' : int(time.time()), }, '$push' : { 'history' : (app_helper.time_str(), uname['uname'], '提交付款')}, } ) # 返回 return json.dumps({'ret' : 0, 'data' : { 'order_id' : param.order_id, 'due' : db_order.get('due3', db_order['due']), 'paid' : db_order.get('due3', db_order['due']), 'status' : '已支付', 'alert' : False, 'message' : '测试信息,还未收到异步通知', 'url' : 'http://app-test.urfresh.cn' }}) else: return json.dumps({'ret' : -4, 'msg' : '无效的session'})
def POST(self, version='v2'): web.header('Content-Type', 'application/json') if version not in ('v2', 'v3'): return json.dumps({'ret': -999, 'msg': '版本错误!'}) print 'version=', version param = web.input(app_id='', session='', order_id='', total='', note='', sign='') if version == 'v2': if '' in (param.app_id, param.order_id, param.session, param.total, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) elif version == 'v3': if '' in (param.app_id, param.session, param.total, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) if web.ctx.has_key('environ'): client_ip = web.ctx.environ['REMOTE_ADDR'] else: return json.dumps({'ret': -5, 'msg': '无法取得客户端ip地址'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign([ param.app_id, param.session, param.order_id, param.total, param.note ]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) #db_shop = db.base_shop.find_one({'_id':ObjectId(setting.default_shop)},{'name':1}) # 统一下单接口获取 prepay_id nonce_str = app_helper.my_rand(30) body = 'U掌柜app' trade_type = 'APP' if version == 'v2': order_id = '%s_%d' % (param.order_id.encode('utf-8'), int(time.time())) elif version == 'v3': if len(param.order_id) > 0: order_id = '%s_%d' % (param.order_id.encode('utf-8'), int(time.time())) print order_id else: # 生成order_id order_id = app_helper.get_new_order_id(version).encode( 'utf-8') print 'new order_id', order_id total_fee = param.total.encode('utf-8') para = [('appid', wx_appid), ('body', body), ('mch_id', mch_id), ('nonce_str', nonce_str), ('notify_url', notify_url), ('out_trade_no', order_id), ('spbill_create_ip', client_ip), ('total_fee', total_fee), ('trade_type', trade_type)] print para stringA = '&'.join('%s=%s' % i for i in para) stringSignTemp = '%s&key=%s' % (stringA, api_key) sign = hashlib.md5(stringSignTemp).hexdigest().upper() para_xml = '<xml>' \ '<appid>'+wx_appid+'</appid>' \ '<mch_id>'+mch_id+'</mch_id>' \ '<nonce_str>'+nonce_str+'</nonce_str>' \ '<sign>'+sign+'</sign>' \ '<body>'+body+'</body>' \ '<out_trade_no>'+order_id+'</out_trade_no>' \ '<total_fee>'+total_fee+'</total_fee>' \ '<spbill_create_ip>'+client_ip+'</spbill_create_ip>' \ '<notify_url>'+notify_url+'</notify_url>' \ '<trade_type>'+trade_type+'</trade_type>' \ '</xml>' print para_xml #return json.dumps({'ret' : 0, 'data' : 'here'}) urllib3.disable_warnings() pool = urllib3.PoolManager(num_pools=2, timeout=180, retries=False) url = 'https://api.mch.weixin.qq.com/pay/unifiedorder' r = pool.urlopen('POST', url, body=para_xml) if r.status == 200: data = r.data print data if version == 'v2': # 记录微信商户订单号 db.order_app.update_one( {'order_id': param.order_id}, {'$set': { 'wx_out_trade_no': order_id }}) return json.dumps({'ret': 0, 'data': data}) elif version == 'v3': if len(param.order_id) > 0: db_order = db.order_app.find_one( {'order_id': param.order_id}) if db_order['status'] != 'DUE': print '============================== -100' return json.dumps({ 'ret': -100, 'msg': '订单状态变化,请确认' }) ret_json = checkout( version, uname, { 'session': param.session, 'order_id': param.order_id, 'shop_id': str(db_order['shop']), 'addr_id': db_order['address'][0], 'coupon_id': db_order['coupon'][0] if float(db_order['coupon_disc']) > 0 else '', 'cart': json.dumps(db_order['cart']), 'app_id': param.app_id, 'use_credit': '1' if float(db_order.get('use_credit', '0')) > 0 else '', #2015-11-19 }) if ret_json['ret'] < 0: # checkout 出错 return json.dumps({ 'ret': ret_json['ret'], 'msg': ret_json['msg'] }) if float(ret_json['data']['due']) != float( db_order.get('due3', db_order['due'])): # checkout后金额有变化,说明库存或优惠券有变化 db.order_app.update_one( {'order_id': param.order_id}, { '$set': { 'status': 'CANCEL' }, '$push': { 'history': (app_helper.time_str(), uname['uname'], '订单取消(微信支付)') } }) print '============================== -100' return json.dumps({ 'ret': -100, 'msg': '很抱歉,数据异常,订单已取消,请重新下单' }) # 可支付 db.order_app.update_one({'order_id': param.order_id}, { '$set': { 'wx_out_trade_no': order_id }, '$push': { 'history': (app_helper.time_str(), uname['uname'], '提交微信支付2') } }) return json.dumps({ 'ret': 0, 'order_id': param.order_id, 'data': data }) else: # 生成新订单 db_cart = db.app_user.find_one( {'uname': uname['uname']}, {'cart_order.%s' % param.session: 1}) new_order = dict(db_cart['cart_order'][param.session]) new_order['order_id'] = order_id new_order['status'] = 'DUE' new_order['user_note'] = param.note.strip() new_order['wx_out_trade_no'] = order_id new_order['history'] = [(app_helper.time_str(), uname['uname'], '提交微信支付')] ret_json = checkout( version, uname, { 'session': param.session, 'order_id': order_id, 'shop_id': str(new_order['shop']), 'addr_id': new_order['address'][0], 'coupon_id': new_order['coupon'][0] if float(new_order['coupon_disc']) > 0 else '', 'cart': json.dumps(new_order['cart']), 'app_id': param.app_id, 'use_credit': '1' if float(new_order.get('use_credit', '0')) > 0 else '', #2015-11-23 }) if ret_json['ret'] < 0: # checkout 出错 return json.dumps({ 'ret': ret_json['ret'], 'msg': ret_json['msg'] }) if float(ret_json['data']['due']) != float( new_order.get('due3', new_order['due'])): # checkout后金额有变化,说明库存或优惠券有变化 print '============================== -100' return json.dumps({ 'ret': -100, 'msg': '很抱歉,数据异常,请重新下单' }) db.order_app.insert_one(new_order) return json.dumps({ 'ret': 0, 'order_id': order_id, 'data': data }) else: return json.dumps({'ret': -1, 'data': r.status}) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', dev_id='', ver_code='', session='', tick='', category='', pic1='', pic1_type='') if '' in (param.app_id, param.dev_id, param.ver_code, param.session, param.tick, param.category): return json.dumps({'ret': -2, 'msg': '参数错误'}) # 检查session登录 uname = app_helper.app_logged(param.session) if uname is None: return json.dumps({'ret': -4, 'msg': '无效的session'}) #-------------------------------------------------- if param['category'].upper() not in ('LICENCE', 'PHOTO'): return json.dumps({'ret': -5, 'msg': '无效的category取值'}) if param['pic1_type'].upper() not in ('JPG', 'PNG'): return json.dumps({'ret': -6, 'msg': '无效的图片类型取值'}) # 保存图片 if len(param['pic1'].strip()) > 0: pic1_filename = app_helper.write_image( param['pic1_type'], urllib.unquote_plus(param['pic1'])) else: pic1_filename = '' # 删除图片 # 更新数据 update_set = {} if param['category'].upper() == 'LICENCE': db.app_user.update_one({ 'userid': uname['userid'], 'type': 1 }, {'$set': { 'upload_licence': pic1_filename }}) else: if pic1_filename == '': # 删除已上传的图片 db.app_user.update_one({ 'userid': uname['userid'], 'type': 1 }, {'$set': { 'shop_pic': [] }}) else: db.app_user.update_one({ 'userid': uname['userid'], 'type': 1 }, {'$push': { 'shop_pic': pic1_filename }}) # 准备返回值 ret_data = { "pic1_url": app_helper.image_url(pic1_filename) if pic1_filename != '' else pic1_filename, } # 返回 return json.dumps({ 'ret': 0, 'data': ret_data, })