• 在进入微信开发前,首先我们要将我们的ip映射成url访问地址,这里我用的是natapp,感觉还是挺稳定的,只不过映射的地址搁一段时间会被替换掉natapp的下载地址https://natapp.cn/接下来进入到微信的公众号平台里面去...
    在进入微信开发前,首先我们要将我们的ip映射成url访问地址,这里我用的是natapp,感觉还是挺稳定的,只不过映射的地址搁一段时间会被替换掉
    
    **natapp的下载地址**https://natapp.cn/
    
    接下来进入到微信的公众号平台里面去,如果还没申请的话可以进行申请,微信的公众号分为三种:订阅号,服务号,企业号,由于这里是屌丝的聚集地,所以只能用订阅号来玩一玩。
    
    公众号平台地址:
    https://mp.weixin.qq.com/cgi-bin/home
    接着我们点击开发-》基本配置-》服务器配置上点击启动,输入我们的后台网址,令牌,接着点击确定就可以了,如果提示错误,说明后台和微信平台没对接成功,需要检查一下传入的参数是否正确。如下是我的ip地址
    ![这里写图片描述](https://img-blog.csdn.net/20170827212853068?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb29pdXk0NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    
    记得启动的natapp服务,以下是我用springmvc搭建的服务器代码,如下:
    
    ```
    @Controller
    @RequestMapping("wechat")
    public class WeChatController {
    
        @RequestMapping(value = "/hello")
        public String index(){
            return "index";
        }
    
        @RequestMapping(value = "/detail")
        public String detail(){
            return "detailpage";
        }
    
    
        @RequestMapping(value = "/home",method= RequestMethod.GET)
        @ResponseBody
        public void valid(HttpServletRequest request, HttpServletResponse response) throws IOException {
            boolean isGet = request.getMethod().toLowerCase().equals("get");
            String code = request.getParameter("code");
            if (isGet) {
                // 微信加密签名
                String signature = request.getParameter("signature");
                // 时间戳
                String timestamp = request.getParameter("timestamp");
                // 随机数
                String nonce = request.getParameter("nonce");
                // 随机字符串
                String echostr = request.getParameter("echostr");
    
                PrintWriter out = response.getWriter();
                // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
                if (SignUtil.checkSignature(signature, timestamp, nonce)) {
                    out.print(echostr);
                }
                out.close();
                out = null;
            }else{
                userpost(request,response);
            }
        }
    
        @RequestMapping(value = "/home",method= RequestMethod.POST)
        public void userpost(HttpServletRequest request, HttpServletResponse response) throws IOException   {
            request.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            String str = null;
            String code = request.getParameter("code");
            try {
                Map message = MessageUtil.xmlToMap(request);
                String fromUser = message.get("FromUserName");
                String toUser = message.get("ToUserName");
                String content = message.get("Content");
                String msgType = message.get("MsgType");
                String msgId = message.get("MsgId");
                Message ms = new Message();
                ms.setContent(content);
                ms.setFromUserName(toUser);
                ms.setToUserName(fromUser);
                ms.setMsgType(msgType);
                str = MessageUtil.textMessageToXml(ms).replace("\n","").replace(" ","");
                out.print(str);
                out.close();
                out = null;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    ```
    签名认证
    
    ```
    /** 
     * 请求校验工具类 
     *  
     * @author liufeng 
     * @date 2013-05-18 
     */  
    public class SignUtil {  
        // 与接口配置信息中的Token要一致  
        private static String token = "chenmianhai";
      
        /** 
         * 验证签名 
         *  
         * @param signature 
         * @param timestamp 
         * @param nonce 
         * @return 
         */  
        public static boolean checkSignature(String signature, String timestamp, String nonce) {  
            String[] arr = new String[] { token, timestamp, nonce };  
            // 将token、timestamp、nonce三个参数进行字典序排序  
            Arrays.sort(arr);  
            StringBuilder content = new StringBuilder();  
            for (int i = 0; i >> 4) & 0X0F];  
            tempArr[1] = Digit[mByte & 0X0F];  
      
            String s = new String(tempArr);  
            return s;  
        }  
    }  
    ```
    
    pojo转换为xml
    
    ```
    /**
     * 基于JAXB的XML生成器: 用于pojo与xml文件的相互转换
     * @author wuwz
     * @ClassName XmlBuilder
     * @DateTime 2016年3月29日 上午10:50:17
     */
    public abstract class XmlBuilder {
    
        private final static Logger log= Logger.getLogger(XmlBuilder.class);
        /**
         * 将pojo转换为XML字符串
         * @param object
         * @return
         */
        public static String convertToXml(Object object) {
            Writer sw = new StringWriter();  
            try {  
                // 利用jdk中自带的转换类实现  
                JAXBContext context = JAXBContext.newInstance(object.getClass());
    
                Marshaller marshaller = context.createMarshaller();  
                // 格式化xml输出的格式  
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);  
                // 将对象转换成输出流形式的xml  
                marshaller.marshal(object, sw); 
                log.debug("XML字符串生成成功!");
            } catch (JAXBException e) {  
                e.printStackTrace();  
            } finally {
                if(sw != null) {
                    try {
                        sw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return sw.toString().replace("standalone=\"yes\"", "");  
        }
    
        /**
         * 将pojo转换为XML文件
         * @param obj
         * @param savePath
         */
        public static File convertToXmlFile(Object obj,String savePath) {
            File file = null;
            String xmlStr = convertToXml(obj);
            if(xmlStr != null && !"".equals(xmlStr)) {
    
                file = new File(savePath);
                if(!file.exists() && file.isFile()) {
                    try {
                        file.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(file.isDirectory()) {
                    System.out.println(MessageFormat.format("{0}不是有效的文件路径.", savePath));
                    return null;
                }
    
                Writer writer = null;
    
                try {
                    writer = new FileWriter(file);
                    writer.write(xmlStr);
                    writer.flush();
                    log.debug("XML文件生成成功!");
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if(writer != null) {
                        try {
                            writer.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
            }
            return file;
        }
    
    
        /**
         * 将XML文件转换为指定类型的pojo
         * @param clazz
         * @param xmlPath
         * @return
         */
        public static Object xmlFileToObject(Class clazz, String xmlPath) {
            Object xmlObject = null;
            Reader fr = null;
            try {
                JAXBContext context = JAXBContext.newInstance(clazz);
                Unmarshaller unmarshaller = context.createUnmarshaller();
                fr = new FileReader(xmlPath);
                xmlObject = unmarshaller.unmarshal(fr);
            } catch (JAXBException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                if (null != fr) {
                    try {
                        fr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return xmlObject;
        }
    
        /**
         * 将XML字符串转换为指定类型的pojo
         * 
         * @param clazz
         * @param xmlStr
         * @return
         */
        public static Object xmlStrToObject(Class clazz, String xmlStr) {
            Object xmlObject = null;
            Reader reader = null;
            try {
                JAXBContext context = JAXBContext.newInstance(clazz);
                // 进行将Xml转成对象的核心接口
                Unmarshaller unmarshaller = context.createUnmarshaller();
                reader = new StringReader(xmlStr);
                xmlObject = unmarshaller.unmarshal(reader);
            } catch (JAXBException e) {
                e.printStackTrace();
            } finally {
                if (null != reader) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return xmlObject;
        }
    }
    ```
    
    以上的内容模拟的是消息接口的接收与回复,详情请查看微信的开发文档
    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
    
    
    
    展开全文
  • 微信公众号开发-开发后台设计》是子恒老师出品的微信公众号开发系列之一,这套视频教程,使用响应式网站的模式,帮你设计好开发后台,让你在后续的微信公众号开发中更高效。欢迎反馈,QQ/微信:68183131
  • 微信小程序后台开发详解 2018-06-18 08:21:53
    微信小程序后台开发 前言 开发环境 开发流程 项目整体结构 接口开发 项目部署 ip映射 Nginx反向代理 gunicorn+super多进程开启服务+进程监控 ssl证书 小程序常用功能 微信支付 生成二维码 推送消息 测试 黑盒...
  • 微信公众号后台开发总结 2019-01-30 16:28:18
    微信公众号后台开发总结 一、项目简介 当前需要做一个公众号后台,前期需要实现的功能有: (1) 在用户关注公众号时便获取用户的信息同时还要将用户信息存入数据库。 (2) 在用户给公众号发送消息时,后台...
  • 微信小程序+Java后台开发 全部代码链接 链接:https://pan.baidu.com/s/1GiIXKgu76Urr7QfZ-U7W9A 提取码:mpio 通过这个博客,你可以快速的搭建一个微信小程序前端和后台相连的一个功能,在这里我会详细的解说每一...
  • 微信后台开发实战教程 2018-02-09 11:36:24
    微信后台开发实战教程讲师介绍: 向军,项目总监,从事IT行业10年以上,服务过acer、fluke、中国石油、光大银行、丰田汽车、三星电子、保洁公司等企业。精PHP/MySQL、C/C++/VC++、VB、Java、SQL Server、Oracle、...
  • Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台。 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前一阵子上线了一个公众号内回复口令解锁网站...
  • 微信小程序云开发开发云函数数据库存储云开发数据库不能被外部调用微信小程序并发问题 云开发开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,...
  • 微信小程序+java后台 2018-03-21 21:30:58
    博主是大四学生,毕业设计做的是微信小程序+java后台。陆陆续续经历了三个月(因为白天要实习又碰上过年玩了一阵子),从对微信小程序一无所知到完成毕设,碰到许多问题,在跟大家分享一下自己的经历和一个小程序...
  •  近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序。因为是初次接触小程序,经过一番摸索和尝试,个人觉得的微信小程序与...
  • 微信小程序的后台搭建常用到腾讯云,包括云数据库与云服务器。
  • 申请微信小程序并认证的步骤参见三掌柜发布的名为“微信小程序:微信公众号申请微信小程序并认证的步骤”这篇文章,这里只介绍怎么正确登录到微信小程序管理后台界面。  发现一个问题,之所以被误导就是因为没有...
  • 现在微信越来越火了,公众平台也越来越火,作为一个公司或者网站,没有一个公众号,你都不好意思跟人...开发模式需要准备网站并且接入微信后台,在微信目前文档不完善,接口不友好的情况下,本文将详细讲解如何快速接入
  • 学习微信公众号的开发,必须先阅读微信开发文档,通过阅读文档,了解有关微信公众开发的步骤及相关限制,了解其工作原理等。 微信开发之入门指引       ...
  • Django微信小程序后台开发教程1 申请小程序,创建hello world小程序2 添加交互框和按钮3 在服务器配置hello django4 实现计算器接口5 配置服务器将后端与微信小程序连接5.1 uwsgi配置5.2 http协议(80端口)下的...
  • 1 申请公众号测试账号...- 在填写接口配置信息的时候需要后台配合验证才能配置成功1.1 验证服务器 输入服务器ip地址和端口号(只支持8
  • spring-boot开发微信小程序后台 本次开发使用spring聚合工程,大概如下  common层:类似枚举类,工具类都放在该层 pojo层:项目实体类 mapper(dao)层:数据库操作 server层:逻辑 api层:接口 自下而上...
1 2 3 4 5 ... 20
收藏数 73,849
精华内容 29,539