コード例 #1
0
    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,
            }
        })
コード例 #2
0
ファイル: order_star.py プロジェクト: jack139/fair
    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'})
コード例 #3
0
ファイル: customer_voice.py プロジェクト: jack139/fair
    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'})
コード例 #4
0
    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',
            }
        })
コード例 #5
0
ファイル: addr_add.py プロジェクト: jack139/fair
	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'})
コード例 #6
0
    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'})
コード例 #7
0
ファイル: order_cancel.py プロジェクト: jack139/fair
    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'})
コード例 #8
0
ファイル: get_settings.py プロジェクト: jack139/fair
    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)
コード例 #9
0
ファイル: order_checkout.py プロジェクト: jack139/fair
    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'})
コード例 #10
0
ファイル: coupon_list.py プロジェクト: jack139/fair
    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'})
コード例 #11
0
    def POST(self, version='v2'):
        web.header('Content-Type', 'application/json')
        if version not in ('v2', 'v3'):
            return json.dumps({'ret': -999, 'msg': '版本错误!'})
        print 'version=', version

        param = web.input(app_id='', session='', 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'})
コード例 #12
0
ファイル: addr_list.py プロジェクト: jack139/fair
    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'})
コード例 #13
0
ファイル: api_router.py プロジェクト: jack139/fair
	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',
		}})
コード例 #14
0
ファイル: credit_history.py プロジェクト: jack139/fair
    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'})
コード例 #15
0
ファイル: wxpay.py プロジェクト: jack139/fair
    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'})
コード例 #16
0
    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'})
コード例 #17
0
    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'})
コード例 #18
0
ファイル: sku_list.py プロジェクト: jack139/fair
    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,
            }
        })
コード例 #19
0
ファイル: wxpay.py プロジェクト: jack139/fair
    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'})
コード例 #20
0
	def POST(self, version='v2'):
		web.header('Content-Type', 'application/json')
		if version not in ('v2','v3'):
			return json.dumps({'ret' : -999, 'msg' : '版本错误!'})
		print 'version=',version

		param = web.input(app_id='',session='',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'})
コード例 #21
0
ファイル: order_list.py プロジェクト: jack139/fair
    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'})
コード例 #22
0
ファイル: sku_detail.py プロジェクト: jack139/fair
    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})
コード例 #23
0
ファイル: order_detail.py プロジェクト: jack139/fair
    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'})
コード例 #24
0
	def POST(self, version='v2'):
		web.header('Content-Type', 'application/json')
		if version not in ('v2','v3'):
			return json.dumps({'ret' : -999, 'msg' : '版本错误!'})
		print 'version=',version

		param = web.input(app_id='', session='', 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'})
コード例 #25
0
    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,
            }
        })
コード例 #26
0
    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'})
コード例 #27
0
	def POST(self, version='v2'):
		web.header('Content-Type', 'application/json')
		if version not in ('v2','v3'):
			return json.dumps({'ret' : -999, 'msg' : '版本错误!'})
		print 'version=',version

		param = web.input(app_id='', session='', 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'})
コード例 #28
0
ファイル: locate_shop.py プロジェクト: jack139/fair
	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)
コード例 #29
0
    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'],
                }
            })
コード例 #30
0
ファイル: locate_shop.py プロジェクト: jack139/fair
    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],
                }
            })