Ejemplo n.º 1
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          object_id='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id,
                  param.session, param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #-------------------------------------------------- 不实现了,废弃,使用detail_course

        ret_data = {
            "pass_to_download": 1,  # 是否可下载,0 不可下载, 1 可以下载 
            "down_url":
            "https://pretty.f8cam.com/static/test.mp4",  # 下载链接,pass_to_download==0时为空 
            "msg": "测试中,不能下载",  # pass_to_download==0时提示信息 
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 2
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']}, {
                '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'})
Ejemplo n.º 3
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='', star='', sign='')

		if '' in (param.app_id, param.session, param.order_id, param.star, param.sign):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		uname = app_helper.app_logged(param.session) # 检查session登录
		if uname:
			#验证签名
			md5_str = app_helper.generate_sign([param.app_id, param.session, param.order_id, param.star])
			if md5_str!=param.sign:
				return json.dumps({'ret' : -1, 'msg' : '签名验证错误'})

			db_user = db.app_user.find_one({'uname':uname['uname']},{'coupon':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 订单打分
			db.order_app.update_one({'order_id' : param.order_id, 'user':{'$in':uname.values()}},{
				'$set'  : { 'star': int(param.star) },
				'$push' : { 'history' : (app_helper.time_str(), uname['uname'], '订单打分')},
			})
			return json.dumps({'ret' : 0, 'msg' : '订单已打分!'})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的session'})
Ejemplo n.º 4
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='',
                          userid='',
                          object_id='',
                          action='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id,
                  param.session, param.tick, param.userid, param.object_id,
                  param.action):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        if param['action'].upper() not in ['AUTH', 'CANCEL']:
            return json.dumps({'ret': -7, 'msg': '无效的action取值'})

        r4 = db.obj_store.find_one({'obj_id': param['object_id']})
        if r4 is None:
            return json.dumps({'ret': -6, 'msg': '无效的object_id'})

        # userid 支持多个,用英文逗号分隔
        userid_list = param['userid'].split(',')
        r4 = db.employee_auth.find({
            'owner_userid': uname['userid'],
            'employee_userid': {
                '$in': userid_list
            }
        })
        #if r3 is None:
        #    return json.dumps({'ret' : -5, 'msg' : '此userid不是当前店主的店员'})

        for r3 in r4:  # 操作多个店员
            if param['action'].upper() == 'AUTH':  # 添加
                if param['object_id'] not in r3['object_list']:
                    db.employee_auth.update_one(
                        {'_id': r3['_id']},
                        {'$push': {
                            'object_list': param['object_id']
                        }})
            else:  # 删除
                if param['object_id'] in r3['object_list']:
                    r3['object_list'].remove(param['object_id'])
                    db.employee_auth.update_one(
                        {'_id': r3['_id']},
                        {'$set': {
                            'object_list': r3['object_list']
                        }})

        # 返回
        return json.dumps({
            'ret': 0,
        })
Ejemplo n.º 5
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        r2 = credit_helper.check_balance(uname['userid'])

        ret_data = {
            "cash": r2,  # 余额 单位 分 
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 6
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', progress='', tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, 
            param.progress, param.tick):
            return json.dumps({'ret' : -2, 'msg' : '参数错误'})

        if not param.progress.isdigit():
            return json.dumps({'ret' : -3, 'msg' : 'progress参数必须是数字'})

        # 检查session登录
        uname = app_helper.app_logged(param.session) 
        if uname is None:
            return json.dumps({'ret' : -4, 'msg' : '无效的session'})

        #--------------------------------------------------

        r2 = db.obj_store.find_one({'obj_id' : param.object_id})
        if r2 is None:
            return json.dumps({'ret' : -5, 'msg' : '错误的object_id'})

        db.progress_info.update({'userid':uname['userid'],'obj_id':param.object_id},{'$set':{
            'progress'   : int(param.progress),
            'last_time' : app_helper.time_str(),
        }}, upsert=True)

        # 返回
        return json.dumps({
            'ret'  : 0,
        })
Ejemplo n.º 7
0
    def POST(self, version='v2'):
        web.header('Content-Type', 'application/json')
        if version not in ('v2', 'v3'):
            return json.dumps({'ret': -999, 'msg': '版本错误!'})
        print 'version=', version
        param = web.input(app_id='', session='', voice='', sign='')

        if '' in (param.app_id, param.session, param.voice, param.sign):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        uname = app_helper.app_logged(param.session)  # 检查session登录
        if uname:
            #验证签名
            md5_str = app_helper.generate_sign(
                [param.app_id, param.session, param.voice])
            if md5_str != param.sign:
                return json.dumps({'ret': -1, 'msg': '签名验证错误'})

            # 存入db
            db.customer_voice.insert_one({
                'uname': uname['uname'],
                'voice': param.voice,
                'time': app_helper.time_str(),
            })

            # 返回
            return json.dumps({'ret': 0})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的session'})
Ejemplo n.º 8
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        r2 = db.app_user.find_one({'userid': uname['userid'], 'type': 1})
        if r2 and r2.get('upload_licence', '') == '':
            return json.dumps({'ret': -5, 'msg': '未上传营业执照照片'})

        # 设置店主审核状态
        db.app_user.update_one({
            'userid': uname['userid'],
            'type': 1
        }, {'$set': {
            'user_role': 3,
            'user_role_status': 'WAIT',
        }})

        # 返回
        return json.dumps({
            'ret': 0,
        })
Ejemplo n.º 9
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------
        heart_data = []
        r2 = db.heart_info.find({'userid': uname['userid']})
        for i in r2:
            r3 = db.obj_store.find_one({'obj_id': i['obj_id']})
            if r3 is None:
                continue
            r4 = db.progress_info.find_one({
                'userid': uname['userid'],
                'obj_id': i['obj_id']
            })
            if r4 is None:
                progress = 0
            else:
                progress = r4['progress']

            if len(r3['image']) > 0:  # 取第1张图
                image_url = app_helper.image_url(r3['image'][0])
            else:
                image_url = ''

            heart_data.append({
                "object_id": i['obj_id'],
                "title": r3['title'],
                "type": 1,  # 类型: 1 课程, 2 专辑 
                "object_type":
                1 if r3['media'] == 'video' else 2,  # 1- 视频   2 - 音频  
                "length": r3['length'],  # 长度,单位 分钟 
                "progress": progress,  # 进度百分比,如果是未购买课程,此字段为-1
                "image": image_url,
            })

        ret_data = {
            "heart": heart_data,
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 10
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          order_trade_id='',
                          data='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code,
                  param.order_trade_id, param.session, param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        # 修改充值订单状态
        r2 = db.order_recharge.find_one_and_update(
            {'recharge_id': param.order_trade_id},  # 实充值订单号
            {
                '$set': {
                    'status': 'PREPAY'
                },
                '$push': {
                    'order_paid_data': param.data
                },
            },
        )

        if r2 is None:
            return json.dumps({'ret': -3, 'msg': '未找到订单'})

        # 如果是IAP订单,使用data数据检查支付情况,backrun异步检查
        if r2['pay_type'] == 'iap':
            if r2['status'] == 'DUE':  # 只有DUE才推,防止重复支付 2017-06-21, gt
                app_helper.event_push_notify('iap', param.data,
                                             param.order_trade_id)
            else:
                print 'Error: 可疑重复支付', param.order_trade_id

        ret_data = {
            "order_trade_id": param.order_trade_id,
            "due": r2['due'],  # 应付金额,单位 分
            "paid": r2['due'],  # 实付金额 
            "status": "PENDING",  # 订单状态:PAID/PENDING 已支付/待支付
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 11
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='',
                          nickname='',
                          headimage='',
                          image_type='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        update_set = {}

        if len(param['nickname']) > 0:
            update_set['nickname'] = param['nickname']

        if len(param['headimage']) > 0:
            if param['image_type'].upper() not in ('JPG', 'PNG'):
                return json.dumps({'ret': -5, 'msg': 'image_type取值错误'})

            data = urllib.unquote_plus(param['headimage'])
            #print data
            #print len(data)

            # 保存图片
            filename = app_helper.write_image(param['image_type'], data)
            update_set['img_url'] = app_helper.image_url(filename)  # 图片url

        if len(update_set) > 0:
            # 只保存在手机号码账户里 type==1
            db.app_user.update_one({
                'userid': uname['userid'],
                'type': 1
            }, {'$set': update_set})

        # 获取当前设置
        r4 = app_helper.get_user_detail(uname['userid'])

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'headimage_url': r4['img_url'],
            }
        })
