微信公众号超链接代码实现图片消息回复代码

开发者必读
开发者工具
获取接口调用凭据
消息加解密
自定义菜单管理
数据统计接口
微信JS-SDK
微信小店接口
微信卡券接口
微信门店接口
微信智能接口
设备功能介绍
多客服功能
摇一摇周边
微信连Wi-Fi
出自微信公众平台开发者文档
微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发。
为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID,可以在用户管理-获取用户基本信息(UnionID机制)文档了解详情。
请开发者注意:
1、微信公众平台开发是指为微信公众号进行业务开发,为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发,请前往微信开放平台接入。
2、在申请到认证公众号之前,你可以先通过测试号申请系统,快速申请一个接口测试号,立即开始接口测试开发。
3、在开发过程中,可以使用接口调试工具来在线调试某些接口。
4、每个接口都有每日接口调用频次限制,可以在公众平台官网-开发者中心处查看具体频次。
5、在开发出现问题时,可以通过接口调用的返回码,以及报警排查指引(在公众平台官网-开发者中心处可以设置接口报警),来发现和解决问题。
6、公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取access_token,access_token在2小时内有效,过期需要重新获取,但1天内获取次数有限,开发者需自行存储,详见获取接口调用凭据(access_token)文档。
7、公众平台接口调用仅支持80端口。
公众号主要通过公众号消息会话和公众号内网页来为用户提供服务的,下面分别介绍这两种情况:
1、公众号消息会话
公众号是以微信用户的一个联系人形式存在的,消息会话是公众号与用户交互的基础。目前公众号内主要有这样几类消息服务的类型,分别用于不同的场景。
1)群发消息:公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息、图文消息、图片、视频、语音等。
2)被动回复消息:在用户给公众号发消息后,微信服务器会将消息发到开发者预先在开发者中心设置的服务器地址(开发者需要进行消息真实性验证),公众号可以在5秒内做出回复,可以回复一个消息,也可以回复命令告诉微信服务器这条消息暂不回复。被动回复消息可以设置加密(在公众平台官网的开发者中心处设置,设置后,按照消息加解密文档来进行处理。其他3种消息的调用因为是API调用而不是对请求的返回,所以不需要加解密)。
3)客服消息:在用户给公众号发消息后的48小时内,公众号可以给用户发送不限数量的消息,主要用于客服场景。用户的行为会触发事件推送,某些事件推送是支持公众号据此发送客服消息的,详见微信推送消息与事件说明文档。
4)模板消息:在需要对用户发送服务通知(如刷卡提醒、服务预约成功通知等)时,公众号可以用特定内容模板,主动向用户发送消息。
2、公众号内网页
许多复杂的业务场景,需要通过网页形式来提供服务,这时需要用到:
1)网页授权获取用户基本信息:通过该接口,可以获取用户的基本信息(获取用户的OpenID是无需用户同意的,获取用户的基本信息则需用户同意)
2)微信JS-SDK:是开发者在网页上通过JavaScript代码使用微信原生功能的工具包,开发者可以使用它在网页上录制和播放微信语音、监听微信分享、上传手机本地图片、拍照等许多能力。
值得借鉴的公众帐号主要是服务号,试列举并介绍如下:
招商银行信用卡中心
如果你是持卡人,可快捷查询信用卡账单、额度及积分;快速还款、申请账单分期;微信转接人工服务;信用卡消费,微信免费笔笔提醒。如果不是持卡人,可以微信办卡!
招商银行公众号通过提示消息引导用户将自己的微信号和信用卡号安全绑定。
用户可以通过该公众号查询账单、收取刷卡通知等功能,这是由招行开发人员通过公众号接口实现的功能。
中国南方航空
你可以办理值机手续,挑选座位,查询航班信息,查询目的地城市天气,并为明珠会员提供专业的服务。
南方航空公众号可以让用户将明珠会员服务和微信号绑定起来。
用户可以通过该公众号预订机票、查询订单,甚至办理登机牌。
你可以在微信里绑定手机号、积分流量,套餐余量、手机上网流量,微信专属流量查询,客服咨询。
广东联通公众号可以绑定手机号,来查询流量、套餐等等功能。
广东联通更与微信深度合作,购买微信沃卡可以获得微信五大特权。6604人阅读
最近公司在开发微信项目,所以自己也试着申请了个人的订阅服务号,实现了通过微信接收信息转发至java后台解析并回复的消息的简单功能,在还没忘记的时候记录一下,以便日后查阅,并且贡献出代码希望能给大家一个参考。
好首先你要看下面的示例,要事先申请微信公众平台的订阅服务号(个人只能申请这个),地址https://mp. ,申请的范例我这里就不讲了,一般根据提示可以自行完成,如果这都完成不了,那只能去度娘翻翻了。
要想让用户发送给公众帐号的消息转发给java后台服务器,首先要&在开发者中心 进行&服务器配置
下图为认证启动后小效果:
你要先进入到 修改配置里面,如下图:
你要填写这几个文本框内的内容,
1.URL 不用解释了,就是微信将用户发来的消息转发到你服务器的请求的地址,我让微信把请求发送到本地服务这样方便调试。
推荐一款反向代理的工具&pagekite.net ,感兴趣的朋友可以去搜索一下。使用相当方便,就是需要python2.7.x环境支持,然后运行下载的一个脚本,输入你的邮箱,然后在输入你要设置的域名前缀,就搞定,下次运行就不用在输入,它影射的是本地80端口,所以你启动服务的时候记得改成80端口就对了,还有这个貌似对于一个邮箱只有31天和5个连接的限制,PS:邮箱这东西都是免费的,你懂的。
2.Token:这个长度符合就行 自己随意
3.EncodingAESKey:点击随机生成 就OK
下面介绍我的代码:
我的开发环境是eclipse+springMvc
&/chat& 是我最终项目的请求Controller&URL路径
下面是homecontroller
@Controller
@RequestMapping(&/*&)
public class HomeController {
private String Token = &abcdef&;
@RequestMapping(value = &chat&, method = { RequestMethod.GET, RequestMethod.POST })
@ResponseBody
public void liaotian(Model model, HttpServletRequest request, HttpServletResponse response) {
System.out.println(&进入chat&);
boolean isGet = request.getMethod().toLowerCase().equals(&get&);
if (isGet) {
String signature = request.getParameter(&signature&);
String timestamp = request.getParameter(&timestamp&);
String nonce = request.getParameter(&nonce&);
String echostr = request.getParameter(&echostr&);
System.out.println(signature);
System.out.println(timestamp);
System.out.println(nonce);
System.out.println(echostr);
access(request, response);
// 进入POST聊天处理
System.out.println(&enter post&);
// 接收消息并返回消息
acceptMessage(request, response);
} catch (IOException e) {
e.printStackTrace();
* 验证URL真实性
* @author morning
* @date 日 上午10:53:07
* @param request
* @param response
* @return String
private String access(HttpServletRequest request, HttpServletResponse response) {
// 验证URL真实性
System.out.println(&进入验证access&);
String signature = request.getParameter(&signature&);// 微信加密签名
String timestamp = request.getParameter(&timestamp&);// 时间戳
String nonce = request.getParameter(&nonce&);// 随机数
String echostr = request.getParameter(&echostr&);// 随机字符串
List&String& params = new ArrayList&String&();
params.add(Token);
params.add(timestamp);
params.add(nonce);
// 1. 将token、timestamp、nonce三个参数进行字典序排序
Collections.sort(params, new Comparator&String&() {
public int compare(String o1, String o2) {
pareTo(o2);
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));
if (temp.equals(signature)) {
response.getWriter().write(echostr);
System.out.println(&成功返回 echostr:& + echostr);
} catch (IOException e) {
e.printStackTrace();
System.out.println(&失败 认证&);
private void acceptMessage(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 处理接收消息
ServletInputStream in = request.getInputStream();
// 将POST流转换为XStream对象
XStream xs = SerializeXmlUtil.createXstream();
xs.processAnnotations(InputMessage.class);
xs.processAnnotations(OutputMessage.class);
// 将指定节点下的xml节点数据映射为对象
xs.alias(&xml&, InputMessage.class);
// 将流转换为字符串
StringBuilder xmlMsg = new StringBuilder();
byte[] b = new byte[4096];
for ( (n = in.read(b)) != -1;) {
xmlMsg.append(new String(b, 0, n, &UTF-8&));
// 将xml内容转换为InputMessage对象
InputMessage inputMsg = (InputMessage) xs.fromXML(xmlMsg.toString());
String servername = inputMsg.getToUserName();// 服务端
String custermname = inputMsg.getFromUserName();// 客户端
long createTime = inputMsg.getCreateTime();// 接收时间
Long returnTime = Calendar.getInstance().getTimeInMillis() / 1000;// 返回时间
// 取得消息类型
String msgType = inputMsg.getMsgType();
// 根据消息类型获取对应的消息内容
if (msgType.equals(MsgType.Text.toString())) {
// 文本消息
System.out.println(&开发者微信号:& + inputMsg.getToUserName());
System.out.println(&发送方帐号:& + inputMsg.getFromUserName());
System.out.println(&消息创建时间:& + inputMsg.getCreateTime() + new Date(createTime * 1000l));
System.out.println(&消息内容:& + inputMsg.getContent());
System.out.println(&消息Id:& + inputMsg.getMsgId());
StringBuffer str = new StringBuffer();
str.append(&&xml&&);
str.append(&&ToUserName&&![CDATA[& + custermname + &]]&&/ToUserName&&);
str.append(&&FromUserName&&![CDATA[& + servername + &]]&&/FromUserName&&);
str.append(&&CreateTime&& + returnTime + &&/CreateTime&&);
str.append(&&MsgType&&![CDATA[& + msgType + &]]&&/MsgType&&);
str.append(&&Content&&![CDATA[你说的是:& + inputMsg.getContent() + &,吗?]]&&/Content&&);
str.append(&&/xml&&);
System.out.println(str.toString());
response.getWriter().write(str.toString());
// 获取并返回多图片消息
if (msgType.equals(MsgType.Image.toString())) {
System.out.println(&获取多媒体信息&);
System.out.println(&多媒体文件id:& + inputMsg.getMediaId());
System.out.println(&图片链接:& + inputMsg.getPicUrl());
System.out.println(&消息id,64位整型:& + inputMsg.getMsgId());
OutputMessage outputMsg = new OutputMessage();
outputMsg.setFromUserName(servername);
outputMsg.setToUserName(custermname);
outputMsg.setCreateTime(returnTime);
outputMsg.setMsgType(msgType);
ImageMessage images = new ImageMessage();
images.setMediaId(inputMsg.getMediaId());
outputMsg.setImage(images);
System.out.println(&xml转换:/n& + xs.toXML(outputMsg));
response.getWriter().write(xs.toXML(outputMsg));
加密SHA1,此代码是来自网上
* 微信公众平台(JAVA) SDK
* Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.
* /weixin/sdk/
* Licensed under the Apache License, Version 2.0 (the &License&);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &AS IS& BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
package com.mor.
import java.security.MessageD
* Title: SHA1算法
public final class SHA1 {
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
* Takes the raw bytes from the digest and formats them correct.
* @param bytes
the raw bytes from the digest.
* @return the formatted bytes.
private static String getFormattedText(byte[] bytes) {
int len = bytes.
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j & j++) {
buf.append(HEX_DIGITS[(bytes[j] && 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
return buf.toString();
public static String encode(String str) {
if (str == null) {
MessageDigest messageDigest = MessageDigest.getInstance(&SHA1&);
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
输入信息实体类&InputMessage&
&pre name=&code& class=&java&&/*
* 微信公众平台(JAVA) SDK
* Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.
* /weixin/sdk/
* Licensed under the Apache License, Version 2.0 (the &License&);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &AS IS& BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
package com.mor.maven.demo.mavenweb.
import java.io.S
import com.thoughtworks.xstream.annotations.XStreamA
* POST的XML数据包转换为消息接受对象
* 由于POST的是XML数据包,所以不确定为哪种接受消息,&br/&
* 所以直接将所有字段都进行转换,最后根据&tt&MsgType&/tt&字段来判断取何种数据
@XStreamAlias(&xml&)
public class InputMessage implements Serializable {
private static final long serialVersionUID = 1L;
@XStreamAlias(&ToUserName&)
private String ToUserN
@XStreamAlias(&FromUserName&)
private String FromUserN
@XStreamAlias(&CreateTime&)
private Long CreateT
@XStreamAlias(&MsgType&)
private String MsgType = &text&;
@XStreamAlias(&MsgId&)
private Long MsgId;
// 文本消息
@XStreamAlias(&Content&)
private String C
// 图片消息
@XStreamAlias(&PicUrl&)
private String PicU
// 位置消息
@XStreamAlias(&LocationX&)
private String LocationX;
@XStreamAlias(&LocationY&)
private String LocationY;
@XStreamAlias(&Scale&)
private Long S
@XStreamAlias(&Label&)
private String L
// 链接消息
@XStreamAlias(&Title&)
private String T
@XStreamAlias(&Description&)
private String D
@XStreamAlias(&Url&)
private String URL;
// 语音信息
@XStreamAlias(&MediaId&)
private String MediaId;
@XStreamAlias(&Format&)
private String F
@XStreamAlias(&Recognition&)
private String R
@XStreamAlias(&Event&)
private String E
@XStreamAlias(&EventKey&)
private String EventK
@XStreamAlias(&Ticket&)
private String T
public String getToUserName() {
return ToUserN
public void setToUserName(String toUserName) {
ToUserName = toUserN
public String getFromUserName() {
return FromUserN
public void setFromUserName(String fromUserName) {
FromUserName = fromUserN
public Long getCreateTime() {
return CreateT
public void setCreateTime(Long createTime) {
CreateTime = createT
public String getMsgType() {
return MsgT
public void setMsgType(String msgType) {
MsgType = msgT
public Long getMsgId() {
return MsgId;
public void setMsgId(Long msgId) {
MsgId = msgId;
public String getContent() {
public void setContent(String content) {
public String getPicUrl() {
return PicU
public void setPicUrl(String picUrl) {
PicUrl = picU
public String getLocationX() {
return LocationX;
public void setLocationX(String locationX) {
LocationX = locationX;
public String getLocationY() {
return LocationY;
public void setLocationY(String locationY) {
LocationY = locationY;
public Long getScale() {
public void setScale(Long scale) {
public String getLabel() {
public void setLabel(String label) {
public String getTitle() {
public void setTitle(String title) {
public String getDescription() {
public void setDescription(String description) {
Description =
public String getURL() {
return URL;
public void setURL(String uRL) {
URL = uRL;
public String getEvent() {
public void setEvent(String event) {
public String getEventKey() {
return EventK
public void setEventKey(String eventKey) {
EventKey = eventK
public String getMediaId() {
return MediaId;
public void setMediaId(String mediaId) {
MediaId = mediaId;
public String getFormat() {
public void setFormat(String format) {
public String getRecognition() {
public void setRecognition(String recognition) {
Recognition =
public String getTicket() {
public void setTicket(String ticket) {
为了加入 CDATA 验证创建的@interface类
package com.mor.maven.demo.mavenweb.
import java.lang.annotation.ElementT
import java.lang.annotation.R
import java.lang.annotation.RetentionP
import java.lang.annotation.T
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface XStreamCDATA {
改写的XStream工具类
package com.mor.
import java.io.W
import java.lang.reflect.F
import com.mor.maven.demo.mavenweb.model.XStreamCDATA;
import com.thoughtworks.xstream.XS
import com.thoughtworks.xstream.annotations.XStreamA
import com.thoughtworks.xstream.core.util.QuickW
import com.thoughtworks.xstream.io.HierarchicalStreamW
import com.thoughtworks.xstream.io.xml.PrettyPrintW
import com.thoughtworks.xstream.io.xml.XppD
* xml 转换工具类
* @author morning
* @date 日 下午2:42:50
public class SerializeXmlUtil {
public static XStream createXstream() {
return new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
boolean cdata =
Class&?& targetClass =
public void startNode(String name, @SuppressWarnings(&rawtypes&) Class clazz) {
super.startNode(name, clazz);
// 业务处理,对于用XStreamCDATA标记的Field,需要加上CDATA标签
if (!name.equals(&xml&)) {
cdata = needCDATA(targetClass, name);
targetClass =
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write(&&![CDATA[&);
writer.write(text);
writer.write(&]]&&);
writer.write(text);
private static boolean needCDATA(Class&?& targetClass, String fieldAlias) {
boolean cdata =
// first, scan self
cdata = existsCDATA(targetClass, fieldAlias);
if (cdata)
// if cdata is false, scan supperClass until java.lang.Object
Class&?& superClass = targetClass.getSuperclass();
while (!superClass.equals(Object.class)) {
cdata = existsCDATA(superClass, fieldAlias);
if (cdata)
superClass = superClass.getClass().getSuperclass();
private static boolean existsCDATA(Class&?& clazz, String fieldAlias) {
if (&MediaId&.equals(fieldAlias)) {
// 特例添加 morning99
// scan fields
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 1. exists XStreamCDATA
if (field.getAnnotation(XStreamCDATA.class) != null) {
XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class);
// 2. exists XStreamAlias
if (null != xStreamAlias) {
if (fieldAlias.equals(xStreamAlias.value()))// matched
} else {// not exists XStreamAlias
if (fieldAlias.equals(field.getName()))
输出实体类&OutputMessage&
package com.mor.maven.demo.mavenweb.
import com.thoughtworks.xstream.annotations.XStreamA
* @author morning
* @date 日 下午2:29:32
@XStreamAlias(&xml&)
public class OutputMessage {
@XStreamAlias(&ToUserName&)
@XStreamCDATA
private String ToUserN
@XStreamAlias(&FromUserName&)
@XStreamCDATA
private String FromUserN
@XStreamAlias(&CreateTime&)
private Long CreateT
@XStreamAlias(&MsgType&)
@XStreamCDATA
private String MsgType = &text&;
private ImageMessage I
public String getToUserName() {
return ToUserN
public void setToUserName(String toUserName) {
ToUserName = toUserN
public String getFromUserName() {
return FromUserN
public void setFromUserName(String fromUserName) {
FromUserName = fromUserN
public Long getCreateTime() {
return CreateT
public void setCreateTime(Long createTime) {
CreateTime = createT
public String getMsgType() {
return MsgT
public void setMsgType(String msgType) {
MsgType = msgT
public ImageMessage getImage() {
public void setImage(ImageMessage image) {
图片信息实体类
package com.mor.maven.demo.mavenweb.
import com.thoughtworks.xstream.annotations.XStreamA
@XStreamAlias(&Image&)
public class ImageMessage extends MediaIdMessage {
多媒体id 实体类
package com.mor.maven.demo.mavenweb.
import com.thoughtworks.xstream.annotations.XStreamA
public class MediaIdMessage {
@XStreamAlias(&MediaId&)
@XStreamCDATA
private String MediaId;
public String getMediaId() {
return MediaId;
public void setMediaId(String mediaId) {
MediaId = mediaId;
基本就这些类,也不知道拷贝全没有。
不过在输出xml的时候由于要添加CDATA标签所以没有实现完美,目前自己在SerializeXmlUtil 内添加了一下判断
如果是子标签下的值目前只能用这种方法加CDATA,不知道各位同学有没有好的方法。
目前只是实现了服务器认证,接收文本信息并回复原文本信息加上些附加信息,接收图片信息并返回原图片信息。
后期会有扩展,先记录到此。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70649次
积分:1033
积分:1033
排名:千里之外
原创:29篇
转载:28篇
评论:20条
(1)(2)(2)(1)(1)(3)(1)(4)(1)(2)(1)(1)(1)(3)(3)(5)(9)(1)(6)(9)【技术文章】微信公众平台开发教程新手解惑40则
发表于 10:35|
摘要:由CSDN和《程序员》杂志联合主办的2014年微信开发者大会将于8月23日在北京举行。组委会已经邀请到了柳峰担任此次大会的演讲嘉宾,他将带来《智能客服与LBS开发的“坑”与解决之道》的主题分享。
【编者按】由CSDN和《程序员》杂志联合主办的
将于8月23日在北京举行,邀请了来自于一线的微信开发商技术负责人或资深工程师从企业应用开发高级篇、智能客服与LBS、微信支付、微信上的HTML5社交应用、微信小店开发等角度为与会者带来实战分享(
)。目前报名处于优惠票价阶段,通过申请加入CSDN CTO俱乐部即可享受8折购票价格(票款中均含午餐),在前完成付款的同学还将免费获赠微信开发图书一本(两选一,活动现场发放)。&值得一提的是,CSDN优秀博主、畅销书《微信公众平台应用开发:方法、技巧与案例》的作者柳峰受邀做本次活动讲师之一,演讲主题《智能客服与LBS开发的“坑”与解决之道》。他在CSDN博客中(
)撰写了几十篇+的微信开发技术文章,多篇访问量都在3万+,以下这篇《
》摘自他的博客。
全文如下:
笔者在CSDN博客频道推出微信公众平台开发教程之后,接触了许多公众平台开发爱好者,也帮助他们解决了许多实际的问题,当然这其中有很多问题都是重复的,因此,笔者将这些问题及解答整理出来,以帮助更多初学者少走弯路。
1、订阅号与服务号的主要区别是什么?
订阅号每天能群发一条消息,没有自定义菜单及高级接口权限;服务号有自定义菜单及高级接口权限,但每月只能群发一条消息。
2、到底该申请订阅号还是服务号?
申请哪种类型的公众账号,主要取决于账号的用途。服务号主要面向企业和组织,旨在为用户提供服务;订阅号主要面向媒体和个人,旨在为用户提供信息和资讯。
3、订阅号是否支持编程开发?
不管是订阅号,还是服务号,在高级功能中都有编辑模式和开发模式,订阅号也支持编程开发,同样也能与企业系统对接。
4、为什么申请的公众账号没有高级功能?
公众账号注册后,要经过微信团队的审核,在审核未完成之前不显示高级功能。一般审核会在15个工作日内完成,如果一两周没审核通过均属正常现象,还请耐心等待。
5、现在订阅号能否申请自定义菜单?
不能。那为什么有些订阅号有自定义菜单?这是历史遗留问题。日,随着微信5.0的发布,公众账号被划分为订阅号和服务号,所有的公众账号都被默认为订阅号,并且有一次转服务号的机会,许多在此之前申请到自定义菜单的账号并没有转为服务号,所以就存在一些订阅号有自定义菜单,例如:36氪、蓉城先锋、天府之光等。
补充:日,公众平台针对订阅号做了重要更新。政府、传统媒体、明星等非企业性质的订阅号可以申请微信认证,通过微信认证的订阅号可获得自定义菜单接口权限。
6、现在申请的订阅号能否转服务号?
不能。只有日微信5.0发布以前申请的订阅号才有一次转服务号的机会,在此之后申请的订阅号不能转服务号。
那如果真的有转服务号的需求怎么解决?只能重新申请一个服务号。7、目前一个身份证号能申请几个公众账号?
8、使用一个公司的材料能申请多少个公众账号?
没有限制。
9、在注册公众账号时,提示“你注册的公众号名称存在侵权风险,请先完成微博验证”,这是什么意思?
公众平台对一些可能存在侵权的关键词进行了保护,例如:“微信”、“移动”、“搜狐”等,如果注册的公众账号名称中包含这类关键词,提交时就会提示存在侵权风险。
遇到这种情况时,要么避开这些关键词换个名称注册,要么就根据提示先完成微博验证再继续注册。
10、个人能否申请服务号?
不能,个人只能申请订阅号。服务号的运营主体必须为组织,例如:企业、政府、其他组织等。
11、公众账号的名称可以重复吗?
公众账号的名称可以重复,不用担心被他人抢注。
12、公众账号的名称可以修改吗?
公众账号名称一经设置无法修改,公众平台没有提供账号改名的功能,因此在注册账号时取名应谨慎。
13、微信认证与微博认证有什么区别?
微信认证是针对于服务号,微博认证是针对于订阅号。也就是说,订阅号只能申请微博认证,服务号只能申请微信认证。
14、是否需要粉丝数达到500才能申请微信认证?
只要是服务号都可以申请微信认证,与粉丝数无关。只有订阅号申请微博认证才要求粉丝数必须达到500。
15、编辑模式与开发模式能够同时使用吗?
不能,这两种模式是互斥的,开启编辑模式就必须关闭开发模式,开启开发模式就必须关闭编辑模式。
16、现在用的是编辑模式,以后还可以选择使用开发模式吗?
可以,任何时候都可以根据需要切换到另外一种模式。
17、编辑模式切换到开发模式之后,在编辑模式中设置的内容还在吗?还有效吗?
在编辑模式中设置的内容,只要自己不手动删除,会永远存在的,但这些设置在开发模式下无效。
18、开发模式的菜单为什么突然消失了?
菜单不会无缘无故的消失,如果开发人员没有手动删除,那一定是有人开启过编辑模式引起的。请注意:开启编辑模式后,在开发模式下创建的菜单会被删除。
19、使用开发模式需要具备哪些条件?
1)至少掌握一门编程语言;2)具备公网服务器资源。
20、微信公众平台支持哪些编程语言?应该如何选择?
凡是支持动态Web开发的编程语言都能够用于微信公众平台开发,例如:Java、PHP、ASP.NET、Ruby、Python、Note.js等。
开者人员应该选择自己最擅长的编程语言进行开发,如果都不擅长怎么办?如果都不擅长,建议选择Java或PHP,原因在于网上关于微信公众平台开发的资料大都是基于Java和PHP的,开发起来要相对容易。
21、没有公网服务器资源怎么办?
1)免费:可以考虑使用云环境,例如,BAE(Baidu App Engine,百度应用引擎)和SAE(Sina App Engine,新浪应用引擎)。
2)付费:可以考虑租用VPS(Virtual Private Server,虚拟专用服务器)或阿里云的云服务器。
如果仅是为了学习微信公众平台开发,个人建议使用BAE。
22、如果想使用Java进行微信公众平台开发至少需要掌握哪些内容?
至少需要掌握Java基础知识、JSP、Servlet、Javabean和JDBC(操作数据库)。
23、公司的项目大都是基于SSH框架进行开发,能使用SSH开发微信公众账号吗?
当然可以,前面说过,凡是支持动态Web开发的编程语言都能用于微信公众平台开发。其实,Struts本质上也是Servlet。
24、柳峰老师,可以给我一份微信公众平台项目的源码吗?
想要源码的朋友请您免开尊口,我认为这不是一种很好的学习方式和态度,而是一种浮躁的表现。博客中的教程已经讲的很详细了,并且贴出了所有代码(一行也不少),如果这样还不愿意花点时间去理解、消化和动动手,我也无能为力!
PS:曾经也有一些开发者、创业团队和公司提出要买小q机器人(xiaoqrobot)的源码,有的开价是5位数,但都被我拒绝了。相比之下,我更愿意把小q机器人的完整实现过程写成一篇篇技术文章免费分享出来,带动更多的开发者加入到微信公众平台开发阵营!
25、公众账号能够通过程序主动向关注用户发消息吗?
截止目前,公众平台还没有开放主动向用户发消息的接口。为什么招行可以?我前面说的是没有“开放”主动发消息的接口,并不代表没有该接口。如果贵公司也有招行的实力,我相信你也有办法申请到;如果没有这样的实力,那就不要费事了。
26、订阅号使用开发模式能够向用户回复图片、语音和视频消息吗?
可以,虽然订阅号没有多媒体文件上传接口权限,无法通过上传多媒体文件到微信服务器获取MediaId,但仍可以变相得到MediaId,同样可以实现回复多媒体消息。变相的实现方法是将用户发送给公众账号的多媒体消息的MediaId记录下来,给用户回复多媒体消息时可以使用。
27、订阅号使用开发模式能够向用户回复
音乐消息吗?
28、音乐消息包含参数ThumbMediaId,没有高级接口权限的公众账号无法获得ThumbMediaId,怎么回复音乐消息?
ThumbMediaId不是音乐消息的必须参数,给用户回复音乐消息时可以不传ThumbMediaId参数,类似下面这种示例格式也能正确回复音乐消息:
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[music]]&&/MsgType&
&Title&&![CDATA[TITLE]]&&/Title&
&Description&&![CDATA[DESCRIPTION]]&&/Description&
&MusicUrl&&![CDATA[MUSIC_Url]]&&/MusicUrl&
&HQMusicUrl&&![CDATA[HQ_MUSIC_Url]]&&/HQMusicUrl&
29、订阅号与非微信认证的服务号能够向回复哪些类型的消息?
在开发模式下,订阅号与非微信认证的服务号只能向用户回复文本消息、音乐消息和图文消息。
30、为什么项目代码与柳峰老师教程中的一样,发消息给公众账号却没有任何响应?
这是我写微信公众平台开发教程以来,初学者给我反馈最多的问题。可以肯定的是,至今为止,我博客中贴出的所有代码全部都能正常运行,没有任何问题。遇到上面这种问题大都是由以下三种情况引起:
1)在公众平台开发模式下,成为开发者却忘记开启开发模式,即开发模式的开关是关闭状态。
2)通过上传WAR包的方式部署应用时,导出的WAR包中没有包含JAR。建议初学者直接将项目需要的JAR拷贝到项目中,这样通过开发工具导出的WAR包就会包含JAR。
3)项目中引入的第三方JAR包与笔者教程中使用的JAR包版本不一致。
31、为什么自定义菜单创建成功了,在微信客户端的公众账号上却不显示?
由于微信客户端缓存的原因,自定义菜单创建成功后,需要24小时以后才能显示出来。开发者在测试时,可以尝试取消关注公众账号后再次关注,这样能立即看到最新的菜单效果。
PS:菜单更新、菜单删除也会有缓存。
32、如果要更新公众账号的自定义菜单,需要先将原有菜单删除吗?
不需要,直接执行菜单创建方法即可,每次创建菜单会自动覆盖以前的菜单。
33、什么是微网站?
微网站是新瓶装老酒,被一些搞营销的人给神化了,以至于很多开发者都在问什么是微网站,如何开发微网站。微网站本质上就是以微信浏览器为入口的手机网站(Web APP),能够兼容Android、iOS、WP等操作系统。开发微网站用到的技术与开发普通网站一样,都是基于HTML(HTML5)、CSS、Javascript等,所以有普通网站开发经验的开发者,完全有能力开发微网站。
PS:初学者以后再看到什么以“微”开头的新名词,例如:微商城、微客服、微统计,直接把“微”字去掉或者把“微”当作是“基于微信的”就不难理解了。
34、什么是模拟登录?模拟登录微信公众平台
能够干什么?
模拟登录指的是通过程序模拟用户在浏览器上的操作。例如,我们通过浏览器访问微信公众平台,先要登录,登录成功后能够查看用户信息、给用户回复消息、群发消息等,其实通过程序也能够实现这些操作。
PS:对于模拟登录,官方并没有明确表态是允许还是禁止,请谨慎使用,万一哪天被封号就不划算了,也没法向关注你公众账号的用户交待。
35、微信认证是如何收费的?
服务号申请微信认证需要支付300元/次的审核服务费用,无论最终的认证审核通过与否,都需要支付这笔费用。微信认证成功后,认证的有效期是一年,在有效期快结束时还要再次申请微信认证。
36、微信支付如何申请?
截止目前,微信公众平台仍未开放微信支付权限的申请。为什么广东联通、小米手机这些账号有微信支付权限?这些公司大都与微信有着合作关系,提前享受这些权限一点也不奇怪。
37、临时带参二维码有哪些应用场景?
通过微信扫描二维码登录微信网页版,就是临时带参二维码的典型应用场景。
38、微信公众平台开发一般如何调试?
微信公众平台提供的
旨在帮助开发者检测调用公众平台接口时传入的参数是否正确,这款工具对开发者的帮助其实并不大。对于调试本地运行的公众账号后台程序,这里给读者推荐两种方法:1)使用“微信开发调试小工具”,该工具支持在本地调试,工具的用法及下载请访问:
,通过路由器端口映射,可以将自己的电脑变成一台外网服务器,这样本机运行的公众账号后台程序就能直接与微信服务器进行交互了。
39、为什么项目在本地运行正常,也能获取到数据,部署到服务器上之后公众账号没有任何响应?
遇到这类情况,请读者尝试从以下几个方面排查问题:
1)检查项目在服务器上是否部署成功,可以尝试方法以前能够正常运行的功能模块,看能否正确响应,以便缩小问题范围。
2)检查项目中通过URL传递参数时,如果传递特殊字符(例如:中文、+、&等),是否对特殊字符进行了编码。
3)检查程序的处理是否超时,如果超过5秒,公众账号不响应。
4)检查返回的文本消息、图文消息是否超过限制(文本消息长度&=2048字节,图文消息条数&=10条),若超过限制,公众账号不响应。
5)公众账号不响应也有可能是微信公众平台自身故障导致。
40、为什么URL在浏览器能访问,放到微信上却不能访问?
请检查URL中是否包含特殊字符,例如:中文、+、&等,PC上的浏览器通常都会对URL中包含的特殊字符自动编码,但有些浏览器不会。
为了保证所有的浏览器都能正常访问URL,请务必对URL中包含特殊字符显示编码,显示编码的意思是代码中能够明确看出编码方式是UTF8、GB2312或者其它。例如像下面这样:
// 采用操作系统默认的字符集进行编码,在不同的操作系统上表现不一致,不推荐
java.net.URLEncoder.encode(chinese);// 显示编码,推荐用法
java.net.URLEncoder.encode(chinese, "UTF-8");PS:很多初学者都认为只有URL中包含中文时才需要编码,结果导致OAuth2.0授权接口、通过ticket换取二维码接口总是调用不成功。
OAuth2.0授权接口中的回调地址redirect_uri中包含大量特殊字符必须进行编码,通过ticket换取二维码接口中的ticket中可能包含+号也要进行编码。
送给初学者一条中肯的建议:不要总是怀疑微信公众平台的接口或者有经验的开发者分享的程序代码有问题,最先应该怀疑自己写的程序有问题,这样才有助于发现问题,从而解决问题。请相信:一套久经考验的平台、程序被初学者发现BUG的情况并不多见。欢迎大家到现场与柳峰深度沟通。目前,
(持续关注
更新)。另外,主委会还开设了
,欢迎技术精英自荐和互相推荐,也可以直接联系
。(持续更新)
此外,主办方还特别开设了
)现在就去
。微信开发者QQ群:(已满)和微信开发者② QQ群:,欢迎加入交流。
相关阅读:
,了解更多研发资讯,参与互动讨论;当然您可以向我们推荐更多有趣、有质量的文章。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章}

我要回帖

更多关于 微信公众平台回复代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信