微信开发者 获取发送消息

2018-11-08 14:34:00 weixin_30275415 阅读数 278

1.将安装好的 微开发者工具移动到没有中文路径的地址,然后将   微信开发者工具.exe 更改为英文名字,然后发送到桌面快捷方式

2,按照谷歌配置可跨域的方法配置

 

配置方法(配置的时候请保证 你的软件在关闭状态)

邮件你发送到桌面的快捷方式,然后更改  目标

后面加上 这一句话

--args --disable-web-security --user-data-dir

然后通过这个快捷方式进行打开 微信开发者工具就支持跨域了

转载于:https://www.cnblogs.com/MainActivity/p/9928913.html

2020-04-04 10:55:10 weixin_43446193 阅读数 163

编辑器区域

编辑器区域分为两部分:

  • 项目文件目录和结构展示区:在项目目录或文件上单击右键可完成新建文件、删除、重命名目录或文件等。
  • 代码编辑区:在该区编写代码,可通过模拟器区实时预览。修改wxss、wxml文件,会刷新当前页面。修改js或json文件,会重新编译小程序。
    在这里插入图片描述

代码补全

在代码编写过程中,开发工具提供自动补全功能。
编辑js文件时,会自动补全所有的API,并给出相关注释解释;编辑wxml时,会帮助开发者直接写出相关标签;编辑json文件时,会补全相关的配置,并给出实时提示。

调试器区域

常用调试工具有:

  • Console:显示小程序的错误输出信息和调试代码。
  • Sources:显示当前项目的脚本文件,此处看到的是处理之后的脚本文件。
  • Network:用来观察发送的请求和调用文件的信息,包括文件名称、路径、大小、调用状态、时间等。
  • Storage:显示当前项目使用wx.setStorage或者wx.setStorageSync后的数据存储情况。
  • AppData:显示当前项目当前时刻的具体数据,实时反馈项目数据情况。
  • Wxml:用于帮助开发者开发Wxml转化后的界面。在这里可以看到真实的页面结构及结构对应的wxss属性,也可修改对应属性。

工具栏区域

  • 编译:编译当前代码,并自动刷新模拟器。
  • 预览:将小程序上传,并生成预览二维码。
  • 真机调试:在真实手机上进行调试,会生成调试二维码。
  • 前后台切换:帮助开发者模拟一些客户端的操作环境。如:在操作小程序过程中,有电话进来,小程序就会从前台进入后台,重新访问时,又从后台进入前台。
  • 清缓存:清除各类缓存,包括数据、文件、授权、网络、登录等
    各方面。
  • 上传:小程序开发完成后,需要上传到腾讯服务器进行测试,
    然后可获取测试报告,根据报告进行修改。
  • 版本管理:可以完成对小程序的版本管理。
  • 详情:查看小程序的基本信息和项目配置,也可修改本地配置。

云开发

小程序开发时的云环境,包括:

  1. 云函数
  2. 数据库
  3. 文件存储
  4. 数据分析

注意:创建项目时选择“小程序•云开发”时选用,若选择“不使用云服务”则此处可跳过。

云开发初始页:
在这里插入图片描述
云开发设置页:

在这里插入图片描述
云开发控制台:
在这里插入图片描述

2018-02-01 12:01:24 lethe0624 阅读数 7119

最近开始写微信公众号了,作为小白的我,有些懵,参考各种大神写的博客,总算实现了第一个功能。写此博客作为记录吧。

第一步:注册登录相应微信公众号信息
微信公众号平台地址:https://mp.weixin.qq.com/

第二步:实现内外网穿透
参考博客:http://blog.csdn.net/xyang81/article/details/52141881

第三步:仔细阅读开发文档,地址:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432,然后开始进行编码实现。

我要实现的功能,简单来说就是,获取用户向公众号发送的消息,然后依据一定条件进行消息筛选,符合要求的进行入库操作。
话不多说,开始贴代码吧。

