微信网页授权登录(公众号)

第一步

  先去微信公众平台申请公众号,网址:https://mp.weixin.qq.com/,然后有了公众号申请测试号,拿到appID和appsecret

第二步

申请url和域名

(1) 测试号二维码添加自己的微信号(后期使用微信web开发者工具)可以用自己微信测试,注意 往下拉 :网页服务 --> 网页帐号 --> 网页授权获取用户基本信息 --> 修改   这边也需要把域名填写,和上面的域名一致。

因为微信的授权接口必须是域名不能ip,所有这边没有域名的小伙伴可以使用NATAPP

公网配置前的准备:
在我们本地测试的时候,需要将我们的本地地址映射到公网,我们使用一个免费且非常方便的工具:natapp。下面的地址是natapp的官网和natapp的使用教程:
natapp官网 :https://natapp.cn/
NATAPP 1分钟快速新手图文教程 :https://natapp.cn/article/natapp_newbie

免费隧道配置


先注册,注册成功后登录。

注意上图:本地端口必须是要填8080的(这个购买后也是可以再修改的),因为微信公众平台接口的调用仅支持80。开发之间建议阅读微信公众平台技术文档
隧道购买成功后,在我的隧道中就可以看到已拥有的隧道:


客户端下载
我们访问到natapp的客户端下载,下载natapp客户端:

下载后,解压,会有一个natapp.exe的文件。

运行natapp
在运行natapp之前需要先配置,详细教程参考:使用本地配置文件config.ini。config.ini内容:

注意:config.ini配置文件需要与natapp.exe在同一个目录下。
 
在这两个文件的目录下,打开cmd命令窗口,输入:

natapp -authtoken=你的authtoken

回车,运行成功后是如下界面:
 
- Tunnel Status Online 代表链接成功
- Version 当前客户端版本,如果有新版本,会有提示
- Forwarding 当前穿透 网址 或者端口
- Web Interface 是本地Web管理界面,可在隧道配置打- 开或关闭,仅用于web开发测试
- Total Connections 总连接数
- Avg Conn Time 0.00ms 这里不代表,不代表,不代表 延时,需要注意!
 
这两个都是可以访问的,区别就是使用natapp是将本地映射到公网上了,别人也可以访问,但是别人就不能访问你的127.0.0.1:8080。注意:用http://xxx.natappfree.cc 访问的时候运行natapp的cmd窗口要开着,也就是得运行着natapp,不然是找不到公网映射的

(2) 申请url,有了域名以后自己写个api直接返回就可以成功了

 1     @ApiOperation(value = "微信申请URL")
 2     @GetMapping("")
 3     public void getUrl(HttpServletRequest request, HttpServletResponse response) throws IOException {
 4         log.info("WeiXinController getUrl start");
 5
 6         Enumeration pNames = request.getParameterNames();
 7         String logName = null;
 8         while (pNames.hasMoreElements()) {
 9             String name = (String) pNames.nextElement();
10             String value = request.getParameter(name);
11             logName = "name =" + name + "     value =" + value;
12         }
13         log.info("logName: " + logName);
14
15         // 微信加密签名
16         String signature = request.getParameter("signature");
17         // 时间戳
18         String timestamp = request.getParameter("timestamp");
19         // 随机数
20         String nonce = request.getParameter("nonce");
21         // 随机字符串
22         String echostr = request.getParameter("echostr");
23         PrintWriter out = response.getWriter();
24         out.print(echostr);
25         out.close();
26         String info = "signature = " + signature + ", timestamp = " + timestamp + ", nonce = " + nonce + ", echostr = "+ echostr;
27         log.info(info);
28
29         log.info("WeiXinController getUrl end");
30     }

第三步

后台接口测试

第一个servlet:

@Slf4j
@WebServlet(name = "weChatLoginServlet", urlPatterns = "/wechat/login")
public class WeiXinLoginServlet extends HttpServlet {

    public WeiXinLoginServlet() {
        super();
    }

    /**
     * 微信公众号唯一标识(在微信小程序管理后台获取)
     */
    @Value("${wechat.appId}")
    private String appId;

    /**
     * 回调地址
     */
    @Value("${wechat.backUrl}")
    private String backUrl;

    /**
     * 第一步:引导用户进入授权页面同意授权,获取code
     */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        log.debug("WeiXinLoginServlet doGet start");

