微信公众平台开发(十二) 发送客服消息

合集下载

微信公众平台使用方法五大微信公众平台使用功能教程手册

微信公众平台使用方法五大微信公众平台使用功能教程手册

微信公众平台使用方法:五大微信公众平台使用功能介绍本片文章主要解说下微信公众平台五大功能使用,让大家在做微信推广的时候能够更加有效:1.群发功能使用2.关键词回复3.用户消息回复4.被添加自动回复5.开发者模式一:群发功能使用微信公众平台群发规则说明和群发消息的方法操作方法:登录微信公众平台()=》群发消息=》根据需要填写文字/语音/图片/视频/录音等内容后,选择对群发对象、性别、群发地区发送即可。

群发消息内容目前支持群发的内容:文字、语音、图片、视频、图文消息。

1、群发内容中需添加文字+图片+视频,可先在“素材管理”中设置图文消息,然后群发时选择“图文消息”类型即可。

2、上传至素材管理中的图片、语音可多次群发,没有有效期。

3、群发图文消息的标题上限为64个字节;4、群发内容字数上限为1200个字符、或600个汉字。

5、语音限制:最大5M,最长60秒,支持mp3、wma、wav、amr格式。

6、视频限制:最大20M,支持rm, rmvb, wmv, avi, mpg, mpeg, mp4格式。

(上传视频后为了便于粉丝通过手机查看,系统会自动进行压缩,请谅解。

)注:公众平台群发消息目前只支持中文和英文,暂时不支持其他语言,请您谅解。

群发消息的规则1、群发消息条数:公众订阅号(认证用户、非认证用户)在24小时内只能群发1条消息;公众服务号(认证用户、非认证用户),1个月(按自然月)内可发送4条群发消息。

2、通过微信公众平台已经群发的消息内容(包括群发成功、或群发后审核中的内容),不支持修改或者删除消息内容。

3、用户第1次群发时,会自动弹出签署使用协议(服务协议)提示框,签署协议以后不会再提醒、也无法查看协议,请您了解。

4、被加入黑名单的关注用户,不会接收到群发信息。

5、为了保持绿色网络环境,请您不要发布色情、暴力、赌博、血腥、政治等违反国家法律法规的信息,避免引起其他用户投诉,导致您的微信公众号无法正常使用。

微信公众平台使用方法:五大微信公众平台使用功能教程手册

微信公众平台使用方法:五大微信公众平台使用功能教程手册

微信公众平台使用方法:五大微信公众平台使用功能介绍现状很多人都在注册微信公众账号,只是对于企业微信公众账号以及个人微信公众账号在很多功能方面都不知道如何使用。