package com.weixin.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.weixin.entity.RequestTextMessage;
import com.weixin.entity.Serial;
import com.weixin.service.SerialService;
import com.weixin.util.ReplyMessage;
import com.weixin.util.SHA1;

@Controller
@RequestMapping
public class RecognitionSerialNumberController {

    private static final Logger log =Logger.getLogger(RecognitionSerialNumberController.class);

  // 设置一个全局的token,开发者自己设置。api这样解释:Token可由开发者可以任意填写,
  // 用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性) 
  private String TOKEN = "guoyou";

    @Autowired
    private SerialService  serialService ;

    @RequestMapping(value="/addSerialNumber.html")
    public void  addSerialNumber(HttpServletRequest request, HttpServletResponse response) throws Exception{ 

        //checkToken(request, response); //仅在认证微信开发者模式时调用一次即可

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        String wxMsgXml =IOUtils.toString(request.getInputStream(), "utf-8");
        log.info("获取的数据信息>>>>>"+wxMsgXml);

        boolean eventType =wxMsgXml.contains("Event") ;// 如果包含,则是触发事件
        RequestTextMessage textMsg =null ;
        String returnXml ="";
        StringBuffer replyMsg = new StringBuffer();
        if(!eventType){ //信息交互事件
            textMsg = ReplyMessage.getRequestTextMessage(wxMsgXml);//解析用户输入的信息
            String content = textMsg.getContent().trim();//用户发送信息
            String openId= textMsg.getFromUserName().trim();//发送方账号(OpenID)
            String creattime=textMsg.getCreateTime();
            String msgType=textMsg.getMessageType();// 发送类型
            String tousername=textMsg.getToUserName();//用户微信号
            boolean  flag= isContainsNumOrLetter(content);

            if(flag) {
                //将数据入库
                Serial serial = new Serial();
                serial.setAddtime(new Date());
                serial.setOpen_id(openId);
                serial.setName(tousername);
                serial.setSn(content);
                serial.setBt_mac_addr("");
                serial.setWifi_mac_addr("");
                serialService.insertSelective(serial);
                //serialService.insert(serial);
                replyMsg.append("返回信息!");
                returnXml = ReplyMessage.getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
            }else {
                replyMsg.append("输入字符不符合格式!");
                returnXml = ReplyMessage.getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
            }
        }

        log.info("wxMsgXml>>>>>>>>>>>>>>"+wxMsgXml);
        log.info("returnXml>>>>>>>>>>>>>>"+returnXml);
        pw.println(returnXml);

    }


    /**
     * 
        * @Title: isContainsNumOrLetter  
        * @Description: TODO(判断字符是否符合要求即包含数字和字母且长度为12) 
        * @param @param str
        * @param @return    参数  
        * @return boolean    返回类型  
        * @throws
     */
    private  boolean isContainsNumOrLetter(String  str) {
        boolean flag = false;

        boolean isDigit = false;//定义一个boolean值,用来表示是否包含数字
        boolean isLetter = false;//定义一个boolean值,用来表示是否包含字母
      //假设有一个字符串
        for (int i=0 ; i<str.length() ; i++){ //循环遍历字符串   
            if (Character.isDigit(str.charAt(i))){     //用char包装类中的判断数字的方法判断每一个字符
                isDigit = true;   
            }
            if (Character.isLetter(str.charAt(i))){   //用char包装类中的判断字母的方法判断每一个字符
                isLetter = true;
            }
        }
            /*循环完毕以后
            *如果isDigit为true,则代表字符串中包含数字,否则不包含
            *如果isLetter为true,则代表字符串中包含字母,否则不包含                 
            */
        //System.out.println(isDigit);          //System.out.println(isLetter);

        if(isDigit && isLetter) {
            //根据字符长度、判断输入是Wifi 还是蓝牙
             int len=str.length();
             if( len == 12) {
                flag = true;
             }
        }
            return flag;
    }


