def send_order_template_message(webapp_id, order_id, send_point): user_profile = UserProfile.objects.get(webapp_id=webapp_id) user = user_profile.user template_message = get_template_message_by(user, send_point) from mall.models import Order order = Order.objects.get(id=order_id) if order and user_profile and template_message and template_message.template_id: mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: try: weixin_api = get_weixin_api(mpuser_access_token) message = _get_order_send_message_dict(user_profile, template_message, order, send_point) result = weixin_api.send_template_message(message, True) #_record_send_template_info(order, template_message.template_id, user) # if result.has_key('msg_id'): # UserSentMassMsgLog.create(user_profile.webapp_id, result['msg_id'], MESSAGE_TYPE_TEXT, content) return True except: notify_message = u"发送模板消息异常, cause:\n{}".format( unicode_full_stack()) watchdog_warning(notify_message) return False else: return False return True
def send_template_message_for_not_paid_order(webapp_owner_id, member_id, template_data): if _is_member_subscribed(member_id): # 会员已经取消关注 return True user_profile = UserProfile.objects.get(user_id=webapp_owner_id) user = user_profile.user if template_data and user_profile: mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: try: weixin_api = get_weixin_api(mpuser_access_token) social_account = member_model_api.get_social_account_by_member_id( member_id) if social_account and social_account.openid: template_data['touser'] = social_account.openid result = weixin_api.send_template_message(template_data, True) return True except: notify_message = u"发送模板消息异常, cause:\n{}".format( unicode_full_stack()) watchdog_warning(notify_message) return False else: return False return True
def send_weixin_template_message(webapp_owner_id, member_id, model, send_point): if _is_member_subscribed(member_id): # 会员已经取消关注 return True user_profile = UserProfile.objects.get(user_id=webapp_owner_id) user = user_profile.user template_message = get_template_message_by(user_profile.user, send_point) if not template_message: return False template_message.send_point = send_point # return _get_send_message_dict(user_profile, member_id, model, template_message) if model and user_profile and template_message and template_message.template_id: mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: try: weixin_api = get_weixin_api(mpuser_access_token) message = _get_send_message_dict(user_profile, member_id, model, template_message) result = weixin_api.send_template_message(message, True) #_record_send_template_info(order, template_message.template_id, user) return True except: notify_message = u"发送模板消息异常, cause:\n{}".format( unicode_full_stack()) watchdog_warning(notify_message) return False else: return False return True
def get_templates(user): """ 从微信获取商家在公众号中配置的所有模板消息 @param owner_id: @return: """ mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: weixin_api = get_weixin_api(mpuser_access_token) try: result = weixin_api.get_all_template_messages(True) template_list = result['template_list'] user_update_list = [] for t in template_list: user_update_list.append( UserHasTemplateMessages( owner_id=user.id, template_id=t['template_id'], title=t['title'], primary_industry=t['primary_industry'], deputy_industry=t['deputy_industry'], content=t['content'])) UserHasTemplateMessages.objects(owner_id=user.id).delete() UserHasTemplateMessages.objects.insert(user_update_list) print result, 'asdfsgsf' except Exception, e: print e notify_message = u"获取模板列表异常, cause:\n{}".format( unicode_full_stack()) watchdog_warning(notify_message)
def get_member_group_id(user_profile, openid): mpuser_access_token = _check_access_token(user_profile) if mpuser_access_token: weixin_api = get_weixin_api(mpuser_access_token) groups = weixin_api.get_member_group_id(openid) return groups else: return None
def get_all_group(user_profile): mpuser_access_token = _check_access_token(user_profile) if mpuser_access_token: weixin_api = get_weixin_api(mpuser_access_token) groups = weixin_api.get_groups() return groups else: return None
def _get_weixin_account_info_via_api(user_profile, social_account): mp_user = get_binding_weixin_mpuser(user_profile.user_id) if mp_user is None: return None mpuser_access_token = get_mpuser_accesstoken(mp_user) if mpuser_access_token is None: return None if mp_user.is_certified and mpuser_access_token.is_active: weixin_api = get_weixin_api(mpuser_access_token) userinfo = weixin_api.get_user_info(social_account.openid) if userinfo is None: return None else: nickname = '' headimgurl='' sex = 0 subscribe = False country = '' city = '' province = '' try: if hasattr(userinfo, 'nickname'): nickname = userinfo.nickname if hasattr(userinfo, 'headimgurl'): headimgurl = userinfo.headimgurl if hasattr(userinfo, 'sex'): sex = userinfo.sex if hasattr(userinfo, 'subscribe'): if str(userinfo.subscribe) == '1': subscribe = True if hasattr(userinfo, 'city'): city = userinfo.city if hasattr(userinfo, 'province'): province = userinfo.province if hasattr(userinfo, 'country'): country = userinfo.country except: pass return SocialAccountInfo(nickname, headimgurl, sex, subscribe, country, province, city) else: return None
def handle(self, user_id, **options): user = User.objects.get(id=user_id) mp_user = get_binding_weixin_mpuser(user) if mp_user is None: return None if not mp_user.is_service or not mp_user.is_certified: return None mpuser_access_token = get_mpuser_accesstoken(mp_user) weixin_api = get_weixin_api(mpuser_access_token) result = weixin_api.api_shakearound_device_aopplyid(3,u'测试') print result
def send_message(self): try: message = self._get_message_dict() if message is None: return False, u"message dict错误" mpuser_access_token = self._get_mpuser_access_token(self.user) weixin_api = get_weixin_api(mpuser_access_token) result = weixin_api.send_template_message(message, True) return True, result except: notify_message = u"shengjing发送模板消息异常, cause:\n{}".format( unicode_full_stack()) watchdog_warning(notify_message, self.shengjing_params.WATCHDOG_TYPE_SHENGJING) return False, unicode_full_stack()
def check_openid_by_api(user_profile, openid): mp_user = get_binding_weixin_mpuser(user_profile.user_id) if mp_user is None: return None mpuser_access_token = get_mpuser_accesstoken(mp_user) if mpuser_access_token is None: return False if mp_user.is_certified and mpuser_access_token.is_active: weixin_api = get_weixin_api(mpuser_access_token) userinfo = weixin_api.get_user_info(openid) if hasattr(userinfo, 'errcode'): return False else: return True else: return False
def _get_ticket(user_id, screen_id): mp_user = get_binding_weixin_mpuser(user_id) mpuser_access_token = get_mpuser_accesstoken(mp_user) weixin_api = get_weixin_api(mpuser_access_token) if mp_user.is_certified and mp_user.is_service and mpuser_access_token.is_active: try: qrcode_ticket = weixin_api.create_qrcode_ticket( screen_id, QrcodeTicket.PERMANENT) return qrcode_ticket.ticket except: return _get_ticket(user_id, screen_id) else: try: qrcode_ticket = weixin_api.create_qrcode_ticket( screen_id, QrcodeTicket.PERMANENT) return qrcode_ticket.ticket except: return ''
def send_mass_text_message_with_openid_list(user_profile, openid_list, content, log_id=None, group_id=0): user = user_profile.user if len(openid_list) > 0 and content != None and content != '' and user: mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: mesage = TextMessage(openid_list, content) weixin_api = get_weixin_api(mpuser_access_token) if log_id: sent_log = UserSentMassMsgLog.objects.filter(id=log_id).first() else: sent_log = UserSentMassMsgLog.create(user_profile.webapp_id, '', MESSAGE_TYPE_TEXT, content, group_id) try: result = weixin_api.send_mass_message(mesage, True) #增加群发任务失败处理 sent_log.msg_id = result['msg_id'] sent_log.message_type = MESSAGE_TYPE_TEXT sent_log.message_content = content if result['errcode'] != 0: sent_log.status = 'send fail code: %d' % result['errcode'] if result['errcode'] == -1: #微信系统繁忙,则稍后重试 sent_log.save() return False sent_log.save() return True except: notify_message = u"群发文本消息异常send_mass_message, cause:\n{}".format( unicode_full_stack()) print notify_message watchdog_warning(notify_message) sent_log.status = 'send failed' sent_log.save() return False else: return False return True
def __get_qrcode(user_id): try: user = User.objects.get(id=user_id) except: notify_msg = u"微信会员二维码__get_qrcode errror :id={}cause:\n{}".format( user_id, unicode_full_stack()) watchdog_error(notify_msg) return None, None mp_user = get_binding_weixin_mpuser(user) if mp_user: mpuser_access_token = get_mpuser_accesstoken(mp_user) else: return None, None if mpuser_access_token is None: return None, None if mpuser_access_token.is_active: weixin_api = get_weixin_api(mpuser_access_token) try: ticket = None qrcode_ticket = weixin_api.create_qrcode_ticket(int(user.id)) try: ticket = qrcode_ticket.ticket except: ticket = None #qcrod_info = weixin_api.get_qrcode(ticket) if ticket: return ticket, 604000 else: return None, None except: notify_msg = u"微信会员二维码__get_qrcode errror :id={}cause:\n{}".format( user_id, unicode_full_stack()) watchdog_error(notify_msg, 'WEB', user_id) return None, None else: return None, None
def delete_mass_message(user_profile, msg_id): user = user_profile.user if msg_id != None and msg_id != '' and user: mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: weixin_api = get_weixin_api(mpuser_access_token) try: result = weixin_api.delete_mass_message(msg_id.strip()) if result.has_key('errmsg') and result['errmsg'] == 'ok': UserSentMassMsgLog.objects.filter( webapp_id=user_profile.webapp_id, msg_id=msg_id).update(status='delete') return True except: notify_message = u"删除群发消息异常delete_mass_message, cause:\n{}".format( unicode_full_stack()) print notify_message watchdog_warning(notify_message) return False return False
def send_apps_template_message(owner_id, member_info): """ 百宝箱活动的模板消息 @param owner_id: @param member_senders_info: @return: """ user = User.objects.get(id=owner_id) mpuser_access_token = _get_mpuser_access_token(user) result = False if mpuser_access_token: weixin_api = get_weixin_api(mpuser_access_token) try: message = _get_fixed_apps_send_message_dict(member_info) weixin_api.send_template_message(message, True) result = True except: notify_message = u"发送模板消息异常, cause:\n{}".format( unicode_full_stack()) watchdog_warning(notify_message) return result, member_info['member_id']
def api_put(request): """ 响应PUT """ data = request_util.get_fields_to_be_save(request) data['permission'] = True if data['permission']=='1' else False data['is_limit_first_buy'] = True if data['is_limit_first_buy']=='1' else False data['is_limit_cash'] = True if data['is_limit_cash']=='1' else False weizoom_card_ids = data['weizoom_card_ids'].split(',') weizoom_card_passwords = data['weizoom_card_passwords'].split(',') rebate = app_models.Rebate(**data) ticket_id = app_models.Rebate.objects.all().count() + 10001 #ID从1W开始计算,为了防止跟带参数二维码重复 rebate.ticket_id = ticket_id rebate.save() data = json.loads(rebate.to_json()) data['id'] = data['_id']['$oid'] index = 0 for weizoom_card_id in weizoom_card_ids: weizoom_card_info = AppsWeizoomCard( owner_id = request.manager.id, belong_to = data['id'], weizoom_card_id = weizoom_card_id, weizoom_card_password = encrypt_password(weizoom_card_passwords[index]) ) weizoom_card_info.save() index += 1 if settings.MODE != 'develop': mp_user = get_binding_weixin_mpuser(request.manager) mpuser_access_token = get_mpuser_accesstoken(mp_user) weixin_api = get_weixin_api(mpuser_access_token) try: qrcode_ticket = weixin_api.create_qrcode_ticket(ticket_id, QrcodeTicket.PERMANENT) ticket = qrcode_ticket.ticket except Exception, e: print 'get qrcode_ticket fail:', e ticket = ''
def handle(self, *args, **options): print options print args date_time = datetime.datetime.now() + datetime.timedelta(days=-1) date_time = date_time.strftime("%Y-%m-%d") auth_appids = ComponentAuthedAppid.objects.filter(is_active=True) user_ids = [auth_appid.user_id for auth_appid in auth_appids] print date_time user_profiles = UserProfile.objects.filter(user_id__in=user_ids, is_mp_registered=True) for user_profile in user_profiles: print user_profile.webapp_id try: mp_user = get_binding_weixin_mpuser(user_profile.user_id) if mp_user is None: continue mpuser_access_token = get_mpuser_accesstoken(mp_user) if mpuser_access_token is None: continue if mp_user.is_certified and mp_user.is_service and mpuser_access_token.is_active: weixin_api = get_weixin_api(mpuser_access_token) summary_result = weixin_api.api_get_user_summary( date_time, date_time) cumulate_result = weixin_api.api_get_user_cumulate( date_time, date_time) print cumulate_result if summary_result.has_key('list'): MemberAnalysis.objects.filter( owner_id=user_profile.user_id, date_time=date_time).delete() member_analysis = MemberAnalysis.objects.create( owner_id=user_profile.user_id, date_time=date_time) total_new_user = 0 total_cancel_user = 0 for summary_data in summary_result['list']: new_user = summary_data['new_user'] cancel_user = summary_data['cancel_user'] MemberAnalysisDetail.objects.create( member_analysis=member_analysis, user_source=summary_data['user_source'], new_user=new_user, cancel_user=cancel_user) total_new_user = total_new_user + new_user total_cancel_user = total_cancel_user + cancel_user member_analysis.cancel_user = total_cancel_user member_analysis.new_user = total_new_user member_analysis.net_growth = total_new_user - total_cancel_user member_analysis.save() if cumulate_result.has_key('list'): cumulate_user = cumulate_result['list'][0][ 'cumulate_user'] member_analysis.cumulate_user = cumulate_user member_analysis.save() except: print 'error:', user_profile.webapp_id
def api_post(request): """ 同步模版 从微信获取商家在公众号中配置的所有模板消息 """ mpuser_access_token = _get_mpuser_access_token(request.manager) response = create_response(500) print mpuser_access_token if mpuser_access_token: user_id = request.manager.id try: weixin_api = get_weixin_api(mpuser_access_token) curr_template_info = { t.template_id: t for t in weixin_models.UserHasTemplateMessages.objects. filter(owner_id=user_id) } result = weixin_api.get_all_template_messages(True) template_list = result['template_list'] need_create_list = [] #商家新配置的模版 changed_template_info = [ ] #有变化的模版,包括新增的和先删除后新增同一个模版后,template_id发生变化的模版 deleted_template_info = [] #商家删除的模版 all_sync_ids = [] #商家配置的所有模版id need_delete_ids = [] #商家删除的模版id for t in template_list: template_id = t['template_id'] all_sync_ids.append(template_id) title = t['title'] if template_id not in curr_template_info.keys(): need_create_list.append( weixin_models.UserHasTemplateMessages( owner_id=user_id, template_id=template_id, title=title, primary_industry=t['primary_industry'], deputy_industry=t['deputy_industry'], content=t['content'], example=t['example'])) changed_template_info.append({ 'template_id': template_id, 'title': title, 'status': False, 'first': '', 'remark': '', 'industry_name': '%s-%s' % (t['primary_industry'], t['deputy_industry']), 'example': t['example'] }) for t_id in curr_template_info.keys( ): #如果当前库里的template_id不在获取的信息之中,那么就是商家已删除的 if t_id not in all_sync_ids: template = curr_template_info[t_id] need_delete_ids.append(t_id) deleted_template_info.append({ 'template_id': template.template_id, 'title': template.title }) #删除模板库中的记录 weixin_models.UserHasTemplateMessages.objects.filter( owner_id=user_id, template_id__in=need_delete_ids).delete() #同时删除已配置过的模版 weixin_models.UserTemplateSettings.objects.filter( owner_id=user_id, template_id__in=need_delete_ids).delete() #新增模版 weixin_models.UserHasTemplateMessages.objects.bulk_create( need_create_list) #提醒用户这些模版已经发生变化 response = create_response(200) response.data = { 'changed': changed_template_info, 'deleted': deleted_template_info } return response.get_response() except: notify_message = u"获取模板列表异常, cause:\n{}".format( unicode_full_stack()) watchdog_alert(notify_message) response.errMsg = u"获取模板列表异常" response.innerErrMsg = notify_message return response.get_response() else: response.errMsg = u'微信接口异常' return response.get_response()
def send_mass_news_message_with_openid_list(user_profile, openid_list, material_id, log_id=None, group_id=0): user = user_profile.user if len(openid_list ) > 0 and material_id != None and material_id != '' and user: news = News.get_news_by_material_id(material_id) mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: weixin_api = get_weixin_api(mpuser_access_token) def pic_re(matched): pic_astr = matched.group("img_url") if pic_astr.startswith('/') and pic_astr.find('http') == -1: pic_astr = pic_astr[1:] pic_url = os.path.join(settings.PROJECT_HOME, '../', pic_astr) else: pic_url = pic_astr pic_result = weixin_api.upload_content_media_image( pic_url, True) pic_result_url = '' if pic_result.has_key('url'): pic_result_url = pic_result['url'] try: if not pic_result_url: watchdog_error( u'上传多媒体文件失败 url:{}, pic_result:{}, weixin_resp:{}'. format(pic_url, pic_result_url, pic_result)) except: pass pic_pre = matched.group("img_pre") pic_result_url = pic_pre + pic_result_url return pic_result_url if log_id: sent_log = UserSentMassMsgLog.objects.filter(id=log_id).first() else: sent_log = UserSentMassMsgLog.create(user_profile.webapp_id, '', MESSAGE_TYPE_NEWS, material_id, group_id) try: article = Articles() for new in news: if new.pic_url: if new.pic_url.startswith('/') and new.pic_url.find( 'http') == -1: new.pic_url = new.pic_url[1:] #TODO::::目前是 把服务器上的图片上传到weixin 后期修改upyun的时候要做处理 pic_url = os.path.join(settings.PROJECT_HOME, '../', new.pic_url) else: pic_url = new.pic_url result_info = weixin_api.upload_media_image( pic_url, True) if new.url.startswith('./?'): new.url = '%s/workbench/jqm/preview%s' % ( user_profile.host, new.url[1:]) elif new.url.startswith('/m/') or new.url.startswith( './m/') or new.url.startswith('m/'): if new.url.startswith('/m/'): new.url = '%s%s' % (user_profile.host, new.url) elif new.url.startswith('./m/'): new.url = '%s%s' % (user_profile.host, new.url) else: new.url = '%s/%s' % (user_profile.host, new.url) if len(new.text.strip()) != 0: if new.text.find('<img'): #content = new.text.replace('/static/',('http://%s/static/' % user_profile.host)) #if new.text.find('.jpg') : new.text = re.sub( r'(?P<img_pre><img\s+[^>]*?\s*?src=[\"\'])(?P<img_url>[^>\s]*?\.(png|jpg))(?=[\"\'])', pic_re, new.text) if new.text.find('background-image:'): new.text = re.sub( r'(?P<img_pre>background-image:\s*?url\((\"|\'|")?)(?P<img_url>[^\)]+?\.(png|jpg))(?=(\"|\'|")?\))', pic_re, new.text) content = new.text else: content = new.text else: content = new.text article.add_article(result_info['media_id'], new.title, content, new.url, None, new.summary) result = weixin_api.upload_media_news(article) message = NewsMessage(openid_list, result['media_id']) result = weixin_api.send_mass_message(message, True) #增加群发任务失败处理 sent_log.msg_id = result['msg_id'] sent_log.message_type = MESSAGE_TYPE_NEWS sent_log.message_content = material_id if result['errcode'] != 0: sent_log.status = 'send failed code: %d' % result['errcode'] if result['errcode'] == -1: #微信系统繁忙,则稍后重试 sent_log.save() return False sent_log.save() return True except: notify_message = u"群发图文消息异常send_mass_message, cause:\n{}".format( unicode_full_stack()) print notify_message watchdog_warning(notify_message) sent_log.status = 'send failed' sent_log.save() return False else: return False return True
def send_mui_media(request): # 上传图片到云 uploadAction = request.POST.get('action', None) response = create_CORS_response(200, '', '') if uploadAction and uploadAction == 'query': return response filename = request.POST.get('filename') media_type = request.POST.get('type') receiver_username = request.POST.get('r_u') session_id = request.POST.get('s_id') domain = request.POST.get('domain') user = User.objects.get(id=request.POST.get('user')) user_profile = user.get_profile() request.user = user request.user_profile = user_profile mpuser = get_system_user_binded_mpuser(request.user) try: if user: try: mpuser_access_token = get_mpuser_access_token_for(mpuser) weixin_api = get_weixin_api(mpuser_access_token) except: response = create_CORS_response(500, u'微信公众号授权出错', '') return response else: response = create_CORS_response(500, u'用户登陆信息出错', '') return response upload_value = '' if filename and media_type: if media_type == 'image': # 尝试上传图片到云,成功则返回云路径,否则返回服务器存储路径 value = save_and_zip_img_file_for_muiApp(request, filename) if not value: response = create_CORS_response(500, u'上传云失败', '') return response if value.startswith('/') and value.find('http') == -1: upload_value = os.path.join(settings.PROJECT_HOME, '../', value[1:]) value = '%s%s' % (domain, value) else: upload_value = value #上传到微信服务器 result_info = weixin_api.upload_media_image(upload_value, True) if not result_info: response = create_CORS_response(500, u'发送图片失败,请重试..', '') return response # 发送给用户 res = weixin_api.send_custom_msg( receiver_username, ImageCustomMessage(result_info['media_id'])) # 存储数据库 Session.objects.filter(id=session_id).update( latest_contact_content='[图片]', latest_contact_created_at=datetime.today(), is_latest_contact_by_viper=True, unread_count=0) Message.objects.create( mpuser=mpuser, session_id=session_id, from_weixin_user_username=mpuser.username, to_weixin_user_username=receiver_username, pic_url=value, message_type='image', media_id=result_info['media_id'], content='', is_reply=True) response = create_CORS_response(200, '', '') elif media_type == 'voice': # 尝试上传语音到云,成功则返回云路径,否则返回服务器存储路径 file = request.FILES.get('upload_file', None) if not file: response = create_CORS_response(500, u'不存在该文件', '') value = save_audio_file_for_mobileApp(request, file) if not value: response = create_CORS_response(500, u'mp3文件没有找到', '') return response if value.startswith('/') and value.find('http') == -1: upload_value = os.path.join(settings.PROJECT_HOME, '../', value[1:]) value = '%s%s' % (domain, value) else: upload_value = value #上传到微信服务器 result_info = weixin_api.upload_media_voice(upload_value, True) if not result_info: response = create_CORS_response(500, u'发送语音失败,请重试..', '') return response # 发送给用户 res = weixin_api.send_custom_msg( receiver_username, VoiceCustomMessage(result_info['media_id'])) # 存储数据库 Session.objects.filter(id=session_id).update( latest_contact_content='[语音]', latest_contact_created_at=datetime.today(), is_latest_contact_by_viper=True, unread_count=0) Message.objects.create( mpuser=mpuser, session_id=session_id, from_weixin_user_username=mpuser.username, to_weixin_user_username=receiver_username, audio_url=value, message_type='voice', media_id=result_info['media_id'], content='', is_reply=True) response = create_CORS_response(200, '', '') except Exception: response = create_CORS_response(500, u'发送失败', '') return response
def handle(self, *args, **options): """ 同步模板 """ print 'tms sync start...' l = len(args) if l == 1: if not args[0].isdigit(): print '参数为user_id, 必须为正整数!!' return users = UserProfile.objects.filter(user_id=int(args[0])) else: users = [ u.user for u in UserProfile.objects.filter( is_active=True, is_mp_registered=True, is_oauth=True) ] for user in users: mpuser_access_token = _get_mpuser_access_token(user) if mpuser_access_token: user_id = user.id print 'start handle user [{}]`s templates...'.format( user.username) try: weixin_api = get_weixin_api(mpuser_access_token) curr_template_info = { t.template_id: t for t in UserHasTemplateMessages.objects.filter( owner_id=user_id) } result = weixin_api.get_all_template_messages(True) template_list = result['template_list'] need_create_list = [] # 商家新配置的模版 all_sync_ids = [] # 商家配置的所有模版id need_delete_ids = [] # 商家删除的模版id for t in template_list: template_id = t['template_id'] all_sync_ids.append(template_id) title = t['title'] if template_id not in curr_template_info.keys(): need_create_list.append( UserHasTemplateMessages( owner_id=user_id, template_id=template_id, title=title, primary_industry=t['primary_industry'], deputy_industry=t['deputy_industry'], content=t['content'], example=t['example'])) for t_id in curr_template_info.keys( ): # 如果当前库里的template_id不在获取的信息之中,那么就是商家已删除的 if t_id not in all_sync_ids: need_delete_ids.append(t_id) # 删除模板库中的记录 UserHasTemplateMessages.objects.filter( owner_id=user_id, template_id__in=need_delete_ids).delete() # 同时删除已配置过的模版 UserTemplateSettings.objects.filter( owner_id=user_id, template_id__in=need_delete_ids).delete() # 新增模版 UserHasTemplateMessages.objects.bulk_create( need_create_list) except: print unicode_full_stack() else: print 'weixin api failed!' print 'tms sync end...'
def list_channel_qrcode_settings(request): mpuser = get_system_user_binded_mpuser(request.user) if (mpuser is None) or (not mpuser.is_certified) or (not mpuser.is_service): should_show_authorize_cover = True else: should_show_authorize_cover = False settings = ChannelQrcodeSettings.objects.filter(owner=request.user) setting_ids = [s.id for s in settings] relations = ChannelQrcodeHasMember.objects.filter(channel_qrcode_id__in=setting_ids) setting_id2count = {} member_id2setting_id = {} member_ids = [] for r in relations: member_ids.append(r.member_id) member_id2setting_id[r.member_id] = r.channel_qrcode_id if r.channel_qrcode_id in setting_id2count: setting_id2count[r.channel_qrcode_id] += 1 else: setting_id2count[r.channel_qrcode_id] = 1 webapp_users = member_model.WebAppUser.objects.filter(member_id__in=member_ids) webapp_user_id2member_id = dict([(u.id, u.member_id) for u in webapp_users]) webapp_user_ids = set(webapp_user_id2member_id.keys()) orders = mall_model.Order.by_webapp_user_id(webapp_user_ids).filter(status=mall_model.ORDER_STATUS_SUCCESSED) member_id2total_final_price = {} for order in orders: member_id = webapp_user_id2member_id[order.webapp_user_id] if member_id in member_id2total_final_price: member_id2total_final_price[member_id] += order.final_price else: member_id2total_final_price[member_id] = order.final_price setting_id2total_final_price = {} for member_id in member_id2total_final_price.keys(): final_price = member_id2total_final_price[member_id] setting_id = member_id2setting_id[member_id] if setting_id in setting_id2total_final_price: setting_id2total_final_price[setting_id] += final_price else: setting_id2total_final_price[setting_id] = final_price mp_user = get_binding_weixin_mpuser(request.user) mpuser_access_token = get_mpuser_accesstoken(mp_user) for setting in settings: prize_info = decode_json_str(setting.award_prize_info) if prize_info['name'] == '_score-prize_': setting.cur_prize = '[%s]%d' % (prize_info['type'], prize_info['id']) elif prize_info['name'] == 'non-prize': setting.cur_prize = prize_info['type'] else: setting.cur_prize = '[%s]%s' % (prize_info['type'], prize_info['name']) if setting.id in setting_id2count: setting.count = setting_id2count[setting.id] else: setting.count = 0 if setting.id in setting_id2total_final_price: setting.total_final_price = setting_id2total_final_price[setting.id] else: setting.total_final_price = 0 #如果没有ticket信息则获取ticket信息 if not setting.ticket: try: if mp_user.is_certified and mp_user.is_service and mpuser_access_token.is_active: weixin_api = get_weixin_api(mpuser_access_token) qrcode_ticket = weixin_api.create_qrcode_ticket(int(setting.id), QrcodeTicket.PERMANENT) try: ticket = qrcode_ticket.ticket except: ticket = '' setting.ticket = ticket setting.save() except: pass c = RequestContext(request, { 'first_nav_name': MARKET_TOOLS_NAV, 'second_navs': export.get_second_navs(request), 'second_nav_name': SECOND_NAV_NAME, 'settings': settings, 'should_show_authorize_cover': should_show_authorize_cover, 'is_hide_weixin_option_menu': True }) return render_to_response('channel_qrcode/editor/channel_qrcode_settings.html', c)
def edit_channel_qrcode_setting(request): if request.POST: setting_id = int(request.POST["setting_id"]) name = request.POST["name"] award_prize_info = request.POST['prize_info'].strip() reply_type = int(request.POST.get("reply_type", 0)) reply_detail = request.POST.get("reply_detail", '') reply_material_id = request.POST.get("reply_material_id", 0) remark = request.POST.get("remark", '') grade_id = int(request.POST.get("grade_id", -1)) re_old_member = int(request.POST.get("re_old_member", 0)) if reply_type == 0: reply_material_id = 0 reply_detail = '' elif reply_type == 1: reply_material_id = 0 elif reply_type == 2: reply_detail = '' if setting_id: ChannelQrcodeSettings.objects.filter(owner=request.user, id=setting_id).update( name=name, award_prize_info=award_prize_info, reply_type=reply_type, reply_detail=reply_detail, reply_material_id=reply_material_id, remark=remark, grade_id=grade_id, re_old_member=re_old_member ) else: cur_setting = ChannelQrcodeSettings.objects.create( owner=request.user, name=name, award_prize_info=award_prize_info, reply_type=reply_type, reply_detail=reply_detail, reply_material_id=reply_material_id, remark=remark, grade_id=grade_id, re_old_member=re_old_member ) mp_user = get_binding_weixin_mpuser(request.user) mpuser_access_token = get_mpuser_accesstoken(mp_user) weixin_api = get_weixin_api(mpuser_access_token) try: qrcode_ticket = weixin_api.create_qrcode_ticket(int(cur_setting.id), QrcodeTicket.PERMANENT) ticket = qrcode_ticket.ticket except: ticket = '' cur_setting.ticket = ticket cur_setting.save() return HttpResponseRedirect('/market_tools/channel_qrcode/') else: member_grades = MemberGrade.get_all_grades_list(request.user_profile.webapp_id) c = RequestContext(request, { 'first_nav_name': MARKET_TOOLS_NAV, 'second_navs': export.get_second_navs(request), 'second_nav_name': SECOND_NAV_NAME, 'member_grades': member_grades }) return render_to_response('channel_qrcode/editor/edit_channel_qrcode_setting.html', c)
def get_channel_qrcode_settings(request): """ 获取渠道扫码配置列表 """ #处理搜索 query = request.GET.get('query', '').strip() if query: settings = ChannelQrcodeSettings.objects.filter(owner=request.user, name__contains=query) else: settings = ChannelQrcodeSettings.objects.filter(owner=request.user) setting_ids = [s.id for s in settings] relations = ChannelQrcodeHasMember.objects.filter( channel_qrcode_id__in=setting_ids) setting_id2count = {} member_id2setting_id = {} member_ids = [] for r in relations: member_ids.append(r.member_id) member_id2setting_id[r.member_id] = r.channel_qrcode_id if r.channel_qrcode_id in setting_id2count: setting_id2count[r.channel_qrcode_id] += 1 else: setting_id2count[r.channel_qrcode_id] = 1 webapp_users = member_model.WebAppUser.objects.filter( member_id__in=member_ids) webapp_user_id2member_id = dict([(u.id, u.member_id) for u in webapp_users]) webapp_user_ids = set(webapp_user_id2member_id.keys()) orders = mall_model.Order.by_webapp_user_id(webapp_user_ids).filter( status=mall_model.ORDER_STATUS_SUCCESSED) member_id2total_final_price = {} for order in orders: member_id = webapp_user_id2member_id[order.webapp_user_id] if member_id in member_id2total_final_price: member_id2total_final_price[member_id] += order.final_price else: member_id2total_final_price[member_id] = order.final_price setting_id2total_final_price = {} for member_id in member_id2total_final_price.keys(): final_price = member_id2total_final_price[member_id] setting_id = member_id2setting_id[member_id] if setting_id in setting_id2total_final_price: setting_id2total_final_price[setting_id] += final_price else: setting_id2total_final_price[setting_id] = final_price response = create_response(200) response.data.items = [] items = [] mp_user = get_binding_weixin_mpuser(request.user) mpuser_access_token = get_mpuser_accesstoken(mp_user) for setting in settings: cur_setting = JsonResponse() prize_info = decode_json_str(setting.award_prize_info) if prize_info['name'] == '_score-prize_': setting.cur_prize = '[%s]%d' % (prize_info['type'], prize_info['id']) elif prize_info['name'] == 'non-prize': setting.cur_prize = prize_info['type'] else: setting.cur_prize = '[%s]%s' % (prize_info['type'], prize_info['name']) if setting.id in setting_id2count: setting.count = setting_id2count[setting.id] else: setting.count = 0 if setting.id in setting_id2total_final_price: setting.total_final_price = setting_id2total_final_price[ setting.id] else: setting.total_final_price = 0 #如果没有ticket信息则获取ticket信息 if not setting.ticket: try: if mp_user.is_certified and mp_user.is_service and mpuser_access_token.is_active: weixin_api = get_weixin_api(mpuser_access_token) qrcode_ticket = weixin_api.create_qrcode_ticket( int(setting.id), QrcodeTicket.PERMANENT) try: ticket = qrcode_ticket.ticket except: ticket = '' setting.ticket = ticket setting.save() except: pass cur_setting.id = setting.id cur_setting.name = setting.name cur_setting.count = setting.count cur_setting.total_final_price = round(setting.total_final_price, 2) cur_setting.cur_prize = setting.cur_prize cur_setting.ticket = setting.ticket cur_setting.remark = setting.remark items.append(cur_setting) #进行分页 response.data.sortAttr = request.GET.get('sort_attr', 'count') if '-' in response.data.sortAttr: sorter = response.data.sortAttr[1:] is_reverse = True else: sorter = response.data.sortAttr is_reverse = False items = sorted(items, reverse=is_reverse, key=lambda b: getattr(b, sorter)) count_per_page = int(request.GET.get('count_per_page', 15)) cur_page = int(request.GET.get('page', '1')) pageinfo, items = paginator.paginate( items, cur_page, count_per_page, query_string=request.META['QUERY_STRING']) # response.data.items = items response.data.pageinfo = paginator.to_dict(pageinfo) return response.get_response()
def _send_custom_message(mpuser, send_to, custom_message): mpuser_access_token = get_mpuser_access_token_for(mpuser) wxapi = get_weixin_api(mpuser_access_token) wxapi.send_custom_msg(send_to, custom_message)
def _send_custom_message(mpuser, send_to, content): mpuser_access_token = get_mpuser_access_token_for(mpuser) wxapi = get_weixin_api(mpuser_access_token) wxapi.send_custom_msg(send_to, TextCustomMessage(content))
def _get_channel_qrcode_items(request): #处理搜索 from mall.models import * query = request.GET.get('query', '').strip() sort_attr = request.GET.get('sort_attr', '-created_at') created_at = '-created_at' if 'created_at' in sort_attr: created_at = sort_attr setting = MemberChannelQrcodeSettings.objects.filter(owner=request.manager) if setting.count() > 0: member_channel_qrcodes = MemberChannelQrcode.objects.filter( member_channel_qrcode_setting=setting[0]) if query: member_ids = [ qrcode.member_id for qrcode in member_channel_qrcodes ] query_hex = byte_to_hex(query) members = member_model.Member.objects.filter( id__in=member_ids).filter(username_hexstr__contains=query_hex) member_ids = [m.id for m in members] member_channel_qrcodes = member_channel_qrcodes.filter( member_id__in=member_ids) else: return create_response(500).get_response() member_channel_qrcode_ids = [ qrcode.id for qrcode in member_channel_qrcodes ] relations = MemberChannelQrcodeHasMember.objects.filter( member_channel_qrcode__in=member_channel_qrcode_ids) member_channel_qrcode_id2count = {} member_id2member_channel_qrcode_id = {} member_id2relation = {} member_ids = [] for r in relations: member_ids.append(r.member_id) member_id2member_channel_qrcode_id[ r.member_id] = r.member_channel_qrcode_id member_id2relation[r.member_id] = r if r.member_channel_qrcode_id in member_channel_qrcode_id2count: member_channel_qrcode_id2count[r.member_channel_qrcode_id] += 1 else: member_channel_qrcode_id2count[r.member_channel_qrcode_id] = 1 webapp_users = member_model.WebAppUser.objects.filter( member_id__in=member_ids) webapp_user_id2member_id = dict([(u.id, u.member_id) for u in webapp_users]) webapp_user_ids = set(webapp_user_id2member_id.keys()) orders = Order.by_webapp_user_id(webapp_user_ids).filter( status__in=(ORDER_STATUS_PAYED_SUCCESSED, ORDER_STATUS_PAYED_NOT_SHIP, ORDER_STATUS_PAYED_SHIPED, ORDER_STATUS_SUCCESSED)) member_id2total_final_price = {} member_id2cash_money = {} member_id2weizoom_card_money = {} for order in orders: member_id = webapp_user_id2member_id[order.webapp_user_id] if member_id2relation[member_id].is_new or member_id2relation[ member_id].created_at <= order.created_at: if member_id in member_id2total_final_price: member_id2total_final_price[ member_id] += order.final_price + order.weizoom_card_money member_id2cash_money[member_id] += order.final_price member_id2weizoom_card_money[ member_id] += order.weizoom_card_money else: member_id2total_final_price[ member_id] = order.final_price + order.weizoom_card_money member_id2cash_money[member_id] = order.final_price member_id2weizoom_card_money[ member_id] = order.weizoom_card_money member_channel_qrcode_id2total_final_price = {} member_channel_qrcode_id2cash_money = {} member_channel_qrcode_id2weizoom_card_money = {} for member_id in member_id2total_final_price.keys(): final_price = member_id2total_final_price[member_id] cash_money = member_id2cash_money[member_id] weizoom_card_money = member_id2weizoom_card_money[member_id] member_channel_qrcode_id = member_id2member_channel_qrcode_id[ member_id] if member_channel_qrcode_id in member_channel_qrcode_id2total_final_price: member_channel_qrcode_id2total_final_price[ member_channel_qrcode_id] += final_price member_channel_qrcode_id2cash_money[ member_channel_qrcode_id] += cash_money member_channel_qrcode_id2weizoom_card_money[ member_channel_qrcode_id] += weizoom_card_money else: member_channel_qrcode_id2total_final_price[ member_channel_qrcode_id] = final_price member_channel_qrcode_id2cash_money[ member_channel_qrcode_id] = cash_money member_channel_qrcode_id2weizoom_card_money[ member_channel_qrcode_id] = weizoom_card_money response = create_response(200) #response.data.items = [] items = [] mp_user = get_binding_weixin_mpuser(request.manager) mpuser_access_token = get_mpuser_accesstoken(mp_user) for qrcode in member_channel_qrcodes: current_qrcode = JsonResponse() if qrcode.id in member_channel_qrcode_id2count: qrcode.count = member_channel_qrcode_id2count[qrcode.id] else: qrcode.count = 0 if qrcode.id in member_channel_qrcode_id2total_final_price: qrcode.total_final_price = member_channel_qrcode_id2total_final_price[ qrcode.id] qrcode.cash_money = member_channel_qrcode_id2cash_money[qrcode.id] qrcode.weizoom_card_money = member_channel_qrcode_id2weizoom_card_money[ qrcode.id] else: qrcode.total_final_price = 0 qrcode.cash_money = 0 qrcode.weizoom_card_money = 0 #如果没有ticket信息则获取ticket信息 if not qrcode.ticket: try: if mp_user.is_certified and mp_user.is_service and mpuser_access_token.is_active: weixin_api = get_weixin_api(mpuser_access_token) qrcode_ticket = weixin_api.create_qrcode_ticket( int(qrcode.id), QrcodeTicket.PERMANENT) try: ticket = qrcode_ticket.ticket except: ticket = '' qrcode.ticket = ticket qrcode.save() except: pass current_qrcode.id = qrcode.id current_qrcode.name = qrcode.member.username_for_html current_qrcode.count = qrcode.count current_qrcode.total_final_price = round(qrcode.total_final_price, 2) current_qrcode.ticket = qrcode.ticket current_qrcode.created_at = qrcode.created_at.strftime( '%Y-%m-%d %H:%M:%S') items.append(current_qrcode) return items