        // 授权页面地址
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?"
                + "appid=" + appId
                + "&redirect_uri=" + urlEncodeUTF8(backUrl)
                + "&response_type=code"
                + "&scope=snsapi_base"
                + "&state=STATE#wechat_redirect";

        // 重定向到授权页面
        response.sendRedirect(url);

        log.debug("WeiXinLoginServlet doGet end");
    }

    /**
     * 用 urlEncode 对链接进行处理
     *
     * @author
     * @date 2019-03-19
     */
    private String urlEncodeUTF8(String source) {
        log.debug("WeiXinLoginServlet urlEncodeUTF8 start, source = [{}]", source);

        String result = source;
        try {
            result = java.net.URLEncoder.encode(source,"utf-8");
        } catch (UnsupportedEncodingException e) {
            log.info("WeiXinController urlEncodeUTF8 BaseException: " + e.getMessage());
        }

        log.debug("WeiXinLoginServlet urlEncodeUTF8 end");
        return result;
    }
}

第二个servlet:

@Slf4j
@WebServlet(name = "weChatCallbackServlet", urlPatterns = "/wechat/callback")
public class WeiXinCallBackServlet extends HttpServlet {

    public WeiXinCallBackServlet() {
        super();
    }

    /**
     * 微信公众号唯一标识(在微信小程序管理后台获取)
     */
    @Value("${wechat.appId}")
    private String appId;

    /**
     * 回调地址
     */
    @Value("${wechat.secret}")
    private String secret;

    /**
     * 第二步:通过code换取网页授权openid
     */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        log.debug("WeiXinCallBackServlet callback start");

        // 从request里面获取code参数(当微信服务器访问回调地址的时候,会把code参数传递过来)
        String code = request.getParameter("code");

        // 获取code后,请求以下链接获取access_token
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
                + "appid=" + appId
                + "&secret=" + secret
                + "&code=" + code
                + "&grant_type=authorization_code";

        // 通过网络请求方法来请求上面这个接口
        JSONObject jsonObject = doGetJson(url);

        // 从返回的JSON数据中取出access_token和openid,拉取用户信息时用
//        String token =  jsonObject.getString("access_token");
        String openid = jsonObject.getString("openid");

        // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
//        String infoUrl ="https://api.weixin.qq.com/sns/userinfo?"
//                + "access_token=" + token
//                + "&openid=" + openid
//                + "&lang=zh_CN";
        // 通过网络请求方法来请求上面这个接口
//        JSONObject userInfo = doGetJson(infoUrl);
        request.setAttribute("openid", openid);
//        request.getRequestDispatcher("/login?channel=1&source=1&openid=" + openid).forward(request, response);

        log.debug("WeiXinCallBackServlet callback end");
    }

    /**
     * 工具类
     * @param url String
     * @return JSONObject
     */
    private JSONObject doGetJson(String url) throws IOException {
        log.debug("WeiXinCallBackServlet doGetJson start, url = [{}]", url);

        JSONObject jsonObject = null;
        // 首先初始化HttpClient对象
        HttpClient client = HttpClientBuilder.create().build();
        // 通过get方式进行提交
        HttpGet httpGet = new HttpGet(url);
        // 通过HTTPclient的execute方法进行发送请求
        HttpResponse response = client.execute(httpGet);
        // 从response里面拿自己想要的结果
        HttpEntity entity = response.getEntity();
        if(entity != null){
            String result = EntityUtils.toString(entity,"UTF-8");
            jsonObject = JSONObject.parseObject(result);
        }
        // 把链接释放掉
        httpGet.releaseConnection();

        log.debug("WeiXinCallBackServlet doGetJson end");
        return jsonObject;
    }

访问第一个servlet以后会得到一个跳转地址,然后直接在微信web开发者工具上使用就可以测试获取openId了

原文地址:https://www.cnblogs.com/hzzjj/p/10595020.html

时间: 2024-11-03 22:50:52

微信网页授权登录(公众号)的相关文章

利用微信公众号网页授权做公众号粉丝迁移