 /*
  * 第一步:验证服务器地址的有效性 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,
  * GET请求携带四个参数:signature、timestamp、nonce、echostr
  * 开发者通过检验signature对请求进行校验(下面有校验方式)。 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,
  * 则接入生效, 成为开发者成功,否则接入失败。
  * 
  * 加密/校验流程如下: 
  * 1. 将token、timestamp、nonce三个参数进行字典序排序 
  * 2. 将三个参数字符串拼接成一个字符串进行sha1加密 
  * 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
  * 
  *  字典排序(lexicographical order)是一种对于随机变量形成序列的排序方法。其方法是,按照字母顺序,或者数字小大顺序,由小到大的形成序列。
  */
    public boolean checkToken(HttpServletRequest request, HttpServletResponse response) throws IOException {
        boolean flag = false;
        // 微信加密签名
        String signature = request.getParameter("signature");
        // 随机字符串
        String echostr = request.getParameter("echostr");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");

        String[] str = { TOKEN, timestamp, nonce };
        Arrays.sort(str); // 字典序排序

        String bigStr = str[0] + str[1] + str[2];
        // SHA1加密
        String digest = new SHA1().getDigestOfString(bigStr.getBytes()).toLowerCase();

        // 确认请求来至微信
        if (digest.equals(signature)) {
            response.getWriter().print(echostr);
            flag = true;
        }else {
            System.out.println("TAG"+"接入失败");
        }
        return flag;
    }

}

ReplyMessage.java

package com.weixin.util;

import java.util.Date;
import java.util.List;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.weixin.entity.Item;
import com.weixin.entity.ReplyTextMessage;
import com.weixin.entity.ReplyTuwenMessage;
import com.weixin.entity.RequestTextMessage;

