• 进入开发者工具:公众号页面左下角 进入公众平台测试账号:开发者工具页面中...注意:本次微信开发专题,全部使用spring boot进行开发。 CODE:servletimport java.io.IOException; import java.io.PrintWriter;im

    配置位置
    进入公众号:https://mp.weixin.qq.com
    进入开发者工具:公众号页面左下角
    进入公众平台测试账号:开发者工具页面中

    下面有张图片,介绍配置:
    这里写图片描述

    下面来看看Token验证。注意:本次微信开发专栏,全部使用spring boot进行开发。
    CODE:servlet

    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.shw.vote.web.service.AuthService;
    
    public class ServerPortal extends HttpServlet {
        private static final long serialVersionUID = 1L;
        //我们的Token
        private static final String token = "tokensh";
    
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ServerPortal() {
            super();
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String signature = request.getParameter("signature");
            String timestamp = request.getParameter("timestamp");
            String nonce = request.getParameter("nonce");
            String echostr = request.getParameter("echostr");
            System.out.println("signature:" + signature);
            System.out.println("timestamp:" + timestamp);
            System.out.println("nonce:" + nonce);
            System.out.println("echostr:" + echostr);
            PrintWriter pw = response.getWriter();
            pw.append(echostr);
            pw.flush();
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    spring boot需要注入servlet:

    @Bean  
    public ServletRegistrationBean testServletRegistration() {  
        ServletRegistrationBean registration = new ServletRegistrationBean(new ServerPortal());  
        //我们的URL
        registration.addUrlMappings("/portal");  
        return registration;  
    }

    上面我们设定Token为tokensh:
    private static final String token = “tokensh”;

    由于Token验证接口URL必须是域名,我这边使用了ngrok来处理域名的问题:
    参考http://www.qydev.com/
    注意,Token验证的地址一定要用80端口。
    假设我们的域名为https://sunhush.tunnel.qydev.com
    URL处我们填:https://sunhush.tunnel.qydev.com/portal

    Token , URL都设定了,提交,提示提交成功,则配置完毕。

    参考资料:http://www.cnblogs.com/janken/p/5593737.html

    展开全文
  • 扫描关注后登录 ...填写JS接口安全域名 ,设置JS接口安全域后,通过关注该测试号,开发者即可在该域名下调用微信开放的JS接口,请阅读微信JSSDK开发文档。 注意:不知道啥原因,自己的帐号申请测试

    官方链接:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    扫描关注后登录

    需要填写接口配置,一个公网能访问的域名,推荐用natapp。

    填写JS接口安全域名 ,设置JS接口安全域后,通过关注该测试号,开发者即可在该域名下调用微信开放的JS接口,请阅读微信JSSDK开发文档

    注意:不知道啥原因,用自己的帐号申请测试帐号后貌似不能立即关注,但是同事的微信能关注。自己的帐号是过了两天就能关注了。



    展开全文
  • 接入微信公众平台开发需要使用微信公众号,由于正式微信公众号...所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,微信还提供了微信公众帐号测试号,通过手机微信扫描二维码即可获得测试号。
    接入微信公众平台开发需要使用微信公众号,由于正式微信公众号注册具有一定门槛,普通用户很难申请。所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,微信还提供了微信公众帐号测试号,通过手机微信扫描二维码即可获得测试号。
    测试号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
    当普通微信用户向公众号发送消息或者与微信公众号进行互动触发某些事件时,微信服务器将会把这些消息或者事件以XML数据包格式POST到开发者配置的服务器地址URL上,对于公众号和公众账号测试号的配置方式如下。

    配置微信公众号

    微信公众平台地址:https://mp.weixin.qq.com
    配置步骤:公众平台首页-->开发-->基本配置-->服务器配置-->修改配置。

    配置测试号

    测试号管理地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
    对于公众账号测试号,在接口配置信息中对服务器地址URL和令牌Token进行设置,配置规则与正式微信公众号相同。

    验证服务器地址URL

    开发者提交配置信息后,微信服务器将发送GET请求到填写的服务器地址URL上以验证配置的服务器地址URL是否正确并确认开发者的身份,GET请求携带参数如下表所示:
    开发者需在配置的服务器地址URL中对GET请求传入的signature进行校验,以确认此次请求是否来自微信服务器,若确认此次GET请求来自微信服务器,只需原样返回echostr参数内容即可接入成功,否则接入失败。
    加密/校验流程如下:
    1)将token、timestamp、nonce三个参数进行字典序排序;
    2)将三个参数字符串拼接成一个字符串进行sha1加密;
    3)开发者获得加密后的字符串可与signature对比,判断该请求是否来源于微信。
    校验signature的Java示例代码如下。
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import com.pengjunlee.wechat.msg.WeChatEncrypt;
    import com.pengjunlee.wechat.msg.WechatSession;
    
    /**
     * 处理微信消息和事件专用控制器
     */
    @Controller
    @RequestMapping("/wechat")
    public class WeChatController
    {
    
        private static final String token = "pengjunlee";// 公众号管理后台配置的令牌(Token)
    
        /**
         * 验证微信服务器端GET请求 实现一
         * 
         * @param out
         * @param request
         * @param response
         */
        @RequestMapping(value = "/index", method = RequestMethod.GET)
        public void checkSignature(PrintWriter out, HttpServletRequest request, HttpServletResponse response)
        {
    
            String signature = request.getParameter("signature"); // 微信加密签名
            String timestamp = request.getParameter("timestamp"); // 时间戳
            String nonce = request.getParameter("nonce"); // 随机数
            String echostr = request.getParameter("echostr"); // 随机字符串
    
            String[] arr = new String[]
            {
                    token, timestamp, nonce
            };
    
            // 对数组内的token、timestamp、nonce三个元素进行字典序排序
            Arrays.sort(arr);
    
            // 将排序后的token、timestamp、nonce三个字符串按顺序拼接成一个字符串
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < arr.length; i++)
            {
                sb.append(arr[i]);
            }
    
            // 对拼接好的字符串进行SHA-1加密
            String tmpStr = WeChatEncrypt.encrypt(sb.toString(), WeChatEncrypt.SHA_1);
    
            // 将加密后的字符串与signature进行比较
            if (tmpStr.equals(signature))
            {
                out.print(echostr);// 身份验证成功,将echostr字符串内容原样返回
            }
            else
            {
                out.print("");// 身份验证失败,返回空字符串
            }
            out.flush();
            out.close();
        }
    
        /**
         * 验证微信服务器端GET请求 实现二
         * 
         * @param out
         * @param signature
         * @param timestamp
         * @param nonce
         * @param echostr
         * @throws Exception
         */
        @GetMapping(value = "/index2")
        public void checkSignature2(PrintWriter out, @RequestParam(value = "signature", required = true) String signature, @RequestParam String timestamp,
                @RequestParam String nonce, @RequestParam String echostr) throws Exception
        {
            List<String> list = new ArrayList<String>(3)
            {
                private static final long serialVersionUID = 1L;
    
                @Override
                public String toString()
                {
                    return this.get(0) + this.get(1) + this.get(2);
                }
            };
            list.add(token); // 令牌
            list.add(timestamp);// 时间戳
            list.add(nonce);// 随机数
    
            Collections.sort(list); // 排序
            String tmpStr = WeChatEncrypt.encrypt(list.toString(), WeChatEncrypt.SHA_1); // SHA-1加密
            if (signature.equals(tmpStr))
            {
                out.write(echostr); // 身份验证成功,将echostr字符串内容原样返回
            }
            else
            {
                out.write(""); // 身份验证失败,返回空字符串
            }
            out.flush();
            out.close();
        }
    
        /**
         * 接收微信服务器POST过来的各种消息&事件
         * 
         * @param request
         * @param response
         * @throws Exception
         */
        @PostMapping(value = "/index")
        public void interceptMsgAndEvent(HttpServletRequest request, HttpServletResponse response) throws Exception
        {
            // response.setCharacterEncoding("UTF-8");
            response.setContentType("application/xml; charset=UTF-8"); // 设置响应内容的类型和编码字符集
            InputStream in = request.getInputStream();
            PrintWriter out = response.getWriter();
            handleMsgAndEvent(in, out);
        }
    
        /**
         * 处理微信服务器POST过来的各种消息&事件
         * 
         * @param in
         * @param out
         * @throws Exception
         */
        public void handleMsgAndEvent(InputStream in, PrintWriter out) throws Exception
        {
    
            WechatSession session = new WechatSession(in, out);
            session.process(); // 处理微信消息或者事件
            session.close(); // 关闭Session
        }
    }
    
    WeChatEncrypt  加密工具类。
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * 微信公众号字符串加密工具类
     */
    public class WeChatEncrypt
    {
    
        public static final String MD5 = "MD5";
        public static final String SHA_1 = "SHA-1";
        public static final String SHA_256 = "SHA_256";
    
        /**
         * 使用指定的加密算法对字符串进行加密
         * 
         * @param srcStr
         *            要加密的字符串
         * @param encryptType
         *            MD5\SHA_1\SHA_256
         * @return 加密后的字符串
         */
        public static String encrypt(String srcStr, String encryptType)
        {
            String desStr = "";
            try
            {
                if ((encryptType == null) || ("".equals(encryptType)))
                    encryptType = "MD5";
                MessageDigest md = MessageDigest.getInstance(encryptType);
                md.update(srcStr.getBytes());
                desStr = bytes2Hex(md.digest());
            }
            catch (NoSuchAlgorithmException e)
            {
                return srcStr;
            }
            return desStr;
        }
    
        /**
         * 将字节数组转换为16进制字符串
         * 
         * @param bts
         * @return
         */
        private static String bytes2Hex(byte[] bts)
        {
            String des = "";
            String tmp = null;
            for (int i = 0; i < bts.length; i++)
            {
                tmp = Integer.toHexString(bts[i] & 0xFF);
                if (tmp.length() == 1)
                {
                    des += "0";
                }
                des += tmp;
            }
            return des;
        }
    
        public static void main(String[] args)
        {
            String strSrc = "\u53EF\u4EE5\u52A0\u5BC6\u6C49\u5B57";
            System.out.println("Source String:" + strSrc);
            System.out.println("Encrypted String:");
            System.out.println("Use MD5:" + encrypt(strSrc, null));
            System.out.println("Use MD5:" + encrypt(strSrc, "MD5"));
            System.out.println("Use SHA:" + encrypt(strSrc, "SHA-1"));
            System.out.println("Use SHA-256:" + encrypt(strSrc, "SHA-256"));
        }
    }
    本文项目源码已上传至CSDN,资源地址:http://download.csdn.net/download/pengjunlee/10257857
    展开全文
  • 进入网址后,会分配一个appID和appsecret账号: 需要一个外网映射工具,可在此链接中下载https://natapp.cn/login。 然后将你的外网映射地址修改对应的URL中:注意只修改前面的路径,保留后面的/wx/portal,第.....

    微信测试官方网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    进入网址后,会分配一个appID和appsecret账号:

     需要一个外网映射工具,可在此链接中下载https://natapp.cn/login

    然后将你的外网映射地址修改对应的URL中:注意只修改前面的路径,保留后面的/wx/portal,第一次保存会报错,再次提交一次就好了。

    然后修改如下图中的配置

    将外网映射的url粘贴上去,去除前面的http,如下图:

     

    将微信的appId和secret和token配置到项目中:

    wx:
      mp:
        configs:
          - appId:  wxde1af54203d3ce76
            secret: a2af0aff05d4f45b8a3ad056aaa9af0c
            token:  fanrong666
    最后使用自己的微信扫一扫,将自己添加到测试号中

    欢迎关注本人公众号,一起学习,交流。

     

    展开全文
  • 想要学习微信开发功能,又苦于没有认证公众号的伙伴们,可以通过注册一个微信公众号,然后申请一个接口测试账号的方式,来学习微信接口开发。【为了可以使用全部的常用接口,需要有一个域名和服务器空间】 下面简单...

    想要学习微信开发功能,又苦于没有认证公众号的伙伴们,可以通过注册一个微信公众号,然后申请一个接口测试账号的方式,来学习微信接口开发。【为了可以使用全部的常用接口,需要有一个域名和服务器空间】
    下面简单介绍一下,申请过程及使用方式:
    申请地址:https://mp.weixin.qq.com
    注册微信公众号
    个人申请的话,选择“订阅号”
    公众号类型
    完成注册之后,回到首页进行登录,手机扫码进入;
    在左侧菜单栏的“开发”–>“开发者工具”–>然后选择“公众平台测试账号”–>扫码获取;
    这里写图片描述
    系统会自动分配一个测试账号,接下来进行配置:
    这里写图片描述
    “接口配置信息”中的URL填写服务器地址(访问到文件的路径),如:
    http://www.qiandu.com/test.php;在‘Token’一栏填写自定义的验证值token,这里的token要跟test.php文件中声明的值一致,才能提交成功,完成配置。
    至于,js接口域名配置,直接写上述中的,例:www.qiandu.com,对应起来即可。
    这里写图片描述
    然后,扫面下面的二维码,关注该公众号,以便在开发过程中进行自主测试;
    下面介绍一下,test.php文件的大致内容:
    【说明:test.php文件内容部分来自网上公开资源,自主测试,总结而成,在此分享】

    <?php
    define("TOKEN", "mytest");//声明token
    $wechatObj = new wechatCallbackapiTest();
    //$wechatObj->valid();//验证token
    //$wechatObj->responseMsg();//自动回复功能
    $wechatObj->createCaidan(); //创建菜单
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
        public function responseMsg()
        {
                $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
            if (!empty($postStr)){
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $ev = $postObj->Event;//获取事件类型
                $keyword = trim($postObj->Content);
                $time = time();
                $textTpl = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    <FuncFlag>0</FuncFlag>
                    </xml>";
                if($ev == "subscribe"){
                //用户第一次关注时,自动回复消息设置
                  $msgType = "text";
                  $contentStr = "欢迎关注!";
                  $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                  echo $resultStr;
                }
               if(!empty( $keyword ))
               {
                    $msgType = "text";
                    $contentStr = "Welcome to wechat world!";
                    $erer=$keyword;
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $erer);
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }
            }else {
                    echo '';
                    exit;
            }
        }
        private function checkSignature()
        {
                $signature = $_GET["signature"];
                $timestamp = $_GET["timestamp"];
                $nonce = $_GET["nonce"];
    
                $token = TOKEN;
                $tmpArr = array($token, $timestamp, $nonce);
                sort($tmpArr);
                $tmpStr = implode( $tmpArr );
                $tmpStr = sha1( $tmpStr );
                if( $tmpStr == $signature ){
                    return true;
                }else{
                    return false;
                }
        }
        public function gettoken(){
            $appid='wxb*******c81';
            $secret='994009***32d79cc36';
            $getTokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;
            $accessTokenJson=file_get_contents($getTokenUrl);
            $accessTokenArr=json_decode($accessTokenJson,true);
            $accessToken=$accessTokenArr['access_token'];
            return   $accessToken;
        }
        public function createCaidan(){
            $access_token=$this->gettoken();
            $url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
            $caidan= ' {
         "button":[
         {    
              "type":"click",
              "name":"乐曲欣赏",//一级菜单
              "key":"V1001_TODAY_MUSIC"
          },
          {
               "type":"click",
               "name":"歌手简介",//一级菜单
               "key":"V1001_TODAY_SINGER"
          },
          {
               "name":"菜单列表",
               "sub_button":[
               {    
                   "type":"view",
                   "name":"搜索",//二级菜单
                   "url":"http://www.soso.com/"
                },
                {
                   "type":"view",
                   "name":"视频",
                   "url":"http://v.qq.com/"
                },
                {
                   "type":"view",
                   "name":"友情链接",
                   "url":"http://www.baidu.com/"
                }]
           }]
     }';
            $result = $this->https_request($url,$caidan);
            print_r($result);
        }
        //封装一个函数,使用curl实现post方式的请求
        function https_request($url,$data = null){
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)){
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
    
    }
    ?>

    以上代码比较乱,大致逻辑如此,仅供参考,不喜勿喷。
    代码部分参考部分网上资源,再次感谢那些有爱的陌生人!

    展开全文
  • 微信开发——网页授权 项目需求:通过用户在微信中打开网页获取用户的openid来实现绑定消费卡的功能。 项目开发:首先我们需要配置微信的运行环境,这里请参考我的第一篇关于微信开发的日志。 第一步我们得去平台...
  • 第一步:开启微信公众号的开发者模式第二步:申请服务器第三步:搭建服务器第四步:申请测试账号第五步:进行开发配置第六步:进行微信api的引入和环境配置第七步:调试代码,进行开发...
  • 微信开发的概念

    2019-12-03 23:23:16
    什么微信开发 微信这个软件,提供了聊天、支付、分享、收藏等各种功能,同时用户基数庞大; 微信对外开放了很多接口和能力,程序员基于这些功能进行的二次开发,叫做微信开发 微信开放平台 微信开放平台是微信对外...
  • 背景: 过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。...公众平台测试账号四、细读开发者文档五、开发流程重点解析1.开发环境准备2.服务器基本配置3....
  • 微信开发本地调试工具(模拟微信客户端)开源免费微信管家系统(java)源码下载微信部署需要依靠80端口,如何快速有效的调试本地微信开发程序,捷微团队(jeewx-java微信开源系统),采用微信开发调试工具,供本地...
  •  各位肯定知道,做微信开发,我们的开发服务器需要和微信服务器做交互,我们需要准备一台放置在公网的服务器,能够使得我们的服务器可以正常访问微信服务器,并且微信服务器也需要可以正常访问我们的开发服务器。...
  • 准备工作最近学习微信公众平台的开发,在申请一个微信公众号的时候,发现如果不是公司或组织只能申请订阅号(并且是个人的),而且不能使用微信提供的高级接口,所以如果想要使用公众平台的高级接口的话,申请一个...
  • 微信开发-NATAPP的使用

    2018-01-17 21:59:29
    1.1 在进行微信公众号开发时,我们需要搭建网站,并且有可能需要将项目部署到外网可访问的域名上,并且随时有可能修改网站内容进行调试。如果能够将内网ip映射到外网上,大大方便了开发者的调试。每次发布只需本地...
  • 必备条件准备,第一个是外网服务器,让我们的项目部署在上面,第二个是微信公众平台账号.可以多了解微信企业号回调页面开发-企业号信息的回发。 微信公众平台开发步骤: 首先应该是微信服务器与我们的服务器项目的...
  • 最近由于工作需要,接触...在网上搜索了一下,发现这个问题没什么好的答案,很多说取不到微信用户名实现不了,甚至有说实现了这个功能的应该是与微信有内部合作的。 搜索无果,遂自己动手实验,后发现其实完全可以的
  • 一、前言 这次的项目主要是关于微信...在开发过程中会设计到微信接口的调测,这里使用微信公众号中提供的开发者工具中的在线接口调测和公众平台测试账号。注:微信支付功能不能使用公众平台测试账号测试,必须部署...
  •  对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。  2.开发准备:  (1)有人开玩笑说,会vue小程序根本不用学:  微信小程序虽然是...
  • 最近微信发布了微信小程序内侧,各位程序员们是不是...本系列实战文章为大家介绍微信开发的相关知识,包括公众号申请、接口开发等。并为程序员们提供微信开发开源代码。后期也会出一些教学视频,和大家一起交流学习。
  • 微信开发时,我们yx时候可能需要用到微信小程序,微信小程序云开发需要使用注册的小程序appid,测试和游客进入是没有云开发的功能,所以我们需要注册一个微信小程序账号。在注册账号时要注意的是,是通过邮箱作为...
  • 编辑模式与开发模式 微信公众帐号申请成功后,要想接收处理用户的请求,就必须要在“高级功能”里进行配置,点击“高级功能”,将看到如下界面: 从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式...
1 2 3 4 5 ... 20
收藏数 38,089
精华内容 15,235