def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', session='', secret='') if '' in (param.app_id, param.session, param.secret, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.secret]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) #session = app_helper.get_session(param.session) #if session==None: # return json.dumps({'ret' : -4, 'msg' : '无效的session'}) db.app_sessions.remove({'session_id': param.session}) # 返回 return json.dumps({ 'ret': 0, 'data': { 'logout': True, } })
def POST(self): web.header('Content-Type', 'application/json') 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.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}, {'coupon': 1}) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 订单打分 db.order_app.update_one({ 'order_id': param.order_id, 'user': uname }, { '$set': { 'star': int(param.star) }, '$push': { 'history': (app_helper.time_str(), uname, '订单打分') }, }) return json.dumps({'ret': 0, 'msg': '订单已打分!'}) 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='', 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): web.header('Content-Type', 'application/json') param = web.input(app_id='', secret='', sign='') if '' in (param.app_id, param.secret, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) #验证签名 md5_str = app_helper.generate_sign([param.app_id, 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}) # 返回全局参数 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://app.urfresh.cn/static/image/product', 'banner': app_helper.BANNER['c001'], 'default_shop': setting.default_shop, # 返回默认站店 'default_name': db_shop['name'] if db_shop else '', 'app_store': 'no', } })
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', session='', name='', tel='', addr='', sign='') if '' in (param.app_id, param.session, param.name, param.tel, param.addr, param.sign): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) uname = app_helper.logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign([param.app_id, param.session, param.name, param.tel, param.addr]) if md5_str!=param.sign: return json.dumps({'ret' : -1, 'msg' : '签名验证错误'}) # 需要判断地址是否有对应门店,否则不在送货范围内 # app_helper.check_address() # 更新个人资料 new_addr = ( app_helper.my_rand(), param.name.strip(), param.tel.strip(), param.addr.strip(), int(time.time()) ) r = db.app_user.update_one({'uname':uname}, {'$push' : {'address' : new_addr}}) # 返回 return json.dumps({'ret' : 0, 'data' : { 'addr_id' : new_addr[0], }}) else: return json.dumps({'ret' : -4, 'msg' : '无效的session'})
def POST(self): web.header('Content-Type', 'application/json') 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.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}, { '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='', sign='') if '' in (param.app_id, param.session, param.order_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.order_id]) 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 = 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['uname'], '取消账单') }, }) return json.dumps({'ret': 0, 'msg': '订单已取消!'}) 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='', secret='', sign='') if '' in (param.app_id, param.secret, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) #验证签名 md5_str = app_helper.generate_sign([param.app_id, 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}) # 返回全局参数 ret_data = { 'ret': 0, 'data': { 'delivery_fee': '%.2f' % app_helper.delivery_fee, 'free_delivery': '%.2f' % app_helper.free_delivery, 'first_promote': '%.2f' % app_helper.first_promote, 'image_host2': 'http://%s/image/product' % setting.image_host, 'notify_host': 'http://%s' % setting.notify_host, #'notify_host' : 'http://app.urfresh.cn', 'cod_enable': app_helper.cod_enable, 'alipay_enable': app_helper.alipay_enable, 'wxpay_enable': True, #app_helper.wxpay_enable, 'credit_enable': app_helper.credit_enable, 'category': app_helper.CATEGORY2, 'banner': app_helper.BANNER, 'banner_url': app_helper.BANNER_URL, 'default_shop': setting.default_shop, # 返回默认站店 'default_name': db_shop['name'] if db_shop else '', 'alert': app_helper.start_alert, # 多余 'message': app_helper.start_message, # ios使用 'message2': app_helper.start_message, # 安卓使用 } } if version == 'v3': ret_data['data']['wxpay_enable'] = True #app_helper.wxpay_enable ret_data['data']['credit_enable'] = True #app_helper.credit_enable ret_data['data']['release_date'] = '20151020' ret_data['data']['release_date2'] = '20151027' ret_data['data']['apk_url'] = '' ret_data['data']['wxpay_enable2'] = True #app_helper.wxpay_enable ret_data['data'][ 'credit_enable2'] = True #app_helper.credit_enable #print ret_data return json.dumps(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): web.header('Content-Type', 'application/json') 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.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}, {'coupon': 1}) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 检查是否有新红包 app_helper.check_hb(uname) # 这里应该增加对有效期的检查!!! 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': '无效的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='', 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): web.header('Content-Type', 'application/json') 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.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}, {'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, }) addr2 = quick(addr) # 返回 return json.dumps({ 'ret': 0, 'data': { 'addr': addr2, 'total': len(addr2), } }) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self, version='v1'): web.header('Content-Type', 'application/json') param = web.input(app_id='', secret='', sign='') if '' in (param.app_id, param.secret, param.sign): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) #验证签名 md5_str = app_helper.generate_sign([param.app_id, param.secret]) if md5_str!=param.sign: return json.dumps({'ret' : -1, 'msg' : '签名验证错误'}) # 返回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', }})
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='', 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): web.header('Content-Type', 'application/json') 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.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}, { '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, '提交付款') }, }) 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': '不是待付款订单!'}) # 余额支付和支付宝/微信支付未到账处理 # # 余额支付中对B3的处理与notify中处理一样 2015-09-14 # 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 }}) # 正常减库存! # item = [ product_id, num, num2, price] # k - num 库存数量 print "修改库存." b2 = [] # C端商品 b3 = [] # B3整箱预售商品 b3_total = 0.0 for item in db_order['cart']: # 暂停整箱预售 2015-10-27 #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'] = 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站点" db.order_app.update_one({'order_id': param.order_id}, { '$set': { 'shop_0': db_order['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, '余额付款') }, }) # 消费余额 db.app_user.update_one({ 'uname': uname, }, { '$inc': { 'credit': 0 - float(db_order['due']), }, '$push': { 'history': (app_helper.time_str(), uname, '消费余额 %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, '提交付款') }, }, {'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, '提交付款') }, }) # 返回 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': '无效的session'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', session='', shop_id='', order_id='', addr_id='', coupon_id='', 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.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.cart ]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) # 记录版本信息 db.app_user.update_one({'uname': uname}, {'$set': { 'version': 'v1' }}) # mice 为黄牛手机号标志,mice==1不可以下单 2015-08-22 db_user = db.app_user.find_one( {'uname': uname}, #, 'mice':{'$ne':1}}, { 'coupon': 1, 'address': 1, 'credit': 1, 'app_id': 1, 'mice': 1 }) if db_user == None: # 不应该发生 return json.dumps({'ret': -9, 'msg': '未找到用户信息'}) # 检查mice, 排除白名单 if db_user.get('mice') == 1 and uname not in app_helper.WHITE_LIST: print 'mice !!!' return json.dumps({'ret': -9, 'msg': '未找到用户信息'}) app_id = db_user['app_id'] # 修改未付款的过期订单 db.order_app.update_many( { #'uname' : uname, 'status': 'DUE', 'deadline': { '$lt': int(time.time()) } }, {'$set': { 'status': 'TIMEOUT' }}) # 检查是否有新红包 #app_helper.check_hb(uname) # 先要核对送货地址是否在门店送货范围内!!!!!!! -- 需补充 # 查找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 not in db_recv['unames']: # 补充疑似账号 db.recv_tel.update_one({'tel': address[2]}, {'$push': { 'unames': uname }}) 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({'uname': uname}, {'$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]}) print 'insert', address[2] # 用收货地址检查黄牛, 不准确,不能标注 2015-08-23 db_recv = db.recv_addr.find_one({'addr': address[3]}) if db_recv: one_more = 0 if uname not in db_recv['unames']: db.recv_addr.update_one({'addr': address[3]}, {'$push': { 'unames': uname }}) 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, db_recv['unames'] else: db.recv_addr.insert_one({ 'addr': address[3], 'unames': [uname] }) #print 'insert', address[2] # 用app_id检查黄牛 appid_count = db.app_user.find({ 'app_id': app_id }, { '_id': 1 }).count() if appid_count > 10 and app_id.strip( ) != '': # app_id 可能为空,新绑定的用户 # 改为10,2015-10-12 # 发现 mice db_mice = db.app_user.find({'app_id': app_id}, {'uname': 1}) mice = [] for m in db_mice: if m['uname'] in app_helper.WHITE_LIST: # 过滤白名单 mice = [] break else: mice.append(m['uname']) db.app_user.update_many({'uname': { '$in': mice }}, {'$set': { 'mice': 1 }}) if mice != []: print '!!! mice by app_id: ', mice return json.dumps({'ret': -9, 'msg': '黄牛下单1'}) # 查黄牛-结束 ########################################################################### # 查找优惠券 # 未查到,则不使用优惠券 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('v1') print 'new order_id', order_id else: order_id = param.order_id cc = db.order_app.find_one( { #'uname' : uname, # 防止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, 'shop': db_shop['_id'], 'user': uname, 'order_id': order_id, 'order_source': app_helper.get_devive_type(param.app_id), '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), } # 统计旧订单数,为0则是首单 2015-09-29 old_order_num = db.order_app.find( { 'user': uname, 'status': { '$nin': ['DUE', 'TIMEOUT', 'CANCEL'] } }, { '_id': 1 }).count() # item = { # “product_id” : “k000011”, # “num” : “5”, # } # 应该只有 k-prod cart_to_return = [] cate_001 = 0 b3_sku = 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 整箱预售 # -3 不启动B3销售 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, 'first_order' : 1 } ) b3_sku += 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, 'first_order' : 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' : uname, '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'] item['num'] = '%d' % new_num # 防止iOS闪退!!! 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: ''' # 首单可见商品,非首单用户 2015-09-29 if r.has_key('first_order') and r[ 'first_order'] == 1 and old_order_num > 0: # 非首单用户,不让购买,比较生硬 new_num = 0 item['num'] = '%d' % new_num # 防止iOS闪退!!! 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元 cut_now = app_helper.first_promote # if cate_001>0 and (tt+float(order['delivery_fee']))>=app_helper.first_promote_threshold and \ db.order_app.find({'user':uname, '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 old_order_num == 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, '提交结算') } }, upsert=True) ret_json = { # 返回结果,实际有库存的结果, '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) } } print ret_json return json.dumps(ret_json) else: return json.dumps({'ret': -4, 'msg': '无效的session'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', shop_id='', category='', page_size='', page_index='') if '' in (param.app_id, param.shop_id, param.category, param.page_size, param.page_index, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) if not (param.page_size.isdigit() and param.page_index.isdigit()): return json.dumps({'ret': -4, 'msg': 'page参数错误'}) if len(param.shop_id) < 24: return json.dumps({'ret': -2, 'msg': 'shop_id参数错误'}) #验证签名 md5_str = app_helper.generate_sign([ param.app_id, param.shop_id, param.category, param.page_size, param.page_index ]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) # 处理整箱预售 if param.category == '-3': # -3 不启动B3销售 shop_id = setting.B3_shop # B3整箱预售虚拟店 else: shop_id = param.shop_id # 查找商品信息清单 # 分页返回 find().skip(page_size*page_index).limit(page_size) ''' db_invent = db.inventory.find({ 'shop' : ObjectId(shop_id), 'category' : param.category, 'list_in_app' : {'$ne' : 0}, 'online' : 1, #'num' : {'$gt' : 0}, # 只显示有库存的商品 }, { '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( { 'shop': ObjectId(shop_id), 'category': param.category, 'list_in_app': { '$ne': 0 }, 'online': 1, #'num' : {'$gt' : 0}, # 只显示有库存的商品 }, { '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: # 调整价格显示,整数价格不显示 .00, 未适应旧版ios app 2015-09-13 if int(float(i[1])) * 1.0 == float(i[1]): show_price = u'%d ' % int(float(i[1])) else: show_price = i[1] #print show_price.encode('utf-8') # 准备数据 new_one = { 'product_id': i[2], 'title': skus[i[0]][2], #'original' : skus[i[0]][5], 'price': show_price, #'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, } })
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', session='', order_id='', total='', sign='') if '' in (param.app_id, param.order_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.logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.order_id, param.total]) 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' order_id = param.order_id.encode('utf-8') 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 return json.dumps({'ret': 0, 'data': data}) else: return json.dumps({'ret': -1, 'data': r.status}) 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='',name='',tel='',addr='',title='',detail='',city='',loc='',sign='') if '' in (param.app_id, param.session, param.name, param.tel, param.addr, param.sign): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) # v3 参数检查 if version=='v3' and '' in (param.title, param.detail, param.city, param.loc): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) uname = app_helper.app_logged(param.session) # 检查session登录 if uname: #验证签名 if version=='v2': md5_str = app_helper.generate_sign([param.app_id, param.session, param.name, param.tel, param.addr]) elif version=='v3': md5_str = app_helper.generate_sign([param.app_id, param.session, param.name, param.tel, param.addr, param.title, param.detail, param.city, param.loc]) if md5_str!=param.sign: return json.dumps({'ret' : -1, 'msg' : '签名验证错误'}) # 判断地址是否有对应门店,否则不在送货范围内 alert = False message = '' if version=='v2': # 获得 收货地址 坐标 ret, loc = lbs.addr_to_loc(param.addr.strip().encode('utf-8')) print ret, loc if ret<0: loc = {'lat': 0, 'lng': 0} alert = True message = '地址定位失败,请重新输入地址' else: poly_shop, loc_shop = lbs.locate_shop((loc['lat'],loc['lng'])) if poly_shop==None: print '不在配送范围内' alert = True message = '很抱歉,收货地址不在配送范围内,请更改地址' #,整箱预售商品可正常购买' # 更新个人资料 new_addr = ( app_helper.my_rand(), param.name.strip(), param.tel.strip(), param.addr.strip(), int(time.time()), loc, ) elif version=='v3': # 使用提示地址的坐标进行匹配 loc0 = param.loc.split(',') # 31.20474193,121.620708272 if len(loc0)<2 or '' in loc0: loc = {'lat': 0, 'lng': 0} alert = True message = '地址定位失败,请重新输入地址' else: loc = {'lat' : float(loc0[0]), 'lng' : float(loc0[1])} print loc poly_shop, loc_shop = lbs.locate_shop((loc['lat'],loc['lng'])) if poly_shop==None: print '不在配送范围内' alert = True message = '很抱歉,收货地址不在配送范围内,请更改地址' #,整箱预售商品可正常购买' # 更新个人资料 new_addr = ( app_helper.my_rand(), param.name.strip(), param.tel.strip(), param.addr.strip(), int(time.time()), loc, param.title.strip(), param.detail.strip(), param.city.strip(), ) r = db.app_user.update_one({'uname':uname['uname']}, {'$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' : '无效的session'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', session='', query='', sign='') if '' in (param.app_id, param.session, param.query, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) uname = app_helper.logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.query]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) db_user = db.app_user.find_one({'uname': uname}, { 'coupon': 1, 'credit': 1 }) if db_user == None: # 不应该发生 return json.dumps({'ret': -5, 'msg': '未找到用户信息'}) # 修改为付款的过期订单 r = db.order_app.update_many( { 'uname': uname, 'status': 'DUE', 'deadline': { '$lt': int(time.time()) } }, {'$set': { 'status': 'TIMEOUT' }}) #print r # 获得订单 if param.query == 'ALL': condition = {'user': uname, 'status': {'$ne': 'TIMEOUT'}} else: condition = {'user': uname, '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': '无效的session'})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', shop_id='', product_id='') if '' in (param.app_id, param.shop_id, param.product_id, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.shop_id, param.product_id]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) # 有效的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: # -3 不启动B3销售 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})
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', session='', order_id='', sign='') if '' in (param.app_id, param.session, param.order_id, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) uname = app_helper.logged(param.session) # 检查session登录 if uname: #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.order_id]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) db_user = db.app_user.find_one({'uname': uname}, { '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': uname }) 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': str(db_order['shop']), # 需要中文名 'status': helper.ORDER_STATUS['APP'].get(db_order['status'], '未知状态'), # 需要中文名 'deadline': db_order['deadline'] - int(time.time()), # 离支付截至的时间,秒数 'delivery': { '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': '无效的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='', 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']},{'address':1}) if db_user==None: # 不应该发生 return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'}) addr=[] # v1 address [id, 收货人, 收货电话, 地址] # v2 address [id, 收货人, 收货电话, 地址, 修改时间戳] # v2 address [id, 收货人, 收货电话, 地址, 修改时间戳, gps] # v3 address [id, 收货人, 收货电话, 地址, 修改时间戳, gps, 提示标题, 提示地址, 城市] for i in db_user['address']: ad={ 'id' : i[0], 'name' : i[1], 'tel' : i[2], 'addr' : i[3], 'tick' : i[4] if len(i)>4 else 0, } if version=='v3': if len(i)>6: ad['title']=i[6] ad['detail']=i[7] ad['city']=i[8] if len(i)>5 and i[5]['lat']>0: ad['loc']='%f,%f' % (i[5]['lat'],i[5]['lng']) else: ad['loc']='' else: ad['title']='' ad['detail']='' ad['city']='上海' if len(i)>5 and i[5]['lat']>0: ad['loc']='%f,%f' % (i[5]['lat'],i[5]['lng']) else: ad['loc']='' addr.append(ad) addr2 = quick(addr) print addr2 # 返回 return json.dumps({'ret' : 0, 'data' : { 'addr' : addr2, 'total' : len(addr2), }}) else: return json.dumps({'ret' : -4, 'msg' : '无效的session'})
def POST(self, version='v1'): web.header('Content-Type', 'application/json') #print web.input() param = web.input(app_id='', number='', secret='') if '' in (param.app_id, param.number, param.secret, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.number, param.secret]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) number = param.number.strip() if len(number) < 11 or (not number.isdigit()): return json.dumps({'ret': -5, 'msg': '手机号码格式错误'}) # 随机码 rand = app_helper.my_rand(base=1) register = False openid = '' # 检查用户是否已注册 db_user = db.app_user.find_one({'uname': number}) if db_user == None: # 未注册,新建用户记录 coupon = [] valid = app_helper.time_str(time.time() + 3600 * 24 * 10, 1) # 有效期10天 2015-11-20 # 注册发抵用券 for i in app_helper.reginster_coupon: coupon.append((app_helper.my_rand(), valid, '%.2f' % float(i[0]), 1, i[1], i[2])) db.app_user.insert_one({ 'uname': number, 'address': [], 'coupon': coupon, # 送优惠券 'app_id': param.app_id, 'reg_time': app_helper.time_str(), }) register = True else: openid = db_user.get('openid', '') # 更新app_id db.app_user.update_one({'uname': number}, {'$set': { 'app_id': param.app_id }}) # 生成 session rand2 = os.urandom(16) now = time.time() secret_key = 'f6102bff8451236b8ca1' session_id = hashlib.sha1( "%s%s%s%s" % (rand2, now, web.ctx.ip.encode('utf-8'), secret_key)) session_id = session_id.hexdigest() db.app_sessions.insert_one({ 'session_id': session_id, 'uname': number, 'openid': openid, 'login': 0, 'rand': rand, 'ip': web.ctx.ip, 'attime': now, }) #发送短信验证码 if number not in setting.inner_number.keys(): sms.send_rand(number, rand, register) # 返回 return json.dumps({ 'ret': 0, 'data': { 'session': session_id, 'register': register, } })
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='', order_id='', total='', note='', sign='') if '' in (param.app_id, param.session, param.total, 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.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}) if len(param.order_id) > 0: print param.order_id 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'])): # 返回的是需第三方支付的金额,所有比对due3,而不是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}, { '$push': { 'history': (app_helper.time_str(), uname['uname'], '提交支付宝支付2') } }) return json.dumps({'ret': 0, 'order_id': param.order_id}) else: # 生成order_id order_id = app_helper.get_new_order_id(version) print 'new order_id', order_id # 生成新订单 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['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}) 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='', type='', data='', gps='', sign='') if '' in (param.app_id, param.type, param.sign): return json.dumps({'ret' : -2, 'msg' : '参数错误'}) if param.type not in ['GPS', 'NAME', 'LOC']: return json.dumps({'ret' : -7, 'msg' : 'type参数错误'}) #验证签名 md5_str = app_helper.generate_sign([param.app_id, param.type, param.data, param.gps]) if md5_str!=param.sign: return json.dumps({'ret' : -1, 'msg' : '签名验证错误'}) # 准备用户坐标 print param.type.encode('utf-8'), param.data.encode('utf-8') 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} elif param.type=='GPS': loc0 = param.data.split(',') # 31.20474193,121.620708272 if len(loc0)<2 or '' in loc0: loc = {'lat': 0, 'lng': 0} else: ret, loc0 = lbs.geo_convert(float(loc0[0]), float(loc0[1])) if ret==0: loc = {'lat': loc0[0]['y'], 'lng': loc0[0]['x']} else: loc = {'lat': 0, 'lng': 0} elif param.type=='LOC': # 使用联想地址提供的坐标(百度坐标,不需要转换) loc0 = param.data.split(',') # 31.20474193,121.620708272 loc = {'lat': float(loc0[0]), 'lng': float(loc0[1])} print loc # 找最近距离的店 poly_shop, loc_shop = lbs.locate_shop((loc['lat'],loc['lng'])) if poly_shop==None: print '不在配送范围内' #return json.dumps({'ret' : -6, 'msg' : '很抱歉,普通商品无法配送到当前收货地址,整箱预售商品可正常购买'}) return json.dumps({'ret' : -6, 'msg' : '很抱歉,收货地址不在配送范围内,请更改地址'}) # 计算gps坐标到站点距离 distance = 0 if param.gps!='': loc0 = param.gps.split(',') # 31.20474193,121.620708272 纬度,经度 if len(loc0)==2: distance = lbs.geo_distance(loc_shop['lat'],loc_shop['lng'], float(loc0[0]),float(loc0[1])) # 返回多边形匹配shop print 'choose:', poly_shop[1].encode('utf-8') if version=='v2': ret_data = {'ret' : 0, 'data' : { 'shop_id' : str(poly_shop[0]), 'shop_name' : poly_shop[1], #'address' : poly_shop[2], 'distance' : int(distance), 'alert' : False, #True if distance>app_helper.max_alert_distance else False, 'message' : ('您当前定位的地址距收货地址超过%d公里,请确认后购买' % app_helper.max_alert_distance) if distance>app_helper.max_alert_distance else '', }} elif version=='v3': # by 站点 配送费 str_shop = str(poly_shop[0]) if str_shop in app_helper.delivery_by_shop.keys(): delivery_fee = app_helper.delivery_by_shop[str_shop]['delivery_fee'] free_delivery = app_helper.delivery_by_shop[str_shop]['free_delivery'] else: delivery_fee = app_helper.delivery_fee free_delivery = app_helper.free_delivery # by 站点, banner if str_shop in app_helper.BANNER_shop.keys(): BANNER = app_helper.BANNER_shop[str_shop] BANNER_URL = app_helper.BANNER_URL_shop[str_shop] else: BANNER = app_helper.BANNER BANNER_URL = app_helper.BANNER_URL ret_data = {'ret' : 0, 'data' : { 'shop_id' : str_shop, 'shop_name' : poly_shop[1], #'address' : poly_shop[2], 'distance' : int(distance), 'alert' : False, #True if distance>app_helper.max_alert_distance else False, 'message' : ('您当前定位的地址距收货地址超过%d公里,请确认后购买' % app_helper.max_alert_distance) if distance>app_helper.max_alert_distance else '', 'delivery_fee' : '%.2f' % delivery_fee, 'free_delivery' : '%.2f' % free_delivery, 'first_promote' : '%.2f' % app_helper.first_promote, 'banner' : BANNER, 'banner_url' : BANNER_URL, }} #print ret_data return json.dumps(ret_data)
def POST(self, version='v1'): web.header('Content-Type', 'application/json') #print web.input() param = web.input(app_id='', session='', rand='', invitation='', sign='') if '' in (param.app_id, param.session, param.rand, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.session, param.rand, param.invitation]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) session = app_helper.get_session(param.session) if session == None: return json.dumps({'ret': -4, 'msg': '无效的session'}) if param.rand.strip() != session['rand']: if session['uname'] == '18516569412' and param.rand.strip( ) == '9998': None elif session['uname'] in setting.inner_number.keys() and \ param.rand.strip()==setting.inner_number[session['uname']]: None else: return json.dumps({'ret': -5, 'msg': '短信验证码错误'}) db.app_sessions.update_one( {'session_id': session['session_id']}, {'$set': { 'login': 1, 'attime': time.time(), }}) #邀请码 if param.has_key('invitation'): invitation = param.invitation.lower() if db.invitation.find({ 'code': invitation }).count() == 0: # 无效地推邀请码 if db.app_user.find({ 'my_invit_code': invitation }).count() == 0: # 无效用户邀请码 invitation = '' if invitation != '': r = db.app_user.find_one({'uname': session['uname']}, {'invitation': 1}) if r.get('invitation', '') != '': # 已填邀请码 invitation = '' else: invitation = '' invitation_coupon = 0 if invitation != '': # 赠送优惠券 invitation_coupon = 1 valid = app_helper.time_str(time.time() + 3600 * 24 * 10, 1) # 有效期10天 r = db.app_user.find_one_and_update( {'uname': session['uname']}, { '$set': { 'invitation': invitation, 'last_time': app_helper.time_str() }, '$push': { 'coupon': (app_helper.my_rand(), valid, '5.00', 1, 14.9, 'apple') }, # 邀请码送5+4+3 }, { 'address': 1, 'new_coupon': 1 }) db.app_user.update_one({'uname' : session['uname']},{ # 4元 '$push' : {'coupon' : (app_helper.my_rand(), valid, '4.00', 1, 24.9, 'apple')}, }) db.app_user.update_one({'uname' : session['uname']},{ # 3元 '$push' : {'coupon' : (app_helper.my_rand(), valid, '3.00', 1, 19.9, 'apple')}, }) else: r = db.app_user.find_one_and_update( {'uname': session['uname']}, {'$set': { 'last_time': app_helper.time_str() }}, { 'address': 1, 'new_coupon': 1 }) 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 = {} # 检查是否有新红包 app_helper.check_hb(session['uname']) # 返回 if version == 'v3': # 是否有新收到的抵用券,进行提示 if r.has_key('new_coupon') and r['new_coupon'] > 0: alert = True message = '掌柜送您%d张抵用券,请在个人中心查看哦' % (r['new_coupon'] + invitation_coupon) db.app_user.update_one({'uname': session['uname']}, {'$set': { 'new_coupon': 0 }}) else: alert = False message = '' return json.dumps({ 'ret': 0, 'data': { 'session': session['session_id'], 'login': True, 'addr': addr, 'uname': session['uname'], 'alert': alert, 'message': message } }) else: # v1,v2 return json.dumps({ 'ret': 0, 'data': { 'session': session['session_id'], 'login': True, 'addr': addr, 'uname': session['uname'], } })
def POST(self): web.header('Content-Type', 'application/json') param = web.input(app_id='', type='', data='', sign='') if '' in (param.app_id, param.type, param.sign): return json.dumps({'ret': -2, 'msg': '参数错误'}) if param.type not in ['IP', 'GPS', 'NAME']: return json.dumps({'ret': -4, 'msg': 'type参数错误'}) #验证签名 md5_str = app_helper.generate_sign( [param.app_id, param.type, param.data]) if md5_str != param.sign: return json.dumps({'ret': -1, 'msg': '签名验证错误'}) # 准备用户坐标 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], } })