2018-10-31 09:52:50 qq_37031675 阅读数 86
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    175 人正在学习 去看看 黄菊华

我们在微信开发过程中,很可能需要获取授权用户的微信头像来作为系统的默认头像,这是个非常简单的实现
现在我们的手上已经用于openid和accesstoken(这不是全局token!!!),不知道如何获取的见上一节,微信开发获取openid

我们通过以下方法

    /**
     * 获取用户的信息
     * @param openId
     * @param accessToken
     * @return
     */
    public static JSONObject getUserInfo(String openId, String accessToken) {
        StringBuffer userInfoUrl =
                new StringBuffer("https://api.weixin.qq.com/sns/userinfo?access_token=")
                        .append(accessToken)
                        .append("&openid=").append(openId)
                        .append("&lang=zh_CN");
        String userInfoStr = HttpClientHelper.getHtml(userInfoUrl.toString(), "UTF-8", 5);
        JSONObject jo = JSONObject.parseObject(userInfoStr);
        return jo;
    }

通过拼接字符串发送get请求,返回的json中就包含用户的基本信息了。

String image = userJson.getString("headimgurl");
2016-05-02 21:36:24 wgyscsf 阅读数 9230
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    175 人正在学习 去看看 黄菊华

java微信开发API解析(七)-网页开发-微信网页授权

全局说明

* 详细说明请参考前两篇文章。

本文说明

  • 本文主要完成获取用户基本信息的工作,包括(昵称、头像、地址、国家等基本信息)
  • 对于snsapi_base和snsapi_userinfo我们只演示关于snsapi_userinfo。因为snsapi_userinfo更难,如果能够理解snsapi_userinfo,那么snsapi_base不在话下。
  • 对于该部分(微信网页开发)我们只介绍如何获取用户基本信息,对于开发样式库,js-SDK、开发者工具不能再讲解。(我是搞技术的,不会UI=_+)
  • 文章最后有演示的地址和操作源码

效果图

图片一
图片二,效果图

文档原文-网页授权获取用户基本信息(摘要)

  • 文档地址:http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html
  • 接入微信公众平台开发,开发者需要按照如下步骤完成:

    1 第一步:用户同意授权,获取code
    2 第二步:通过code换取网页授权access_token
    3 第三步:刷新access_token(如果需要)
    4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
    
  • 关于网页授权回调域名的说明

    1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
    2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权
    3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
    
  • 关于网页授权的两种scope的区别说明

    1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
    2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
    3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。    
    
  • 理解

    • 在开发之前我们需要填写回调地址,该地址就是我们项目的服务器地址(ip或者域名)
    • 我们需要按照文档的要求进行四步操作才能获取到用户的基本信息。当然,如果我们只是获取snsapi_base,也就是一个用户的openid,就不需要四步了。
    • 请特别注意:关于网页授权access_token和普通access_token的区别,它们是不一样的。