public class ReplyMessage {

//  获取关注事件
    public static RequestTextMessage getRequestFocus(String xml){

            XStream xstream = new XStream(new DomDriver());

            xstream.alias("xml", RequestTextMessage.class);
            xstream.aliasField("ToUserName", RequestTextMessage.class, "toUserName");
            xstream.aliasField("FromUserName", RequestTextMessage.class, "fromUserName");
            xstream.aliasField("CreateTime", RequestTextMessage.class, "createTime");
            xstream.aliasField("MsgType", RequestTextMessage.class, "messageType");
            xstream.aliasField("Event", RequestTextMessage.class, "event");
            xstream.aliasField("EventKey", RequestTextMessage.class, "eventKey");
//            xstream.aliasField("Content", RequestTextMessage.class, "content");
//            xstream.aliasField("MsgId", RequestTextMessage.class, "msgId");
            RequestTextMessage requestTextMessage = (RequestTextMessage)xstream.fromXML(xml); 
            return requestTextMessage;

    }

//  获取推送文本消息
    public static RequestTextMessage getRequestTextMessage(String xml){
            XStream xstream = new XStream(new DomDriver());
            xstream.alias("xml", RequestTextMessage.class);
            xstream.aliasField("URL", RequestTextMessage.class, "url");
            xstream.aliasField("ToUserName", RequestTextMessage.class, "toUserName");
            xstream.aliasField("FromUserName", RequestTextMessage.class, "fromUserName");
            xstream.aliasField("CreateTime", RequestTextMessage.class, "createTime");
            xstream.aliasField("MsgType", RequestTextMessage.class, "messageType");
            xstream.aliasField("Content", RequestTextMessage.class, "content");
            xstream.aliasField("MsgId", RequestTextMessage.class, "msgId");

            RequestTextMessage requestTextMessage = (RequestTextMessage)xstream.fromXML(xml); 
            return requestTextMessage;
    }


//    回复文本消息
    public static String getReplyTextMessage(String content, String fromUserName,String toUserName){
        ReplyTextMessage we = new ReplyTextMessage();
        we.setMessageType("text");
        we.setFuncFlag("0");
        we.setCreateTime(new Long(new Date().getTime()).toString());
        we.setContent(content);
        we.setToUserName(fromUserName);  
        we.setFromUserName(toUserName);
        XStream xstream = new XStream(new DomDriver()); 
        xstream.alias("xml", ReplyTextMessage.class);
        xstream.aliasField("ToUserName", ReplyTextMessage.class, "toUserName");
        xstream.aliasField("FromUserName", ReplyTextMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", ReplyTextMessage.class, "createTime");
        xstream.aliasField("MsgType", ReplyTextMessage.class, "messageType");
        xstream.aliasField("Content", ReplyTextMessage.class, "content");
        xstream.aliasField("FuncFlag", ReplyTextMessage.class, "funcFlag");
        String xml =xstream.toXML(we);
        return xml;

    }


//    回复图文消息
    public static String getReplyTuwenMessage(String fromUserName,String toUserName,List<Item> articleList){
//      NewsMessage newsMessage = new NewsMessage();
//      MessageUtil messageUtil = new MessageUtil();
        ReplyTuwenMessage we = new ReplyTuwenMessage();
      //  List<Item> articleList = new ArrayList<>();
  //      Articles articles = new Articles();

//        Item item = new Item();
//        Item item2 = new Item();
//        Item item3 = new Item();

        we.setMessageType("news");
        we.setCreateTime(new Long(new Date().getTime()).toString());
        we.setToUserName(fromUserName);  
        we.setFromUserName(toUserName);
        we.setFuncFlag("0");
        we.setArticleCount(articleList.size());
        we.setArticles(articleList);

        XStream xstream = new XStream(new DomDriver()); 
        xstream.alias("xml", ReplyTuwenMessage.class);
        xstream.aliasField("ToUserName", ReplyTuwenMessage.class, "toUserName");
        xstream.aliasField("FromUserName", ReplyTuwenMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", ReplyTuwenMessage.class, "createTime");
        xstream.aliasField("MsgType", ReplyTuwenMessage.class, "messageType");
        xstream.aliasField("Articles", ReplyTuwenMessage.class, "Articles");

        xstream.aliasField("ArticleCount", ReplyTuwenMessage.class, "articleCount");
        xstream.aliasField("FuncFlag", ReplyTuwenMessage.class, "funcFlag");

        //xstream.aliasField("item", Articles.class, "item");
        xstream.alias("item", new Item().getClass());
        xstream.aliasField("Title", Item.class, "title");
        xstream.aliasField("Description", Item.class, "description");
        xstream.aliasField("PicUrl", Item.class, "picUrl");
        xstream.aliasField("Url", Item.class, "url");
        String xml =xstream.toXML(we);
        return xml;
        }


}

RequestTextMessage.java

package com.weixin.entity;
 public class RequestTextMessage {
     private String url;
     private String toUserName;
     private String fromUserName;
     private String createTime;
     private String messageType;
     private String content;
     private String msgId;
     private String event;
     private String eventKey;



    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getToUserName() {
        return toUserName;
    }
    public void setToUserName(String toUserName) {
        this.toUserName = toUserName;
    }
    public String getFromUserName() {
        return fromUserName;
    }
    public void setFromUserName(String fromUserName) {
        this.fromUserName = fromUserName;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getMessageType() {
        return messageType;
    }
    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getMsgId() {
        return msgId;
    }
    public void setMsgId(String msgId) {
        this.msgId = msgId;
    }
    public String getEvent() {
        return event;
    }
    public void setEvent(String event) {
        this.event = event;
    }
    public String getEventKey() {
        return eventKey;
    }
    public void setEventKey(String eventKey) {
        this.eventKey = eventKey;
    }
}

获取/回复用户发送的其他类型消息还未实现,有时间整理出来一并贴出来。革命尚未成功,还需努力呀。

2018-09-27 09:34:18 weixin_35877115 阅读数 6947

公众号类型

测试号

测试号现在仅支持使用预览接口,并不能实现群发。

【图片来源:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21截图】

实现

基于springboot

前端是自己根据图文消息(Article)的格式设计的,Article的内容如下:

【图片来源:官方文档截图】

 

1. 上传内容图片获取URL

【图片来源:官方文档截图】

前端使用bootstrap-fileinput上传图片,传到后台获取URL,然后将URL作为图片链接,放入wangEditor编辑器中。

(此处仅提供图片素材上传功能,暂未考虑视频、音频素材)

【注意:通过获取的微信服务器的URL插入编辑器时,可能会出现”未经允许“的图案,只需在当前html中加入

<meta name="referrer" content="never">

即可】

后台代码如下:

    @PostMapping(value = "/wx/upload/img")
    @ResponseBody
    public String uploadImg(MultipartFile img) throws IOException {
        JsonResult res = ResultUtil.success();
        String url = wxService.postImg(img);
        if (null != url) {
            res.setData(url);
        } else {
            res = ResultUtil.error(ResultEnum.UPLOAD_IMG_FAILURE);
        }
        return res.toString();
    }

     /**
     * 上传图文信息图片
     *
     * @param img 图片
     * @return url
     */
    @Override
    @Nullable
    public String postImg(MultipartFile img) throws IOException {
        // 保存到本地,获取本地图片绝对路径
        String filePath = FileUtil.saveFile("TEMP", img, "TEMP_"+DataUtil.getTimeStringSixBit()+DataUtil.getRandom(6)+".jpg");
        JSONObject res = doPostForm(UPLOAD_IMG_URL.replace("ACCESS_TOKEN", wxTokenHelper.getToken().getToken()), filePath);
        return res.getString("url");
    }

    /**
     * POST请求 - Form格式数据
     *
     * @param url 请求地址
     * @param filePath 文件本地路径
     * @return
     */
    public JSONObject doPostForm(String url, String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            throw new IOException("文件不存在");
        }

        URL urlObj = new URL(url);
        // 连接
        HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();

        con.setRequestMethod("POST");
        con.setDoInput(true);
        con.setDoOutput(true);
        con.setUseCaches(false);

        // 设置请求头信息
        con.setRequestProperty("Connection", "Keep-Alive");
        con.setRequestProperty("Charset", "UTF-8");

        // 设置边界
        String BOUNDARY = "----------" + System.currentTimeMillis();
        con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

        String sb = "--" +
                BOUNDARY +
                "\r\n" +
                "Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n" +
                "Content-Type:application/octet-stream\r\n\r\n";

        byte[] head = sb.getBytes("utf-8");

        // 获得输出流
        OutputStream out = new DataOutputStream(con.getOutputStream());
        // 输出表头
        out.write(head);

        // 文件正文部分
        // 把文件已流文件的方式 推入到url中
        DataInputStream in = new DataInputStream(new FileInputStream(file));
        int bytes = 0;
        byte[] bufferOut = new byte[1024];
        while ((bytes = in.read(bufferOut)) != -1) {
            out.write(bufferOut, 0, bytes);
        }
        in.close();

        // 结尾部分
        byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线

        out.write(foot);

        out.flush();
        out.close();

        StringBuilder buffer = new StringBuilder();
        BufferedReader reader = null;
        String result = null;
        try {
            // 定义BufferedReader输入流来读取URL的响应
            reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            result = buffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                reader.close();
            }
        }

        return JSONObject.parseObject(result);
    }

    

 

2. 上传图文消息素材,得到media_id

【图片来源:官方文档截图】

