实例介绍
【实例简介】
# 微信生态开发常用接口使用案例
#### 本项目是一个微信生态开发常用接口的案例集合,其中包括:解密小程序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"; } }
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论