Ejemplo n.º 12
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          object_id='',
                          page_size='',
                          page_index='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id,
                  param.page_size, param.page_index, param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.session != '':
            # 检查session登录
            uname = app_helper.app_logged(param.session)
            if uname is None:
                return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        r2 = db.obj_store.find_one({'obj_id': param.object_id})
        if r2 is None:
            return json.dumps({'ret': -5, 'msg': '错误的object_id'})

        r3 = db.comment_info.find(
            {'obj_id': param.object_id},
            sort=[('last_time', -1)],  # 按时间倒序
            skip=int(param.page_size) * int(param.page_index),
            limit=int(param.page_size))

        comment_data = []
        for i in r3:
            r4 = app_helper.get_user_detail(i['userid'])
            comment_data.append({
                "name": r4['nickname'],
                "image": r4['img_url'],  # 头像 
                "star": i['star'],  # 评的星级 
                "time": i['last_time'],
                "comment": i['comment'],
            })

        ret_data = {
            "comment": comment_data,
            "total": len(comment_data),  # 返回的课程数量,小于 page_size说明到末尾 
            "page_size": param.page_size,  # 分页尺寸,与调用参数相同 
            "page_index": param.page_index,  # 页索引 
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 13
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          object_id='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id,
                  param.session, param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        r2 = db.obj_store.find_one({'obj_id': param['object_id']})
        if r2 is None:
            return json.dumps({'ret': -5, 'msg': 'object_id错误'})

        db_exam = db.exam_info.find(
            {
                'obj_id': param['object_id'],
                'available': 1
            },
            sort=[('exam_id', 1)])

        exam_data = []
        for i in db_exam:
            option = []
            for j in i['option'][:4]:  #只返回4个选项, 2017-06-19,gt
                if len(j.strip()) == 0:
                    break
                option.append(j)
            exam_data.append({
                "problem": i['question'],
                "option": option,
            })

        ret_data = {
            "title": r2['title'],
            "note": r2.get('exam_note', ''),
            "question": exam_data,
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 14
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='',
                          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'})
Ejemplo n.º 15
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          tick='',
                          session='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.session != '':
            # 检查session登录
            uname = app_helper.app_logged(param.session)
            if uname is None:
                return json.dumps({'ret': -4, 'msg': '无效的session'})
        else:
            uname = None

        #--------------------------------------------------
        now_tick = int(time.time())

        # 拉取符合条件的类目, 时间区间,是否可用
        r2 = db.category_info.find(
            {
                'available':
                1,
                '$and': [{
                    'start_tick': {
                        '$lt': now_tick
                    }
                }, {
                    'expire_tick': {
                        '$gt': now_tick
                    }
                }],
            },
            sort=[('sort_weight', 1)])

        category_data = []
        for i in r2:
            category_data.append({
                'key': i['cate_id'],
                'title': i['title'],
            })

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'category': category_data,
            }
        })
