微信公众好开发流程 Java
1、申请账号
公众号分为服务号、企业号、订阅号,每个类型所对应的接口是不同的
公众号接口权限说明
不同的公众号类型具备不同的接口权限,具体如下表: 请注意:
1)、微博认证视作未认证,因此微博认证的公众号不会拥有微信认证公众号特有的接口。
2)、微信认证分为资质认证和名称认证两部分,只需要资质认证通过,就可获得接口。
接口名称
|
未认证订阅号
|
微信认证订阅号
|
未认证服务号
|
微信认证服务号
|
基础支持-获取access_token
|
有
|
有
|
有
|
有
|
基础支持-获取微信服务器IP地址
|
有
|
有
|
有
|
有
|
接收消息-验证消息真实性、接收普通消息、接收事件推送、接收语音识别结果
|
有
|
有
|
有
|
有
|
发送消息-被动回复消息
|
有
|
有
|
有
|
有
|
发送消息-客服接口
|
|
有
|
|
有
|
发送消息-群发接口
|
|
有
|
|
有
|
发送消息-模板消息接口(发送业务通知)
|
|
|
|
有
|
发送消息-一次性订阅消息接口
|
|
有
|
|
有
|
用户管理-用户分组管理
|
|
有
|
|
有
|
用户管理-设置用户备注名
|
|
有
|
|
有
|
用户管理-获取用户基本信息
|
|
有
|
|
有
|
用户管理-获取用户列表
|
|
有
|
|
有
|
用户管理-获取用户地理位置
|
|
|
|
有
|
用户管理-网页授权获取用户openid/用户基本信息
|
|
|
|
有
|
推广支持-生成带参数二维码
|
|
|
|
有
|
推广支持-长链接转短链接口
|
|
|
|
有
|
界面丰富-自定义菜单
|
|
有
|
有
|
有
|
素材管理-素材管理接口
|
|
有
|
|
有
|
智能接口-语义理解接口
|
|
|
|
有
|
多客服-获取多客服消息记录、客服管理
|
|
|
|
有
|
微信支付接口
|
|
|
|
需申请
|
微信小店接口
|
|
|
|
需申请
|
微信卡券接口
|
|
需申请
|
|
需申请
|
微信设备功能接口
|
|
|
|
需申请
|
微信发票接口
|
|
有
|
|
有
|
微信JS-SDK-基础接口
|
有
|
有
|
有
|
有
|
微信JS-SDK-分享接口
|
|
有
|
|
有
|
微信JS-SDK-图像接口
|
有
|
有
|
有
|
有
|
微信JS-SDK-音频接口
|
有
|
有
|
有
|
有
|
微信JS-SDK-智能接口(网页语音识别)
|
有
|
有
|
有
|
有
|
微信JS-SDK-设备信息
|
有
|
有
|
有
|
有
|
微信JS-SDK-地理位置
|
有
|
有
|
有
|
有
|
微信JS-SDK-界面操作
|
有
|
有
|
有
|
有
|
微信JS-SDK-微信扫一扫
|
有
|
有
|
有
|
有
|
微信JS-SDK-微信小店
|
|
|
|
有
|
微信JS-SDK-微信卡券
|
|
有
|
|
有
|
微信JS-SDK-微信支付
|
|
|
|
有
|
对于我们个人开发尝试而言,个人是不能够认证的,所以只能有一点点接口可以调用
但是公众号提供了测试公众号,
直接体验和测试公众平台所有高级接口
可直接扫码登录
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
2、对公众号进行必要的配置
1)、个人开发的过程中,我们要经常进行调试,但是我们的电脑基本都是没有独立的外网IP,我们可以通过第三方的工具进行内网映射,将外网地址映射到本地电脑,只要输入外网地址就可以找到本地电脑
可提供外网映射的有很多,我在开发途中使用了
nat123,
花生壳,
NATAPP
以下是我使用工程中的心得,每个都会提供免费的域名映射内网地址
nat123
页面古板,且一步步的诱惑充值,免费开通后
第一步需要使用80端口?充值8元:不能使用80端口然后为了使用80端口,充值8元
第二步需要使用自定义域名?至少充值30元:不能使用自定义域名 卒
花生壳
页面美观,开通内网映射需要充值8元开通,开通后也是不能使用自定义域名的,但是没有诱导的过程
NATAPP
页面简单,可开通免费的隧道使用内网映射,不过为了使用自定义域名,开通VIP1
VIP-1 型
|
5元/月
|
月付用户限制流量5G/月,年付7G/月.账单日流量清零,如超流量可单独购买流量包 0.3元/G
|
微信开发,DEMO演示,SSH/3389,较少人数同时在线游戏等应用
|
推荐使用这款,可以使用自定义域名,因为微信把大部分内网映射提供的域名加入了黑名单,使用的时候可能会报(该网页不是微信官方的网页,可能不安全,影响体验)
具体使用教程可参考
https://natapp.cn/article
由于前期个人需要,申请了域名并通过了备案
2) 微信配置
图1 微信基本配置
图2 启用微信网页授权
图3 修改为自己的域名
3 Java 代码
设置微信网关,项目中所有和微信交互的全都要通过该接口
/**
* WxGateway 微信转发网关
*/
@Controller
@RequestMapping("/gateway")
public class WxGateway {
private static final Logger logger = LoggerFactory
.getLogger(WxGateway.class);
@Autowired
private WxMpConfigStorage wxMpConfigStorage;
@Autowired
private WxMpService wxMpService;
@Autowired
private WxMpMessageRouter wxMpMessageRouter;
@Autowired
private IWxMpService iWxMpService;
@Autowired
private IUserTokenService iUserTokenService;
Gson gson = new Gson();
@Value("${charset}")
private String charset;
/**
* 微信公众号主网关,负责处理所有和微信公众号信息交互
*/
@RequestMapping("/main")
public void gateway(HttpServletRequest request, HttpServletResponse response, String xml)
throws IOException {
response.setCharacterEncoding(charset);
logger.debug("接收到消息......");
// 读取输入流
Map reqParam = getAllRequestParam(request);
String signature = request.getParameter("signature");
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
// 验签
if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
// 消息签名不正确,说明不是公众平台发过来的消息
logger.info("非法请求");
response.getWriter().println("非法请求");
response.getWriter().close();
return;
}
String echostr = request.getParameter("echostr");
if (StringUtils.isNotBlank(echostr)) {
// 说明是一个仅仅用来验证的请求,回显echostr
logger.info("echostr:" + echostr);
response.getWriter().println(echostr);
response.getWriter().close();
return;
}
String encryptType = request.getParameter("encrypt_type");
// 加密类型
encryptType = StringUtils.isBlank(encryptType) ? "raw" : encryptType;
if ("raw".equals(encryptType)) {
// 明文传输的消息
String xmlStr = StringUtil.convertStreamToString(request.getInputStream());
WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(xmlStr);
logger.info("{}", xmlStr);
iWxMpService.saveInMsg(inMessage);
WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);
UserToken userToken = iUserTokenService.findByOpenId(inMessage.getFromUser());
if(userToken != null){
if (outMessage != null) {
long msgId = 0;
if (null != inMessage.getMsgId()) {
msgId = inMessage.getMsgId();
}
iWxMpService.saveOutMsg(outMessage, msgId);
// 说明是同步回复的消息
// 将xml写入HttpServletResponse
response.getWriter().write(outMessage.toXml());
} else {
// 说明是异步回复的消息,直接将空字符串写入HttpServletResponse
response.getWriter().write("");
}
}else {
//String reply = "" + "请先绑定账号" + "";
response.getWriter().write(outMessage.toXml());
}
response.getWriter().close();
return;
}
if ("aes".equals(encryptType)) {
// 是aes加密的消息
String msgSignature = request.getParameter("msg_signature");
WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(
request.getInputStream(), wxMpConfigStorage, timestamp,
nonce, msgSignature);
WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);
response.getWriter().write(
outMessage.toEncryptedXml(wxMpConfigStorage));
/**
* 微信服务器发送三次重复的排重问题解决流程:
a.得到数据response.getWriter();
b.得到数据request下的所有数据--->写入一个HashMap中
c.使用response的writer返回一个空白,并且关闭writer,注意如果不关闭的话,那么这个空白消息是不会被传给微信服务器的
*/
response.getWriter().close();
return;
}
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("不可识别的加密类型");
response.getWriter().close();
return;
}
/**
* 获取请求参数中所有的信息
*
* @param request
* @return
*/
public static Map getAllRequestParam(final HttpServletRequest request) {
Map res = new HashMap();
Enumeration> temp = request.getParameterNames();
if (null != temp) {
while (temp.hasMoreElements()) {
String en = (String) temp.nextElement();
String value = request.getParameter(en);
res.put(en, value);
//logger.debug("en:"+en + ">>>>>>" + "value:" + value);
if (null == res.get(en) || "".equals(res.get(en))) {
res.remove(en);
}
}
}
return res;
}
}
4 Maven 引入 开源微信jar包,减少开发困难程度,具体请参看
https://gitee.com/binary/weixin-java-tools
com.github.binarywang
weixin-java-mp
2.9.0
compile