• 在进入微信开发前,首先我们要将我们的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
    
    
    
    展开全文
  • 现在微信越来越火了,公众平台也越来越火,作为一公司或者网站,没有一公众号,你都不好意思跟人...开发模式需要准备网站并且接入微信后台,在微信目前文档不完善,接口不友好的情况下,本文将详细讲解如何快速接入
  • 微信公众号开发教程(一)验证接入本篇文章主要介绍了微信公众号开发接入详细流程,希望对刚接触公众号开发的同学有所帮助,有兴趣的同学可多多关注叩丁狼公众号,后续会更新不同的公众号小案例。公众号的分类我们平常...
  • 微信开发之——接入指南 2017-01-18 17:23:05
    接入微信公众平台开发,开发者需要按照如下步骤完成: 1、填写服务器配置 2、验证服务器地址的有效性 3、依据接口文档实现业务逻辑 下面详细介绍这3步骤。 第一步:填写服务器配置 登录微信公众平台...
  • 微信开发接入 2014-02-10 09:56:50
    微信开发 微信接入
  • 由于项目是采用java编写的,微信包括微信支付大都是php相关,于是微信支付官方文档对java的支持就不是很友好,在网上找了很文章,基本上没有一篇是真正跑的通的,经过一番整理,先将java接入微信支付详细流程总结...
  • 微信公众号后台开发总结 2018-08-01 15:39:28
    微信公众号后台开发总结 一、项目简介 当前需要做一公众号后台,前期需要实现的功能有: (1) 在用户关注公众号时便获取用户的信息同时还要将用户信息存入数据库。 (2) 在用户给公众号发送消息时,后台...
  • 通过热门框架spring boot来学习微信公众号开发,帮助同学们快速入门微信公众号开发
  • 这篇文章使用一些简单的代码例子来解释微信接入支付宝支付功能的操作步骤,即使新手也可以轻松参透的。 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口...
  • 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先判断消息的合法性...
  • requestPayment函数的确是微信小程序前端唯一需要调用到的函数,但想实现小程序接入微信支付功能远不止一函数,对于没有做过接入微信支付的开发者,会觉得无从下手。在小程序中接入支付功能首先要申请微信支付,小...
  • 这篇文章是献给正在开发微信支付,但是对微信支付的流程,或是看微信支付文档有疑问的小伙伴们,我也是一枚小白,在第一次对接微信支付,也是措手不及。ok 不说了,写的不好,大家不要喷我哈。 1、第一步  我们...
  • 微信公众号是另一家公司运营管理,现在我们需要在公众号加功能菜单,该功能菜单需要获取当前用户信息,我们平台能不能部署在2级域名的地址上?从而连接微信的api接口
  •  1:如果你没有服务器,那你需要一内网映射工具:我用的是《花生壳》(PS:这不是广告),花生壳在实名认证是需要8RMB的认证费,之后就可以永久使用了,并且支持80端口映射,  注:花生壳在免费申请时要申请...
  • PHP开发APP微信支付接口 2019-09-10 15:06:50
    这段时间在给一iOS应用程序开发个微信支付接口,之前并没有接触过微信支付,翻阅了一上午的微信开发文档,对其流程做了大致的了解后,便开始着手该接口程序的编写。 编写的过程中也遇到了各种各样的问题,各方...
  • 本文主要讲述微信小程序接入微信支付开发过程中遇到的坑,分为两大块,小程序端和后台接口封装。一、后台接口封装本文介绍基于ThinkPHP5进行接口封装,具体步骤如下:1、微信支付官方文档提供了PHP脚本微信支付的...
  • 接入微信公众平台开发,开发者需要按照如下步骤完成: 1、填写服务器配置 2、验证服务器地址的有效性 3、依据接口文档实现业务逻辑 第一步:填写服务器配置 登录微信公众平台官网后,在公众平台后台管理页面 ...
  • 首先,我简单总结一下这几天搞微信支付和支付宝支付接口的体会,通过这几天的...做微信支付接口接入,官方文档负责参考所需传递的参数,Demo完全没必要去下(鸡肋),觉得最靠谱的还是在Github找一有注释的完整D...
  • 前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA...(一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin
  • ASP.NET WEBAPI实现微信接入验证首先你需要一微信公众号,很重要的是你需要完成认证,这点非常重要,如果不认证优先功能无法实现。 当你完成公众号的基本设定后,我们需要为开发做第一件事情:基本配置。下面我...
1 2 3 4 5 ... 20
收藏数 21,815
精华内容 8,726