def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', order_id='', star='') if '' in (param.order_id, param.star): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid':uname['openid']},{'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['openid'], '订单打分')}, }) return json.dumps({'ret' : 0, 'msg' : '订单已打分!'}) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', shop_id='', order_id='', addr_id='', coupon_id='', cart='') if '' in (param.shop_id, param.addr_id, param.cart): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) print param # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: ret_json = checkout(uname, param) print ret_json return json.dumps(ret_json) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='') if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_shop = db.base_shop.find_one( {'_id': ObjectId(setting.default_shop)}, {'name': 1}) # 返回全局参数 return json.dumps({ 'ret': 0, 'data': { 'free_delivery': '%.2f' % app_helper.free_delivery, 'first_promote': '%.2f' % app_helper.first_promote, 'cod_enable': False, 'image_host': '/static/image/product', 'image_host2': 'http://%s/image/product' % setting.image_host, 'banner': app_helper.BANNER['c001'], 'default_shop': setting.default_shop, # 返回默认站店 'default_name': db_shop['name'] if db_shop else '', 'phone_number': uname['uname'], } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', addr_id='', name='', tel='', addr='') if '' in (param.addr_id, param.name, param.tel, param.addr): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 需要判断地址是否有对应门店,否则不在送货范围内 # app_helper.check_address() # 查找并修改收货地址 r = db.app_user.find_one({'openid': uname['openid']}, {'address': 1}) new_addr = [] for i in r['address']: if i[0] == param.addr_id: new_addr.append( (param.addr_id, param.name.strip(), param.tel.strip(), param.addr.strip(), int(time.time()))) else: new_addr.append(i) r = db.app_user.update_one({'openid': uname['openid']}, {'$set': { 'address': new_addr }}) # 返回 return json.dumps({ 'ret': 0, 'data': { 'addr_id': param.addr_id, } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='') if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid': uname['openid']}, {'coupon': 1}) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 这里应该增加对有效期的检查!!! coupon = [] unused = 0 for i in db_user['coupon']: if app_helper.time_str(format=1) > i[1]: # 过期抵用券不返回 2015-08-22 continue coupon.append({ 'id': i[0], 'valid': i[1], 'cash': i[2], 'status': 'unused' if i[3] == 1 else 'used', }) unused += (1 if i[3] == 1 else 0) # 返回 return json.dumps({ 'ret': 0, 'data': { 'coupon': coupon, 'total': len(coupon), 'unused': unused, } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') #print web.input() param = web.input(openid='', session_id='', number='') if param.number == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: #print 'user_phone', uname if len(uname['uname'].strip()) > 0: return json.dumps({'ret': -5, 'msg': '已绑定手机号码,不能重复绑定'}) number = param.number.strip() if len(number) < 11 or (not number.isdigit()): return json.dumps({'ret': -3, 'msg': '手机号码格式错误'}) # 随机码 rand = app_helper.my_rand(base=1) register = False #发送短信验证码 sms.send_rand(number, rand, register) #临时保存到phone字段 db.app_user.update({'openid': uname['openid']}, {'$set': { 'phone': number, 'rand': rand }}) # 返回 return json.dumps({'ret': 0}) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', addr_id='') if param.addr_id == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 查找并删除收货地址 r = db.app_user.find_one({'openid': uname['openid']}, {'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({'openid': uname['openid']}, {'$set': { 'address': new_addr }}) # 返回 return json.dumps({ 'ret': 0, 'data': { 'addr_id': param.addr_id, } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='') if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid': uname['openid']}, {'address': 1}) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) addr = [] for i in db_user['address']: addr.append({ 'id': i[0], 'name': i[1], 'tel': i[2], 'addr': i[3], 'tick': i[4] if len(i) > 4 else 0, }) #print addr addr2 = quick(addr) #print addr2 # 返回 return json.dumps({ 'ret': 0, 'data': { 'addr': addr2, 'total': len(addr2), } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', order_id='') if param.order_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1}) if db_user==None: # 不应该发生 return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'}) # 获得订单 db_order = db.order_app.find_one( {'order_id' : param.order_id, 'user': {'$in':uname.values()}}, {'status':1, 'cart':1, 'due':1, 'shop':1} ) if db_order==None: return json.dumps({'ret' : -3, 'msg' : '未找到订单!'}) elif db_order['status']!='DUE': return json.dumps({'ret' : -3, 'msg' : '不是待付款订单!'}) # 取消订单 db.order_app.update_one({'order_id' : param.order_id,},{ '$set' : { 'status':'CANCEL' }, '$push' : { 'history' : (app_helper.time_str(), uname['openid'], '取消账单')}, }) return json.dumps({'ret' : 0, 'msg' : '订单已取消!'}) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='',session_id='') if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid':uname['openid']},{'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' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='',session_id='') if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 返回host地址、端口 host = setting.app_pool[random.randint(0,len(setting.app_pool)-1)] print 'host = ', host return json.dumps({'ret' : 0, 'data' : { 'protocol' : 'http', #'host' : setting.app_host, #'app.urfresh.cn', 'host' : host, 'port' : '12050', }}) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', shop_id='', product_id='') if '' in (param.shop_id, param.product_id): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 有效的sku db_sku = db.sku_store.find_one({'product_id': param.product_id}, { 'product_id': 1, 'base_sku': 1, 'app_title': 1, 'is_onsale': 1, 'special_price': 1, 'promote': 1, 'list_in_app': 1, }) base_sku = db.dereference(db_sku['base_sku']) # 处理整箱预售 if db_sku['list_in_app'] == -3: # 关闭整箱预售 2015-10-27 shop_id = setting.B3_shop # B3整箱预售虚拟店 else: shop_id = param.shop_id # 查找商品详情 db_invent = db.inventory.find_one( { 'shop': ObjectId(shop_id), 'product_id': param.product_id, 'list_in_app': { '$ne': 0 }, }, { 'product_id': 1, #'category' : 1, # 品类,从sku_store来的 #'sort_weight' : 1, 'sku': 1, 'price': 1, # 门店价 'num': 1, # 库存数 }, ) # 准备返回结果 data = { 'product_id': db_invent['product_id'], 'title': db_sku['app_title'], 'abstract': base_sku['abstract'], 'price': db_invent['price'], 'num': db_invent['num'], 'promote': db_sku['promote'], 'detail_url': '', } # 是否有优惠价格 if db_sku['is_onsale'] == 1 and float( db_sku['special_price']) < float(db_invent['price']): # 优惠价格比门店价格低 data['sale_price'] = db_sku['special_price'] # 图片 if base_sku.has_key('image'): if len(base_sku['image']) > 1: i = base_sku['image'][1] # 第2张是详情图 else: i = base_sku['image'][0] data['image'] = ['/%s/%s' % (i[:2], i)] #data['image']=['/%s/%s' % (i[:2], i) for i in base_sku['image']] else: data['image'] = '' # 返回 return json.dumps({'ret': 0, 'data': data}) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='',session_id='') if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1}) if db_user==None: # 不应该发生 return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'}) # 返回列表排序,可用的按金额排序,过期的沉底 coupon=[] coupon_used=[] coupon_expired=[] unused=0 for i in db_user['coupon']: if len(i)>4: # (id, 有效期, 金额, 是否已用, 门槛) 2015-09-27 # 有门槛信息,使用优惠券门槛信息 msg1 = '满%.1f元使用' % i[4] else: # 没有门槛信息,使用默认设置 if float(i[2])==6.0: msg1 = '满29.9元使用' elif float(i[2])==9.0: msg1 = '满39.9元使用' else: msg1 = '满14.9元使用' msg2 = '抵用券' msg3 = '' if len(i)>5: if i[5]=='apple': #msg2 = '水果券' msg3 = ',须含水果' elif i[5]=='b3': #msg2 = '整箱券' msg3 = ',整箱可用' if i[3]==0: coupon_used.append({ 'id' : i[0], 'valid' : i[1], 'cash' : i[2], 'status' : 'used', 'msg1' : msg1+msg3, 'msg2' : msg2, }) elif app_helper.time_str(format=1)>i[1]: # 过期抵用券不返回 2015-08-22 coupon_expired.append({ 'id' : i[0], 'valid' : i[1], 'cash' : i[2], 'status' : 'expired', 'msg1' : msg1+msg3, 'msg2' : msg2, }) elif i[3]==1: coupon.append({ 'id' : i[0], 'valid' : i[1], 'cash' : i[2], 'status' : 'unused', 'msg1' : msg1+msg3, 'msg2' : msg2, }) unused += 1 else: # 未知类型 coupon_used.append({ 'id' : i[0], 'valid' : i[1], 'cash' : i[2], 'status' : 'used', 'msg1' : msg1+msg3, 'msg2' : msg2, }) coupon = quick(coupon) coupon.extend(coupon_used) coupon.extend(coupon_expired) # 返回 return json.dumps({'ret' : 0, 'data' : { 'coupon' : coupon, 'total' : len(coupon), 'unused' : unused, }}) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') #print web.input() param = web.input(openid='', session_id='', rand='', invitation='') if param.rand == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: if len(uname['uname'].strip()) > 0: return json.dumps({'ret': -5, 'msg': '已绑定手机号码,不能重复绑定'}) #邀请码 if param.has_key('invitation'): invitation = param.invitation if db.invitation.find({ 'code': invitation }).count() == 0: # 无效邀请码 invitation = '' else: r = db.app_user.find_one({'openid': uname['openid']}, {'invitation': 1}) if r.get('invitation', '') != '': # 已填邀请码 invitation = '' else: invitation = '' if invitation != '': # 赠送优惠券 valid = app_helper.time_str(time.time() + 3600 * 24 * 30, 1) # 有效期30天 r = db.app_user.find_one_and_update( {'openid': uname['openid']}, { '$set': { 'invitation': invitation, 'last_time': app_helper.time_str() }, #'$push' : {'coupon' : (app_helper.my_rand(), valid, '5.00', 1)}, # 邀请码送5元 }) else: r = db.app_user.find_one_and_update( {'openid': uname['openid']}, {'$set': { 'last_time': app_helper.time_str() }}) # 检查验证码 if param.rand.strip() != r['rand']: return json.dumps({'ret': -5, 'msg': '短信验证码错误'}) if len(r['address']) > 0: # 应该实现:返回最近使用的地址 !!!! addr = { 'id': r['address'][0][0], 'name': r['address'][0][1], 'tel': r['address'][0][2], 'addr': r['address'][0][3], } else: addr = {} # 绑定处理 r2 = db.app_user.find_one({'uname': r['phone']}) #print r['phone'],r2 if r2: # 手机号码已注册过app, 需要合并app用户和微信用户 #print db.app_user.update_one({'openid':uname['openid']},{'$set':{ # 'uname' : r['phone'], # 'address' : r['address']+r2['address'], # 'coupon' : r['coupon']+r2['coupon'], # 'app_id' : r2['app_id'] #}}) # 使手机号帐户不能再使用 #db.app_user.update_one({'_id':r2['_id']},{'$set' : {'uname': u'~%s' % r2['uname']}}) print '合并到app用户' print db.app_user.update_one({'_id': r2['_id']}, { '$set': { 'openid': uname['openid'], 'address': r['address'] + r2['address'], 'coupon': r['coupon'] + r2['coupon'], } }) # 使微信帐户不能再使用 db.app_user.update_one( {'_id': r['_id']}, {'$set': { 'openid': u'~%s' % uname['openid'] }}) else: # 手机号码还未注册过 db.app_user.update_one({'openid': uname['openid']}, {'$set': { 'uname': r['phone'] }}) # 更新session里的uname db.app_sessions.update_one({'session_id': param.session_id}, {'$set': { 'uname': r['phone'] }}) # 返回 return json.dumps({ 'ret': 0, 'data': { 'login': True, 'addr': addr, } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', order_id='') print 'order_detail: ', param if param.order_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1, 'credit':1}) if db_user==None: # 不应该发生 return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'}) image_host = 'http://%s/image/product' % setting.image_host # 获得订单 #print param.order_id, uname db_order = db.order_app.find_one({'order_id' : param.order_id, 'user':{'$in':uname.values()}}) if db_order==None: return json.dumps({'ret' : -3, 'msg' : '未找到订单!'}) if db_order.get('order_source')=='wx_tuan': r0 = db.pt_order.find_one({'pt_order_id':db_order['pt_order_id']}) cart=[] for i in db_order['cart']: r2 = db.pt_store.find_one({'tuan_id':i['tuan_id']}) image = r2['image'][0] if r2.has_key('image') and len(r2['image'])>0 else '' cart.append({ 'tuan_id' : i['tuan_id'], 'title1' : r2['title'], 'price' : r2['tuan_price'] if r0['type']=='TUAN' else r2['price'], 'image' : '%s/%s/%s' % (image_host, image[:2], image), 'type' : '%d人团'%r2['tuan_size'] if r0['type']=='TUAN' else '单人购买', 'status' : r0['status'] }) data = { 'type' : 'TUAN', 'order_id' : db_order['order_id'], 'pt_order_id' : db_order['pt_order_id'], 'region_id' : db_order['region_id'], 'status' : helper.ORDER_STATUS['APP'].get(db_order['status'],'未知状态'), # 需要中文名 'deadline' : db_order['deadline']-int(time.time()), # 离支付截至的时间,秒数 'delivery' : { 'addr_id' : db_order['address'][0], 'address' : db_order['address'][3] if len(db_order['address'])<9 else ''.join(xx for xx in db_order['address'][8].split(','))+db_order['address'][3], 'contact' : db_order['address'][1], 'contact_tel' : db_order['address'][2], 'runner' : db_order['runner']['name'] if db_order.has_key('runner') else '', # 送货员姓名 'runner_tel' : db_order['runner']['tel'] if db_order.has_key('runner') else '', # 送货员电话 }, 'cart' : cart, 'total' : db_order['total'], 'coupon' : db_order['coupon'][0] if db_order['coupon'] else '', 'coupon_disc' : db_order['coupon_disc'], 'due' : db_order['due'], } else: cart=[] for i in db_order['cart']: r = db.sku_store.find_one({'product_id':i['product_id']}, {'base_sku':1}) base_sku = db.dereference(r['base_sku']) image = base_sku['image'][0] if base_sku.has_key('image') and len(base_sku['image'])>0 else '' cart.append({ 'product_id' : i['product_id'], 'title' : i['title'], 'price' : i['price'], 'num2' : i['num2'], 'numyy' : i.get('numyy',0), # v3 使用 'image' : '%s/%s/%s' % (image_host, image[:2], image), }) data={ 'order_id' : db_order['order_id'], 'type' : 'HOUR', 'shop_id' : str(db_order['shop']), # 需要中文名 'status' : helper.ORDER_STATUS['APP'].get(db_order['status'],'未知状态'), # 需要中文名 'deadline' : db_order['deadline']-int(time.time()), # 离支付截至的时间,秒数 'delivery' : { 'addr_id' : db_order['address'][0], 'address' : db_order['address'][3] if len(db_order['address'])<9 else ''.join(xx for xx in db_order['address'][8].split(','))+db_order['address'][3], 'contact' : db_order['address'][1], 'contact_tel' : db_order['address'][2], 'runner' : db_order['runner']['name'] if db_order.has_key('runner') else '', # 送货员姓名 'runner_tel' : db_order['runner']['tel'] if db_order.has_key('runner') else '', # 送货员电话 }, 'cart' : cart, 'total' : db_order['total'], 'coupon' : db_order['coupon'][0] if db_order['coupon'] else '', 'coupon_disc' : db_order['coupon_disc'], 'first_disc' : db_order['first_disc'], 'delivery_fee' : db_order['delivery_fee'], 'due' : db_order['due'], 'star' : db_order.get('star', 1), 'credit' : '%.2f' % db_user.get('credit', 0.0), } data['history']=[] # 返回订单历史 for i in db_order['history']: data['history'].append({ 'time' : i[0], 'action' : i[2], }) pay_type = db_order.get('pay_type') if pay_type=='CREDIT': data['pay_type']='余额支付' elif pay_type=='ALIPAY': data['pay_type']='支付宝' elif pay_type=='WXPAY': data['pay_type']='微信支付' else: data['pay_type']='n/a' print data return json.dumps({'ret' : 0, 'data' : data}) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', name='', tel='', addr='', city='') if '' in (param.name, param.tel, param.addr, param.city): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 判断地址是否有对应门店,否则不在送货范围内 alert = False sort_tick = int(time.time()) message = '' # 获得 收货地址 坐标, 设置城市, v3 ret, loc = lbs.addr_to_loc(param.addr.strip().encode('utf-8'), city=param.city.strip().encode('utf-8')) print ret, loc if ret < 0: loc = {'lat': 0, 'lng': 0} alert = False #True message = '地址定位失败,请重新输入地址' sort_tick = 0 else: poly_shop, loc_shop = lbs.locate_shop((loc['lat'], loc['lng'])) if poly_shop == None: print '不在配送范围内' alert = False # True # 拼团不提示 message = '很抱歉,收货地址不在配送范围内,请更改地址' #,整箱预售商品可正常购买' sort_tick = 0 # 更新个人资料 new_addr = ( app_helper.my_rand(), param.name.strip(), param.tel.strip(), param.addr.strip(), sort_tick, loc, '', # app 的title '', # app 的detail param.city.strip(), ) r = db.app_user.update_one({'openid': uname['openid']}, {'$push': { 'address': new_addr }}) # 返回 return json.dumps({ 'ret': 0, 'data': { 'addr_id': new_addr[0], 'alert': alert, 'message': message, } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', region_id='', tuan_id='', pt_order_id='') if '' in (param.region_id, param.tuan_id): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: now_tick = int(time.time()) # 有效的tuan db_sku = db.pt_store.find_one({ 'tuan_id': param.tuan_id, 'region_id': { '$in': [param.region_id] }, #'online' : { '$in' : [ param.region_id ] }, #'expire_tick' : { '$gt' : now_tick } # 过期不能查看 }) if db_sku == None: return json.dumps({'ret': -2, 'msg': 'tuan_id错误'}) image_host = 'http://%s/image/product' % setting.image_host # 准备返回结果 data = { 'region_id': param.region_id, 'tuan_id': db_sku['tuan_id'], 'title': db_sku['title'], 'desc': db_sku['desc'], 'price': db_sku['price'], 'tuan_price': db_sku['tuan_price'], 'ref_price': db_sku['ref_price'], 'volume': '%d件' % db_sku['volume'], 'promote': True if db_sku['promote'] == 1 else False, 'promote_img': '%s/images/promote.png' % image_host, 'image': ['%s/%s/%s' % (image_host, x[:2], x) for x in db_sku['image']], 'tuan_size': db_sku['tuan_size'], 'sale_out': True if db_sku['sale_out'] == 1 else False, 'expired': True if db_sku['expire_tick'] < now_tick else False, 'pt_order_id': param.pt_order_id, 'status': '', 'position': 'VISITOR', # 缺省为游客 } # 已下架,显示售罄 if param.region_id not in db_sku['online']: data['sale_out'] = True # 过期也显示售罄 if data['expired']: data['sale_out'] = True # 图片 #if base_sku.has_key('image'): # data['image']=['/%s/%s' % (i[:2], i) for i in base_sku['image']] # if len(data['image'])>1: # 如果不止一张图,第2张开始时详情图 # data['image'].pop(0) # 把第1张去除 #else: # data['image']='' # 设置标签 2015-09-27 if data['promote'] > 0: for j in app_helper.left_tag['tags']: if db_sku['tuan_id'] in j['skus']: data['promote_img'] = image_host + j['tag'] break if len(param.pt_order_id) > 0: # 存在pt_order_id db_order = db.pt_order.find_one( {'pt_order_id': param.pt_order_id}) if db_order: data['status'] = db_order['status'] # 返回订单状态 if db_order['status'] == 'OPEN': # 如果拼团中,按实际情况显示售罄,忽略下架 data['sale_out'] = True if db_sku[ 'sale_out'] == 1 else False for i in db_order['member']: # 查找是否已参团 if i['openid'] == uname['openid']: data['position'] = i['position'] break # 返回 #print data return json.dumps({'ret': 0, 'data': data}) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', region_id='', pt_order_id='') print param if '' in (param.pt_order_id, param.region_id): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid': uname['openid']}, { 'coupon': 1, 'credit': 1 }) if db_user == None: # 不应该发生 print '-5' return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 刷新订单状态,过期的OPEN活动变为FAIL1, 个人订单已付款的变为FAIL_TO_REFUND r2 = db.pt_order.find( { 'status': 'OPEN', 'expire_tick': { '$lt': int(time.time()) } }, {'pt_order_id': 1}) for x in r2: # 已付款的已付款的变为FAIL_TO_REFUND db.order_app.update_many( { 'pt_order_id': x['pt_order_id'], 'status': 'PAID_AND_WAIT' }, { '$set': { 'status': 'FAIL_TO_REFUND', 'man': 1 }, '$push': { 'history': (app_helper.time_str(), 'system', '超时成团失败') } }) #过期的OPEN活动变为FAIL1, r3 = db.pt_order.find_one_and_update({'_id': x['_id']}, { '$set': { 'status': 'FAIL1' }, '$push': { 'history': (app_helper.time_str(), 'system', '超时成团失败') } }, {'member': 1}) print '发微信通知' for x in r3['member']: print app_helper.wx_reply_msg( x['openid'], '很抱歉,你参加的拼团活动已过24小时,人数不足未能成团,我们将在1-3个工作日内为您安排退款到支付帐户') image_host = 'http://%s/image/product' % setting.image_host # 获得订单 #print param.order_id, uname db_order = db.pt_order.find_one({ 'pt_order_id': param.pt_order_id, #'member.openid' : uname['openid'], }) if db_order == None: print '-3' return json.dumps({'ret': -3, 'msg': '未找到订单!'}) if db_order['status'] in ['WAIT', 'FAIL3' ] or db_order['type'] == 'SINGLE': # 不显示未开团成功订单和单人购买 print '-4' return json.dumps({'ret': -4, 'msg': '忽略的订单!'}) db_sku = db.pt_store.find_one({'tuan_id': db_order['tuan_id']}) image = [ '%s/%s/%s' % (image_host, x[:2], x) for x in db_sku['image'] ] # 当前用户身份 position = 'VISITOR' member = [] for i in db_order['member']: if i['openid'] == uname['openid']: position = i['position'] r2 = db.app_user.find_one({'openid': i['openid']}, { 'wx_nickname': 1, 'wx_headimgurl': 1 }) member.append({ 'name': r2.get('wx_nickname', '???'), # 微信中文昵称 'position': i['position'], 'time': i['time'], 'image': r2.get('wx_headimgurl', ''), # 取自微信头像 }) # 准备返回数据 now_tick = int(time.time()) data = { "region_id": db_order['region_id'], "tuan_id": db_order['tuan_id'], 'pt_order_id': db_order['pt_order_id'], 'position': position, "title1": db_sku['title'], "image": image, "status": db_order['status'], "due": db_sku['tuan_price'], "type": '%d人团' % db_sku['tuan_size'], "need": db_order['need'], "time_remain": max(db_order['expire_tick'] - now_tick, 0), "time_used": (now_tick - db_order['create_tick']) if not db_order.has_key('succ_tick') else (db_order['succ_tick'] - db_order['create_tick']), "members": member, } #print data return json.dumps({'ret': 0, 'data': data}) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', pt_order_id='', order_id='', type='', total='') print param if '' in (param.total, param.type): 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地址'}) if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_shop = db.base_shop.find_one({'_id':ObjectId(setting.default_shop)},{'name':1}) db_session = db.app_sessions.find_one({'session_id':param.session_id},{'ticket':1}) ticket = db_session.get('ticket','') # 修改为付款的过期订单 r = db.order_app.update_many({ 'uname' : {'$in' : uname.values()}, 'status' : 'DUE', 'deadline' : {'$lt':int(time.time())} }, {'$set': {'status':'TIMEOUT'}}) # 统一下单接口获取 prepay_id nonce_str = app_helper.my_rand(30) body = 'U掌柜app' trade_type = 'JSAPI' if len(param.order_id)>0: #order_id = '%s_%d' % (param.order_id.encode('utf-8'), int(time.time())) order_id = param.order_id.encode('utf-8') else: # 生成order_id, 2015-10-29 order_id = app_helper.get_new_order_id('x').encode('utf-8') # 拼团订单 t 开头 if param.type=='TUAN': order_id = 't'+order_id[1:] total_fee = param.total.encode('utf-8') openid = uname['openid'].encode('utf-8') para = [ ('appid' , wx_appid), ('body' , body), ('mch_id' , mch_id), ('nonce_str' , nonce_str), ('notify_url' , notify_url), ('openid' , openid), ('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>' \ '<openid>'+openid+'</openid>' \ '</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 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' : '订单状态变化,请确认'}) # 再次 checkout if param.type=='TUAN': ret_json = pt_checkout( uname, { 'region_id' : db_order['region_id'], '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']), 'pt_order_id' : db_order['pt_order_id'], }) if ret_json['ret']<0: # checkout 出错 return json.dumps({'ret' : ret_json['ret'], 'msg' : ret_json['msg']}) else: ret_json = checkout( uname, { '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']), 'order_id' : db_order['order_id'], }) 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['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['openid'], '提交微信支付2')} }) if param.type=='TUAN': # 拼团订单 return json.dumps({ 'ret' : 0, 'order_id' : param.order_id, 'pt_order_id' : db_order['pt_order_id'], 'position' : db_order['position'], 'data' : data, 'ticket' : ticket }) else: # 1小时订单 return json.dumps({ 'ret' : 0, 'order_id' : param.order_id, 'data' : data, 'ticket' : ticket }) else: # 生成新订单 db_cart = db.app_user.find_one({'openid':uname['openid']},{'cart_order_wx':1}) if param.type=='TUAN': # 拼团订单 if not db_cart.has_key('cart_order_wx'): print 'fail: 不该发生, 缺少购物车数据' return json.dumps({'ret' : -9, 'msg' : '系统错误,请重试!'}) new_order = dict(db_cart['cart_order_wx'][0]) 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['openid'], '提交微信支付')] # 如果是新开团,添加pt_order if len(db_cart['cart_order_wx'])>1: new_pt_order = dict(db_cart['cart_order_wx'][1]) new_pt_order['pt_order_id']='pt'+order_id[1:] new_pt_order['status']='WAIT' new_pt_order['history']=[(app_helper.time_str(), uname['openid'], '等待开团')] db.pt_order.insert_one(new_pt_order) # 订单数据里添加 pt_order_id new_order['pt_order_id']=new_pt_order['pt_order_id'] # 再次 checkout ret_json = pt_checkout( uname, { 'region_id' : new_order['region_id'], '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']), 'pt_order_id' : new_order['pt_order_id'], }) if ret_json['ret']<0: print 'checkout 检查未通过,不能支付' return json.dumps({'ret' : -9, 'msg' : ret_json['msg']}) db.order_app.insert_one(new_order) return json.dumps({ 'ret' : 0, 'order_id' : new_order['order_id'], 'pt_order_id' : new_order['pt_order_id'], 'position' : new_order['position'], # 测试 'data' : data, 'ticket' : ticket }) else: # 1小时订单 new_order = dict(db_cart['cart_order_wx']) 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['openid'], '提交微信支付')] # 再次 checkout ret_json = checkout( uname, { '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']), 'order_id' : new_order['order_id'], }) if ret_json['ret']<0: print 'checkout 检查未通过,不能支付' return json.dumps({'ret' : -9, 'msg' : ret_json['msg']}) if float(ret_json['data']['due'])!=float(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, 'ticket' : ticket }) else: return json.dumps({'ret' : -1, 'data' : r.status}) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', region_id='') if param.region_id == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) #if not (param.page_size.isdigit() and param.page_index.isdigit()): # return json.dumps({'ret' : -3, 'msg' : 'page参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 区别首单用户 #ccc = db.order_app.find({'user':{'$in':uname.values()}, # 'status':{'$nin':['DUE','TIMEOUT','CANCEL']}},{'_id':1}).count() now_tick = int(time.time()) # 查找拼团商品信息清单 condition = { 'region_id': { '$in': [param.region_id] }, 'online': { '$in': [param.region_id] }, 'expire_tick': { '$gt': now_tick } # 过期隐藏 } #if ccc > 0: # 非首单,要回避只首单可见的商品 2015-09-25 # condition['first_order'] = { '$ne' : 1 } # 取所有商品数据 db_invent = db.pt_store.find(condition).sort([('sort_weight', 1), ('_id', -1)]) # 售罄的沉底 db_invent2 = [] db_num_0 = [] for s in db_invent: if s['sale_out'] != 1: db_invent2.append(s) else: db_num_0.append(s) db_invent2.extend(db_num_0) # 取指定区间的 2015-10-29 #start_pos = int(param.page_size)*int(param.page_index) #end_pos = start_pos + int(param.page_size) #db_invent3 = db_invent2[start_pos:end_pos] image_host = 'http://%s/image/product' % setting.image_host data = [] for i in db_invent2: # 准备数据 new_one = { 'tuan_id': i['tuan_id'], 'title': i['title'], 'desc': i['desc'], 'price': i['price'], 'tuan_price': i['tuan_price'], 'ref_price': i['ref_price'], 'volume': '%d件' % i['volume'], 'promote': True if i['promote'] == 1 else False, 'promote_img': '%s/images/promote.png' % image_host, 'image': ['%s/%s/%s' % (image_host, x[:2], x) for x in i['image']], 'tuan_size': i['tuan_size'], 'sale_out': True if i['sale_out'] == 1 else False, 'expired': True if i['expire_tick'] < now_tick else False, } # 设置标签 2015-09-27 if new_one['promote'] > 0: for j in app_helper.left_tag['tags']: if i['tuan_id'] in j['skus']: new_one['promote_img'] = image_host + j['tag'] break data.append(new_one) #print data # 返回 return json.dumps({ 'ret': 0, 'data': { 'region_id': param.region_id, 'total': len(data), 'tuans': data, } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', shop_id='', product_id='') if '' in (param.shop_id, param.product_id): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 有效的sku db_sku = db.sku_store.find_one({'product_id': param.product_id}, { 'product_id': 1, 'base_sku': 1, 'app_title': 1, 'is_onsale': 1, 'special_price': 1, 'promote': 1, 'list_in_app': 1, 'maximun': 1, 'volume': 1, }) base_sku = db.dereference(db_sku['base_sku']) # 处理整箱预售 if db_sku['list_in_app'] == -3: # 关闭整箱 2015-10-27 shop_id = setting.B3_shop # B3整箱预售虚拟店 else: shop_id = param.shop_id # 查找商品详情 db_invent = db.inventory.find_one( { 'shop': ObjectId(shop_id), 'product_id': param.product_id, 'list_in_app': { '$ne': 0 }, }, { 'product_id': 1, #'category' : 1, # 品类,从sku_store来的 #'sort_weight' : 1, 'sku': 1, 'price': 1, # 门店价 'num': 1, # 库存数 }, ) # 准备返回结果 data = { 'product_id': db_invent['product_id'], 'title': db_sku['app_title'], 'abstract': base_sku['abstract'], 'price': db_invent['price'], 'num': db_invent['num'], 'promote': db_sku['promote'], 'promote_img': app_helper.left_tag['default2'], 'detail_url': '', 'volume': '%d件' % int(db_sku.get('volume', 0)), # 销量,需要后台实现 'max_can_buy': max(int(db_invent['num']), 0) if int(db_sku['maximun']) == 0 else int(db_sku['maximun']), 'message': '' if int(db_sku['maximun']) == 0 else '该商品每单限购%d件' % int(db_sku['maximun']) } # 是否有优惠价格 if db_sku['is_onsale'] == 1 and float( db_sku['special_price']) < float(db_invent['price']): # 优惠价格比门店价格低 data['sale_price'] = db_sku['special_price'] # 图片 if base_sku.has_key('image'): #if len(base_sku['image'])>1: # i = base_sku['image'][1] # 第2张是详情图 #else: # i = base_sku['image'][0] #data['image']=['/%s/%s' % (i[:2], i)] data['image'] = [ '/%s/%s' % (i[:2], i) for i in base_sku['image'] ] if len(data['image']) > 1: # 如果不止一张图,第2张开始时详情图 data['image'].pop(0) # 把第1张去除 else: data['image'] = '' # 设置标签 2015-09-27 if data['promote'] > 0: for j in app_helper.left_tag['tags']: if db_invent['product_id'] in j['skus']: data['promote_img'] = j['tag'] break data['max_can_buy'] = int(db_sku['maximun']) # 0 表示不限购 # 设置买X送Y if db_invent['product_id'] in app_helper.buy_X_give_Y.keys(): data['xx'] = app_helper.buy_X_give_Y[ db_invent['product_id']][0] data['yy'] = app_helper.buy_X_give_Y[ db_invent['product_id']][1] else: data['xx'] = 100000 data['yy'] = 0 data['only_one'] = app_helper.only_one data['only_one_message'] = '每单只能购买1种该促销活动商品' # 返回 return json.dumps({'ret': 0, 'data': data}) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', shop_id='', order_id='', addr_id='', coupon_id='', cart='') if '' in (param.shop_id, param.addr_id, param.cart): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one( {'openid': uname['openid']}, #, 'mice':{'$ne':1}}, { 'coupon': 1, 'address': 1, 'credit': 1, 'mice': 1 }) if db_user == None: # 不应该发生 return json.dumps({'ret': -9, 'msg': '未找到用户信息'}) # 检查mice, 排除白名单 if db_user.get('mice') == 1 and uname[ 'uname'] not in app_helper.WHITE_LIST: print 'mice !!!' return json.dumps({'ret': -9, 'msg': '未找到用户信息'}) # 先要核对送货地址是否在门店送货范围内!!!!!!! -- 需补充 # 查找shop db_shop = db.base_shop.find_one({'_id': ObjectId(param.shop_id)}) if db_shop == None: return json.dumps({'ret': -6, 'msg': 'shop_id错误'}) # 查询收货地址 address = None for i in db_user['address']: if i[0] == param.addr_id: address = list(i) break if address == None: return json.dumps({'ret': -7, 'msg': 'addr_id错误'}) ########################################################################### # 用收货电话检查黄牛 2015-08-22 db_recv = db.recv_tel.find_one({'tel': address[2]}) if db_recv: one_more = 0 if uname['openid'] not in db_recv['unames']: # 补充疑似账号 db.recv_tel.update_one( {'tel': address[2]}, {'$push': { 'unames': uname['openid'] }}) one_more = 1 if len(db_recv['unames']) + one_more > 10: # 改为10,2015-10-12 # 发现 mice mice = 1 for b in db_recv['unames']: if b in app_helper.WHITE_LIST: # 过滤白名单相关号码 mice = 0 break db.app_user.update_many( {'uname': { '$in': db_recv['unames'] }}, {'$set': { 'mice': mice }}) db.app_user.update_many( {'openid': { '$in': db_recv['unames'] }}, {'$set': { 'mice': mice }}) if one_more == 1: db.app_user.update_one({'openid': uname['openid']}, {'$set': { 'mice': mice }}) if mice == 1: print '!!! mice:', address[ 2] #, uname, db_recv['unames'] return json.dumps({'ret': -9, 'msg': '黄牛下单1'}) else: db.recv_tel.insert_one({ 'tel': address[2], 'unames': [uname['openid']] }) #print 'insert', address[2].encode('utf-8') # 用收货地址检查黄牛, 不准确,不能标注 2015-08-23 db_recv = db.recv_addr.find_one({'addr': address[3]}) if db_recv: one_more = 0 if uname['openid'] not in db_recv['unames']: db.recv_addr.update_one( {'addr': address[3]}, {'$push': { 'unames': uname['openid'] }}) one_more = 1 if len(db_recv['unames']) + one_more > 10: # 改为10,2015-10-12 # 发现疑似mice,不标注,因为不确定 print '!!! maybe a mice:', address[3].encode( 'utf-8') #, uname['openid'], db_recv['unames'] else: db.recv_addr.insert_one({ 'addr': address[3], 'unames': [uname['openid']] }) #print 'insert', address[2] # 查黄牛-结束 ########################################################################### # 查找优惠券 # 未查到,则不使用优惠券 coupon = None for i in db_user['coupon']: if i[0] == param.coupon_id: coupon = list(i) break # 转换cart数据为json,应该有异常捕获 !!! cart = json.loads(param.cart) #print cart if len(cart) == 0: return json.dumps({'ret': -5, 'msg': '购物车无数据'}) if param.order_id == '': #cc = 1 #while cc!=None: # # 取得sku计数, 不与线下order共用 # db_sa = db.user.find_one_and_update( # {'uname' : 'settings'}, # {'$inc' : {'app_count' : 1}}, # {'app_count' : 1} # ) # order_id = 'n%06d' % db_sa['app_count'] # # 防止订单号重复 # cc = db.order_app.find_one({'order_id' : order_id},{'_id':1}) order_id = app_helper.get_new_order_id('vx') print 'new order_id', order_id else: order_id = param.order_id cc = db.order_app.find_one( { #'uname' : {'$in':uname.values()}, # 防止app的bug,重复order_id 'order_id': order_id, }, { 'status': 1, }) if cc != None and cc[ 'status'] != 'DUE': # 检查订单状态,只有due才可以checkout print "BUG! order_id status" return json.dumps({'ret': -99, 'msg': '订单状态错误'}) # 订单状态:DUE, PAID, ONROAD, COMPLETED, CANCELED, FINISH # 默认运费 5元,免邮门槛 29元 order = { 'status': 'DUE', 'uname': uname['openid'], 'shop': db_shop['_id'], 'user': uname['openid'], 'order_id': order_id, 'order_source': 'weixin', # 2015-10-20 'address': address, # 收货地址 'coupon': coupon, # 使用的优惠券 'cart': [], 'cost': '0.00', # 成本合计,参考 'total': '0.00', # 价格小计,加项 'coupon_disc': '0.00', # 优惠券抵扣,减项 'first_disc': '0.00', # 首单立减, 减项 'delivery_fee': '0.00', # 运费,加项 'due': '0.00', # 应付价格 'uname_id': db_user['_id'], # for processor 'next_status': '', 'lock': 0, 'man': 0, 'retry': 0, 'comment': '', 'b_time': int(time.time()), 'e_time': int(time.time()), 'deadline': int(time.time() + 60 * 15), } # item = { # “product_id” : “k000011”, # “num” : “5”, # } # 应该只有 k-prod cart_to_return = [] cate_001 = 0 for item in cart: # sku db_sku = db.sku_store.find_one( {'product_id': item['product_id']}, { 'app_title': 1, 'is_onsale': 1, 'special_price': 1, 'ref_price': 1, 'maximun': 1, 'list_in_app': 1, }) if db_sku == None: # 应该不会发生 print 'Error: db_sku==None' continue if db_sku['list_in_app'] == -3: # B3 整箱预售 # 关闭 2015-10-27 r = db.inventory.find_one( # 线上销售要检查库存 { 'product_id' : item['product_id'], 'list_in_app' : {'$ne' : 0}, 'shop' : ObjectId(setting.B3_shop), }, { 'cost_price' : 1, 'ref_prod_id' : 1, 'price' : 1, 'sku' : 1, 'num' : 1, 'category' : 1 } ) else: r = db.inventory.find_one( # 线上销售要检查库存 { 'product_id' : item['product_id'], 'list_in_app' : {'$ne' : 0}, 'shop' : db_shop['_id'], }, {'cost_price':1, 'ref_prod_id':1, 'price':1, 'sku':1, 'num':1, 'category':1} ) if r: # 如果库存数据中没此sku,会忽略掉,此情况应该不会发生 new_num = int(item['num']) new_num = new_num if new_num <= r['num'] else r['num'] new_num = max(0, new_num) # 发现过小于零的情况,微信 # 检查是不是 001 (水果) 分类 if r['category'] == '001': cate_001 += 1 # 检查是否限购 if db_sku['maximun'] > 0: ''' # 每日限购,生成当天的时间tick tday = app_helper.time_str(format=1) begin_d = '%s 00:00:00' % tday end_d = '%s 23:59:59' % tday begin_t = int(time.mktime(time.strptime(begin_d,"%Y-%m-%d %H:%M:%S"))) end_t = int(time.mktime(time.strptime(end_d,"%Y-%m-%d %H:%M:%S"))) print begin_d, end_d, begin_t, end_t # 检查时间段内购买记录 c = db.order_app.find({ 'uname' : {'$in': uname.values()}, 'order_id' : {'$ne':order_id}, 'status' : {'$ne':'TIMEOUT'}, 'cart.product_id' : item['product_id'], '$and' : [{'b_time' : {'$gt' : begin_t}}, {'b_time' : {'$lt' : end_t}}], }, {'_id':1}).count() print 'findings: ',c if c>0: # 限购商品只允许购买1次 new_num=0 else: new_num=min(new_num, db_sku['maximun']) print 'limit : ',new_num ''' # 每单限购 if new_num > db_sku['maximun']: new_num = db_sku['maximun'] print 'limit : ', new_num ''' # 买一送一 每单限购1件 if item['product_id'] in app_helper.buy_1_give_1: #new_num=min(new_num, 1) #print 'buy 1 give 1 limit : ',new_num new_item = { 'product_id' : item['product_id'], 'num' : '%d' % new_num, 'num2' : new_num, 'price' : r['price'], 'title' : db_sku['app_title'], } else: ''' new_item = { 'product_id': item['product_id'], 'num': item['num'], 'num2': new_num, 'price': r['price'], 'title': db_sku['app_title'], } # 是否有优惠价格 if db_sku['is_onsale']==1 and \ float(db_sku['special_price'])<float(r['price']): # 优惠价格比门店价格低 new_item['price'] = db_sku['special_price'] # 计算总价 item_price = round(new_num * float(new_item['price']), 2) new_item['price'] = '%.2f' % item_price cart_to_return.append(new_item) # 返回到app的cart不包含cost cost_price = r['cost_price'] #if item[0][0]=='w': # w-prod 信息都用 u-prod的替换 # new_item['product_id'] = r['ref_prod_id'] # new_item['w_id'] = item[0] # # 查询成本, 从对应u-prod当前成本 # r2 = db.inventory.find_one({ # u-prod # 'shop' : db_shop['shop'], # 'product_id' : r['ref_prod_id'], # }, {'cost_price':1}) # cost_price = r2['cost_price'] # 计算成本 item_cost = round(new_num * float(cost_price), 2) new_item['cost'] = '%.2f' % item_cost # 加入cart order['cart'].append(new_item) # 累计售价和成本 order['total'] = '%.2f' % (float(order['total']) + item_price) order['cost'] = '%.2f' % (float(order['cost']) + item_cost) else: # 店内未找到库存, !!!应该不会发生 new_item = { 'product_id': item['product_id'], 'num': item['num'], 'num2': 0, 'price': '0.00', 'cost': '0.00', 'title': db_sku['app_title'], } cart_to_return.append(new_item) # 返回到app的cart不包含cost order['cart'].append(new_item) tt = float(order['total']) if tt > 0: # 免邮门槛 #if tt<29: # 免邮门槛 29 if tt < app_helper.free_delivery: # 免邮门槛 order[ 'delivery_fee'] = '%.2f' % app_helper.delivery_fee # 运费5元 ''' # 首单立减 first_promote元, 商品总额大于 first_promote_threshold元 print cate_001 cut_now = app_helper.first_promote #10 if cate_001>0 and (tt+float(order['delivery_fee']))>=app_helper.first_promote_threshold and \ db.order_app.find({'user':{'$in':uname.values()}, 'status':{'$nin':['DUE','TIMEOUT','CANCEL']}},{'_id':1}).count()==0: order['first_disc'] = '%.2f' % cut_now ''' # 首单立减 first_promote元, 商品总额大于 first_promote_threshold元 if cate_001 > 0 and db.order_app.find( { 'user': { '$in': uname.values() }, 'status': { '$nin': ['DUE', 'TIMEOUT', 'CANCEL'] } }, { '_id': 1 }).count() == 0: # 符合首单条件,且有一个水果商品 print '首单' if str(db_shop['_id']) in app_helper.first_promote2_shop and \ (tt+float(order['delivery_fee']))>=app_helper.first_promote2_threshold: # 站点落在 指定站点范围内,使用首单立减2 print '首单立减 - 指定站点' order[ 'first_disc'] = '%.2f' % app_helper.first_promote2 elif (tt + float(order['delivery_fee']) ) >= app_helper.first_promote_threshold: # 其他站点使用首单立减1 print '首单立减' order['first_disc'] = '%.2f' % app_helper.first_promote # 优惠券, 检查有效期, 优惠券门槛为10元 if float(order['first_disc'])==0.0 and coupon!=None and \ coupon[3]==1 and app_helper.time_str(format=1)<=coupon[1]: if len(coupon ) > 5 and coupon[5] == 'apple' and cate_001 < 1: # 水果券,但没有水果 2015-09-29 print '水果券没水果' order['coupon'] = None elif len(coupon) > 5 and coupon[5] == 'b3' and b3_sku < 1: # 整箱券,但没有整箱 2015-10-18 print '整箱券没整箱' order['coupon'] = None else: if len(coupon) > 4: # (id, 有效期, 金额, 是否已用, 门槛) 2015-09-27 # 有门槛信息,使用优惠券门槛信息 if (tt + float(order['delivery_fee'])) < coupon[4]: order['coupon'] = None else: order['coupon_disc'] = coupon[2] else: # 使用默认条件 if float(coupon[2]) == 6.0 and ( tt + float(order['delivery_fee'])) < 29.9: order['coupon'] = None elif float(coupon[2]) == 9.0 and ( tt + float(order['delivery_fee'])) < 39.9: order['coupon'] = None elif (tt + float(order['delivery_fee'])) < 14.9: order['coupon'] = None else: order['coupon_disc'] = coupon[2] else: order['coupon'] = None # 计算应付:价格合计 - 优惠券 - 首单立减 + 运费 print(tt + float(order['delivery_fee']) - float(order['coupon_disc']) - float(order['first_disc'])) print tt, float(order['delivery_fee']), float( order['coupon_disc']), float(order['first_disc']) order['due'] = '%.2f' % (tt + float(order['delivery_fee']) - float(order['coupon_disc']) - float(order['first_disc'])) if float(order['due']) <= 0: order['due'] = '0.10' # 如果没有,则insert #db.order_app.replace_one({'order_id':order_id}, order, upsert=True) db.order_app.update_one({'order_id': order_id}, { '$set': order, '$push': { 'history': (app_helper.time_str(), uname['openid'], '提交结算') } }, upsert=True) print cart_to_return return json.dumps({ # 返回结果,实际有库存的结果, 'ret': 0, 'data': { 'order_id': order['order_id'], 'shop_id': str(order['shop']), 'shop': db_shop['name'], # 可能会变,如果地址与门店不匹配的时候 'addr_id': address[0], 'cart_num': len(order['cart']), 'cart': cart_to_return, 'total': order['total'], 'coupon': coupon[0] if order['coupon'] else '', 'coupon_disc': order['coupon_disc'], 'first_disc': order['first_disc'], 'delivery_fee': order['delivery_fee'], 'due': order['due'], 'credit': '%.2f' % db_user.get('credit', 0.0) } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', region_id='', query='') if '' in (param.query, param.region_id): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1, 'credit':1}) if db_user==None: # 不应该发生 return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'}) # 刷新订单状态,过期的OPEN活动变为FAIL1, 个人订单已付款的变为FAIL_TO_REFUND r2 = db.pt_order.find({ 'status' : 'OPEN', 'expire_tick' : {'$lt' : int(time.time()) } }, { 'pt_order_id':1 }) for x in r2: # 已付款的已付款的变为FAIL_TO_REFUND db.order_app.update_many({'pt_order_id':x['pt_order_id'],'status':'PAID_AND_WAIT'}, { '$set' : {'status' : 'FAIL_TO_REFUND', 'man' : 1}, '$push' : {'history' : (app_helper.time_str(), 'system', '超时成团失败')} } ) #过期的OPEN活动变为FAIL1, r3 = db.pt_order.find_one_and_update({'_id':x['_id']}, { '$set' : {'status' : 'FAIL1'}, '$push' : {'history' : (app_helper.time_str(), 'system', '超时成团失败')} }, {'member':1} ) print '发微信通知' for x in r3['member']: print app_helper.wx_reply_msg(x['openid'], '很抱歉,你参加的拼团活动已过24小时,人数不足未能成团,我们将在1-3个工作日内为您安排退款到支付帐户') # 获得订单 #if param.query=='ALL': condition = { 'region_id' : {'$in' : [ param.region_id ]}, '$or' : [ {'member.openid' : uname['openid']}, {'leader' : uname['openid']}, ], } image_host = 'http://%s/image/product' % setting.image_host db_pt_order = db.pt_order.find( condition ).sort([('_id',-1)]) order_list=[] for i in db_pt_order: if i['status'] in ['WAIT','FAIL3']: # 未开团成功的团不显示 continue if i['type']=='SINGLE': # 个人购买不显示 continue # 取购物车中第一个商品的图片 db_sku = db.pt_store.find_one({'tuan_id':i['tuan_id']}) image = ['%s/%s/%s' % (image_host, x[:2], x) for x in db_sku['image']] # 取订单order_id r = db.order_app.find_one({ 'pt_order_id':i['pt_order_id'], 'uname':uname['openid'] }, {'order_id':1}) if r==None: print 'Not found: ', i['pt_order_id'] return json.dumps({'ret' : -5, 'msg' : '未找到order'}) # 准备结果 order_list.append({ 'tuan_id' : i['tuan_id'], 'pt_order_id' : i['pt_order_id'], 'order_id' : r['order_id'], # 订单order_id 'title1' : db_sku['title'], 'image' : image, 'status' : i['status'], 'due' : db_sku['tuan_price'], 'type' : '%d人团'%db_sku['tuan_size'], }) #print order_list return json.dumps({ 'ret' : 0, 'data' : { 'region_id' : param.region_id, 'order_list' : order_list, } }) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', query='') if param.query == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid': uname['openid']}, { 'coupon': 1, 'credit': 1 }) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 修改为付款的过期订单 r = db.order_app.update_many( { 'uname': { '$in': uname.values() }, 'status': 'DUE', 'deadline': { '$lt': int(time.time()) } }, {'$set': { 'status': 'TIMEOUT' }}) #print r # 获得订单 if param.query == 'ALL': condition = { 'user': { '$in': uname.values() }, 'status': { '$ne': 'TIMEOUT' } } else: condition = { 'user': { '$in': uname.values() }, 'status': QUERY.get(param.query) } db_order = db.order_app.find( condition, { 'status': 1, 'cart': 1, 'due': 1, 'shop': 1, 'history': 1, 'order_id': 1, 'deadline': 1 }).sort([('order_id', -1)]) order_list = [] for i in db_order: # 取购物车中第一个商品的图片 db_sku = db.sku_store.find_one( {'product_id': i['cart'][0]['product_id']}, {'base_sku': 1}) base_sku = db.dereference(db_sku['base_sku']) image = base_sku['image'][0] if base_sku.has_key( 'image') and len(base_sku['image']) > 0 else '' order_list.append({ 'order_id': i['order_id'], 'order_time': i['history'][0][0], 'image': '/%s/%s' % (image[:2], image), 'status': helper.ORDER_STATUS['APP'].get(i['status'], '未知状态'), 'due': i['due'], 'count': len(i['cart']), }) return json.dumps({ 'ret': 0, 'data': { 'order_list': order_list, 'credit': '%.2f' % db_user.get('credit', 0.0) } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', order_id='') if param.order_id == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid': uname['openid']}, { 'coupon': 1, 'credit': 1 }) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 获得订单 #print param.order_id, uname db_order = db.order_app.find_one({ 'order_id': param.order_id, 'user': { '$in': uname.values() } }) if db_order == None: return json.dumps({'ret': -3, 'msg': '未找到订单!'}) cart = [] for i in db_order['cart']: r = db.sku_store.find_one({'product_id': i['product_id']}, {'base_sku': 1}) base_sku = db.dereference(r['base_sku']) image = base_sku['image'][0] if base_sku.has_key( 'image') and len(base_sku['image']) > 0 else '' cart.append({ 'product_id': i['product_id'], 'title': i['title'], 'price': i['price'], 'num2': i['num2'], 'image': '/%s/%s' % (image[:2], image), }) data = { 'order_id': db_order['order_id'], 'shop_id': str(db_order['shop']), # 需要中文名 'status': helper.ORDER_STATUS['APP'].get(db_order['status'], '未知状态'), # 需要中文名 'deadline': db_order['deadline'] - int(time.time()), # 离支付截至的时间,秒数 'delivery': { 'addr_id': db_order['address'][0], 'address': db_order['address'][3], 'contact': db_order['address'][1], 'contact_tel': db_order['address'][2], 'runner': db_order['runner']['name'] if db_order.has_key('runner') else '', # 送货员姓名 'runner_tel': db_order['runner']['tel'] if db_order.has_key('runner') else '', # 送货员电话 }, 'cart': cart, 'total': db_order['total'], 'coupon': db_order['coupon'][0] if db_order['coupon'] else '', 'coupon_disc': db_order['coupon_disc'], 'first_disc': db_order['first_disc'], 'delivery_fee': db_order['delivery_fee'], 'due': db_order['due'], 'star': db_order.get('star', 1), 'credit': '%.2f' % db_user.get('credit', 0.0), } return json.dumps({'ret': 0, 'data': data}) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', shop_id='', category='', page_size='', page_index='') if '' in (param.shop_id, param.category, param.page_size, param.page_index): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if not (param.page_size.isdigit() and param.page_index.isdigit()): return json.dumps({'ret' : -3, 'msg' : 'page参数错误'}) if len(param.shop_id)<24: return json.dumps({'ret' : -1, 'msg' : 'shop_id参数错误'}) if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 处理整箱预售 if param.category=='-3': # 关闭 B3 2015-10-27 shop_id = setting.B3_shop # B3整箱预售虚拟店 else: shop_id = param.shop_id # 区别首单用户 ccc = db.order_app.find({'user':{'$in':uname.values()}, 'status':{'$nin':['DUE','TIMEOUT','CANCEL']}},{'_id':1}).count() # 查找商品信息清单 # 分页返回 find().skip(page_size*page_index).limit(page_size) condition = { 'shop' : ObjectId(shop_id), 'category' : param.category, 'list_in_app' : {'$ne' : 0}, 'online' : 1, #'num' : {'$gt' : 0}, # 只显示有库存的商品 } if ccc > 0: # 非首单,要回避只首单可见的商品 2015-09-25 condition['first_order'] = { '$ne' : 1 } ''' db_invent = db.inventory.find(condition, { 'product_id' : 1, 'category' : 1, # 品类,从sku_store来的 'sort_weight' : 1, 'sku' : 1, 'price' : 1, # 门店价 'num' : 1, # 库存数 }, skip = int(param.page_size)*int(param.page_index), limit = int(param.page_size) ).sort([('sort_weight',1), ('_id',1)]) ''' # 取所有商品数据 2015-10-29 db_invent = db.inventory.find(condition, { 'product_id' : 1, 'category' : 1, # 品类,从sku_store来的 'sort_weight' : 1, 'sku' : 1, 'price' : 1, # 门店价 'num' : 1, # 库存数 }, ).sort([('sort_weight',1), ('_id',1)]) # 库存小于零的沉底 2015-10-29 db_invent2 = [] db_num_0 = [] for s in db_invent: if int(s['num'])>0: db_invent2.append(s) else: db_num_0.append(s) db_invent2.extend(db_num_0) # 取指定区间的 2015-10-29 start_pos = int(param.page_size)*int(param.page_index) end_pos = start_pos + int(param.page_size) db_invent3 = db_invent2[start_pos:end_pos] invent = [] skus = [] for s in db_invent3: skus.append(s['sku']) invent.append(( s['sku'], #0 s['price'], #1 s['product_id'], #2 s['num'], #3 )) # 有效的sku db_sku=db.sku_store.find({'_id':{'$in':skus}} ,{ 'product_id' : 1, 'base_sku' : 1, 'app_title' : 1, 'is_onsale' : 1, 'special_price' : 1, 'promote' : 1, 'maximun' : 1, }).sort([('_id',1)]) skus = {} for u in db_sku: base_sku = db.dereference(u['base_sku']) skus[u['_id']]=( base_sku['name'], #0 base_sku['image'][0] if base_sku.has_key('image') and len(base_sku['image'])>0 else '', u['app_title'], #2 u['is_onsale'], #3 u['special_price'], #4 base_sku['original'], #5 u['promote'], #6 u['maximun'], #7 ) data = [] for i in invent: # 准备数据 new_one = { 'product_id' : i[2], 'title' : skus[i[0]][2], #'original' : skus[i[0]][5], 'price' : i[1], #'num' : min(i[3],skus[i[0]][7]) if skus[i[0]][7]>0 else i[3], # 限购 'num' : max(int(i[3]),0), 'promote' : skus[i[0]][6], 'image' : '/%s/%s' % (skus[i[0]][1][:2], skus[i[0]][1]), } if skus[i[0]][3]==1 and float(skus[i[0]][4])<float(i[1]): # 优惠价格比门店价格低 new_one['sale_price'] = skus[i[0]][4], data.append(new_one) # 返回最近shop return json.dumps({ 'ret' : 0, 'data' : { 'total' : len(data), 'page_size' : int(param.page_size), 'page_index' : int(param.page_index), 'skus' : data, } }) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', type='', data='') if param.type == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.type not in ['GPS', 'NAME']: return json.dumps({'ret': -3, 'msg': 'type参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: # 准备用户坐标 if param.type == 'NAME': ret, loc = lbs.addr_to_loc(param['data'].encode('utf-8')) print ret, loc if ret < 0: # 重试一次,网络可能会失败 ret, loc = lbs.addr_to_loc(param['data'].encode('utf-8')) print ret, loc if ret < 0: loc = {'lat': 0, 'lng': 0} else: loc0 = param.data.split(',') # 31.20474193,121.620708272 loc = {'lat': float(loc0[0]), 'lng': float(loc0[1])} # 找最近距离的店 min_d = 999999 min_shop = None poly_shop = None # 多边形匹配 db_shop = db.base_shop.find( {'type': { '$in': ['chain', 'store', 'dark'] }}) for s in db_shop: if s.get('app_shop', 1) == 0: # 忽略不支持线上销售的店 continue #d=lbs.geo_distance(s['loc']['lat'],s['loc']['lng'],loc['lat'],loc['lng']) #print 'd = ', d, min_d #if d<s.get('radius', 2) and d<min_d: # 默认半径2公里 # min_d=d # min_shop=(s['_id'],s['name'],s['address']) # 多边形检查 poly = s.get('poly_xy', []) if len(poly) == 0: # 没有多边形数据 print "缺少多边形数据!" continue if lbs.wn_PnPoly((loc['lat'], loc['lng']), poly) != 0: print 'bingo! poly_shop' poly_shop = (s['_id'], s['name'], s['address']) break if poly_shop == None and min_shop == None: print '不在配送范围内' return json.dumps({'ret': -6, 'msg': '不在配送范围内'}) if poly_shop == None: # 返回最近shop print 'choose:', min_shop[1].encode('utf-8') return json.dumps({ 'ret': 0, 'data': { 'shop_id': str(min_shop[0]), 'shop_name': min_shop[1], 'address': min_shop[2], } }) else: # 返回多边形匹配shop print 'choose:', poly_shop[1].encode('utf-8') return json.dumps({ 'ret': 0, 'data': { 'shop_id': str(poly_shop[0]), 'shop_name': poly_shop[1], 'address': poly_shop[2], } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', order_id='', pay_type='', data='') print param if '' in (param.order_id, param.pay_type): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid': uname['openid']}, { '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} {'_id': 0}) 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['due'], 'paid2_time': app_helper.time_str(), 'paid2_tick': int(time.time()), }, '$push': { 'history': (app_helper.time_str(), uname['openid'], '提交付款') }, }) return json.dumps({ 'ret': 0, 'data': { 'order_id': param.order_id, 'due': db_order['due'], 'paid': db_order['due'], 'status': '已支付' } }) # 只能处理未支付订单 if db_order['status'] != 'DUE': return json.dumps({'ret': -3, 'msg': '不是待付款订单!'}) # 微信支付未到账处理 if 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['due'], 'paid2_time': app_helper.time_str(), 'paid2_tick': int(time.time()), 'pay_data': param.data, }, '$push': { 'history': (app_helper.time_str(), uname['openid'], '提交付款') }, }, {'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['due'], 'paid2_time': app_helper.time_str(), 'paid2_tick': int(time.time()), }, '$push': { 'history': (app_helper.time_str(), uname['openid'], '提交付款') }, }) # 返回 return json.dumps({ 'ret': 0, 'data': { 'order_id': param.order_id, 'due': db_order['due'], 'paid': db_order['due'], 'status': '已支付', 'alert': False, 'message': '测试信息,还未收到异步通知', 'url': 'http://app-test.urfresh.cn' } }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', order_id='', pay_type='', data='') print param if '' in (param.order_id, param.pay_type): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if param.openid=='' and param.session_id=='': return json.dumps({'ret' : -2, 'msg' : '参数错误1'}) # 同时支持openid和session_id if param.openid!='': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid':uname['openid']},{'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} {'_id':0} ) 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['due'], 'paid2_time' : app_helper.time_str(), 'paid2_tick' : int(time.time()), }, '$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')}, } ) return json.dumps({'ret' : 0, 'data' : { 'order_id' : param.order_id, 'due' : db_order['due'], 'paid' : db_order['due'], 'status' : '已支付' }}) # 只能处理未支付订单 if db_order['status']!='DUE': return json.dumps({'ret' : -3, 'msg' : '不是待付款订单!'}) # 余额支付和支付宝/微信支付未到账处理 if param.pay_type=='CREDIT': # 检查余额是否够支付 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({'openid':db_order['uname']}, {'$set':{'coupon':coupon}}) # 正常减库存! # item = [ product_id, num, num2, price] # k - num 库存数量 print "修改库存." b2 = [] # C端商品 b3 = [] # B3整箱预售商品 b3_total = 0.0 for item in db_order['cart']: #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['product_id'] in app_helper.buy_1_give_1: 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 r = db.inventory.find_one_and_update( # 不检查库存,有可能负库存 { 'product_id' : item['product_id'], 'shop' : db_order['shop'], }, { '$inc' : { 'num' : 0-float(item['num2']), # num2 实际购买数量 'pre_pay_num' : float(item['num2']), # 记录预付数量 } #'$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'] = r['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站点" db.order_app.update_one({'order_id':param.order_id},{'$set' : { 'shop_0' : r['shop'], 'shop' : ObjectId(setting.B3_shop), }}) else: # 情况3,什么都不做 print "订单保持不变" # 更新销货单信息 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()), }, '$push' : { 'history' : (app_helper.time_str(), uname['openid'], '余额付款')}, }) # 消费余额 db.app_user.update_one({'openid' : uname['openid'],},{ '$inc' : { 'credit' : 0-float(db_order['due']), }, '$push' : { 'history' : (app_helper.time_str(), uname['openid'], '消费余额 %s' % db_order['due'].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['due'], 'paid2_time' : app_helper.time_str(), 'paid2_tick' : int(time.time()), 'pay_data' : param.data, }, '$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')}, }, {'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['due'], 'paid2_time' : app_helper.time_str(), 'paid2_tick' : int(time.time()), }, '$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')}, } ) # 返回 return json.dumps({'ret' : 0, 'data' : { 'order_id' : param.order_id, 'due' : db_order['due'], 'paid' : db_order['due'], 'status' : '已支付' }}) else: return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(openid='', session_id='', query='') if param.query == '': return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.openid == '' and param.session_id == '': return json.dumps({'ret': -2, 'msg': '参数错误1'}) # 同时支持openid和session_id if param.openid != '': uname = app_helper.check_openid(param.openid) else: uname = app_helper.wx_logged(param.session_id) if uname: db_user = db.app_user.find_one({'openid': uname['openid']}, { 'coupon': 1, 'credit': 1 }) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 修改为付款的过期订单 r = db.order_app.update_many( { 'uname': { '$in': uname.values() }, 'status': 'DUE', 'deadline': { '$lt': int(time.time()) } }, {'$set': { 'status': 'TIMEOUT' }}) #print r image_host = 'http://%s/image/product' % setting.image_host # 获得订单 #if param.query=='ALL': condition = { 'user': { '$in': uname.values() } } #, 'status':{'$ne':'TIMEOUT'}} db_order = db.order_app.find( condition, { 'status': 1, 'cart': 1, 'due': 1, 'shop': 1, 'history': 1, 'order_id': 1, 'deadline': 1, 'order_source': 1, 'pt_order_id': 1, 'type': 1, }).sort([('_id', -1)]) order_list = [] for i in db_order: #print i['_id'] if i.get('order_source') == 'wx_tuan': # 取拼团图片 r = db.pt_order.find_one({'pt_order_id': i['pt_order_id']}) if r == None: print i['pt_order_id'] return json.dumps({'ret': -6, 'msg': '未找pt_order'}) r2 = db.pt_store.find_one({'tuan_id': r['tuan_id']}) if r == None: print i['pt_order_id'] return json.dumps({'ret': -7, 'msg': '未找pt_store'}) image = r2['image'][0] if r2.has_key('image') and len( r2['image']) > 0 else '' order_list.append({ 'order_id': i['order_id'], 'pt_order_id': i['pt_order_id'], 'order_time': i['history'][0][0], 'image': '%s/%s/%s' % (image_host, image[:2], image), 'status': helper.ORDER_STATUS['APP'].get(i['status'], '未知状态'), 'due': i['due'], 'count': len(i['cart']), 'type': r['type'], }) else: # 取购物车中第一个商品的图片 db_sku = db.sku_store.find_one( {'product_id': i['cart'][0]['product_id']}, {'base_sku': 1}) base_sku = db.dereference(db_sku['base_sku']) image = base_sku['image'][0] if base_sku.has_key( 'image') and len(base_sku['image']) > 0 else '' order_list.append({ 'order_id': i['order_id'], 'order_time': i['history'][0][0], 'image': '%s/%s/%s' % (image_host, image[:2], image), 'status': helper.ORDER_STATUS['APP'].get(i['status'], '未知状态'), 'due': i['due'], 'count': len(i['cart']), 'type': i.get('type', 'HOUR'), }) print order_list ret_data = {'order_list': order_list} return json.dumps({ 'ret': 0, 'data': ret_data, }) else: return json.dumps({'ret': -4, 'msg': '无效的openid'})