实现

  • 前奏:首先构建需要的json对应的bean

    • 通过code换取网页授权access_token,我们将返回的值存在AutoWebParams

      public class AutoWebParams {
      private String access_token;
      private String expires_in;
      private String refresh_token;
      private String openid;
      private String scope;
      //Setter、Getter...
      }
      

    *最终返回的用户信息,我们存储到UserInfo

    public class UserInfo {
    private String openid;
    private String nickname;
    private String sex;
    private String province;
    private String city;
    private String country;
    private String headimgurl;
    private List<String> privilege;
    private String unionid;
    //Setter、Getter...
    }
    
  • 第一步:用户同意授权,获取code,需要引导用户打开此页面

    @WebServlet("/GuideServlet")
    public class GuideServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            // 设置编码
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            resp.setCharacterEncoding("utf-8");
            PrintWriter writer = resp.getWriter();
            /**
             * 第一步:用户同意授权,获取code:https://open.weixin.qq.com/connect/oauth2/authorize
             * ?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE
             * &state=STATE#wechat_redirect
             */
            String redirect_uri = "http://42.96.144.28/WeixinApiDemo/WeixinWebServlet";// 目标访问地址
            redirect_uri = URLEncoder.encode(
                    "http://42.96.144.28/WeixinApiDemo/WeixinWebServlet", "UTF-8");// 授权后重定向的回调链接地址,请使用urlencode对链接进行处理(文档要求)
            // 按照文档要求拼接访问地址
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="
                    + GlobalParams.APPID
                    + "&redirect_uri="
                    + redirect_uri
                    + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
            resp.sendRedirect(url);// 跳转到要访问的地址
    
        }
    }
    
  • 第二步:通过code换取网页授权access_token

        /**
         * 第二步:通过code换取网页授权access_token
         */
        String code = req.getParameter("code");// 获取返回码
        // 同意授权
        if (code != null) {
            // 拼接请求地址
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
                    + "appid=" + GlobalParams.APPID + "&secret="
                    + GlobalParams.SECERT
                    + "&code=" + code
                    + "&grant_type=authorization_code";
            String json = MyHttpUtils.getReturnJson(url, null);// 拿去返回值
            AutoWebParams autoWebParams = new AutoWebParams();
            Gson gson = new Gson();
            autoWebParams = gson.fromJson(json, new AutoWebParams().getClass());
        }
    
  • 第三步:刷新access_token(如果需要),我们按照文档要求来,使用这一步

        /**
         * 第三步:刷新access_token(如果需要)
         */
        String url2 = "https://api.weixin.qq.com/sns/oauth2/refresh_token?"
                + "appid=" + GlobalParams.APPID
                + "&grant_type=refresh_token&refresh_token="
                + autoWebParams.getRefresh_token();
        String json2 = MyHttpUtils.getReturnJson(url2, null);// 拿去返回值
        AutoWebParams autoWebParams2 = new AutoWebParams();
        Gson gson2 = new Gson();
        autoWebParams2 = gson2
                .fromJson(json2, new AutoWebParams().getClass());
    
  • 第四步:拉取用户信息(需scope为 snsapi_userinfo)

        /**
         * 第四步:拉取用户信息(需scope为 snsapi_userinfo)
         */
        String url3 = "https://api.weixin.qq.com/sns/userinfo?access_token="
                + autoWebParams2.getAccess_token()
                + "&openid="
                + autoWebParams2.getOpenid() + "&lang=zh_CN";
        String json3 = MyHttpUtils.getReturnJson(url3, null);// 拿去返回值
        UserInfo userInfo = new UserInfo();
        Gson gson3 = new Gson();
        userInfo = gson3.fromJson(new String(json3.getBytes(), "utf-8"),
                new UserInfo().getClass());
        System.out.println(userInfo);
    
  • 测试显示

        // 显示用户信息
        req.setAttribute("userInfo", userInfo);
        req.getRequestDispatcher("userinfo.jsp").forward(req, resp);
    
  • 显示的userinfo.jsp

    <body>
    <h1>页面太丑,只看内容</h1>
        <table style="margin: 0 auto;">
            <tr>
                <td>openid(id)</td>
                <td>${userInfo.openid}</td>
            </tr>
            <tr>
                <td>nickname(昵称)</td>
                <td>${userInfo.nickname}</td>
            </tr>
            <tr>
                <td>sex(性别)</td>
                <td>
                <c:if test="${userInfo.sex==0}">未知</c:if>
                <c:if test="${userInfo.sex==1}">男</c:if>
                <c:if test="${userInfo.sex==2}">女</c:if>
                </td>
            </tr>
            <tr>
                <td>province(省)</td>
                <td>${userInfo.province}</td>
            </tr>
            <tr>
                <td>city(市)</td>
                <td>${userInfo.city}</td>
            </tr>
            <tr>
                <td>country(国家)</td>
                <td>${userInfo.country}</td>
            </tr>
            <tr>
                <td>headimgurl(头像)</td>
                <td><img alt="头像" style="width: 40px;height: 40px;" src="${userInfo.headimgurl}"></td>
            </tr>
            <tr>
                <td>privilege(特权,什么意思看文档)</td>
                <td>
                <c:forEach items="${userInfo.privilege}" var="p">
                ${p.String }|
                </c:forEach>
                </td>
            </tr>
            <tr>
                <td>unionid(unionid)</td>
                <td>${userInfo.unionid}</td>
            </tr>
        </table>
    </body>
    