本片文章主要解说下微信公众平台五大功能使用,让大家在做微信推广的时候能够更加有效:1.群发功能使用2.关键词回复3.用户消息回复4.被添加自动回复5.开发者模式一:群发功能使用微信公众平台群发规则说明和群发消息的方法操作方法:登录微信公众平台(https://)=》群发消息=》根据需要填写文字/语音/图片/视频/录音等内容后,选择对群发对象、性别、群发地区发送即可。

群发消息内容目前支持群发的内容:文字、语音、图片、视频、图文消息。

1、群发内容中需添加文字+图片+视频,可先在“素材管理”中设置图文消息,然后群发时选择“图文消息”类型即可。

2、上传至素材管理中的图片、语音可多次群发,没有有效期。

3、群发图文消息的标题上限为64个字节;4、群发内容字数上限为1200个字符、或600个汉字。

5、语音限制:最大5M,最长60秒,支持mp3、wma、wav、amr格式。

6、视频限制:最大20M,支持rm, rmvb, wmv, avi, mpg, mpeg, mp4格式。

(上传视频后为了便于粉丝通过手机查看,系统会自动进行压缩,请谅解。

)注:公众平台群发消息目前只支持中文和英文,暂时不支持其他语言,请您谅解。

群发消息的规则1、群发消息条数:公众订阅号(认证用户、非认证用户)在24小时内只能群发1条消息;公众服务号(认证用户、非认证用户),1个月(按自然月)内可发送4条群发消息。

2、通过微信公众平台已经群发的消息内容(包括群发成功、或群发后审核中的内容),不支持修改或者删除消息内容。

3、用户第1次群发时,会自动弹出签署使用协议(服务协议)提示框,签署协议以后不会再提醒、也无法查看协议,请您了解。

4、被加入黑名单的关注用户,不会接收到群发信息。

5、为了保持绿色网络环境,请您不要发布色情、暴力、赌博、血腥、政治等违反国家法律法规的信息,避免引起其他用户投诉,导致您的微信公众号无法正常使用。

微信公众平台的功能

微信公众平台的功能

微信公众平台的功能微信公众平台作为一个社交媒体平台,提供了多种功能,以满足用户的不同需求。

以下是微信公众平台的一些主要功能。

1. 自定义菜单:公众号可以自定义设置菜单,方便用户浏览和获取所需信息。

通过自定义菜单,用户可以轻松了解公众号的主要内容和服务。

2. 消息群发:公众号可以发送消息给关注者,包括文字、图片、链接等。

通过群发功能,公众号可以向大量用户传达信息、宣传产品或服务。

3. 推送通知:公众号可以向关注者发送消息提醒。

这可以是新文章、活动通知、特殊促销等。

关注者可以通过接收通知及时了解公众号的最新动态。

4. 图文素材管理:公众号可以上传和管理图文素材,方便制作推文或群发消息。

用户可以使用富媒体内容提高信息的吸引力和可阅读性。

5. 数据统计:公众号可以查看用户的阅读和行为数据,包括阅读量、转发量、活跃用户等。

这些数据可以帮助公众号了解目标用户的兴趣和行为,进而优化内容和营销策略。

6. 小程序支持:公众号可以与小程序进行关联,提供更多功能和服务。

小程序可以为用户提供更多交互和购物体验,以及更多线下服务。

7. 会员卡:公众号可以提供会员卡服务,用户可以通过公众号申请会员卡,获取积分、优惠券和专属权益。

8. 在线支付:公众号可以集成在线支付功能,用户可以通过公众号完成购物和支付。

这方便了用户的购物体验,也提供了更多营销手段。

9. 客服接入:公众号可以接入客服功能,用户可以通过公众号发送消息与客服人员进行互动。

这提供了便捷的客服渠道,增加用户的满意度和忠诚度。

10. 第三方接入:微信公众平台还提供了第三方开放接口,允许开发者开发和集成更多功能。

这使得微信公众平台成为了一个完善的生态系统,提供了更多的服务和工具。

总结起来,微信公众平台的功能丰富多样,包括自定义菜单、消息群发、推送通知、图文素材管理、数据统计、小程序支持、会员卡、在线支付、客服接入和第三方接入等。

这些功能帮助公众号更好地与用户互动,提供优质的服务和内容。

微信公众平台使用方法:五大微信公众平台使用功能教程手册8P

微信公众平台使用方法:五大微信公众平台使用功能教程手册8P
手机微信中效果:
五:开发者模式,微信公众平台如何成为开发者?
登录微信公众平台后,点击高级功能=》开发模式=》成为开发者=》填写接口配置信息,提交后等待我司工作人员的审核。
群发成功,而粉丝未收到群发消息的说明
在微信公众平台消息群发成功后,而粉丝未收到群发消息,可能导致的原因:
1、通过微信公众平台群发消息时,对群发对象、性别、群发地区进行了选择,不在选择内的粉丝则无法接收消息。
2、被加入黑名单的粉丝,不会接收到群发信息,建议进入微信公众平台=》用户管理=》黑名单,查看是否有进行设置。
已发送的群发消息查看方法:登录微信公众平台=》群发消息=》已发送。
二:关键词回复,公众平台如何设置关键词回复
关键词自动回复功能的介绍
在微信公众平台设置关键词自动回复,可以通过添加规则(规则名最多为60字数),订阅用户发送的消息内如果有您设置的关键字(关键字不超过30字数,可选择是否全匹配如设置了全匹配则必须关键字全部匹配才生效),即可把您设置在此规则名中回复的内容自动发送给订阅用户。
现状很多人都在注册微信公众账号,只是对于企业微信公众账号以及个人微信公众账号在很多功能方面都不知道如何使用。
本片文章主要解说下微信公众平台五大功能使用,让大家在做微信推广的时候能够更加有效:
1.群发功能使用
2.关键词回复
3.用户消息回复
4.被添加自动回复
5.开发者模式
一:群发功能使用
群发消息内容
目前支持群发的内容:文字、语音、图片、视频、图文消息。
1、群发内容中需添加文字+图片+视频,可先在“素材管理”中设置图文消息,然后群发时选择“图文消息”类型即可。
2、上传至素材管理中的图片、语音可多次群发,没有有效期。

微信公众平台建立及日常管理

微信公众平台建立及日常管理

要实现订阅号的高级功能,需要借助外面的技术公司支持,通过与外面技术公司的 合作实现在线查询,预订,支付以及一些微活动的开展(高级功能)
技 术 支 持 后
在线预订
微信公众平台技术提升
餐饮商家做微信公众号要实现的功能
查询店面环境,分店信 息,服务项目(特色菜 品)等功能
餐位预订、包房预订, 送餐服务预订,会员卡 消费积分 通过认证就可以获得 建议商家都可以做 到这些功能
总结
根据以上特点可以看出主要区别:
服务号不用认证可免费申请自定义菜 单,而订阅号需要认证
服务号每月只能群发一条信息,订阅 号可以每天群发一条消息 服务号群发的消息有消息提醒,订阅 号群发的消息没有,并直接放入订阅号 文件夹当中 服务号可以申请微信支付,而订阅号 不能
微信公众平台基础建设
1.
微信公众平台基础建设
7. 数据统计功能可以查看用户增长、用户属性、图文群发、消息发送等多个维 度的数据。其中用户属性、图文群发、消息发送三个维度的数据是具备一定 的参考价值。
微信公众平台基础建设
8. 素材管理其实就是将你所需要群发出去的内容进行管理,可以上传图片、 视频、语音,也可以创建单图文和多图文。
微信公众平台基础建设
11. 高级功能的开发模式一旦接入了自己开发的接口,或者是第三方接口平台的接 口,那么编辑模式的自动回复功能就无法使用。通过开发模式可以实现微网站、 微商城、大转盘、微会员卡、优惠券等多种功能,当然也可以实现之前官方编 辑模式的自动回复功能。
微信公众平台基础建设
12. 微信公众帐号的类型如果选择了服务号,则可使用特有的自定义菜单功能。自 定义菜单功能需要在高级功能里面的开发模式进行申请,通过申请之后可使用 微库这种第三方接口平台进行菜单的添加,修功能只能通过订阅号推送获取 消息,一旦不推送,无法获取消息

小程序客服使用教程

小程序客服使用教程

小程序客服
一、步骤
1、第一步
开发——开发设置——消息推送——启用——管理员扫码
第二步绑定客服人员
使用网页版与移动端小程序客服工具前,小程序管理员需在小程序后台完成客服人员的绑定。

目前小程序支持绑定不多于100个客服人员。

二、客服工具
1、移动端客服小助手
已被绑定的小程序客服人员可微信搜索“客服小助手”或扫码登录客服小助手小程序,并选择对应的小程序帐号,登录后即可看到与小程序对话的用户,可选择接入对话。

切换客服状态
点击在线状态,可以选择在线状态、离开状态:选择在线状态后,即使退出客服小程序,仍可在“服务通知”中接收到用户咨询的消息提醒;选择离开状态后,将无法收到客服消息与消息提醒。

接收与发送消息
首次打开小程序后,会自动接入客服消息,后续有新的客服消息,可点击顶部接
入栏进行接入;已经接入的会话,客服人员可以在48小时内和用户进行对话,目前支持发送文本、图片类型的消息。

2、PC端微信公众平台网页客服
已被绑定的小程序客服人员可扫码登录微信公众平台网页版客服工具,并选择对应的小程序帐号,登录后即可看到与小程序对话的用户,可选择接入对话。

切换客服状态
点击在线状态,可以选择在线状态、离开状态或退出登录
接收消息
手动接入:客服人员上线后,点击“待接入”,即可在“待接入”列表中,手动接入待回复的对话
自动接入:当待接入的对话太多时,可以在设置/接入设置中,开启自动接入重新接入:退出登录,或对话超过半小时,需要重新接入,激活对话
发送消息
已经接入的会话,客服人员可以在48小时内和用户进行对话,目前支持发送文本、图片类型的消息。

微信公众平台与小程序开发 第七讲 发送客服消息

微信公众平台与小程序开发 第七讲 发送客服消息

文本格式的客服消息JSON数据包参数含义表
参数名 Touser Msgtype Text
含义 接收者(关注者的openID) 消息类型(text) 消息内容(object)
(二)图片消息
图片格式的客服消息JSON数据包参数含义表
参数名 Touser
Msgtype Media_id
含义 接收者(关注者的openID)
保存access_token时,至少预留512个字符的空间。
此外,由于每天有50万条客服消息的限制,且必须在用户行为的48小时内 才能发送客服消息,因此对于客服消息业务量较大的公众号,可靠的作法是记录 用户的每一次交互行为,以便在时间上可以把握,避免回复一些交互已经超时的 用户,浪费消息流量。
2
(一)文本消息
STEP2
调用客服消息接口,利用 access_token,使用post提 交的方式,将消息内容发送 给指定的用户。
• 接口地址如下 https:///cgibin/message/custom/send?access_ token={$accesstoken}
7.1客服消息的原理简介
卡券格式的客服消息JSON数据包参数含义表
参数名 Touser Msgtype card_id
含义 接收者(关注者的openID) 消息类型(msgmenu) 卡券号
(八)小卡片消息
小卡片格式的客服消息JSON数据包参数含义表
参数名 Touser Msgtype title Appid Pagepath
• 接口地址如下: https:///cgibin/token?grant_type=client_crede ntial&appid={$xxx}&secret={$yyy}

微信公众平台后台操作手册

微信公众平台后台操作手册

微信公众平台后台操作手册目录1、群发消息 (1)1)图文信息 (1)2)文字信息 (3)3)图片信息 (4)4)语音信息 (5)5)视频信息 (6)2、添加功能插件 (7)多客服: (7)摇一摇周边: (7)3、微信支付 (9)申请条件/资格 (9)4、流量主 (10)5、广告主 (11)6、公众号设置 (12)7、微信认证 (13)微信认证简单介绍 (13)微信认证需要准备的资料: (13)8、安全中心 (14)管理员微信号: (14)违规记录: (15)9、开发者中心 (15)1、群发消息订阅号每天可以发布一条消息,服务号每月可群发4条消息群发消息分为五种模式:1)图文信息一般情况下我们看到的图文信息有两种展示模式:单图文模式、多图文模式单图文模式,顾名思义就是单条图文信息的模式,展示为:多图文模式,也就是多条图文信息同时展示的模式,最多可以发布(1+7条),展示的样式如图:如何群发?登陆微信公众平台之后,点击:群发功能--新建图文消息--输入标题、摘要、正文,输入正文,带上原文链接【注】1)认证服务号在正文部分可以带上超级链接2)认证订阅号不可以在正文部分可以带上超级链接3)未认证服务号不可以在正文部分可以带上超级链接4)未认证订阅号不可以在正文部分可以带上超级链接【注】图文消息的发布可以:带上视频、图片、语音、音乐、发起投票、引用已发布的信息等2)文字信息文本内容输入600字以内的信息3)图片信息只能上传一张图片信息可从图片库选择,也可以从本地上传,大小不能超过5M,且只能上传一张图片4)语音信息需先上传到素材库,且只能上传1条格式支持mp3、wma、wav、amr,文件大小不超过30M,语音时长不超过30分钟5)视频信息需先上传到素材库,之后从素材库中进行选择,只能上传一条大小: 不超过20M, 格式: rm, rmvb, wmv, avi, mpg, mpeg, mp4综合上述,可以看出图文消息的模式是非常强大的,建议大家在发布时选择图文消息2、添加功能插件以下为认证服务号可以添加的功能插件多客服:申请条件:●必须开通微信认证功能介绍:●多客服为公众号提供客服功能,支持多人同时为一个公众号提供客服服务。

微信公众平台开发教程

微信公众平台开发教程

微信公众平台开发教程一、了解公众平台公众平台是提供的一种服务,它允许企业、组织或个人在平台上创建自己的,通过发布消息、互动等方式与用户进行沟通。

本文将介绍公众平台开发的基本步骤和注意事项。

