def pay_order(request): order_to_pay = None profile = request.user_profile webapp_user = request.webapp_user order_id = request.POST.get('order_id', None) if order_id is None: response = create_response(400) response.errMsg = u'订单不存在' return response.get_response() try: order_to_pay = Order.objects.get(id=order_id) except: response = create_response(500) response.errMsg = u'获取订单失败' response.innerErrMsg = full_stack() return response.get_response() interface_id = int(request.POST.get('interface_id', 0)) pay_interface = PayInterface.objects.get(id=interface_id) pay_url = shihuazhiye_util.pay(pay_interface, order_to_pay, request.webapp_owner_id) if pay_url: response = create_response(200) response.data.url = pay_url else: response = create_response(500) response.errMsg = u'支付失败' stack = unicode_full_stack() response.innerErrMsg = full_stack() return response.get_response()
def get_or_create_messge(context, from_weixin_user): request, message, user_profile, member, response_rule, from_weixin_user, is_from_simulator = _get_info_from_context( context) try: mp_user = WeixinMpUser.objects.get(owner_id=user_profile.user_id) except: if settings.DUMP_DEBUG_MSG: from core.exceptionutil import full_stack print '========== start monitored exception ==========' print full_stack() print 'no mp_user for webapp_id ', user_profile.webapp_id print '========== finish monitored exception ==========' #没有注册mp user,人工客服不可用,直接返回 return sender_icon = _get_weixin_user_head_icon(from_weixin_user.username) if message.has_key("content"): #:hasattr(message, 'content'): content = message["content"] else: content = '' mediaId, picUrl = '', '' if message["msgType"] == WeixinMessageTypes.TEXT: content = message["content"] elif message["msgType"] == WeixinMessageTypes.VOICE: mediaId = message["mediaId"] elif message["msgType"] == WeixinMessageTypes.IMAGE: mediaId = message["mediaId"] picUrl = message["picUrl"] params = { 'sender_username': from_weixin_user.username, 'sender_nickname': from_weixin_user.username, 'sender_fake_id': '', 'sender_icon': sender_icon, 'receiver_username': mp_user.username, 'receiver_nickname': mp_user.username, 'receiver_fake_id': '', 'receiver_icon': '[not used]', 'content': content, 'mpuser': mp_user, 'mode': settings.MODE, 'weixin_created_at': message["createTime"], 'message_type': message["msgType"], 'msg_id': message["msgId"], 'pic_url': picUrl, 'media_id': mediaId } if 'sender_fake_id' in request["POST"]: params['sender_fake_id'] = request["POST"]['sender_fake_id'] return message_util.record_message(params)
def _record_message(self, request, message, user_profile, from_weixin_user): try: mp_user = WeixinMpUser.objects.get(owner_id=user_profile.user_id) except: if settings.DUMP_DEBUG_MSG: from core.exceptionutil import full_stack print '========== start monitored exception ==========' print full_stack() print 'no mp_user for webapp_id ', user_profile.webapp_id print '========== finish monitored exception ==========' #没有注册mp user,人工客服不可用,直接返回 return sender_icon = self._get_weixin_user_head_icon( from_weixin_user.username) if hasattr(message, 'content'): content = message.content else: content = '' mediaId, picUrl = '', '' if message.msgType == WeixinMessageTypes.TEXT: content = message.content elif message.msgType == WeixinMessageTypes.VOICE: mediaId = message.mediaId elif message.msgType == WeixinMessageTypes.IMAGE: mediaId = message.mediaId picUrl = message.picUrl params = { 'sender_username': from_weixin_user.username, 'sender_nickname': from_weixin_user.username, 'sender_fake_id': '', 'sender_icon': sender_icon, 'receiver_username': mp_user.username, 'receiver_nickname': mp_user.username, 'receiver_fake_id': '', 'receiver_icon': '[not used]', 'content': content, 'mpuser': mp_user, 'mode': settings.MODE, 'weixin_created_at': message.createTime, 'message_type': message.msgType, 'msg_id': message.msgId, 'pic_url': picUrl, 'media_id': mediaId } if 'sender_fake_id' in request.POST: params['sender_fake_id'] = request.POST['sender_fake_id'] return message_util.record_message(params)
def get_express_details_by_order(order): """ 根据 order 获取 快递明细信息 """ details = ExpressDetail.objects.filter( order_id=order.id).order_by('-display_index') if details.count() > 0: return list(details) expresses = ExpressHasOrderPushStatus.objects.filter( express_company_name=order.express_company_name, express_number=order.express_number) if expresses.count() == 0: return list([]) try: express = expresses[0] return list( ExpressDetail.objects.filter( express_id=express.id).order_by('-display_index')) except: innerErrMsg = full_stack() watchdog_fatal( u'获取快递详情失败,order_id={}, case:{}'.format(order.id, innerErrMsg), EXPRESS_TYPE) return list([])
def wapi_log(self, app, resource, method, params, time_in_s, status=0): """ 记录WAPI信息,保存到mongo中 """ try: if settings.WAPI_LOGGER_ENABLED: global _wapi_logger if _wapi_logger is None: _wapi_logger = MongoAPILogger() if settings.MODE == 'develop' or settings.MODE == 'test': logging.info( "develop mode, called WAPI (in {} s): {} {}/{}, param: {}". format(time_in_s, method, app, resource, param_to_text(params))) return _wapi_logger.log(app, resource, method, morph_params(params), time_in_s, status) else: logging.info("called WAPI (in {} s): {} {}/{}, param: {}".format( time_in_s, method, app, resource, param_to_text(params))) return 'OK' except: logging.error("Failed to send wapi log, retrying.:Cause:\n{}".format( full_stack())) raise self.retry() return 'OK'
def _watchdog(type, message, severity=WATCHDOG_INFO, user_id='0', db_name='default'): """ watchdog : 向日志记录表添加一条日志信息 """ try: if isinstance(user_id, int): user_id = str(user_id) if settings.WATCH_DOG_DEVICE == 'console': if severity == WATCHDOG_DEBUG: severity = 'DEBUG' elif severity == WATCHDOG_INFO: severity = 'INFO' elif severity == WATCHDOG_NOTICE: severity = 'NOTICE' elif severity == WATCHDOG_WARNING: severity = 'WARNING' elif severity == WATCHDOG_ERROR: severity = 'ERROR' elif severity == WATCHDOG_FATAL: severity = 'FATAL' elif severity == WATCHDOG_ALERT: severity = 'ALERT' elif severity == WATCHDOG_EMERGENCY: severity = 'EMERGENCY' else: severity = 'UNKNOWN' # if not settings.IS_UNDER_BDD: # logging.info("[%s] [%s] : %s" % (severity, type, message)) else: try: # if not settings.IS_UNDER_BDD: # logging.info("[%s] [%s] : %s" % (severity, type, message)) WeappMessage.objects.using(settings.WATCHDOG_DB).create( type=type, message=message, severity=severity, user_id=user_id) except: # logging.error(u'>>>>>>>>>>>>>>>>> not connection operation databases settings.WATCHDOG_DB={}'.format(settings.WATCHDOG_DB)) # logging.error("Cause:\n{}".format(full_stack())) print 'error message==============', message Message.objects.create(type=type, message=message, severity=severity, user_id=user_id) except: #TODO, 通过监控和心跳来发现 try: logging.error( "Failed to save watchdog, type:{}, message:{}".format( type, message)) logging.error("Cause:\n{}".format(full_stack())) except: pass
def pay_order(request): """ 订单支付api, 获取【支付跳转路径】 避免使用,直接通过save_order方法返回【支付跳转路径】 """ order_to_pay = None #profile = request.user_profile #webapp_user = request.webapp_user order_id = request.POST.get('order_id', None) if order_id is None: response = create_response(400) response.errMsg = u'订单不存在' return response.get_response() try: order_to_pay = Order.objects.get(id=order_id) except: response = create_response(500) response.errMsg = u'获取订单失败' response.innerErrMsg = full_stack() return response.get_response() interface_id = int(request.POST.get('interface_id', 0)) if interface_id == 0: #没有指定interface id, 根据interface type获取 pay_interface = PayInterface.objects.get( owner_id=request.webapp_owner_id, type=request.POST['interface_type']) else: pay_interface = PayInterface.objects.get(id=interface_id) pay_url = pay_interface.pay(order_to_pay, request.webapp_owner_id) if pay_url: response = create_response(200) response.data.url = pay_url else: response = create_response(500) response.errMsg = u'支付失败' #stack = unicode_full_stack() response.innerErrMsg = full_stack() return response.get_response()
def save_activity_apply(request, webapp_id, activity_id): member = mobile_views.__get_current_member(request) try: activity = Activity.objects.get(id=activity_id) except: response = create_response(500) response.errMsg = u'该活动不存在' response.innerErrMsg = full_stack() return response.get_response() if member is None: response = create_response(500) response.errMsg = u'您还不是会员' return response.get_response() if request.POST: try: items = ActivityItems.objects.filter(activity=activity) for item in items: input_name = '{}-{}'.format(item.id, item.type) if item.type == TYPE_IMAGE: file = request.POST[input_name] value = save_base64_img_file_local_for_webapp( request, file) else: value = request.POST.get(input_name, '') ItmesValue.objects.create(owner=request.user_profile.user, items=item, activity=activity, member=member, value=value) response = create_response(200) except: response = create_response(500) response.errMsg = u'提交错误' response.innerErrMsg = full_stack() return response.get_response() else: response = create_response(500) response.errMsg = u'is not POST method' return response.get_response()
def get_cities(request, province_id): response = create_response(200) try: cities = _get_cities_for_province(province_id) response.data = cities except: response = create_response(500) response.innerErrMsg = full_stack() return response.get_response()
def get_provinces(request): response = create_response(200) try: provinces = _get_all_provinces() response.data = provinces except: response = create_response(500) response.innerErrMsg = full_stack() return response.get_response()
def get_districts(request, city_id): response = create_response(200) try: districts = _get_districts_for_city(city_id) response.data = districts except: response = create_response(500) response.innerErrMsg = full_stack() return response.get_response()
def play_test_game(request): member = request.member webapp_user = request.webapp_user game_id = request.POST['game_id'] score = request.POST['score'] try: game = TestGame.objects.get(id=game_id) except: response = create_response(500) response.errMsg = u'该趣味测试不存在' response.innerErrMsg = full_stack() return response.get_response() if request.POST: try: is_participated = False #是否已经参加 #判断是否参与过 records = TestGameRecord.objects.filter( webapp_user_id=webapp_user.id, test_game=game.id) if records: is_participated = True TestGameRecord.objects.create(test_game=game, webapp_user_id=webapp_user.id, score=score) if member and (not is_participated): prize_info = PrizeInfo.from_json(game.award_prize_info) award(prize_info, member, u'趣味测试获得积分') response = create_response(200) except: response = create_response(500) response.errMsg = u'提交错误' response.innerErrMsg = full_stack() return response.get_response() else: response = create_response(500) response.errMsg = u'is not POST method' return response.get_response()
def get_order_info(request): express_company = request.GET.get('company', '') express_number = request.GET.get('number', '') order_by = request.GET.get('order_by', 'desc') response = create_response(200) try: query = ExpressOrderQuery(request, express_company, express_number, order_by) json_data = query.get_express_order_data() response.data = json_data except: response = create_response(500) response.errMsg = u'获取失败' response.innerErrMsg = full_stack() watchdog_fatal(u'代码错误!%s' % response.innerErrMsg, EXPRESS_TYPE) return response.get_response()
def __get_http_response_data(domain, url, method="GET"): error_info = None conn = httplib.HTTPConnection(domain) try: conn.request(method, url) r1 = conn.getresponse() print r1.status if r1.status is not 200: error_info = r1.read() data_str = None else: data_str = r1.read() except: data_str = None error_info = full_stack() finally: conn.close() return data_str, error_info
def _verify_response(self): """用支付宝返回的notify_id调用支付宝相应接口验证是否是支付宝发来的请求""" verity_url = self.ALIPAY_VERIFY_URL_TMPL.format( self.config.partner, self.notify_data_soup.notify_id.text) verified_result = 'false' verify_response = None try: verify_response = urllib2.urlopen(verity_url) verified_result = verify_response.read().strip() except: try: watchdog_error(u'从支付宝验证失败' + full_stack()) except: pass return verified_result
def update_order_status(request): order_id = request.POST.get('order_id', 0) action = request.POST.get('action', '') if not order_id or action == '': response = create_response(500) response.errMsg = u'webapp中修改订单失败' return response.get_response() try: order = Order.objects.get(id=order_id) mall_api.update_order_status(request.user, action, order) response = create_response(200) except: response = create_response(500) response.errMsg = u'webapp中修改订单失败' response.innerErrMsg = full_stack() notify_message = u"webapp中修改订单状态失败, order_id:{}, action:{}, cause:\n{}".format( order_id, action, unicode_full_stack()) watchdog_error(notify_message) return response.get_response()
def get_weather_info(request): weathers = Weather.objects.all() response = create_response(200) city_code = "101180801" morning_time = 6 # 早晨时间 night_time = 18 # 晚上时间 today_date = datetime.now() try: if weathers.count() == 0: weather_info, weather = __get_weather_info(city_code) else: weather = weathers[0] if __is_out_time_span(weather.update_time, weather.update_span): weather_info, weather = __get_weather_info( city_code, weather_id=weather.id) else: weather_info = json.loads(weather.info) response.data.weather_info = weather_info response.data.today_date = today_date.strftime("%Y年%m月%d日") response.data.create_time = weather.update_time.strftime( "%Y年%m月%d日 %H:%M") # 计算白天还是晚上,True为白天,False为晚上 hour = int(weather.update_time.strftime("%H")) if morning_time <= hour and hour < night_time: response.data.is_daytime = True else: response.data.is_daytime = False # 当前温度 response.data.current_temp = __get_current_temp(city_code) except: response = create_response(500) response.errMsg = u'获取失败' response.innerErrMsg = full_stack() watchdog_fatal(u'代码错误!%s' % response.innerErrMsg, WATCHDOG_TYPE) return response.get_response()
def get_or_create_messge(context, from_weixin_user): request, message, user_profile, member, response_rule, from_weixin_user, is_from_simulator = _get_info_from_context( context) try: mp_user = WeixinMpUser.objects.get(owner_id=user_profile.user_id) except: if settings.DUMP_DEBUG_MSG: from core.exceptionutil import full_stack print '========== start monitored exception ==========' print full_stack() print 'no mp_user for webapp_id ', user_profile.webapp_id print '========== finish monitored exception ==========' #没有注册mp user,人工客服不可用,直接返回 return sender_icon = _get_weixin_user_head_icon(from_weixin_user.username) if message.has_key("content"): #:hasattr(message, 'content'): content = message["content"] else: content = '' mediaId, picUrl = '', '' if message["msgType"] == WeixinMessageTypes.TEXT: content = message["content"] elif message["msgType"] == WeixinMessageTypes.VOICE: mediaId = message["mediaId"] elif message["msgType"] == WeixinMessageTypes.IMAGE: mediaId = message["mediaId"] picUrl = message["picUrl"] try: import time if picUrl.find('mmbiz.qpic.cn') > -1: nonce_str = ''.join( random.sample(string.ascii_letters + string.digits, 6)) picUrlName = "%s%s" % (nonce_str, str(int(time.time() * 1000))) picUrl = upyun_util.upload_weixin_url_to_upyun( picUrl, picUrlName) except: print 'error at picUrl to upyun' #判断是否公众号信息: added by slzhu is_from_mp_user = False if response_rule: is_from_mp_user = True is_un_read_msg = True if response_rule and response_rule.has_key( 'type') and response_rule['type'] == 1: is_un_read_msg = False params = { 'sender_username': from_weixin_user.username, 'sender_nickname': from_weixin_user.username, 'sender_fake_id': '', 'sender_icon': sender_icon, 'receiver_username': mp_user.username, 'receiver_nickname': mp_user.username, 'receiver_fake_id': '', 'receiver_icon': '[not used]', 'content': content, 'mpuser': mp_user, 'mode': settings.MODE, 'weixin_created_at': message["createTime"], 'message_type': message["msgType"], 'msg_id': message["msgId"], 'pic_url': picUrl, 'media_id': mediaId, 'is_from_mp_user': is_from_mp_user, 'is_un_read_msg': is_un_read_msg } # if 'sender_fake_id' in request["POST"]: # params['sender_fake_id'] = request["POST"]['sender_fake_id'] #return message_util.record_message(params) return message_util.record_message(params)
def simple_app(environ, start_response): # 修改窗口名,目前只对windows有效 try: os.system("title {}_bdd_server".format(self_name)) except: pass setup_testing_defaults(environ) status = '200 OK' headers = [('Content-type', 'text/plain')] start_response(status, headers) # the environment variable CONTENT_LENGTH may be empty or missing try: request_body_size = int(environ.get('CONTENT_LENGTH', 0)) except (ValueError): request_body_size = 0 # When the method is POST the query string will be sent # in the HTTP request body which is passed by the WSGI server # in the file like wsgi.input environment variable. # 从http request解析请求 request_body = environ['wsgi.input'].read(request_body_size) post = parse_qs(request_body) step_data = json.loads(post['data'][0]) step = step_data['step'].strip() # 1. 解析step # 2. 执行step # 3. 分类step执行结果 # 4. 返回http response # 0:成功,1:业务失败,2:异常 result = 0 if step == '__reset__': print('*********************** run step **********************') print(u'Reset bdd environment...') environment.after_scenario(context, context.scenario) environment.before_scenario(context, context.scenario) resp = {'result': result, 'bdd_server_name': self_name} return base64.b64encode(json.dumps(resp)) else: # 解析请求携带的context _set_context_attrs(context, json.loads(step_data['context_attrs'])) if step_data['context_text']: step_content = step_data['context_text'] else: step_content = step_data['context_table'] step = u'%s\n"""\n%s\n"""' % (step_data['step'], step_content) print('*********************** run step **********************') print(step) context_attrs = {} traceback = '' try: context.execute_steps(step) except AssertionError: result = 1 from core.exceptionutil import full_stack print('*********************** failure **********************') traceback = full_stack() print(traceback.decode('utf-8')) except: result = 2 from core.exceptionutil import full_stack print( '*********************** exception **********************') traceback = full_stack() print(traceback.decode('utf-8')) else: result = 0 context_attrs = context._stack[0] resp = { 'result': result, 'traceback': traceback, 'context_attrs': context_attrs, 'bdd_server_name': self_name } # 传递context时忽略基本类型外的对象 return base64.b64encode(json.dumps(resp, default=_default))
def join_research(request): member = request.member webapp_user = request.webapp_user research_id = request.POST['research_id'] try: research = Research.objects.get(id=research_id) except: response = create_response(500) response.errMsg = u'该调研不存在' response.innerErrMsg = full_stack() return response.get_response() username = '' phone_number = '' if request.POST: try: items = ResearchItem.objects.filter(research=research) for item in items: input_name = '{}-{}'.format(item.id, item.type) if item.type == RESEARCHITEM_TYPE_IMAGE: file = request.POST[input_name] if file: value = save_base64_img_file_local_for_webapp( request, file) else: value = '' else: value = request.POST.get(input_name, '') if item.title == u'姓名': username = value if item.title == u'手机号': phone_number = value ResearchItemValue.objects.create( owner_id=request.webapp_owner_id, item=item, research=research, webapp_user=webapp_user, value=value) if member: try: member.update_member_info(username, phone_number) except: #不同步到会员 pass #给予奖励 #无奖励 if research.prize_type == -1: pass #优惠券 elif research.prize_type == 1: rule_id = research.prize_source # coupons = create_coupons(research.owner, rule_id, 1, member.id) consume_coupon(research.owner.id, rule_id, member.id) #积分 elif research.prize_type == 3: prize_detail = research.prize_source #增加积分 member.consume_integral(-int(prize_detail), u'参与调研,获得积分') response = create_response(200) except: response = create_response(500) response.errMsg = u'提交错误' response.innerErrMsg = full_stack() return response.get_response() else: response = create_response(500) response.errMsg = u'is not POST method' return response.get_response()
def join_activity(request): weapp_user = request.webapp_user member = weapp_user.get_member_by_webapp_user_id(weapp_user.id) activity_id = request.POST['activity_id'] try: activity = Activity.objects.get(id=activity_id) except: response = create_response(500) response.errMsg = u'该活动不存在' response.innerErrMsg = full_stack() return response.get_response() if not activity.is_non_member: if member is None: response = create_response(500) response.errMsg = u'您还不是会员' return response.get_response() username = '' phone_number = '' if request.POST: try: response = create_response(200) if activity.is_enable_offline_sign: sign_code = _create_activity_sign_code(request.webapp_user.id, activity.id) ActivityUserCode.objects.create( owner_id=request.webapp_owner_id, activity=activity, webapp_user_id=weapp_user.id, sign_code=sign_code) response.data.sign_code = sign_code items = ActivityItem.objects.filter(activity=activity) for item in items: input_name = '{}-{}'.format(item.id, item.type) if item.type == ACTIVITYITEM_TYPE_IMAGE: file = request.POST[input_name] if file: value = save_base64_img_file_local_for_webapp( request, file) else: value = '' else: value = request.POST.get(input_name, '') if item.title == u'姓名': username = value if item.title == u'手机号': phone_number = value ActivityItemValue.objects.create( owner_id=request.webapp_owner_id, webapp_user_id=weapp_user.id, item=item, activity=activity, value=value) try: #是否开启线下签到 is_enable_offline_sign = activity.is_enable_offline_sign if not is_enable_offline_sign and member: member.update_member_info(username, phone_number) #给予奖励 #无奖励 if activity.prize_type == -1: pass #优惠券 elif activity.prize_type == 1: rule_id = activity.prize_source # coupons = create_coupons(activity.owner, rule_id, 1, member.id) consume_coupon(activity.owner.id, rule_id, member.id) #积分 elif activity.prize_type == 3: prize_detail = activity.prize_source #增加积分 member.consume_integral(-int(prize_detail), u'参加活动,获得积分') except: ActivityItemValue.objects.filter( owner_id=request.webapp_owner_id, activity=activity, webapp_user_id=weapp_user.id).delete() ActivityUserCode.objects.filter( owner_id=request.webapp_owner_id, activity=activity, webapp_user_id=weapp_user.id, ).delete() raise IOError except: notify_msg = u"活动报名失败, cause:\n{}".format(unicode_full_stack()) watchdog_fatal(notify_msg) response = create_response(500) response.errMsg = u'提交错误' response.innerErrMsg = full_stack() return response.get_response() else: response = create_response(500) response.errMsg = u'is not POST method' return response.get_response()