测试请在下面的测试号中访问该地址

http://42.96.144.28/WeixinApiDemo/GuideServlet

测试的微信号二维码

这里写图片描述

技术博客

这里写图片描述

源码下载

http://download.csdn.net/detail/wgyscsf/9508289

2018-04-18 15:06:10 Jarven_ma 阅读数 2454
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    175 人正在学习 去看看 黄菊华

前一篇文章说了获取用户个人信息,下面来说一下获取用户微信头像,很多开发者在显示用户信息的时候都要获取用户头像,通常获取的都是url连接, 我们需要将图片下载下来并保存,以方便我们调用;、

上一篇文章我们说了用过access_token来获取用户的个人信息,我们获取到的headimgurl这个键就是头像连接,我们要截获连接的内容然后,将图片保存到我们服务器上,方便我们获取,下面我们上代码:

public function userIconSave($url,$openid){
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
		$file = curl_exec($ch);
		curl_close($ch);
		$resource = fopen($_SERVER['DOCUMENT_ROOT']."/usericon/" . $openid.".jpg" ,'a');
		fwrite($resource, $file);
		fclose($resource);
	}
思路跟获取用户信息一样,通过curl函数截获图片信息,然后将图片放到文件中即可,主要用到了fopen()和fwrite()函数来操作,fopen可以创建文件,然后fwrite将内容写入文件,即可,在数据库中可以保存文件路径,到时候就可以随时可以调用了,如果用户更新了文件,只要没掉调出来比较一下,该用户没有就可以保存,一样的头像就不在更新了;
2017-10-16 11:20:14 qq_31617637 阅读数 9599
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    175 人正在学习 去看看 黄菊华

前几天做的一个项目,微信助力活动,需要获取微信用户的头像,然后存表,在获取微信头像的时候,遇到了两个问题,可能很普通的问题,解决起来也很好解决!



  • 问题一Accesstoken 问题(获取信息接口的问题)

网页授权的 AccessToken 和获取用户信息的 AccessToken 不是一个东西。

也就是获取用户信息接口地址应是

https://api.weixin.qq.com/sns/userinfo

而不是

https://api.weixin.qq.com/cgi-bin/user/info

  • 问题二 48001错误问题

微信错误: 微信登录提示48001,{“errcode”:48001,”errmsg”:”api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]”}
原因:
①:你的服务号必须是通过腾讯认证,每年是300元,如果没有认证而导致的错误提示,那就去认证,别往下看了!如果你已认证,本条原因排除,那么请继续往下看
②:你是否是第三方网页,第三方网页的话,那么你的url地址里面的scope这个参数要填写”snsapi_userinfo”,否则会报这个错!原因如下!
URL地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=ok#wechat_redirect

scope参数对应值的解释:
snsapi_base 不需要用户点同意,直接跳转到授权后的页面,只能用于获取openid,不能获取用户基本信息
snsapi_userinfo 会征求用户同意,授权后,可以获取用户基本信息

需要snsapi_userinfo 的授权域,不然就会拿不到头像啦



  • 问题三 机械返回的问题

当微信回调地址拼上code参数之后,就会用code拿到头像,但是如果我们点进下一个链接,然后在通过手机返回之前拼接的code页面之时,那个连接的code 则会失效,则我们需要重新获取认证

           if(isset($wx_arr['errcode'])){  //当手机机械按钮返回的时候code已经使用过会出现报错  需要重新拿code <br>
            $return_url = '/wap/activityhelp-1.html?uid='.$_GET['uid'].'&amp;model='.$_GET['model']; <br>
            $return_url = 'http://'.$_SERVER['HTTP_HOST'].$return_url; <br>
            if($_GET['time']) { <br>
                $return_url = $return_url.'&amp;time='.$_GET['time']; <br>
            } <br>
            $appId_to_get_code = trim($wxpayjsapi_conf['setting']['appId']); <br>
            $wechat_object->get_code($appId_to_get_code, $return_url); <br>
        }</li>
