Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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)
Exemple #5
0
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
Exemple #6
0
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
Exemple #7
0
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
Exemple #8
0
	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()
Exemple #10
0
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
Exemple #11
0
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 ''
Exemple #12
0
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
Exemple #13
0
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
Exemple #14
0
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
Exemple #15
0
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']
Exemple #16
0
	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 = ''
Exemple #17
0
    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()
Exemple #19
0
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\((\"|\'|&quot;)?)(?P<img_url>[^\)]+?\.(png|jpg))(?=(\"|\'|&quot;)?\))',
                                    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
Exemple #20
0
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
Exemple #21
0
    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...'
Exemple #22
0
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)
Exemple #23
0
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)
Exemple #24
0
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()
Exemple #25
0
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)
Exemple #26
0
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))
Exemple #27
0
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