二、创建1、打开公众平台官网,点击右上角的“立即注册”。

2、在注册页面中,选择的类型,如订阅号、服务号或企业号。

不同类型的有不同的功能和限制,需要根据自己的需求进行选择。

3、填写注册信息,包括账号名称、头像、介绍等。

这些信息将用于创建,请确保准确无误。

4、提交注册信息后,公众平台将审核你的申请。

审核通过后,即可使用进行开发和运营。

三、开发1、登录公众平台,选择开发选项卡。

2、在开发页面中,你可以看到公众平台提供的开发文档和接口。

这些文档和接口是开发的基础。

3、根据自己的需求,进行相应的开发工作。

例如,你可以编写自定义的菜单、回复用户的消息、实现自动回复等功能。

4、在开发过程中,你可以使用公众平台的开发工具进行调试和测试。

开发工具提供了一个模拟器,可以帮助你测试的基本功能。

四、发布1、完成开发后,你可以在公众平台上发布你的。

登录公众平台,选择发布选项卡。

2、在发布页面中,你可以上传图片、编写文章等内容。

根据你的需求,设置的可见性、推送频率等选项。

3、点击发布后,你的将出现在的列表中,用户可以通过搜索或扫描二维码来你的。

五、注意事项1、开发需要一定的编程知识和经验。

如果你不具备相关技能,可以参考公众平台的开发文档或寻求专业开发人员的帮助。

2、开发需要遵守公众平台的开发规范和要求。

在开发过程中,请确保你的不会侵犯他人的权益或传播不良信息。

3、开发需要投入一定的时间和精力来进行开发和测试。

为了提高的品质和用户体验,需要在发布前进行充分的测试和优化。

微信公众平台开发教程一、了解公众平台公众平台是提供的一种服务,它允许企业、组织或个人在平台上创建自己的,通过发布消息、互动等方式与用户进行沟通。

本文将介绍公众平台开发的基本步骤和注意事项。

基于微信公众平台的客户服务系统设计

基于微信公众平台的客户服务系统设计

基于微信公众平台的客户服务系统设计随着社交媒体的普及和微信的飞速发展,微信公众平台已成为企业建立品牌形象、进行客户互动的重要渠道之一。

微信公众平台提供的客户服务功能,也为企业提供了更加高效、快捷的客户服务方式。

本文将着重介绍基于微信公众平台的客户服务系统设计。

一、客户服务系统的基本功能在微信公众平台上,客户服务系统包含了以下几个核心功能:自动回复、客服管理、会话记录、客户分组、客户评价。

这些功能对于企业与客户间的沟通十分必要,能够有效提升客户服务质量和效率。

首先,自动回复功能能够在24小时内及时回复用户的消息。

当用户向企业公众号发送消息时,系统会根据关键词触发自动回复,即可轻松回应用户的提问。

其次,客服管理功能允许企业设定在线客服工作时间和客服人员,确保客户服务质量。

会话记录功能能够在与客户交流过程中保留完整的聊天记录,方便客户客服人员随时查看。

客户分组功能则可帮助企业根据用户特征和需求将客户划分为不同分组,更加针对性地进行客户服务。

最后,客户评价功能能够让用户对客服人员的服务进行评价,及时发现和排除带有失误的服务环节。

二、完善客户服务系统的关键建立完备的客户服务系统需要企业综合运用多种技术手段。

在微信公众平台上,可通过配置自动回复规则、搭建智能客服系统、使用聊天机器人等方式改进客户服务体验。

1、自动回复规则的制定制定适合企业的自动回复规则是实现客户服务自动化的第一步。

自动回复规则的制定应基于客户常见的问题和需求,针对客户提问的关键词,设定不同的自动回复内容,为客户提供快速、规范的解答。

同时,应避免使用大量模板化语句,营造更加个性化、亲近的客户服务场景。

2、智能客服系统的搭建智能客服系统能够为客户提供快速、个性化的服务体验。

该系统基于自然语言处理技术,能够识别客户提问、语音、文字等复杂媒体信息,进而为客户提供快速、智能的答复。

搭建智能客服系统需要完善的技术框架支持,同时也需要后期对系统进行持续优化,提升系统的语义理解能力。

微信第三方平台设置微客服

微信第三方平台设置微客服

微客服系统接入1、使用的公众账号需符合的条件必须具备两个条件: 1、公众号为服务号 2、公众号必须经过微信认证2、入口对接Step1:登陆微盟平台选择任意公众账号,系统会自动弹出如下界面:Step2:点击验证,进入选择公众号所属类型,进行保存。

选择服务号的商户会出现以下两种情况:a、未进行过授权设置的商家,填写对应的应用 id 及应用秘钥,保存即可,系统会自动绑定系统。

b、进行过授权设置的商家,直接保存系统自动绑定系统。

备注:此授权设置就是原先自定义菜单内的授权设置,应用 id 及应用秘钥完全相同。

3、创建工号每位商家限有3个坐席登录微盟平台,选择左侧菜单栏【客服工号管理】--【添加客服】,进入创建工号流程。

4、进入系统Step1::点击左侧菜单栏【客服工号管理】--【客服管理平台地址】链接 或直接浏览器打开该链接即可进入登陆界面。

Step2:登陆界面输入账号、密码即可登陆。

登陆账号为:工号+@数字,数字为商家 id,请勿遗漏。

注 1:如果商家未进行验证或不属于认证服务号,系统会自动提醒:账号密码不正确。

注 2:成功登陆后,商家如果开启“默认无匹配回复”,请关闭,避免与客服系统发生冲突;随后任意用户发送至公众号的内容,商家均可在客服系统收到。

注 3:成功登陆的商家如是首次登陆,需耐心等待一段时长,系统需逐步更新公众账号的粉丝,首次更新成功以后,后期登陆系统只会自动同步最新粉丝,同步迅速。

14.2、使用指南微盟产品()使用指南1、系统使用须知:所有可发起会话的客户,只针对 24 小时内联系过公众号的客户。

2、聊天窗口:2.1 “等待接入”与“工号排名”按钮无客服接待的客户,则进入等待接入列表,点击可进入详细列表,可批量接入或双击客户接入,也可手动删除。

如图:(注:等待接入的客户系统只保留 24 小时,超出时长未接入系统自动移除)点击【第 1 名】,可查询当天对话数量及其他客服情况,系统自动排名。

2.2 “正在联系人”与“最近联系人”切换正在联系人为当天聊天用户,当天凌晨 12:00 系统有一次自动清除列表,转为最近联系人;最近联系人为 24 小时内联系过商家的客户,超出 24 小时的客户系统自动删除,可在消息记录或微信用户内搜索微信名称查询。

微信公众平台与小程序开发 第九讲 发送模板消息

微信公众平台与小程序开发 第九讲 发送模板消息

3
1、新建mouldMsg.php 文件,并编写程序,包 含引入dataOpt.php文件, 然后定义一个模板消息 mouldMsg类,利用构造 函数,初始化好类的相 关属性
2、定义mouldMsg类的 消息发送方法sendMsg(), 在方法中,通过调用 dataOpt对象的 accessToken()方法获取 最新的access_token,并 调用模板消息发送接口, 使用dataOpt对象的 postData()方法提交模板 消息的JSON数据包
3、由于mouldMsg类中 模板消息的接收用户是 通过openID指定的,而 openID是 showUserList.php文件中 链接通过URL参数传递过 来的。因此需要将这个 URL参数值接收下来,然 后初始化一个mouldMsg 对象,通过对象调用相 应的成员方法,将模板 消息发送给该参数值指 定的openID。
4、点击其中一个 用户openID后面 的“发送模板消息 ” ,可以看到“发 送成功”的提示内 容
9.3 发送模板消息的实现
谢谢观看
3
9.2 消息模板的准备
3
实验9 发送消息模板
1
全局操作类dataOpt的逻辑流程:
查询最新access_tokent
F 重新拉取 保存入库
T 存在
T 过期 F
赋值使用
9.3 发送模板消息的实现
• 新建dataOpt.php文 件,定义dataOpt类, 定义好类的属性,并 通过构造函数进行初 始化
9.1 实验知识概述
2
实验9 发送消息模板
1
公众号后台允许添加的消息模板是根据主营 行业来匹配的,所以要注意选择符合自己实际 情况的主营行业,微信公众平台允许每个月修 改一次主营行业。