Ejemplo n.º 16
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        print uname['userid']

        # 生成数据
        employee = []
        r3 = db.employee_auth.find({'owner_userid': uname['userid']})
        for i in r3:
            # 统计此店员完成课程输量
            complete_num = 0
            for j in i['object_list']:
                r5 = db.progress_info.find_one({
                    'userid': i['employee_userid'],
                    'obj_id': j
                })
                if r5 and r5['progress'] == 100:
                    complete_num += 1

            # 获取店员信息
            r4 = app_helper.get_user_detail(i['employee_userid'])

            employee.append({
                'userid': i['employee_userid'],
                'real_name': r4.get('real_name', ''),  # 店员真实名称
                'nickname': r4.get('nickname', ''),  # 昵称
                'auth_num': len(i['object_list']),
                'complete_num': complete_num,  # 完成课程数,
                'employee_tel': r4.get('mobile', ''),  # 注册的号码
            })

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'employee': employee
            },
        })
Ejemplo n.º 17
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        r4 = app_helper.get_user_detail(uname['userid'])

        ret_data = {
            "name":
            r4['nickname'],
            "image":
            r4['img_url'],  # 用户头像 
            "tel":
            r4['mobile'],  # 用户注册手机号 
            "user_type":
            uname['type'],  # 用户类型
            # 店员信息
            "shop_name":
            r4['shop_name'],
            "real_name":
            r4['real_name'],
            "shop_nickname":
            r4['shop_nickname'],
            "contact_info":
            r4['contact_info'],
            # 店主信息
            "licence_pic":
            app_helper.image_url(r4['licence_pic'])
            if r4['licence_pic'] != '' else r4['licence_pic'],
            "shop_pic": [app_helper.image_url(x) for x in r4['shop_pic']],
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 18
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='',
                          userid='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick, param.userid):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        # 生成数据
        object_list = []
        r3 = db.employee_auth.find_one({
            'owner_userid': uname['userid'],
            'employee_userid': param.userid
        })
        if r3:
            for i in r3['object_list']:
                r4 = db.obj_store.find_one({'obj_id': i})
                if r4 is None:
                    continue

                # 已授权店员数,只统计本店主的店员数
                auth_num = db.employee_auth.find({
                    'owner_userid':
                    uname['userid'],
                    'object_list':
                    r4['obj_id']
                }).count()

                object_list.append({
                    'object_id': r4['obj_id'],
                    'course_name': r4.get('title'),
                    'auth_num': auth_num,  # 已授权店员数 ,
                })

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'course': object_list
            },
        })
