# 微信生态开发常用接口使用案例
#### 本项目是一个微信生态开发常用接口的案例集合,其中包括:解密小程序code获取openid,发送小程序模板消息,发送公众号模板消息,用户关注、取关公众号的事件处理等。
#### 扩展知识
openid:一个小程序的每个用户都有一个唯一的openid,是一个小程序用户中用户的唯一身份标志,公众号也一样;
unionid:用户的小程序、公众号可在微信开放平台进行关联,关联之后的小程序和公众号有一个相同的unionid,公众号始终有unionid,小程序如果没有和公众号关联是
没有unionid的。
### 1.0:微信小程序解密code得到openid([官方文档](https://developers.weixin.qq.com/miniprogram/dev/api/wx.login.html))
过程如下:
1.前端传入code到后端;
2.后端解密code得到openid、session_key、unionid(小程序和公众号关联后才能解密出unionid)。
### 1.1:发送小程序模板消息([官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html))
过程如下:
必备知识:发送模板消息到指定用户需要用户的formid和openid,formid是用户进行表单提交时微信生成的一个序列号,有效期为一周,开发者每收集一个用户的
formid即可以向该用户发送一次模板消息。
1.收集用户的formid;
2.向指定用户发送模板消息。
### 1.2:对微信公众号进行服务器配置校验token([参考博客](https://blog.csdn.net/LONG_Yi_1994/article/details/90022307))
过程如下:
如果进行微信公众号开发,进行服务器配置是必要的,通过配置,用户与公众号的事件交互消息将发送至开发者配置的URL上,开发者可在自己写的接口内进行事件处理。
1.填写配置信息,确保URL可访问;
2.开发token验证接口。
### 1.3:用户与公众号事件交互处理(包括用户关注、取关公众号事件)
过程如下:
1:用户关注或取关公众号后,微信将把事件消息推送至开发者填写的URL上,开发者可在接口内进行处理,例如:保存用户openid,依据openid得到unionid等。
### 1.4:发送公众号模板消息([官方文档](https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=611048160&lang=zh_CN))
过程如下:
1:发送公众号模板消息和发送小程序模板消息类似,只是发送公众号模板消息是没有限制的,有用户的openid即可发送。
package com.longdatech.decryptcode.controller;
import com.alibaba.fastjson.JSONObject;
import com.longdatech.decryptcode.service.LdkjWxApiService;
import com.longdatech.decryptcode.utils.MyHttpRequestUtil;
import com.longdatech.decryptcode.utils.SignUtil;
import com.longdatech.decryptcode.utils.WxConstant;
import com.longdatech.decryptcode.utils.WxMessageUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
@Slf4j
@Api(description = "微信接口相关控制器")
@RestController
@RequestMapping("/wxapi")
public class Ldkj_WxApiController {
@Autowired
private LdkjWxApiService ldkjWxApiService;
/**
* @description 解密code得到openid
* @author: liyinlong
* @date 2019-05-05 13:58
* @param code
* @return
*/
@ApiOperation("1.0:解密code")
@GetMapping("/decryptCode")
public String decryptCode(@RequestParam String code){
log.info("1.0:解密code===>code:" code);
String result = MyHttpRequestUtil.sendGet(WxConstant.getDesryptCodeUri(code));
JSONObject ojb = JSONObject.parseObject(result);
System.out.println("返回结果:" ojb);
Set<String> keys = ojb.keySet();
keys.forEach(item->{
System.out.println(item ":" ojb.get(item));
});
return ojb.getString("openid");
}
/**
* @description 小程序发送模板消息
* @author: liyinlong
* @date 2019-05-05 13:58
* @return
*/
@ApiOperation("1.1:发送小程序模板消息")
@GetMapping("/sendMiniTemplateMessage")
public String sendMiniTemplateMessage(@RequestParam String formId,@RequestParam String openId){
log.info("1.1:发送小程序模板消息===>formId:" formId ",openId:" openId);
ldkjWxApiService.sendMiniTemplate(formId,openId);
return "success";
}
/**
* @description 微信公众号服务器配置校验token
* @author: liyinlong
* @date 2019-05-09 9:38
* @return
*/
@ApiOperation("1.2:微信公众号服务器配置校验token")
@RequestMapping("/checkToken")
public void checkToken(HttpServletRequest request,HttpServletResponse response){
log.info("1.2:微信公众号服务器配置校验token");
//token验证代码段
try{
log.info("请求已到达,开始校验token");
if (StringUtils.isNotBlank(request.getParameter("signature"))) {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
log.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
log.info("数据源为微信后台,将echostr[{}]返回!", echostr);
response.getOutputStream().println(echostr);
}
}
}catch (IOException e){
log.error("校验出错");
e.printStackTrace();
}
}
/**
* @description 该接口url应与服务器配置中填写的URL保持一致,因校验token与处理用户校验事件都只
* 能用一个URL,所以可以在token验证之后把1.2接口注释掉,把本接口名称改为1.2接口名称
* @author: liyinlong
* @date 2019-05-09 12:10
* @param request
* @param response
* @return
*/
@ApiOperation("1.3:用户与公众号交互事件处理")
@RequestMapping("/handlePubFocus")
public String handlePubFocus(HttpServletRequest request,HttpServletResponse response){
log.info("1.3:用户与公众号交互事件处理");
try{
Map<String ,String > requestMap = WxMessageUtil.parseXml(request);
Set<String> keys = requestMap.keySet();
keys.forEach(item->{
String value = requestMap.get(item);
log.info(item "===>" value);
});
String messageType = requestMap.get("MsgType");
String eventType = requestMap.get("Event");
String openid = requestMap.get("FromUserName");
if(messageType.equals("event")){
//判断消息类型是否是事件消息类型
log.info("公众号====>事件消息");
log.info("openid:" openid);
log.info("Event:" eventType);
if(eventType.equals("subscribe")){
log.info("公众号====>新用户关注");
}else if(eventType.equals("unsubscribe")){
log.info("公众号====>用户取消关注");
}else{
log.info("公众号===>其他");
}
}
}catch (Exception e){
e.printStackTrace();
}
return "";
}
/**
* @description 公众号发送模板消息
* @author: liyinlong
* @date 2019-05-05 13:58
* @return
*/
@ApiOperation("1.4:发送公众号模板消息")
@GetMapping("/sendPubTemplateMessage")
public String sendPubTemplateMessage(@RequestParam String openId){
log.info("1.4:发送公众号模板消息===>openId:" openId);
ldkjWxApiService.sendPubTemplateMessage(openId);
return "success";
}
/**
* @description 生成小程序二维码 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html
* @author: liyinlong
* @date 2019-05-09 15:00
* @param strinfo
* @return
*/
@ApiOperation("1.5:生成小程序二维码")
@GetMapping("/createQrCode")
public String createQrCode(String strinfo){
ldkjWxApiService.createQrCode(strinfo);
return "success";
}
}
资源文件列表
wxutils-master/.gitignore , 303
wxutils-master/.mvn/wrapper/MavenWrapperDownloader.java , 4629
wxutils-master/.mvn/wrapper/maven-wrapper.jar , 48337
wxutils-master/.mvn/wrapper/maven-wrapper.properties , 116
wxutils-master/README.md , 2549
wxutils-master/mvnw , 9114
wxutils-master/mvnw.cmd , 5811
wxutils-master/pom.xml , 4687
wxutils-master/src/main/java/com/longdatech/decryptcode/WxUtils_Application.java , 335
wxutils-master/src/main/java/com/longdatech/decryptcode/controller/Ldkj_WxApiController.java , 6557
wxutils-master/src/main/java/com/longdatech/decryptcode/service/LdkjWxApiService.java , 229
wxutils-master/src/main/java/com/longdatech/decryptcode/service/LdkjWxApiServiceImpl.java , 5480
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/CommonUtil.java , 10814
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/MyHttpRequestUtil.java , 6503
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/MyX509TrustManager.java , 551
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/SignUtil.java , 2244
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/Swagger2.java , 1296
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/TemplateData.java , 465
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/Token.java , 664
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/WxConstant.java , 838
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/WxMessageUtil.java , 1046
wxutils-master/src/main/java/com/longdatech/decryptcode/utils/WxMssVo.java , 563
wxutils-master/src/main/resources/application.yml , 20
wxutils-master/src/test/java/com/longdatech/decryptcode/DemoApplicationTests.java , 436
