小程序客服及消息推送开发(后台JAVA)

最近公司在做小程序,涉及到客服及消息推送,简单的记录下开发过程及心得

客服

小程序自带的有客服功能只需要开启就行了.


选择开启后即可使用.

消息推送

首先在开发 开发设置中配置消息推送


URL: 服务器 设置自己服务器的路径.
Token(令牌): 自己设置,后面再自己的URL需对应.
EncodingAESkey(消息加密秘钥):涉及到加密解密,自己设置,推荐使用随机生成.
消息加密方式: 我这里选择的是明文模式.
数据格式: XML 和 JSON 都行,我选择的是JSON(听说JSON有问题,不过目前没遇到).

配置完后点击保存配置,此时微信端会发送一个GET请求到之前配置的URL路径中进行校检.废话不说直接贴代码

 // 与接口配置信息中的Token要一致private static String WECHAT_TOKEN = "ZIJIESHANYAO";
@RequestMapping("/checkToken")public void get(HttpServletRequest request, HttpServletResponse response) throws Exception {boolean isGet = request.getMethod().toLowerCase().equals("get");PrintWriter print;if (isGet) {// 微信加密签名String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if (signature != null && checkSignature(signature, timestamp, nonce)) {System.out.println("111111111");System.out.println("jiaoyanchenggong");try {print = response.getWriter();print.write(echostr);print.flush();} catch (IOException e) {e.printStackTrace();}} else {}} else {}}/*** 验证签名** @param signature* @param timestamp* @param nonce* @return*/public static boolean checkSignature(String signature, String timestamp, String nonce) {String[] arr = new String[]{WECHAT_TOKEN, timestamp, nonce};// 将token、timestamp、nonce三个参数进行字典序排序// Arrays.sort(arr);sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}/*** 将字节数组转换为十六进制字符串** @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串** @param mByte* @return*/private static String byteToHexStr(byte mByte) {char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}public static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}}

校检成功后就可以选择模板进行设置发送消息了,至于如何设置选择模板,这里不多说,直接看下就知道了,下面说下消息推送的具体实现.
第一步 : 获取模板 ID 自己去选择适合自己的模板 https://mp.weixin.qq.com
第二步 : 获取form_id ,前端设置按钮,点击按钮提交表单可以获取 formId(对于后台,直接去找前端要就行了).
第三步 : 调用接口具体的实现.

/** 微信小程序推送单个用户* */@RequestMapping(value = "/Phsu", method = RequestMethod.POST)@ResponseBodypublic String pushOneUser(String openid, String formid, Long orderId) {//获取access_tokenString access_token = getAccess_token(Global.appId, Global.secret);//这里是自己小程序的appId和secretKeyString url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +"?access_token=" + access_token;//拼接推送的模版WxMssVo wxMssVo = new WxMssVo();wxMssVo.setTouser(openid);//用户openidwxMssVo.setTemplate_id("DkA9fB-xmODJLVf1JvRtWdxr5-iTGETOfV5_6Nuk8NU");//模版idwxMssVo.setForm_id(formid);//formidMap<String, TemplateDataVo> m = new HashMap<>();if (order.getStatus().equals(20)) {List<OrderProduct> orderProducts = order.getOrderProducts();String ProductName = null;for (OrderProduct orderProduct : orderProducts) {ProductName = orderProduct.getName();}TemplateDataVo keyword1 = new TemplateDataVo();keyword1.setValue(ProductName);//商品名称m.put("keyword1", keyword1);wxMssVo.setData(m);System.out.println(keyword1.getValue() + ":name");TemplateDataVo keyword2 = new TemplateDataVo();keyword2.setValue(order.getOrderSn() + "");//订单编号m.put("keyword2", keyword2);wxMssVo.setData(m);System.out.println(keyword2.getValue() + ":bianhao");TemplateDataVo keyword3 = new TemplateDataVo();keyword3.setValue(order.getTotalPrice() + "");//订单金额m.put("keyword3", keyword3);wxMssVo.setData(m);System.out.println(keyword3.getValue() + ":jine");TemplateDataVo keyword4 = new TemplateDataVo();keyword4.setValue(order.getPoyTime() + "");//支付时间m.put("keyword4", keyword4);wxMssVo.setData(m);System.out.println(keyword4.getValue() + ":time");}ResponseEntity<String> responseEntity =restTemplate.postForEntity(url, wxMssVo, String.class);System.out.println(responseEntity.getBody() + "wancheng");//发送成功return responseEntity.getBody()}
/** 获取access_token* appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来* */public String getAccess_token(String appid, String appsecret) {//获取access_tokenString url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +"&appid=" + appid + "&secret=" + appsecret;String json = restTemplate.getForObject(url, String.class);AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);return accessToken.getAccess_token();}
@Getter@Setter
public class AccessToken {private String access_token;
}
/*** 微信平台一些固定参数*/
@Data
public class Global {// 小程序唯一标识 (在微信小程序管理后台获取)public static final String appId = "";// 小程序的 app secret (在微信小程序管理后台获取)public static final String secret = "";// 授权(必填)public static final String grant_type = "";//请求地址public static final String requestUrl="https://api.weixin.qq.com/sns/jscode2session";public String getAppId(){return appId;}public String getSecret(){return secret;}public String getGrant_type(){return grant_type;}public String getRequestUrl(){return requestUrl;}
}

至此消息推送完成.

但是随后发现之前配置的客服不能使用了


看下文档, https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/trans.html 发现
如果配置了消息推送,所有用户发给小程序的消息都会被转发到已填写的服务器地址中,此时我们需要处理的是将微信转发到后台的消息取出返回给客服,并将客服消息返回给用户.
官网上有对各种消息的具体格式.https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/receive.html
下面我只处理文本形式.
当微信将消息推送到后台,会推送到之前配置的URL 地址,以POST请求的方式.

/*** 接收微信后台发来的用户消息* @return*/@RequestMapping(value = "/checkToken", method = RequestMethod.POST)@ResponseBodypublic String receiveMessage(@RequestBody Map<String, Object> msg) {//获取tokenString access_token = getAccess_token(Global.appId, Global.secret);System.out.println("access_token:--------" + access_token);//用户openIdString fromUserName = msg.get("FromUserName").toString();String createTime = msg.get("CreateTime").toString();String toUserName = msg.get("ToUserName").toString();String msgType = msg.get("MsgType").toString();if (msgType.equals("text")) { //收到的是文本消息,并将消息返回给客服HashMap<String, Object> resultMap = new HashMap<>();resultMap.put("ToUserName", fromUserName);resultMap.put("FromUserName", toUserName);resultMap.put("CreateTime", Long.parseLong(createTime));resultMap.put("MsgType", "transfer_customer_service");String json = JSON.toJSONString(resultMap);com.alibaba.fastjson.JSONObject result = com.alibaba.fastjson.JSONObject.parseObject(json);return result.toString();}//客服方面,也回复一个文本消息JSONObject text = new JSONObject();text.element("content", msg.get("MsgType"));JSONObject json = new JSONObject();json.element("touser", toUserName);json.element("text", text);json.element("msgtype", "text");//发送aipsendMsToCustomer(access_token, json);return "success";}/*** 用户发送消息给客服** @param json 消息的参数*/private void sendMsToCustomer(String access_token, JSONObject json) {RestTemplate restTemplate = new RestTemplate();//access_tokenString result = restTemplate.postForEntity("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" +access_token, json, String.class).getBody();}


至此,消息推送及客服全部完成.

总结

其实整体流程还是比较简单的,只是开启消息推送的有点坑之外其他的还好说,做之前多看几遍文档熟悉,新人第一次写博客如有错误请指正,共同学习.

小程序消息推送及客服(JAVA后台)相关推荐

  1. php微信小程序物流进度推送,微信小程序 消息推送php服务器验证实例详解

    微信小程序 消息推送php服务器验证实例详解 设置页面("设置">>"开发设置"): 1.设置服务器域名 注意http和https协议的不同. 2. ...

  2. nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能

    利用Nodejs怎么实现一个微信小程序消息推送功能 发布时间:2021-01-20 13:55:29 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程 ...

  3. C# .Net 小程序消息推送配置+详细代码

    C# .Net 小程序消息推送配置+详细代码 首先在微信公众平台登录小程序账号    第一步登陆    登录后,在首页-功能-订阅信息,打开后如未进行配置,需要进行后台配置.    第二步:填写服务器 ...

  4. TP6 微信小程序消息推送配置Token校验失败200302

    ThinkPHP6 微信小程序消息推送配置时报错: {"ret":200302,"err_msg":"verify token fail"} ...

  5. 微信小程序消息推送(订阅消息原模板消息)开发流程

    注:模板消息没了. 正常开发肯定需要前后端配合,此处都在小程序里写了 参考文档:https://developers.weixin.qq.com/miniprogram/dev/framework/o ...

  6. 【小程序】一次关于小程序消息推送能力的分析及实现

    一.推送消息需求 一个简单常见的需求:推送小程序消息通知到用户! 需要解决的问题: 小程序消息推送服务有什么限制? 小程序可支持推送哪些类型消息? 如何实现小程序消息通知推送服务? 二.小程序提供的能 ...

  7. 小程序消息推送配置 Token校验失败,请检查确认

    一.小程序消息推送配置 Token校验失败,请检查确认 添加配置失败,原因 只要是没有echostr原样返回,就会报错: 注意,返回的事echostr的内容,而不是key=value格式 示例如下: ...

  8. 小程序消息推送(含源码)java实现小程序推送,springboot实现微信消息推送

    本文是比较老得技术来实现,用最新技术实现小程序推送,请看 5行java代码实现微信小程序模版消息推送 (含springboot后台和小程序源码) 也可以看最新的视频讲解:https://edu.csd ...

  9. 微信小程序消息推送、接收消息事件、发送客服消息

    文档地址消息推送 | 微信开放文档 接收消息和事件 | 微信开放文档 发送客服消息 | 微信开放文档 代码参考 public function xcxToken(){$signature = $thi ...

最新文章

  1. hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available
  2. java bytebuffer 大小,bytebuffer 获取长度
  3. 信息系统项目管理知识--项目质量管理
  4. 未定义的引用_Rust 引用和借阅
  5. android bitmap裁剪中间,Android裁剪中心位图
  6. Windows 2000/XP中对窗口进行透明化
  7. AI+社交,快手商业化落地之道
  8. 最近参加的CTF的预赛预演练习题
  9. c++ enum 给定类型_在 Rust 中创建 C/C++ API
  10. 报错:content type application/x-www-form-urlencoded;
  11. 【Asp.Net从零开始】:使用缓存来提高网站性能 Caching(一)
  12. 服务器自带raid功能吗,服务器的 RAID 功能介绍
  13. WPF 入门教程StackPanel介绍
  14. QQ浏览器,正式推出,9.0版本又多些好东西!
  15. Spring中过滤器和拦截器
  16. php 泛型编程,泛型是什么,C++泛型编程又是什么?
  17. 安卓开发使用ttf文字_Android应用使用自定义字体
  18. 人体颈椎神经分布图高清,颈椎部神经分布图高清
  19. 小程序apkg还原_如何禁用微信小程序(适合任何机型的完美解决方案)
  20. 计算机图形学2-Liang-Barsky直线裁剪算法

热门文章

  1. 计算机网络实验3--IP静态路由搭建
  2. worker服务器推送消息,浏览器中serviceWorker用法
  3. 交通银行计算机岗位薪资,交通银行员工年终奖
  4. 小米手机短信闪退处理方法
  5. 人工智能:长相越「娘」颜值越高
  6. 虚幻四蓝图编辑之开关门
  7. 致我那终将逝去的青春——小二的原创经典
  8. 病理图像处理个人手札(一)切片制作预处理-标准化
  9. 云服务器如何选择合适的宽带大小?带宽计算、网络流量、页面大小
  10. SpringBoot 基于 OAuth2 统一身份认证流程详解