</ul>
2018-02-13 16:29:57 sinat_38273626 阅读数 627
  • PHP获取微信公众号网页授权和用户信息(code、access_...

    讲解用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户 基本信息,进而实现业务逻辑。 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) PHP获取微信公众号网页授权和用户信息(code、access_token、openid等) 01-PHP获取微信公众号网页授权和用户信息演示 02-官方文档概要和需要提前准备的 03-PHP获取网页返回内容 04-PHP获取微信用户网页授权同意 05-PHP拿到微信用户授权后的code信息 06-PHP获取access_token和openid 07-PHP获取微信用户所有数据 08-PHP获取微信用户头像、昵称、区域、性别

    175 人正在学习 去看看 黄菊华

1- java代码

网站实现扫描二维码关注微信公众号,如果已经关注公众号就自动登陆网站并获取其微信昵称,头像等信息,如果用户未关注就等用户关注公众号后自动登陆网站

     --如果用户已关注公众号,网站端直接自动登陆,如果没有关注,就等用户关注公众号之后网站端自动登陆

     (目前已经完成了这个功能,示例网址:http://www.bid-data.com/ 爱招标——免费实时标讯推送平台,为企业负责人及商务人员即时掌控招标动态、中标检索、竞争对手中标项目分析等服务平台。)

   做微信扫码登陆,生成二维码必须是微信公众号中绑定的域这个域名,网站生成不了二维码(网站与微信服务器不是同一个域名) ,而是调用微信系统的接口获取二维码,用户扫码后也是请求微信服务器 

   

实现思路
   1,微信的系统,提供生成带参数的二维码的接口,这个参数就是唯一值(场景值)
   2,网站调用微信系统,获取生成的二维码图片
   3,用户扫码会直接调用微信服务器,将用户访问微信服务器的信息记录到redis,key就是唯一值(场景值)
   4,网站端做轮训去查询redis中是否有这个唯一值的数据,如果有就获取用户信息登录,没有就五秒一次轮训,登录后就不在做轮训(从二维码弹出之后开始做轮训,关闭二维码后停止轮训)
   5,这里的唯一值是可以自己定义的,我用的是截取了几位的时间戳 

实现步骤
(1)微信端:写一个获取带参数的临时二维码接口。
  // 临时二维码 
    private final static String QR_SCENE = "QR_SCENE";  
    // 永久二维码  
    private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";  
    // 永久二维码(字符串)  
    private final static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";   
    // 创建二维码  
    private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";  
    // 通过ticket换取二维码  
    private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";  

    @RequestMapping("getQrcode")
    public @ResponseBody String getQrcode(@RequestParam(value = "sceneId")int sceneId) throws Exception{


        String ticket = createTempTicket(tokenService.getToken(),"2592000",sceneId);
        LOGGER.info("get wechat qrcode  ==> start");
        LOGGER.info("sceneId :"+sceneId);
        LOGGER.info("ticket :"+ticket);
        LOGGER.info("get wechat qrcode  ==> end");
        return ticket;
    }
    /** 
     * 创建临时带参数二维码 
     * @param accessToken 
     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 
     * @param sceneId 场景Id 
     * @return 
     */  
    public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {  

        TreeMap<String,String> params = new TreeMap<String,String>();  
        params.put("access_token", accessToken);  
        Map<String,Integer> intMap = new HashMap<String,Integer>();
        intMap.put("scene_id",sceneId);  
        Map<String,Map<String,Integer>> mapMap = new HashMap<String,Map<String,Integer>>();  
        mapMap.put("scene", intMap);  

        Map<String,Object> paramsMap = new HashMap<String,Object>();  
        paramsMap.put("expire_seconds", expireSeconds);  
        paramsMap.put("action_name", QR_SCENE);  
        paramsMap.put("action_info", mapMap);  
        String data = new Gson().toJson(paramsMap);  
        String tse = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data);  

        JSONObject jsonObject = JSONObject.fromObject(tse);
        LOGGER.info("ticket :"+jsonObject.getString("ticket"));

     return showqrcode_path+"?ticket="+jsonObject.getString("ticket");
 }