     /**
     * 上传图文消息素材
     *
     * @param articles 图文消息集合
     * @return media_id
     */
    @Override
    @Nullable
    public String postNews(Article[] articles) {
        JSONObject data = new JSONObject();
        data.put("articles", articles);
        JSONObject res = doPostStr(UPLOAD_NEWS_URL.replace("ACCESS_TOKEN", wxTokenHelper.getToken().getToken()), data.toJSONString());
        return res.getString("media_id");
    }

    /**
     * POST请求 - JSON格式数据
     *
     * @param url
     * @param outStr
     * @return
     */
    public JSONObject doPostStr(String url, String outStr) {
        HttpHeaders headers = new HttpHeaders();
        headers.set("Content-Type", "application/json;charset=UTF-8");// 解决请求乱码问题
        String response = restTemplate.postForEntity(url, new HttpEntity<String>(outStr, headers), String.class)
                .getBody();
        return JSON.parseObject(response);
    }

    /**
 * @author kingsong
 * @create 2018/9/26 9:00
 * @desc 图文消息【推送】实体类
 **/
public class Article {

    private String thumb_media_id;  // 图文消息缩略图media_id

    private String author;  // 图文消息作者

    private String title;  // 图文消息标题

    private String content_source_url;  // “阅读原文”链接,受安全限制,如需跳转Appstore,可以使用itun.es或appsto.re的短链服务,并在短链后增加 #wechat_redirect 后缀。