Ejemplo n.º 19
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='', dev_id='', ver_code='', session='', object_id='', pay_type='', tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id, param.session, 
            param.pay_type, param.tick):
            return json.dumps({'ret' : -2, 'msg' : '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session) 
        if uname is None:
            return json.dumps({'ret' : -4, 'msg' : '无效的session'})

        #--------------------------------------------------
        print uname

        # 检查是否可售
        r = checkout_helper.checkout_obj(uname, param.object_id)
        if r['ret']<0:
            return json.dumps({'ret' : r['ret'], 'msg' : r['msg']})            

        # 消费余额
        r2 = credit_helper.consume_balance(uname['userid'], r['due'], u'购买:'+r['title'])
        if r2==False:
            return json.dumps({'ret' : -9, 'msg' : '余额不足'})

        # 保存商品到用户资产
        db.user_property.update_one({'userid':uname['userid'], 'obj_id':param.object_id}, {'$set':{
            'obj_type'       : r['obj_type'],
            'status'         : 'paid',
            'order_trade_id' : r2
        }}, upsert=True)

        # 销量加1
        if r['obj_type']=='topic':
            db.topic_store.update_one({'tpc_id':param.object_id}, {'$inc': {'volume':1}})
        else:
            db.obj_store.update_one({'obj_id':param.object_id}, {'$inc': {'volume':1}})

        ret_data = {
            "pay_type"    : 0, # 支付类型 
            "order_trade_id" : r2, 
        }

        # 返回
        return json.dumps({
            'ret'  : 0,
            'data' : ret_data,
        })
Ejemplo n.º 20
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='',
                          shop_name='',
                          real_name='',
                          shop_nickname='',
                          contact_info='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 4个信息字段必须填写
        if '' in (param.shop_name.strip(), param.real_name.strip(),
                  param.shop_nickname.strip(), param.contact_info.strip()):
            return json.dumps({'ret': -3, 'msg': '必填参数不能为空'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        # 只保存在手机号码账户里 type==1
        db.app_user.update_one(
            {
                'userid': uname['userid'],
                'type': 1
            },
            {
                '$set': {
                    'vip_shopname': param['shop_name'],
                    'vip_realname': param['real_name'],
                    'vip_nickname': param['shop_nickname'],
                    'vip_contact': param['contact_info'],
                    'user_role': 1,  # 店员身份
                }
            })

        # 返回
        return json.dumps({
            'ret': 0,
        })
Ejemplo n.º 21
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='',
                          object_id='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick, param.object_id):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        # 生成数据
        user_list = []
        # 只返回当前用户为店主的所属用户列表
        r3 = db.employee_auth.find({
            'object_list': param.object_id,
            'owner_userid': uname['userid']
        })
        for i in r3:
            r4 = db.app_user.find_one({
                'userid': i['employee_userid'],
                'type': 1
            })  # 电话用户
            if r4 is None:
                continue
            user_list.append({
                'userid': r4['userid'],
                'real_name': r4.get('vip_realname', ''),
                'mobile_num': r4['uname'],
            })

        # 返回
        return json.dumps({
            'ret': 0,
            'data': {
                'employee': user_list
            },
        })
Ejemplo n.º 22
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'})
Ejemplo n.º 23
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        r2 = db.order_trade.find({'userid': uname['userid']},
                                 sort=[('_id', -1)])

        orders = []
        for i in r2:
            if i['trade_type'] == 'consume':
                sign = -1
            else:
                sign = 1
            orders.append({
                "action": i['comment'],
                "cash": i['total_sum'] * sign,  # 金额,单位 分
                "date": i['pay_time'],  # 发生时间 
                "order_id": i['order_trade_id'],  # 订单号
            })

        ret_data = {"order": orders}

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 24
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          object_id='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id,
                  param.session, param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        r2 = db.obj_store.find_one({'obj_id': param.object_id})
        if r2 is None:
            return json.dumps({'ret': -5, 'msg': '错误的object_id'})

        r3 = db.progress_info.find_one({
            'userid': uname['userid'],
            'obj_id': param.object_id
        })
        if r3 is None:
            progress = 0
        else:
            progress = r3['progress']

        ret_data = {
            "progress": progress,  # 课程进度百分比,0表示未上课,100表示已上课 
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 25
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #-------------------------------------------------- 待实现

        # 准备返回值
        ret_data = {
            "info": [
                {
                    "info_id": "abcd",  # 消息id 
                    "title": "测试消息1",
                    "content": "消息内容",
                    "time_str": "2017-08-09 20:20:20",  # 时间 
                },
                {
                    "info_id": "abef",
                    "title": "测试消息2",
                    "content": "消息内容",
                    "time_str": "2017-08-09 12:12:12",
                },
            ]
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 26
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          object_id='',
                          tick='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.object_id,
                  param.session, param.tick):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        r = checkout_helper.checkout_obj(uname, param.object_id)
        if r['ret'] < 0:
            return json.dumps({'ret': r['ret'], 'msg': r['msg']})

        ret_data = {
            "object_id": param.object_id,  # 唯一代码 
            "type": 1 if r['obj_type'] == 'course' else 2,  # 类型: 1 课程, 2 专辑 
            "title": r['title'],
            "due": r['due'],  # 应付金额,单位 分 , 默认1分
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })
Ejemplo n.º 27
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='', 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'})
Ejemplo n.º 28
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'})
Ejemplo n.º 29
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='',
                          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'})
Ejemplo n.º 30
0
    def POST(self, version='v1'):
        web.header('Content-Type', 'application/json')
        param = web.input(app_id='',
                          dev_id='',
                          ver_code='',
                          session='',
                          tick='',
                          category='',
                          pic1='',
                          pic1_type='')

        if '' in (param.app_id, param.dev_id, param.ver_code, param.session,
                  param.tick, param.category):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 检查session登录
        uname = app_helper.app_logged(param.session)
        if uname is None:
            return json.dumps({'ret': -4, 'msg': '无效的session'})

        #--------------------------------------------------

        if param['category'].upper() not in ('LICENCE', 'PHOTO'):
            return json.dumps({'ret': -5, 'msg': '无效的category取值'})

        if param['pic1_type'].upper() not in ('JPG', 'PNG'):
            return json.dumps({'ret': -6, 'msg': '无效的图片类型取值'})

        # 保存图片
        if len(param['pic1'].strip()) > 0:
            pic1_filename = app_helper.write_image(
                param['pic1_type'], urllib.unquote_plus(param['pic1']))
        else:
            pic1_filename = ''  # 删除图片

        # 更新数据
        update_set = {}
        if param['category'].upper() == 'LICENCE':
            db.app_user.update_one({
                'userid': uname['userid'],
                'type': 1
            }, {'$set': {
                'upload_licence': pic1_filename
            }})
        else:
            if pic1_filename == '':  # 删除已上传的图片
                db.app_user.update_one({
                    'userid': uname['userid'],
                    'type': 1
                }, {'$set': {
                    'shop_pic': []
                }})
            else:
                db.app_user.update_one({
                    'userid': uname['userid'],
                    'type': 1
                }, {'$push': {
                    'shop_pic': pic1_filename
                }})

        # 准备返回值
        ret_data = {
            "pic1_url":
            app_helper.image_url(pic1_filename)
            if pic1_filename != '' else pic1_filename,
        }

        # 返回
        return json.dumps({
            'ret': 0,
            'data': ret_data,
        })