微信公众号后台简单操作

微信公众号后台简单操作

一.群发消息场景:主动推送消息给用户注意:1.订阅号一天一条消息2.服务号一个月4条消息3.内容可以是图文消息、文字、图片、语音、视屏4.要使用群发要开启微信保护二.自动回复自动回复分为3类(只有启用后生效):1.被添加自动回复场景:用户关注公众号后触发注意:回复内容只能是文字、图片(素材库)、语音(素材库)、视频(素材库)。

不能发送图文要想发送图文只有开发者模式2.消息自动回复场景:当用户在公众号里面发送消息时,触发注意:回复内容只能是文字、图片(素材库)、语音(素材库)、视频(素材库)。

不能发送图文要想发送图文只有开发者模式3.关键词自动回复场景:当用户输入信息中有包含关键字时触发注意:回复内容可以是文字、图片(素材库)、语音(素材库)、视频(素材库)、图文(素材库)三.自定义菜单1.菜单类型a).一级菜单注意:1.最多有3个一级菜单b).二级菜单注意:1.一个一级菜单下面最多有5个二级菜单2.最多有15个二级菜单2.菜单维护维护内容:1.菜单名称:菜单的显示名称2.菜单内容:a)发送消息(点击按钮的时候发送消息)b)跳转网页(点击按钮的时候跳转到所填写的图文消息的正文或者网页)注意:新增或者修改了自定义菜单,保存并发布之后并不是立即生效,有延迟一半是几个小时,要想马上看到修增或者修改后的效果只需要重新关注一下。