    private String content;  // 消息内容,支持HTML标签

    private String digest;  // 推送描述,如本字段为空,则默认抓去正文的前64个字

    private int show_cover_pic;  // 是否显示封面

    public String getThumb_media_id() {
        return thumb_media_id;
    }

    public void setThumb_media_id(String thumb_media_id) {
        this.thumb_media_id = thumb_media_id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent_source_url() {
        return content_source_url;
    }

    public void setContent_source_url(String content_source_url) {
        this.content_source_url = content_source_url;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getDigest() {
        return digest;
    }

    public void setDigest(String digest) {
        this.digest = digest;
    }

    public int getShow_cover_pic() {
        return show_cover_pic;
    }

    public void setShow_cover_pic(int show_cover_pic) {
        this.show_cover_pic = show_cover_pic;
    }

}

 

3. 发送图文消息

测试号目前仅支持预览接口

【图片来源:官方文档截图】

后台代码如下:

    @PostMapping(value = "/wx/send/new")
    @ResponseBody
    public String sendNew(String media_id) throws Exception {
        JsonResult res = ResultUtil.success();
        res.setData(wxService.sendNewsByOpenIds(userService.getAllOpenIds(), media_id));
        return res.toString();
    }

    /**
     * 根OpenID群发图文消息
     *
     * @param openIds OpenID集合
     * @param media_id 图文消息媒体编号
     * @return msg_id
     * @throws Exception 发送失败
     */
    @Override
    public String sendNewsByOpenIds(List<String> openIds, String media_id) throws Exception {
        JSONObject data = new JSONObject();
        // 预览接口仅支持一个openID
        data.put("touser", openIds.get(0));
        Map<String, String> npnews = new HashMap<>();
        npnews.put("media_id", media_id);
        data.put("mpnews", npnews);
        data.put("msgtype", "mpnews");
        data.put("send_ignore_reprint", 0);
        JSONObject res = doPostStr(SEND_NEWS_URL.replace("ACCESS_TOKEN", wxTokenHelper.getToken().getToken()), data.toJSONString());
        if(0!=res.getIntValue("errcode")) {
            // 发送失败
            throw new CustomException(ResultEnum.SEND_NEWS_FAILURE);
        } else {
            return res.getString("msg_id");
        }
    }

若出现错误情况,可以查阅微信公众平台技术文档 - 全局返回码说明

2018-04-22 21:57:21 yifan_lion 阅读数 3159

如题,开发微信小程序时,发现在开发者工具中能正常发送收到消息,而在真机中不打开调试模式的情况下不能发送获取消息,找了半天文档终于找到了原因:


服务器域名配置原因引起的


在没设置服务器域名的时候不开启上图不校验的设置时会出现下面的错误信息:


解决方法,如果你开启了不校验合法域名,先关闭掉,然后开始配置服务器域名信息:

首先登录微信公众平台,在小程序中点击设置->开发设置,


点击添加或者修改,配置服务器信息中完善域名信息后,就可以解决了


Tip:域名配置时要注意下面的信息,除了websocket,使用其他域名信息时必须是https协议,也就是必须有ca证书,传说中阿里云百度云都有免费的CA证书可以申请,但是我并没有找到。。。