accessToken就是调用微信接口的凭证token
(2)网站端:网站写一个调用微信生成二维码的接口

    @RequestMapping("getQrcode")
    public @ResponseBody Hashtable getQrcode(int sceneId){

        System.out.println(sceneId);

        Hashtable param = new Hashtable();
        param.put("sceneId", sceneId);

        String qrcodePath = HttpUtil.postRequest(Constant.getValue("get_qrcode"), param);

        System.out.println(" qrcodePath ==> "+qrcodePath);
        param.put("path", qrcodePath);
        return param;
    }
直接使用http调用接口就行,Constant.getValue("get_qrcode")这个就是微信提供二维码接口的url

(3)微信端:微信处理用户请求(这个地址是微信公众号填的那个地址,微信服务器会将所有用户请求转发到这个地址)

       // 事件推送
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
                // 事件类型
                String eventType = requestMap.get("Event");
                // 关注
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {

                    //获取用户信息
                    String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
                    requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken())
                            .replace("OPENID", fromUserName);
                    JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);
                    String nickname = jsonObject.getString("nickname");
                    String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");
                    String headimgurl = jsonObject.getString("headimgurl");

            //将用户信息存入redis,key为唯一值(场景值)
                    Hashtable params = new Hashtable();
                    params.put("phoneIme", fromUserName);
                    params.put("state", 1);
                    params.put("location", address);
                    params.put("realName", nickname);
                    params.put("nickname", nickname);
                    params.put("headimgurl", headimgurl);
                    if(StringUtils.isNotBlank(eventKey)){
                        redisCacheTool.setDataToRedis(eventKey.replace("qrscene_", ""), 3600, params);
                        System.out.println("qrcode redis key ==> "+eventKey.replace("qrscene_", ""));
                        params.put("equipmentType", eventKey);
                    }
            //入库
                    HttpUtil.postRequest(Constant.getValue("UPDATE_USER"), params);

                }
                // 取消关注
                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
                    // TODO 取消订阅后用户不会再收到公众账号发送的消息,因此不需要回复
                    Hashtable params = new Hashtable();
                    params.put("phoneIme", fromUserName);
                    params.put("state", 0);
                    HttpUtil.postRequest(Constant.getValue("UPDATE_USER_ANS"), params);

                }
                // 扫描带参数二维码
                else if (eventType.toLowerCase().equals(MessageUtil.EVENT_TYPE_SCAN)) {
                    // TODO 处理扫描带参数二维码事件
if(StringUtils.isNotBlank(eventKey)){

                        String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
                        //获取用户信息
                        requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken())
                                .replace("OPENID", fromUserName);
                        JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);
                        String nickname = jsonObject.getString("nickname");
                        String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");
                        String headimgurl = jsonObject.getString("headimgurl");
              //将用户信息存入redis,key为唯一值(场景值)
                        Hashtable params = new Hashtable();
                        params.put("nickname", nickname);
                        params.put("headimgurl", headimgurl);
                        params.put("location", address);
                        redisCacheTool.setDataToRedis(eventKey, 3600, params);
                        System.out.println("qrcode redis key ==> "+eventKey);
                    }


                    respContent = "返回的信息";
                    textMessage.setContent(respContent);
                    respXml = MessageUtil.messageToXml(textMessage);
                }
(4)网站端:登陆页面中做轮训,每隔几秒查询一次redis,如果有用户信息就登陆

        var timestamp = new Date().getTime() + "";
    var str = timestamp.substring(8, timestamp.length);

        window.setInterval(function() {

        getUser(cont);

    }, 10000);

        function getUser() {
        $.ajax({
            type : 'get',
            data : {
                sceneId : str
            },
            dataType : 'json',
            url : "getUser.do",
            success : function(data) {

                if (data.msg == "success") {
                    location.reload(); 
                }

            },
            error : function(data) {

                if (data.msg == "success") {
                    location.reload();
                }

            }
        });
    }        

微信开发之入门教程

阅读数 13817

没有更多推荐了,返回首页