四.消息管理管理用户在公众号里面发送的消息记录,并可以给用户回复消息注意:只能回复在48h内互动过的用户五.用户管理管理所有关注的用户六.素材管理维护图文、图片、语音和视频七.公众号设置注意:1.功能设置->功能设置->业务域名:屏蔽微信浏览器中input输入时防诈骗提示2.功能设置->功能设置->js安全域名:只有在这个域名下才能调用微信jsapi3.功能设置->功能设置->图片水印:微信公众号中的图片添加水印八.开发者中心1.可以查看该公众号所有的权限2.启用开发者模式(可以自由的去飞翔。

微信公众号客服接口给指定用户openid发送消息

微信公众号客服接口给指定用户openid发送消息

微信公众号客服接口给指定用户openid发送消息微信开发文档:客服接口-发消息接口调用请求说明http请求方式: POSThttps:///cgi-bin/message/custom/send?access_token=ACCESS_TOKEN 各消息类型所需的JSON数据包如下:发送文本消息{"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}创建封装实体类:package com.zenithink.spp.cms.entity;import java.util.Map;/*** 客户接口消息发送实体** @author* @date 2018-2-6 11:00:30*/public class TestMessage {//openidprivate String touser;//消息类型private String msgtype;//消息内容private Map<String,Object> text ;public String getT ouser() {return touser;}public void setTouser(String touser) { this.touser = touser;}public String getMsgtype() {return msgtype;}public void setMsgtype(String msgtype) { this.msgtype = msgtype;}public Map<String, Object> getT ext() { return text;}public void setText(Map<String, Object> text) {this.text = text;}}后台controller代码:/*** 状态修改为测试中** @param id 要测试的ID* @param request* @return 内容展示页面*/@ResponseBody@RequestMapping(value = "/service/test", method = RequestMethod.PUT)public ResponseVO ContentTest(Long id, HttpServletRequest request) {ResponseVO vo=new ResponseVO();if(id!=null){//根据接收的ID查询相应的内容实体WeixinContent weixinContent = weixinContentService.selectById(id);//判断查询到的对象的合法性if (weixinContent!=null&&(weixinContent.getState() == 1||weixinContent.getState()==4)) {//修改内容实体状态为测试中weixinContent.setState(2);//将内容实体进行保存操作weixinContentService.updateById(weixinContent);//获得内容静态页面的访问路径String templatesUrl= weixinContent.getTemplatesUrl();//拼接访问的完整路径String saveUrl =fileuploadPrefix + "/" + templatesUrl;//获得内容信息标题String title = weixinContent.getTitle();//拼接发送的消息内容String content="你好!标题("+title+")<a href='"+saveUrl+"'>点我测试</a>";//创建微信用户查询条件Wrapper<WeixinUser> wrapper=new EntityWrapper<>();wrapper.where("tagid_list={0}","[101]");//获得满足条件的集合List<WeixinUser> weixinUsers = weixinUserService.selectList(wrapper);//遍历用户集合调用业务层进行消息发送for (WeixinUser weixinUser : weixinUsers) {String openid = weixinUser.getOpenid();//调用业务层进行发送消息wxContentTextService.contentTest(openid,content);}vo.setSuccess(true);} else {//不是未测试状态所以不能进行状态修改vo.setSuccess(false);}}return vo;}后台service代码:/*** <p>* 菜单信息服务实现类* </p>** @author* @date 2018/01/15*/@Servicepublic class WxContentTextService {private static Logger log = LoggerFactory.getLogger(WxContentTextService.class);/*** 客服接口给用户发送消息接口*/public static String content_openid="https:///cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";@Autowiredprivate TokenFeignService tokenFeignService;@Autowiredprivate WeixinPortalService weixinPortalService;/**** @param openid openid* @param saveUrl 静态页面访问地址* @return*/public ResponseVO contentTest(String openid,String saveUrl){//获得令牌String accessToken = tokenFeignService.getToken();//创建返回实体对象ResponseVO vo = new ResponseVO();//替换tokenString url=content_openid.replace("ACCESS_TOKEN", accessToken);TestMessage testMessage=new TestMessage();//设置消息的类型testMessage.setMsgtype("text");//设置要发送的openid集合testMessage.setTouser(openid);//创建集合Map<String,Object> map=new HashMap<>();//设置发送内容map.put("content",saveUrl);testMessage.setText(map);//将测试消息对象转成jsonString jsonTestMessage = JSONObject.toJSONString(testMessage);//调用接口进行发送JSONObject jsonObject = httpRequest(url, "POST", jsonTestMessage);log.error("分组群发消息失败errcode:{" + jsonObject.getInteger("errcode")+"} " +"errmsg:{"+jsonObject.getString("errmsg")+"} ");Integer errcode = jsonObject.getInteger("errcode");String errorCodeT ext = ErrorCodeText.errorMsg(errcode);if (errcode == 0){vo.setSuccess(true);}else{vo.setSuccess(false);}vo.setCode(errcode);vo.setText(errorCodeText);return vo;}}获取token的业务层:import flix.feign.FeignClient;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;/*** 进行请求分发**/@FeignClient(value = "weixin-2")public interface T okenFeignService {/*** 进行token请求* @param* @return*/@RequestMapping(value = "/getToken",method = RequestMethod.GET)String getToken();}微信请求工具类utilspublic class WeixinHttpUtil {private static Logger log = LoggerFactory.getLogger(WeixinHttpUtil.class);/*** 描述: 发起https请求并获取结果* @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod)){httpUrlConn.connect();}// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();jsonObject = JSONObject.parseObject(buffer.toString());} catch (ConnectException ce) {log.error("Weixin server connection timed out.");} catch (Exception e) {log.error("https request error:{}", e);}return jsonObject; }}。

公众号消息会话开发

公众号消息会话开发

公众号消息会话开发⽬录1. 概要博客使⽤Word发博,发布后,排版会出现很多问题,敬请谅解。

可加群获取原始⽂档。

公众号是以微信⽤户的⼀个联系⼈形式存在的,消息会话是公众号与⽤户交互的基础。

本篇主要围绕消息会话进⾏讲述。

1. 关于Magicodes.WeChat.SDK更多介绍,请关注后续博客。

1. 群发消息公众号可以以⼀定频次(订阅号为每天1次,服务号为每⽉4次),向⽤户群发消息,包括⽂字消息、图⽂消息、图⽚、视频、语⾳等。

1. 概要图1. 发送流程1. 图⽂消息群发流程1. ⽂本群发流程1. 其他类型群发流程1. 注意事项对于认证订阅号,群发接⼝每天可成功调⽤1次,此次群发可选择发送给全部⽤户或某个分组;对于认证服务号虽然开发者使⽤⾼级群发接⼝的每⽇调⽤限制为100次,但是⽤户每⽉只能接收4条,⽆论在公众平台⽹站上,还是使⽤接⼝群发,⽤户每⽉只能接收4条群发消息,多于4条的群发将对该⽤户发送失败;具备微信⽀付权限的公众号,在使⽤群发接⼝上传、群发图⽂消息类型时,可使⽤<a>标签加⼊外链;4、开发者可以使⽤预览接⼝校对消息样式和排版,通过预览接⼝可发送编辑好的消息给指定⽤户校验效果。

1. 开发实践1. 开发思路1. 框架设计为了简化接⼝调⽤,Magicodes.WeChat.SDK对此进⾏了封装。

⽬前框架仅封装了多图⽂的接⼝调⽤,其他封装类似:1. 多图⽂接⼝注意:多图⽂群发时,图⽚地址必须为上传图⽚素材时获取到的微信服务器地址。

1. Demousing System;using Microsoft.VisualStudio.TestTools.UnitTesting;using Magicodes.WeChat.SDK.Apis.Material;using System.Linq;namespace Magicodes.WeChat.SDK.Test.ApiTests{[TestClass]public class NewsApiTest : ApiTestBase{NewsApi api = new NewsApi();public NewsApiTest(){api.SetKey(1);}[TestMethod]public void NewsApiTest_GetById(){var testNews = db.Site_News.FirstOrDefault();if (testNews == null){Assert.Fail("没有数据!");}var result = api.Get(testNews.MediaId);if (!result.IsSuccess()){Assert.Fail("获取多图⽂信息失败,返回结果如下:" + result.DetailResult); }}[TestMethod]public void NewsApiTest_Get(){var result = api.Get();if (!result.IsSuccess()){Assert.Fail("获取多图⽂信息失败,返回结果如下:" + result.DetailResult); }}[TestMethod]public void NewsApiTest_Post(){//不能使⽤第三⽅的图⽚var model = new NewsPostModel() {Articles=new System.Collections.Generic.List<NewsPostModel.ArticleInfo>() {new NewsPostModel.ArticleInfo(){Author="liwq",ContentSourceUrl ="/codelove/p/5306395.html", Digest="每周⼀⼩更,每⽉⼀⼤更。

微信公众号开发之发送模板消息

微信公众号开发之发送模板消息

微信公众号开发之发送模板消息订阅专栏在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。

今天我们就来说说吧!1、申请模板消息⾸先我们应该知道,模板消息是需要申请的。

这个申请就其本⾝来说是很easy的(我前⼀天晚上申请的,显⽰需要2--3个⼯作⽇,结果第⼆天早上就发现已经开通了,所以说腾讯官⽅还是⽐较给⼒的哈)。

但是我们在申请时还是有⼀些东西要注意,这个在官⽅的⽂档有⾮常详细的说明。

这个我建议你好好看看。

选择⾏业的时候可要谨慎些,因为这个⼀个⽉只可以修改⼀次。

那么,我们来看看在哪⾥申请?这⾥我已经申请过了。

申请之后就耐⼼等待,审核通过之后再功能这⼀栏⾥就会出现模板消息的菜单。

你可以看看我上⾯的截图,就在第三项。

2、添加模板消息审核通过之后,我们就可以添加模板消息,进⾏开发了。

这个很简单:我们点击模板消息进⼊后,直接在模板库中选择你需要的消息模板添加就可以了,添加之后就会在我的模板中。

会有⼀个模板id,这个模板id在我们发送消息的时候会⽤到。

3、消息发送功能开发接下来我们就看看如何发送模板消息:我呢,也来说说我的实现吧。

为了更⽅便,我会直接将相关代码贴出来。

⽂档中我们可以看到接⼝地址如下:关于相关参数,我直接就将官⽅⽂档贴来了(⽂档写的很清楚):POST数据⽰例如下:{"touser":"OPENID","template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY","url":"/download","miniprogram":{"appid":"xiaochengxuappid12345","pagepath":"index?foo=bar"},"data":{"first": {"value":"恭喜你购买成功!","color":"#173177"},"keyword1":{"value":"巧克⼒","color":"#173177"},"keyword2": {"value":"39.8元","color":"#173177"},"keyword3": {"value":"2014年9⽉22⽇","color":"#173177"},"remark":{"value":"欢迎再次购买!","color":"#173177"}}}参数说明参数是否必填说明touser 是接收者openidtemplate_id 是模板IDurl 否模板跳转链接(海外帐号没有跳转能⼒)miniprogram 否跳⼩程序所需数据,不需跳⼩程序可不⽤传该数据appid 是所需跳转到的⼩程序appid(该⼩程序appid必须与发模板消息的公众号是绑定关联关系,暂不⽀持⼩游戏)pagepath 否所需跳转到⼩程序的具体页⾯路径,⽀持带参数,(⽰例index?foo=bar),暂不⽀持⼩游戏data 是模板数据color 否模板内容字体颜⾊,不填默认为⿊⾊注:url和miniprogram都是⾮必填字段,若都不传则模板⽆跳转;若都传,会优先跳转⾄⼩程序。

微信公众平台开发教程Java版(三)消息接收和发送

微信公众平台开发教程Java版(三)消息接收和发送

微信公众平台开发教程Java版(三)消息接收和发送前⾯两章已经介绍了如何接⼊微信公众平台,这⼀章说说消息的接收和发送可以先了解公众平台的消息api接⼝(接收消息,发送消息)接收消息当普通微信⽤户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

接收的消息类型有6种,分别为:可以根据官⽅的api提供的字段建⽴对应的实体类如:⽂本消息有很多属性是所有消息类型都需要的,可以把这些信息提取出来建⽴⼀个基类Java代码1. package com.ifp.weixin.entity.Message.req;2.3. /**4. * 消息基类(⽤户 -> 公众帐号)5. *6. */7. public class BaseMessage {8. /**9. * 开发者微信号10. */11. private String ToUserName;12. /**13. * 发送⽅帐号(⼀个OpenID)14. */15. private String FromUserName;16. /**17. * 消息创建时间(整型)18. */19. private long CreateTime;20.21. /**22. * 消息类型 text、image、location、link23. */24. private String MsgType;25.26. /**27. * 消息id,64位整型28. */29. private long MsgId;30.31. public String getToUserName() {32. return ToUserName;33. }34.35. public void setToUserName(String toUserName) {36. ToUserName = toUserName;37. }38.39. public String getFromUserName() {40. return FromUserName;41. }42.43. public void setFromUserName(String fromUserName) {44. FromUserName = fromUserName;45. }46.47. public long getCreateTime() {48. return CreateTime;49. }50.51. public void setCreateTime(long createTime) {52. CreateTime = createTime;53. }54.55. public String getMsgType() {56. return MsgType;57. }58.59. public void setMsgType(String msgType) {60. MsgType = msgType;61. }62.63. public long getMsgId() {64. return MsgId;65. }66.67. public void setMsgId(long msgId) {68. MsgId = msgId;69. }70.71. }接收的⽂本消息Java代码1. package com.ifp.weixin.entity.Message.req;2.3. /**4. * ⽂本消息5. */6. public class TextMessage extends BaseMessage {7. /**8. * 回复的消息内容9. */10. private String Content;11.12. public String getContent() {13. return Content;14. }15.16. public void setContent(String content) {17. Content = content;18. }19. }接收的图⽚消息Java代码1. package com.ifp.weixin.entity.Message.req;2.3. public class ImageMessage extends BaseMessage{4.5. private String picUrl;6.7. public String getPicUrl() {8. return picUrl;9. }10.11. public void setPicUrl(String picUrl) {12. this.picUrl = picUrl;13. }14.15. }接收的链接消息Java代码1. package com.ifp.weixin.entity.Message.req;2.3.4. public class LinkMessage extends BaseMessage {5. /**6. * 消息标题7. */8. private String Title;9. /**10. * 消息描述11. */12. private String Description;13. /**14. * 消息链接15. */16. private String Url;17.18. public String getTitle() {19. return Title;20. }21.22. public void setTitle(String title) {23. Title = title;24. }25.26. public String getDescription() {27. return Description;28. }29.30. public void setDescription(String description) {31. Description = description;32. }33.34. public String getUrl() {35. return Url;36. }37.38. public void setUrl(String url) {39. Url = url;40. }41.42. }接收的语⾳消息Java代码1. package com.ifp.weixin.entity.Message.req;2.3. /**4. * 语⾳消息5. *6. * @author Caspar7. *8. */9. public class VoiceMessage extends BaseMessage {10. /**11. * 媒体ID12. */13. private String MediaId;14. /**15. * 语⾳格式16. */17. private String Format;18.19. public String getMediaId() {20. return MediaId;21. }22.23. public void setMediaId(String mediaId) {24. MediaId = mediaId;25. }26.27. public String getFormat() {28. return Format;29. }30.31. public void setFormat(String format) {32. Format = format;33. }34.35. }接收的地理位置消息Java代码1. package com.ifp.weixin.entity.Message.req;2.3.4. /**5. * 位置消息6. *7. * @author caspar8. *9. */10. public class LocationMessage extends BaseMessage {11. /**12. * 地理位置维度13. */14. private String Location_X;15. /**16. * 地理位置经度17. */18. private String Location_Y;19.20. /**21. * 地图缩放⼤⼩22. */23. private String Scale;24.25. /**26. * 地理位置信息27. */28. private String Label;29.30. public String getLocation_X() {31. return Location_X;32. }33.34. public void setLocation_X(String location_X) {35. Location_X = location_X;36. }37.38. public String getLocation_Y() {39. return Location_Y;40. }41.42. public void setLocation_Y(String location_Y) {43. Location_Y = location_Y;44. }45.46. public String getScale() {47. return Scale;48. }49.50. public void setScale(String scale) {51. Scale = scale;52. }53.54. public String getLabel() {55. return Label;56. }57.58. public void setLabel(String label) {59. Label = label;60. }61.62. }发送被动响应消息对于每⼀个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进⾏响应(现⽀持回复⽂本、图⽚、图⽂、语⾳、视频、⾳乐)。

java实现微信公众平台发送模板消息的示例代码

java实现微信公众平台发送模板消息的示例代码

java实现微信公众平台发送模板消息的⽰例代码最近开发公众号项⽬,前端采⽤vue开发,后台使⽤java开发,由于业务需求,需要实现公众号向⽤户发送重要的服务通知,提醒⼯作⼈员进⾏业务审核。

这时候就需要⽤到微信平台的模板消息,为了保证⽤户不受到骚扰,在开发者出现需要主动提醒、通知⽤户时,才允许开发者在公众平台⽹站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向⽤户主动推送提醒、通知消息。

常⽤的服务场景,如信⽤卡刷卡通知,商品下单成功、购买成功通知等。

获取template_id(注意:仅微信开放平台同事可获取)通过向微信公众平台申请模板,来获取模板id,模板消息调⽤时主要需要模板ID和模板中各参数的赋值内容。

请注意:1.模板中参数内容必须以".DATA"结尾,否则视为保留字;2.模板保留符号"{{ }}"下图是在微信测试公众号申请模板请求模板消息接⼝1)微信⽹页授权//前端发请请求this.axios.get('/wx/get_code_num').then((res) => {window.location.href = res.data;}).catch((error) => {console.log(error)});/*** 1.⽤户同意授权,获取code*/@RequestMapping(value = "/get_code_num", method = RequestMethod.GET)public String getCode() throws UnsupportedEncodingException {return "https:///connect/oauth2/authorize?appid=" + Constants.APPID + "&redirect_uri="+ URLEncoder.encode("http://192.168.0.152:8085/wx/send_wx_msg", "UTF-8") + "&response_type=code&scope="+ Constants.GRANTSCOPE + "&state=STATE#wechat_redirect";}2)获取⽤户openid/*** 2.通过code换取⽹页授权access_token及openid*/@RequestMapping(value = "/send_wx_msg", method = RequestMethod.GET)public String sendWxMsg(String code) {String access_token_url = "https:///sns/oauth2/access_token";String accessTokenObj = HttpClientUtil.sendGet(access_token_url, "appid=" + Constants.APPID + "&secret="+ Constants.APPSECRET + "&code=" + code + "&grant_type=authorization_code");JSONObject jsonToken = JSONObject.fromObject(accessTokenObj);String openId = null;if (StringUtils.isNotBlank(String.valueOf(jsonToken))) {openId = jsonToken.getString("openid");}("获取openid,微信平台接⼝返回{}", openId);return openId;}3)组装、发送模板消息import java.util.TreeMap;public class WechatTemplate {private String touser;//⽤⼾openidprivate String template_id;//模板IDprivate String url;//URL置空,则在发送后,点击模板消息会进⼊⼀个空⽩页⾯(ios),或⽆法点击(android)private TreeMap<String, TreeMap<String, String>> data; //data数据public static TreeMap<String, String> item(String value, String color) {TreeMap<String, String> params = new TreeMap<String, String>();params.put("value", value);params.put("color", color);return params;}public TreeMap<String, TreeMap<String, String>> getData() {return data;}public void setData(TreeMap<String, TreeMap<String, String>> data) {this.data = data;}public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}public String getTemplate_id() {return template_id;}public void setTemplate_id(String template_id) {this.template_id = template_id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Overridepublic String toString() {return "WechatTemplate{" +"touser='" + touser + '\'' +", template_id='" + template_id + '\'' +", url='" + url + '\'' +", data=" + data +'}';}}//微信模板接⼝private final String SEND_TEMPLATE_MESSAGE_URL = "https:///cgi-bin/message/template/send"; //模板消息详情跳转URLprivate static String url = "https:///";String access_token_url = "https:///sns/oauth2/access_token";String accessTokenObj = HttpClientUtil.sendGet(access_token_url, "appid=" + Constants.APPID + "&secret="+ Constants.APPSECRET + "&code=" + code + "&grant_type=authorization_code");JSONObject jsonToken = JSONObject.fromObject(accessTokenObj);String openId = null;if (StringUtils.isNotBlank(String.valueOf(jsonToken))) {openId = jsonToken.getString("openid");}("获取openid,微信平台接⼝返回{}", openId);String urlToken = "https:///cgi-bin/token";String tokenObj = HttpClientUtil.sendGet(urlToken, "grant_type=client_credential" + "&secret=" + Constants.APPSECRET + "&appid=" + Constants.APPID); JSONObject retToken = JSONObject.fromObject(tokenObj);String accessToken = String.valueOf(retToken.get("access_token"));("获取access_token,微信平台接⼝返回{}", accessToken);TreeMap<String, TreeMap<String, String>> params = new TreeMap<String, TreeMap<String, String>>();//根据具体模板参数组装params.put("first", WechatTemplate.item("您的户外旅⾏活动订单已经⽀付完成,可在我的个⼈中⼼中查看", "#000000"));params.put("keyword1", WechatTemplate.item("发现尼泊尔—⼈⽂与⾃然的旅⾏圣地", "#000000"));params.put("keyword2", WechatTemplate.item("5000元", "#000000"));params.put("keyword3", WechatTemplate.item("2019.09.04", "#000000"));params.put("keyword4", WechatTemplate.item("5", "#000000"));params.put("remark", WechatTemplate.item("请届时携带好⾝份证件准时到达集合地点,若临时退改将产⽣相应损失,敬请谅解,谢谢!", "#000000"));WechatTemplate wechatTemplate = new WechatTemplate();wechatTemplate.setTemplate_id(Constants.TEMPLATEID);wechatTemplate.setTouser(openId);wechatTemplate.setUrl(url);wechatTemplate.setData(params);JSONObject json = JSONObject.fromObject(wechatTemplate);//将java对象转换为json对象String sendData = json.toString();//将json对象转换为字符串("板参数组装{}", sendData);TreeMap<String, String> treeMap = new TreeMap<String, String>();treeMap.put("access_token", accessToken);String retInfo = HttpUtil.doPost(SEND_TEMPLATE_MESSAGE_URL, treeMap, sendData);("消息模板返回{}", retInfo);return retInfo;}请求的数据格式{"data": {"first": {"color": "#000000","value": "您的户外旅⾏活动订单已经⽀付完成,可在我的个⼈中⼼中查看"},"keyword1": {"color": "#000000","value": "发现尼泊尔—⼈⽂与⾃然的旅⾏圣地"},"keyword2": {"color": "#000000","value": "5000元"},"keyword3": {"color": "#000000","value": "2019.09.04"},"keyword4": {"color": "#000000","value": "5"},"remark": {"color": "#000000","value": "请届时携带好⾝份证件准时到达集合地点,若临时退改将产⽣相应损失,敬请谅解,谢谢!"}},"template_id": "ZUMTnYtG0O4vZSv4bPTtWTOFZ2zirOjaM50GYywRRnA","touser": "olv_asx8nmggCQEmAFNbQstx3xd0","url": "https:///"}微信平台返回的结果:微信公众号通知消息⼯具类:import mons.collections.MapUtils;import mons.io.IOUtils;import ng3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import .ssl.*;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .HttpURLConnection;import .URL;import .URLEncoder;import java.nio.charset.StandardCharsets;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.Map;public class HttpUtil {private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);protected static final String POST_METHOD = "POST";private static final String GET_METHOD = "GET";static {TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { logger.debug("ClientTrusted");}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { logger.debug("ServerTrusted");}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}};HostnameVerifier doNotVerify = (s, sslSession) -> true;try {SSLContext sc = SSLContext.getInstance("SSL", "SunJSSE");sc.init(null, trustAllCerts, new SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());HttpsURLConnection.setDefaultHostnameVerifier(doNotVerify);} catch (Exception e) {logger.error("Initialization https impl occur exception : {}", e);}/*** 默认的http请求执⾏⽅法** @param url url 路径* @param method 请求的⽅法 POST/GET* @param map 请求参数集合* @param data 输⼊的数据允许为空* @return result*/private static String HttpDefaultExecute(String url, String method, Map<String, String> map, String data) { String result = "";try {url = setParmas(url, map, null);result = defaultConnection(url, method, data);} catch (Exception e) {logger.error("出错参数 {}", map);}return result;}public static String httpGet(String url, Map<String, String> map) {return HttpDefaultExecute(url, GET_METHOD, map, null);}public static String httpPost(String url, Map<String, String> map, String data) {return HttpDefaultExecute(url, POST_METHOD, map, data);}/*** 默认的https执⾏⽅法,返回** @param url url 路径* @param method 请求的⽅法 POST/GET* @param map 请求参数集合* @param data 输⼊的数据允许为空* @return result*/private static String HttpsDefaultExecute(String url, String method, Map<String, String> map, String data) { try {url = setParmas(url, map, null);(data);return defaultConnection(url, method, data);} catch (Exception e) {logger.error("出错参数 {}", map);}return "";}public static String doGet(String url, Map<String, String> map) {return HttpsDefaultExecute(url, GET_METHOD, map, null);}public static String doPost(String url, Map<String, String> map, String data) {return HttpsDefaultExecute(url, POST_METHOD, map, data);}/*** @param path 请求路径* @param method ⽅法* @param data 输⼊的数据允许为空* @return* @throws Exception*/private static String defaultConnection(String path, String method, String data) throws Exception {if (StringUtils.isBlank(path)) {throw new IOException("url can not be null");}String result = null;URL url = new URL(path);HttpURLConnection conn = getConnection(url, method);if (StringUtils.isNotEmpty(data)) {OutputStream output = conn.getOutputStream();output.write(data.getBytes(StandardCharsets.UTF_8));output.flush();output.close();if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream input = conn.getInputStream();result = IOUtils.toString(input, StandardCharsets.UTF_8);input.close();conn.disconnect();}// (result);return result;}/*** 根据url的协议选择对应的请求⽅式** @param url 请求路径* @param method ⽅法* @return conn* @throws IOException 异常*///待改进protected static HttpURLConnection getConnection(URL url, String method) throws IOException { HttpURLConnection conn;if (StringUtils.equals("https", url.getProtocol())) {conn = (HttpsURLConnection) url.openConnection();} else {conn = (HttpURLConnection) url.openConnection();}if (conn == null) {throw new IOException("connection can not be null");}conn.setRequestProperty("Pragma", "no-cache");// 设置不适⽤缓存conn.setRequestProperty("Cache-Control", "no-cache");conn.setRequestProperty("Connection", "Close");// 不⽀持Keep-Aliveconn.setUseCaches(false);conn.setDoOutput(true);conn.setDoInput(true);conn.setInstanceFollowRedirects(true);conn.setRequestMethod(method);conn.setConnectTimeout(8000);conn.setReadTimeout(8000);return conn;}/*** 根据url** @param url 请求路径* @return isFile* @throws IOException 异常*///待改进protected static HttpURLConnection getConnection(URL url, boolean isFile) throws IOException { HttpURLConnection conn = (HttpURLConnection) url.openConnection();if (conn == null) {throw new IOException("connection can not be null");}//设置从httpUrlConnection读⼊conn.setDoInput(true);conn.setDoOutput(true);conn.setUseCaches(false);//如果是上传⽂件,则设为POSTif (isFile) {conn.setRequestMethod(POST_METHOD); //GET和 POST都可以⽂件略⼤改成POST}// 设置请求头信息conn.setRequestProperty("Connection", "Keep-Alive");conn.setRequestProperty("Charset", String.valueOf(StandardCharsets.UTF_8));conn.setConnectTimeout(8000);conn.setReadTimeout(8000);return conn;}/*** 拼接参数** @param charset 编码格式* @return 拼接完成后的url*/public static String setParmas(String url, Map<String, String> map, String charset) throws Exception {String result = StringUtils.EMPTY;boolean hasParams = false;if (StringUtils.isNotEmpty(url) && MapUtils.isNotEmpty(map)) {StringBuilder builder = new StringBuilder();for (Map.Entry<String, String> entry : map.entrySet()) {String key = entry.getKey().trim();String value = entry.getValue().trim();if (hasParams) {builder.append("&");} else {hasParams = true;}if (StringUtils.isNotEmpty(charset)) {builder.append(key).append("=").append(URLEncoder.encode(value, charset));} else {builder.append(key).append("=").append(value);}}result = builder.toString();}URL u = new URL(url);if (StringUtils.isEmpty(u.getQuery())) {if (url.endsWith("?")) {url += result;} else {url = url + "?" + result;}} else {if (url.endsWith("&")) {url += result;} else {url = url + "&" + result;}}logger.debug("request url is {}", url);return url;}}遇到的问题1)"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [Ua2IXa0080sz47!]"获取的access_token不对,这边的token不是授权的token,是公众号调⽤各接⼝时使⽤的access_token以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

基于PHP实现微信小程序客服消息功能

基于PHP实现微信小程序客服消息功能

基于PHP实现微信⼩程序客服消息功能项⽬说明:本项⽬是⼀个简单微信⼩程序客服消息类,实现客服消息相关功能。

官⽅给的php⽰例有误,这⾥就不再吐槽了。

本⽰例是采⽤开发者服务器,没有采⽤云调⽤的形式。

官⽅⽂档:适⽤场景客户消息流程图使⽤步骤1、开启客服消息登录-开发-开发设置-消息推送点击“启动”Token(令牌):这个随便填,要求3-32位。

EncodingAESKey(消息加密密钥):这个点击“随机⽣成”即可。

消息加密⽅式:可以根据⾃⼰需要选择,本例选择”兼容模式“。

数据格式:json相对于xml来说,从压缩效率及传输效率更具优势,这⾥我们选json。

注意:以上操作完后先不要提交,等配置好开发者服务端后再提交。

2、配置开发者服务端检验signature的PHP⽰例代码:$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$echostr=$_GET["echostr"];$token = TOKEN;//这⾥改成你第⼀步操作时填写的token$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if ($tmpStr == $signature ) {return $echostr;} else {return false;}官⽅⽰例没有返回 $echostr ,这个检验开发者服务端是否成功的关键,必须返回。

3、提交消息推送配置如果没有报错,证明配置成功。

4、开发者服务端demo<?php//验证signature//$signature = $_GET["signature"];//$timestamp = $_GET["timestamp"];//$nonce = $_GET["nonce"];//$echostr=$_GET["echostr"];////$token = TOKEN;//这⾥改成你第⼀步操作时填写的token//$tmpArr = array($token, $timestamp, $nonce);//sort($tmpArr, SORT_STRING);//$tmpStr = implode( $tmpArr );//$tmpStr = sha1( $tmpStr );////if ($tmpStr == $signature ) {// return $echostr;//} else {// return false;//}include_once './Xcxmsg.php';$xcxmsg = new Xcxmsg();$postStr = file_get_contents('php://input');if (!$postStr)return false;$postArr = json_decode($postStr, true);if (!isset($postArr['MsgType']) || !isset($postArr['FromUserName']))return false;$data = ["touser" => $postArr['FromUserName']];$accessToken = $xcxmsg->getAccessToken();$url = "https:///cgi-bin/message/custom/send?access_token=" . $accessToken; switch ($postArr['MsgType']) {case "text"://如⽤户发送的是⽂字信息,这⾥处理//回复图⽂链接,也可以回复别的类型,根据需要$data['msgtype'] = "link";$data['link'] = ["title" => "hello","description" => "Is Really A Happy Day","url" => "LINK_URL",//连接url"thumb_url" =>"THUMB_URL" //图⽚url];$json = json_encode($data, JSON_UNESCAPED_UNICODE);$xcxmsg->curl($json, $url);break;case "image": //如⽤户发送图⽚消息,进⼊这⾥//服务端回复图⽚,也可以回复别的类型,根据需要$data['msgtype'] = "image";$data['image'] = ['media_id' => 'media_id值']; // 执⾏ $xcxmsg->upload($accessToken)返回的 media_id $json = json_encode($data, JSON_UNESCAPED_UNICODE);$xcxmsg->curl($json, $url);case "miniprogrampage"://如⽤户发送⼩程序卡⽚,进⼊这⾥//这⾥服务端回复⼩卡⽚,也可以回复别的类型,根据需要$data['msgtype'] = "miniprogrampage";$data['miniprogrampage'] = ["title" => "title","pagepath" => "pages/index/index","thumb_media_id" => "media_id值"];// 执⾏ $xcxmsg->upload($accessToken)返回的 media_id$json = json_encode($data, JSON_UNESCAPED_UNICODE);$xcxmsg->curl($json, $url);break;case "event"://如⽤户进⼊会话事件//这⾥可以回复⽂本$data['msgtype'] = "text";$data['text'] = ["content" => "Hello World",];$json = json_encode($data, JSON_UNESCAPED_UNICODE);$xcxmsg->curl($json, $url);break;default:}5、⼩程序前端在需要的地⽅添加以下代码:<button open-type="contact" >客服消息</button>⽤微信开发⼯具的预览,⽣成⼆维码,扫描测试是否成功。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微信公众平台开发(十二)发送客服消息一、简介当用户主动发消息给公众号的时候(包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功事件、用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数。

此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。

二、思路分析官方文档中只提供了一个发送客服消息的接口,开发者只要POST一个特定的JSON数据包即可实现消息回复。

在这里,我们打算做成一个简单的平台,可以记录用户消息,并且用网页表格的形式显示出来,然后可以对消息进行回复操作。

首先,我们使用数据库记录用户主动发送过来的消息,然后再提取出来展示到页面,针对该消息,进行回复。

这里我们只讨论文本消息,关于其他类型的消息,大家自行研究。

三、记录用户消息3.1 创建数据表创建一张数据表tbl_customer 来记录用户消息。

---- 表的结构`tbl_customer`--CREATE TABLE `tbl_customer` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '//消息ID',`from_user` char(50) NOT NULL COMMENT '//消息发送者',`message` varchar(200) NOT NULL COMMENT '//消息体', `time_stamp` datetime NOT NULL COMMENT '//消息发送时间',PRIMARY KEY (`id`),KEY `from_user` (`from_user`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;3.2 创建sql.func.php 文件创建_query($_sql) {} 函数,来执行INSERT 操作。

function _query($_sql){if(!$_result = mysql_query($_sql)){exit('SQL执行失败'.mysql_error());}return $_result;}3.3 创建记录消息的函数文件record_message.func.inc.php//引入数据库处理函数require_once 'sql.func.php';function_record_message($fromusername,$keyword,$date_stamp){ //调用_query()函数_query("INSERT INTOtbl_customer(from_user,message,time_stamp)VALUES('$fromusername','$keyword','$date_stamp')");}3.4 处理并记录文本消息A. 引入回复文本的函数文件,引入记录消息的函数文件//引入回复文本的函数文件require_once 'responseText.func.inc.php';//引入记录消息的函数文件require_once 'record_message.func.inc.php';B. 记录消息入数据库,并返回给用户刚才发送的消息,在这里,你可以修改成其他的文本,比如:“你好,消息已收到,我们会尽快回复您!” 等等。

//处理文本消息函数public function handleText($postObj){//获取消息发送者,消息体,时间戳$fromusername = $postObj-&gt;FromUserName;$keyword = trim($postObj-&gt;Content);$date_stamp = date('Y-m-d H:i:s');if(!empty( $keyword )){//调用_record_message()函数,记录消息入数据库_record_message($fromusername,$keyword,$date_stamp);$contentStr = $keyword;//调用_response_text()函数,回复发送者消息$resultStr =_response_text($postObj,$contentStr);echo $resultStr;}else{echo "Input something...";}}四、网页展示用户消息我们的最终效果大概如下所示,主要的工作在“信息管理中心”这块,其他的页面布局等等,不在这里赘述了,只讲解消息展示这块。

4.1 具体实施引入数据库操作文件,执行分页模块,执行数据库查询,将查询出来的结果赋给$_result 供下面使用。

//引入数据库操作文件require_once 'includes/sql.func.php';//分页模块global $_pagesize,$_pagenum;_page("SELECT id FROM tbl_customer",15); //第一个参数获取总条数,第二个参数,指定每页多少条$_result = _query("SELECT * FROM tbl_customer ORDER BY id DESC LIMIT $_pagenum,$_pagesize");将$_result 遍历出来,依次插入表格中。

&lt;form&gt;&lt;table cellspacing="1"&gt;&lt;tr&gt;&lt;th&gt;消息ID&lt;/th&gt;&lt;th&gt;发送者&lt;/th&gt;&lt;th&gt;消息体&lt;/th&gt;&lt;th&gt;消息时间&lt;/th&gt;&lt;th&gt;操作&lt;/th&gt;&lt;/tr&gt;&lt;?phpwhile(!!$_rows = _fetch_array_list($_result)){$_html = array();$_html['id'] = $_rows['id'];$_html['from_user'] = $_rows['from_user'];$_html['message'] = $_rows['message'];$_html['time_stamp'] =$_rows['time_stamp'];?&gt;&lt;tr&gt;&lt;td&gt;&lt;?php echo$_html['id']?&gt;&lt;/td&gt;&lt;td&gt;&lt;?php echo$_html['from_user']?&gt;&lt;/td&gt;&lt;td&gt;&lt;?php echo $_html['message']?&gt;&lt;/td&gt;&lt;td&gt;&lt;?php echo $_html['time_stamp']?&gt;&lt;/td&gt;&lt;td&gt;&lt;ahref="reply.php?fromusername=&lt;?php echo$_html['from_user']?&gt;&amp;message=&lt;?php echo $_html['message']?&gt;"&gt;&lt;input type="button" value="回复" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;?php}_free_result($_result);?&gt;&lt;/table&gt;&lt;/form&gt;说明:在每条消息后,都有一个“回复”操作,点击该按钮,向reply.php文件中传入fromusername和用户发送的消息,为回复用户消息做准备。

五、消息回复5.1 创建客服消息回复函数文件customer.php微信发送客服消息的接口URL如下:https:///cgi-bin/message/custom/send?access_token=ACCESS_TOKEN 需要POST的JSON数据包格式如下:{"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}所以,根据上面的提示,我们编写处理函数_reply_customer($touser,$content),调用的时候,传入touser和需要回复的content,即可发送客服消息。

function _reply_customer($touser,$content){//更换成自己的APPID和APPSECRET$APPID="wxef78f22f877db4c2";$APPSECRET="3f3aa6ea961b6284057b8170d50e2048";$TOKEN_URL="https:///cgi-bin/token?grant_type=client_credential&amp;appid=".$APPI D."&amp;secret=".$APPSECRET;$json=file_get_contents($TOKEN_URL);$result=json_decode($json);$ACC_TOKEN=$result-&gt;access_token;$data = '{"touser":"'.$touser.'","msgtype":"text","text":{"content":"'.$content.'"}}';$url = "https:///cgi-bin/message/custom/send?access_token=".$ACC_TOKEN;$result = https_post($url,$data);$final = json_decode($result);return $final;}function https_post($url,$data){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$result = curl_exec($curl);if (curl_errno($curl)) {。

相关文档
最新文档