美文网首页
微信小程序发送客服消息之小程序卡片

微信小程序发送客服消息之小程序卡片

作者: OrdinaryKnowing | 来源:发表于2018-12-28 14:59 被阅读0次
    实现效果:

    在后台服务器对订单进行回复以后,会给用户推送一张小程序卡片告诉用户他的订单已被回复。点击卡片可以跳转进入订单页面,查看回复。(相比于text消息的好处是用户体验更好,可直接点击进入小程序操作)


    微信图片_20181228142811.jpg
    实现过程:

    微信小程序API:https://developers.weixin.qq.com/miniprogram/dev/api/sendCustomerMessage.html
    服务器端如果要给用户发送消息,需要给微信的URL发出一个post请求。
    请求的地址是 https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

    其中ACCESS_TOKEN是接口调用凭证。
    通过向https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET发送get请求获取。
    appid为小程序的appid,secret为小程序唯一凭证密钥。(「微信公众平台 - 设置 - 开发设置」)

    请求的参数是

    {
    "touser": "OPENID",
    "msgtype": "miniprogrampage",
    "miniprogrampage": {
    "title": "title",
    "pagepath": "pagepath",
    "thumb_media_id": "thumb_media_id"
    }
    }
    touser:对应填入的用户openID
    msgtype:填入"miniprogrampage",表示信息类型为小程序卡片。
    title:为小程序卡片显示的标题。
    pagepath:对应小程序的页面路径。
    thumb_media_id:图片标识ID,即小程序卡片中的图片。

    实现对应的代码如下

        //replyUserMission函数
        //输入openid,给对应openid用户发送小程序卡片。
        public static void replyUserMission(String openid) throws JSONException, IOException {
            String accessToken= WechatService.gainAccessToken();
            //得到小程序的accessToken
    
            String postImage="https://api.weixin.qq.com/cgi-bin/media/upload?access_token="+accessToken+"&type=image";
            //上传图片的URL
    
            Resource resource = new ClassPathResource("images/image.png");
            //获取resource中的图片
    
            InputStream is=resource.getInputStream();
            //得到输入流
    
            byte[] imageByte=new byte[is.available()];//= ImageReader.readImage(imagePath);
            is.read(imageByte);
            is.close();
            //将输入流的信息转为二进制序列。
    
            String res= HttpUtil.httpPost(postImage,imageByte);
            //将图片post给微信服务器
    
            JSONObject obj=new JSONObject(res);
            String thumb_media_id=obj.getString("media_id");
            System.out.println("thumb_media_id"+thumb_media_id);
            //解析服务器返回的json数据,获取thumb_media_id
    
            WechatService.replyMiniProgramme(openid,"您的订单有回复","pages/viewSQL/viewSQL",thumb_media_id);
            //给用户推送小程序卡片
        }
    

    引用到的gainAccessToken静态函数,用于获取AccessToken

        public static String gainAccessToken() throws JSONException {
            String httpurl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=填入自己的appid&secret=对应的secretKey";
            //请求AccessToken的URL
            
            HttpURLConnection connection = null;
            InputStream is = null;
            BufferedReader br = null;
            String result = null;// 返回结果字符串
            
            try {
                // 创建远程url连接对象
                URL url = new URL(httpurl);
                // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
                connection = (HttpURLConnection) url.openConnection();
                // 设置连接方式:get
                connection.setRequestMethod("GET");
                // 设置连接主机服务器的超时时间:15000毫秒
                connection.setConnectTimeout(15000);
                // 设置读取远程返回的数据时间:60000毫秒
                connection.setReadTimeout(60000);
                // 发送请求
                connection.connect();
                // 通过connection连接,获取输入流
                if (connection.getResponseCode() == 200) {
                    is = connection.getInputStream();
                    // 封装输入流is,并指定字符集
                    br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                    // 存放数据
                    StringBuffer sbf = new StringBuffer();
                    String temp = null;
                    while ((temp = br.readLine()) != null) {
                        sbf.append(temp);
                        sbf.append("\r\n");
                    }
                    result = sbf.toString();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭资源
                if (null != br) {
                    try {
                        br.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
                if (null != is) {
                    try {
                        is.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                connection.disconnect();// 关闭远程连接
            }
    
            JSONObject jsonObject = new JSONObject(result);
            String str = jsonObject.getString("access_token");
    
            return str;
        }
    

    发送POST请求和接收回复的类

    public class HttpUtil {
    
        public static String httpPost(String httpUrl,byte[] imagebyte){
    
            HttpPost httpPost = new HttpPost(httpUrl);
            ByteArrayBody image = new ByteArrayBody(imagebyte, ContentType.APPLICATION_JSON,"image.png");//传递图片的时候可以通过此处上传image.jpg随便给出即可
    
            MultipartEntityBuilder me = MultipartEntityBuilder.create();
            me.addPart("image", image);//image参数为在服务端获取的key通过image这个参数可以获取到传递的字节流,这里不一定就是image,你的服务端使用什么这里就对应给出什么参数即可
    
            DefaultHttpClient client= new DefaultHttpClient();
            HttpEntity reqEntity = me.build();
            httpPost.setEntity(reqEntity);
            HttpResponse responseRes = null;
            try {
                responseRes=client.execute(httpPost);
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                client.close();
            }
    
            int status = responseRes.getStatusLine().getStatusCode();
            String resultStr =null;
            if (status == 200) {
                byte[] content;
                try {
                    content = getContent(responseRes);
                    resultStr = new String(content,"utf-8");
                    System.out.println("httpPost返回的结果==:"+resultStr);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(resultStr);
            if(resultStr !=null){
                return resultStr;
            }else{
                return "";
            }
        }
    
        private static byte[] getContent(HttpResponse response)
                throws IOException {
            InputStream result = null;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            try {
                HttpEntity resEntity = response.getEntity();
                if (resEntity != null) {
                    result = resEntity.getContent();
                    int len = 0;
                    while ((len = result.read()) != -1) {
                        out.write(len);
                    }
                    return out.toByteArray();
                }
            } catch (IOException e) {
                e.printStackTrace();
                throw new IOException("getContent异常", e);
            } finally {
                out.close();
                if (result != null) {
                    result.close();
                }
            }
            return null;
        }
    
    }
    

    发送用户小程序卡片

    //返回用户一个mini小程序卡片
            String accessToekn=gainAccessToken();
            URL url = new URL("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="+accessToekn);
    //post参数
            String newpostData="{\n" +
                    "  \"touser\": \""+openid+"\",\n" +
                    "  \"msgtype\": \"miniprogrampage\",\n" +
                    "\"miniprogrampage\": {"+
                    "\"title\":\""+title+"\","+
                        "\"pagepath\": \""+pagepath+"\","+
                        "\"thumb_media_id\": \""+thumb_media_id+"\""+
                        "}"+
                    "}";
            byte[] postDataBytes = newpostData.toString().getBytes("UTF-8");
    
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
            conn.setDoOutput(true);
            conn.getOutputStream().write(postDataBytes);
    
            Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    
            StringBuilder sb = new StringBuilder();
            for (int c; (c = in.read()) >= 0;)
                sb.append((char)c);
            String response = sb.toString();
            System.out.println("response:"+response);
    
            return response;
        }
    

    相关文章

      网友评论

          本文标题:微信小程序发送客服消息之小程序卡片

          本文链接:https://www.haomeiwen.com/subject/owwslqtx.html