有时候,我们运营的公众号,可能因为某些原因而需要更换公众号,比如,公司被收购,公众号转让等. 那原有公众号的粉丝,我们自然也想让其迁移到新的公众号上,一般做法是通过微信自带的粉丝转移功能. 但流程也不少,还要交300元的审核费用.最要命的是,如果你的公众号平台提供了一些系统,那么用户在系统上的资料是无法迁移的, 比如用户等级,余额,与其他用户的关系,订单等.毕竟用户的openId对于每个公众号都不一样. 今天我们来看看,如何通过微信网页授权的模式迁移公众号.这里先说一下思路,后续会提供具体的解决

OAuth2.0微信网页授权登录

功能:用于纪录微信网页授权步骤(前提条件:公众号为服务号,且通过认证) 微信网页授权api说明网址:https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html 相关说明:目前微信api有两种方式获取用户信息.第一种是用户管理获取用户基本信息(包括UnionID机制),这个前提是用户必须事先已经关注公众号,通过获取基础access_token和openID来获取用户信息.第二种是以snsapi_userinfo为sco

手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP)

wechat github 概述 公众号开发是痛苦的,痛苦在好多问题开发者文档是没有提到的,是需要你猜的. 在开发过程中翻了好多的文档,都是说明其中的一部分问题的,很费时间,所以在此总结大体过程.我们模拟的是一个支付的商城,在实现购买过程中基本是把微信公众号最主要模块实现了,其余的功能我们没有涉及,但应该是触类旁通的. 我们叙述的过程是按开发流程进行叙述的,不会是按照开发文档的形式叙述,希望您能结合微信的开发文档一起阅读,当然在流程中我们会提醒你阅读的部分 目录 概述 [解决的问题] [前端技术

微信公众号开发之网页授权登录及code been used 解决!

首先微信公众号开发网页授权登录使用环境: 开发工具:eclipse:服务器:tomcat8,开发语言:JAVA. 我写的网页授权登录时用开发者模式自定义view类型按钮点击跳转链接的. 微信网页授权登录首先以官方微信开发文档为准,大体共分为4步: 先说第一步获取code: code说明:code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5扽这未被使用自动过期. 微信公众开发文档给的有获取code的链接,建议直接复制来用,然后替换其中相应的参

微信公众号网页授权登录获取用户基本信息

发布时间:2018-10-24 技术:spring springboot,微信公众号 概述 微信公众号网页授权登录后微信获取用户基本信息,部署即可运行完整demo 详细 代码下载:http://www.demodashi.com/demo/14290.html 一.前言 (1)适合人群 1,JAVA服务端开发人员 2,初级人员开发人员 3,了解spring springboot + maven 3,了解公众号开发 (2)你需要准备什么? 1,积极主动学习 2,微信公众号开发基本流程 3,java

微信网页授权认证获取用户的详细信息,实现自动登陆-微信公众号开发干货

原创声明:本文为本人原创作品,绝非他处转账,转载请联系博主 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开发公众号需要准备或了解什么 web开发工具:官方提供的开发工具,使用自己的微信号来调试微信网页授权.调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入和输出.下载地址:web开发工具下载 开发文档:https://mp.weixin.qq.com/wiki

玩玩微信公众号Java版之六:微信网页授权

我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧! 参考官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 官方的文档有很详细的说明,这里就主要分析重要的几点: 第一,网页授权分类及说明: 1.以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回调页(往往

微信公众平台,微信网页授权,redirect_uri参数错误,解决方法!

刚才在做微信网页授权的时候,发生一个错误!!!微信网页授权redirect_uri 参数错误! 遇到问题,第一时间应该做的就是查看官网微信公众平台的技术文档. 微信网页授权 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域名的说明 1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修改授权回调域名

Java微信公众平台开发(十六)--微信网页授权(OAuth2.0授权)获取用户基本信息

转自:http://www.cuiyongzhi.com/post/78.html 好长时间没有写文章了,主要是最近的工作和生活上的事情比较多而且繁琐,其实到现在我依然还是感觉有些迷茫,最后还是决定静下心来坚持一开始的选择,继续我们的微信系列文章的后续更新,也希望在自己有时间的时候能把更多的内容呈现给大家,前面一系列的文章讲述了很多微信开发相关的基础知识点 [微信系列文章],那么从这一篇开始将讲述微信较深一层次或者说在产品应用中时刻会用到的一些技术点,那么下面就让我们进入正题吧,这一篇我要讲述的