精华内容
参与话题
问答
  • 1、微信公众平台文档入口 微信公众平台入口地址:https://mp.weixin.qq.com/,截图: 进入之后的文档地址: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 2、微信网页授权 介绍:...

    1、微信公众平台文档入口

    微信公众平台入口地址:https://mp.weixin.qq.com/,截图:
    这里写图片描述

    进入之后的文档地址:
    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
    这里写图片描述

    2、微信网页授权

    介绍:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
    具体内容:
    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

    关于网页授权回调域名的说明

    1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
    即:公众号设置里面–>公众号设置 —>功能设置 里面的 网页授权域名 不用带http或https字样
    类似
    这里写图片描述

    2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.htmlhttp://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.comhttp://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权

    3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可

    关于网页授权的两种scope的区别说明

    1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

    2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

    关于网页授权access_token和普通access_token的区别

    1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;

    2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

    关于UnionID机制

    1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。

    2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。

    关于特殊场景下的静默授权

    1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;

    2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。

    具体而言,网页授权流程分为四步:

    1、引导用户进入授权页面同意授权,获取code
    
    2、通过code换取网页授权access_token(与基础支持中的access_token不同)
    
    3、如果需要,开发者可以刷新网页授权access_token,避免过期
    
    4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

    目录

    1 第一步:用户同意授权,获取code
    2 第二步:通过code换取网页授权access_token
    3 第三步:刷新access_token(如果需要)
    4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
    5 附:检验授权凭证(access_token)是否有效

    第一步:用户同意授权,获取code

    在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

    尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

    参考链接(请在微信客户端中打开此链接体验):
    scope为snsapi_base
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
    scope为snsapi_userinfo
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

    尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

    参数说明

    参数             是否必须           说明
    appid             是         公众号的唯一标识
    redirect_uri      是         授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
    response_type     是         返回类型,请填写code
    scope             是         应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
    state             否         重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
    #wechat_redirect  是         无论直接打开还是做页面302重定向时候,必须带此参数

    要注意的是:这里的redirect_uri要在代码层面进行url.encode,示例代码:

    /**
     * 获取微信code的值
     */
    @RequestMapping("/accredit")
        public String accredit(
                HttpServletResponse response,
                HttpServletRequest request,
                Model model,
                @RequestParam(value = "state",required = false,defaultValue = "-1") Long state) throws Exception {
            log.info("【微信-授权】微信授权,获取微信code");
            //thirdPart_weixin_app_id   :wxxxxxxxxxx04
            //thirdPart_domain          :http://网页授权域名/
            //这里可以最后直接redirect到java后端action地址。也可以直接redirect到前端页面地址。前提条件是这两个地址对应的域名是上面配置的"网页授权域名"
            //String redirectUri = URLEncoder.encode(SysConfig.getValue("thirdPart_domain") + "/wap/thirdPart/accreditCallback","utf-8");
            String redirectUri = URLEncoder.encode(SysConfig.getValue("thirdPart_redirect_url"));
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + SysConfig.getValue("thirdPart_weixin_app_id")
                    + "&redirect_uri=" + redirectUri
                    + "&response_type=code"
                    + "&scope=snsapi_userinfo"
                    //这个state最后会在跳转后在redirect_url后面携带过去,同样微信code也可以携带过去,显示的现象是redirect_url实际的url后面多了?code=xxxxx&state=xxx 这样的内容。
                    //如果是java后端的action,可以通过方法定义中的String code,Long state来接收这两个参数
                    + "&state=" + state
                    + "#wechat_redirect";
            logger.info("url>>>>>>>>>>>>>>>>>>>>>>>>>>" + url);
            //要注意的是这里必须是重定向的,如果是返回json类型的,证明是不可行的,不要再走死胡同了
            return "redirect:" + url;
        }

    下图为scope等于snsapi_userinfo时的授权页面:
    这里写图片描述

    用户同意授权后
    如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE

    code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

    错误返回码说明如下:

    返回码 说明
    10003   redirect_uri域名与后台配置不一致
    10004   此公众号被封禁
    10005   此公众号并没有这些scope的权限
    10006   必须关注此测试号
    10009   操作太频繁了,请稍后重试
    10010   scope不能为空
    10011   redirect_uri不能为空
    10012   appid不能为空
    10013   state不能为空
    10015   公众号未授权第三方平台,请检查授权状态
    10016   不支持微信开放平台的Appid,请使用公众号Appid

    第二步:通过code换取网页授权access_token

    首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

    尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

    请求方法

    获取code后,请求以下链接获取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

    参数说明

    参数  是否必须    说明
    appid   是   公众号的唯一标识
    secret  是   公众号的appsecret
    code    是   填写第一步获取的code参数
    grant_type  是   填写为authorization_code

    返回说明

    正确时返回的JSON数据包如下:

    { "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE" }
    参数  描述
    access_token    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in  access_token接口调用凭证超时时间,单位(秒)
    refresh_token   用户刷新access_token
    openid  用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope   用户授权的作用域,使用逗号(,)分隔

    错误时微信会返回JSON数据包如下(示例为Code无效错误):

    {"errcode":40029,"errmsg":"invalid code"}

    案例:

    /**
         * 微信回调,获取微信access_ticket,获取用户信息接口
         * @param response
         * @param request
         * @param code          :微信code
         * @return
         */
        @ResponseBody
        @RequestMapping("/accreditCallback")
        public String accreditCallback(
                HttpServletResponse response,
                HttpServletRequest request,
                String code
                ) {
            log.info("【xxxx分享-授权-回调】微信用户授权获取用户信息开始");
            log.info("【xxxx分享-授权-回调】获取到微信code,code = {},参数params = {}" , code);
    
            AjaxResponseObj ajaxObj = new AjaxResponseObj();
    
            try {
                if (StringUtils.isNotBlank(code)) {
                    //thirdPart_weixin_app_id  ----> xxxxx_weixin_app_id    ---->     :wxxxxxxxxxxxxxxxx04
                    //thirdPart_domain   ----->  xxxxxx_weixin_app_secret    ---->    :http://网页授权域名/
                    //thirdPart_weixin_app_secret ---> xxxxx_weixin_app_secret  --->  :d9xxxxxxxxxxxxcca925c92ef
                    String authUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
                            "appid=" + SysConfig.getValue("thirdPart_weixin_app_id") +
                            "&secret=" + SysConfig.getValue("thirdPart_weixin_app_secret") +
                            "&code=" + code +
                            "&grant_type=authorization_code";
                    String result = HttpClientUtil.getInstance().sendHttpGet(authUrl);
                    JSONObject json = JSONObject.fromObject(result);
                    log.info("【xxxx分享-授权-回调】返回的用户信息是:{}",json.toString());
                    log.info("【xxxx分享-授权-回调】微信用户授权回调返回的状态值:" + (!json.containsKey("errcode")));
                    if(!json.containsKey("errcode")) { //调用正确
                        //获取openid
                        String openId = json.getString("openid");
                        String access_token = json.getString("access_token");
                        logger.info("access_token=============" + access_token);
                        XXXXSysUserThreeInfo tb = new XXXXSysUserThreeInfo();
                        tb.setUid(openId);
                        tb.setOpenid(openId);
                        tb.setType(SysUserThreeTypeEnum.REDENVELOPE.getValue());
                        tb.setAccessToken(access_token);
                        //通过access_token, openId获取微信的用户信息
                        WeiXinUserResponse weiXinUserResponse= WeiXinUtil.getScopeUsersDetail(access_token, openId);
                        logger.info("=================微信用户信息 start===================");
                        logger.info(weiXinUserResponse.toString());
                        logger.info("=================微信用户信息 end===================");
    
                        if(null != weiXinUserResponse) {
                            //tb.setUid(weiXinUserResponse.getUnionid());
                            //替换昵称存在特殊字符串情况,使用*替换
                            tb.setName(StringUtil.removeFourChar(filterEmoji(weiXinUserResponse.getNickname())));
                            log.info("【xxx分享-授权-回调】用户详情获取成功,昵称:" + weiXinUserResponse.getNickname()+":转换后昵称:"+tb.getName());
                            tb.setIconurl(weiXinUserResponse.getHeadimgurl());
                        }
    
                        //这里略去若干敏感代码
    
                        if (null != xxxSysUser) {
                            String redirectUrl = SysConfig.getValue("thirdPart_redirect_url");
                            if (StringUtils.isNotEmpty(redirectUrl)) {
                                //获取到系统内的ticket
                                String loginTicket = createLoginTicket(user,userTypestr,2);
                                Map<String,Object> callBackData = new HashMap<String,Object>();
                                callBackData.put("ticket",loginTicket);
    
                                ajaxObj.setData(callBackData);
                                ajaxObj.setStatus(1);
                                ajaxObj.setShowMessage("成功获取用户信息");
    
                                //注意,这里是使用的ajax接口返回,若项目没有做前后端分离,可以直接使用redirect:url的方式重定向到相应的页面,并可以可以把相应的参数携带过去。
                                return ajaxObj.getJsonpData(request,response);
                            }
                        }
                    }else{
                        //略去若干敏感代码
                        ajaxObj.setStatus(0);
                        ajaxObj.setData("");
                        ajaxObj.setShowMessage("获取用户信息失败");
    
                        return ajaxObj.getJsonpData(request,response);
                    }
                }
    
                ajaxObj.setStatus(0);
                ajaxObj.setShowMessage("微信code为空");
                ajaxObj.setData("");
                return ajaxObj.getJsonpData(request,response);
            } catch (Exception e) {
                //略
                return ajaxObj.getJsonpData(request,response);
            }
        }
    
        /**
         * 过滤表情
         * @param source
         * @return
         */
        public static String filterEmoji(String source) {
            if(StringUtils.isNotEmpty(source)) {
                Pattern emoji = Pattern.compile ("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",Pattern.UNICODE_CASE | Pattern . CASE_INSENSITIVE ) ;
                Matcher emojiMatcher = emoji.matcher(source);
                if ( emojiMatcher.find()) {
                    source = emojiMatcher.replaceAll("*");
                    return source ;
                }
                return source;
            }
            return source;
        }
    

    第三步:刷新access_token(如果需要)

    由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

    请求方法

    获取第二步的refresh_token后,请求以下链接获取access_token:
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    参数  是否必须    说明
    appid   是   公众号的唯一标识
    grant_type  是   填写为refresh_token
    refresh_token   是   填写通过access_token获取到的refresh_token参数

    返回说明

    正确时返回的JSON数据包如下:

    { "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE" }
    参数  描述
    access_token    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in  access_token接口调用凭证超时时间,单位(秒)
    refresh_token   用户刷新access_token
    openid  用户唯一标识
    scope   用户授权的作用域,使用逗号(,)分隔

    错误时微信会返回JSON数据包如下(示例为code无效错误):

    {"errcode":40029,"errmsg":"invalid code"}

    第四步:拉取用户信息(需scope为 snsapi_userinfo)

    如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

    请求方法

    http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

    参数说明

    参数              描述
    access_token    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid          用户的唯一标识
    lang            返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

    返回说明

    正确时返回的JSON数据包如下:

    {    "openid":" OPENID",
    " nickname": NICKNAME,
    "sex":"1",
    "province":"PROVINCE"
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
    "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    参数  描述
    openid  用户的唯一标识
    nickname    用户昵称
    sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    province    用户个人资料填写的省份
    city    普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl  用户头像,最后一个数值代表正方形头像大小(有0466496132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
    privilege   用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
    unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

    错误时微信会返回JSON数据包如下(示例为openid无效):

    {"errcode":40003,"errmsg":" invalid openid "}

    附:检验授权凭证(access_token)是否有效

    请求方法

    http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

    参数说明

    参数  描述
    access_token    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid  用户的唯一标识

    返回说明
    正确的JSON返回结果:

    { "errcode":0,"errmsg":"ok"}

    错误时的JSON返回示例:

    { "errcode":40003,"errmsg":"invalid openid"}

    案例:

    
    public class WeiXinUtil {
    
        //网页授权获取用户信息
        public static final String GET_SCOPE_USER = "https://api.weixin.qq.com/sns/userinfo";
    
        /**
         * 根据openid获取用户信息
         * @param access_token
         * @param open_id
         * @return
         */
        public static WeiXinUserResponse getScopeUsersDetail(String access_token,String open_id){
            WeiXinUserResponse tb=null;
            try{
                String url = GET_SCOPE_USER+"?access_token=" + access_token+"&openid="+open_id+"&lang=zh_CN";
                //URLConnectionUtil 可以通过编写httpclient来替换
                String result  = URLConnectionUtil.getHttps(url);
                if(StringUtils.isNotEmpty(result)){
                    JSONObject jo=JSONObject.fromObject(result);
                    if(!jo.containsKey("errcode")){
                        jo.remove("privilege");
                        tb=(WeiXinUserResponse)JSONObject.toBean(jo, WeiXinUserResponse.class);
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return tb;
        }
    }
    
    
    import java.io.Serializable;
    
    import org.apache.ibatis.type.Alias;
    @Alias("WeiXinUserResponse")
    public class WeiXinUserResponse implements Serializable{
    
        private static final long serialVersionUID = 1L;
        private String openid;//    用户的唯一标识
        private String nickname;//  用户昵称
        private String sex;//   用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
        private String province;//  用户个人资料填写的省份
        private String city;//  普通用户个人资料填写的城市
        private String country;//   国家,如中国为CN
        private String headimgurl;//    用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
        private String unionid;//
    
    
        public String getOpenid() {
            return openid;
        }
        public void setOpenid(String openid) {
            this.openid = openid;
        }
        public String getNickname() {
            return nickname;
        }
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public String getProvince() {
            return province;
        }
        public void setProvince(String province) {
            this.province = province;
        }
        public String getCity() {
            return city;
        }
        public void setCity(String city) {
            this.city = city;
        }
        public String getCountry() {
            return country;
        }
        public void setCountry(String country) {
            this.country = country;
        }
        public String getHeadimgurl() {
            return headimgurl;
        }
        public void setHeadimgurl(String headimgurl) {
            this.headimgurl = headimgurl;
        }
        public String getUnionid() {
            return unionid;
        }
        public void setUnionid(String unionid) {
            this.unionid = unionid;
        }
        public static long getSerialversionuid() {
            return serialVersionUID;
        }
    
    }
    

    3、公众号网页测试

    在前端开发的时候,如果是写一点然后在手机微信里面进行测试,这种方式显的低效,微信提供了一个“微信开发者工具”关于前端的调试,可以再这个工具中进行调试:
    下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=201714
    这里写图片描述

    下载安装后工具界面如下:
    这里写图片描述

    如果调试的时候,发现提示”未绑定开发者账号”,需要到微信公众平台中“开发者工具”(名称忘记了,好像是这个)去绑定自己的微信账号。

    在绑定过程中提示 要绑定的微信的 需要关注”公众平台安全助手”,然后打开自己的手机,登录自己的微信,进入”发现”频道–>在搜索栏输入”公众平台安全助手”,然后进行关注。
    这里写图片描述

    然后在回到公众平台管理后台,进行设置。设置完成后,发现还需要进入自己的手机上的”公众平台安全助手”中接受并同意邀请。
    界面类似:
    这里写图片描述

    3、微信公众平台测试号申请接入案例

    http://blog.csdn.net/u014427391/article/details/50963607

    http://blog.csdn.net/mzmzo/article/details/50991616

    4、微信公众平台项目部署

    展开全文
  • h5页面需要获取微信用户信息,参考微信开发者文档: 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,...

    微信开发者工具调试微信网页授权,点击‘登录’按钮无效

    问题描述

    h5页面需要获取微信用户信息,参考 微信开发者文档,一步步走到用开发者工具调试页面,却发现点击登录按钮没有反应!如下
    微信授权页面
    看日志信息
    在这里插入图片描述
    好吧,说这个图片路径是http,而应该是https,可是这是微信自己的页面啊,怎么改???
    然鹅不是这个原因,偶然发现点击按钮上边缘是有效的,点击之后重定向页面,跟文档描述的一模一样。为什么点击上边缘有效,而点击按钮无效?如果你也是这样,那么请打开电脑设置—字体大小–看看是不是125%???
    现在,把字体设置成100%,重新打开微信开发者工具,再去调试上面的页面,你会惊喜地发现,点按钮可以了。

    原因

    电脑设置的字体大小(非100%)的时候,会影响微信开发者工具dom节点事件绑定的位置,根据表现来看,并不影响渲染。

    补充一下

    过程中call_me_small_pure的博客 给了很大帮助,感谢!

    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

    ###我们要获取企业微信里用户信息,首先我们来看开发者文档。 输入图片说明 ###正如我们所看到的,我们需要access_token和userid两个参数,接下来我们就要找到如何去获取这两个参数。 输入图片说明 ###下面我们可以根据微信企业号已知的两个参数corpid(一个企业微信号只有一个,不可变)和corpsecret(每个应用有一个自己的,可变)获取到access_token。 #获取AccessToken

    private $appId="wxcf....."; //微信企业号的appid
    
        public function getAccessToken() { //获取AccessToken的方法
    
        $data = json_decode(file_get_contents("AccessToken.json"));//获取存在AccessToken.json
        //$access_token=$data->access_token;
    
        if ($data->expire_time < time()) { //如果AccessToken过期则重新获取AccessToken
            // $config = C('WX_CONFIG');
            $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wxcf.....&corpsecret=2ASy1p9hBT_AGhaSeJEHMbXiXY........";//获取AccessToken的url及参数。
    
             $res =$this->https_request($url);//调用https请求方法
             $res = json_decode($res); //把$res设置为对象
             $access_token = $res->access_token; //获取结果集中的access_token
          if ($access_token) {
            $data->expire_time = time() + 7000; //上一次获取access_token的时间加上两小时,access_token的有效时间为两小时,超过两小时则重新获取。也可以每次使用时都重新获取,但是有获取次数限制。
            $data->access_token = $access_token;
            $fp = fopen("AccessToken.json", "w"); //打开AccessToken.json文件,“W”表示写入(Write)
            fwrite($fp, json_encode($data));//获取到的结果写入
            fclose($fp);//关闭文件
          }
        } else {
          $access_token = $data->access_token; //未过期情况下直接读取文件里的access_token
        }
        return $access_token;
      }
    

    ###access_token的有效时间是7200s,这里我们做一个存储,避免每次使用都去获取。 ###我们已经得到了access_token,现在就要得到userid。 输入图片说明输入图片说明 ###在获取userid之前我们还要获取到code,才能把得到userid。在获取code时候我们要注意的两个参数就是CORPID(这个是我们在上面提到的一个微信号只有唯一的一个标识)和REDIRECT_URI(回调地址,就是当我们获取到code时所跳转的地址)。 #获取userid

    //网页授权获取用户userid
    public  function authUser() {
    
    
     if(session('UserId')){
    
    
      return  session('UserId');//判断缓存里是否有UserId,如果有直接返回,没有则获取
     }else{
    
    
         $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $redirecturl = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";//回调地址
    
    
    $redirecturl=urlencode($redirecturl);对地址进行编码;
    
    if($_GET['code']){  //判断code是否获取到,如果以获取则获取userid,否则获取code。
    
    $accesstoken=$this->getAccessToken(); //调用上面获取access-token的方法
    $code=$_GET['code'];
    
    $getuser="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=".$accesstoken."&code=".$code;//获取userid的url。
    
    $data=$this->https_request($getuser); 调用https_request方法请求得到userid。
    
    $data=json_decode($data,true); //将获取到的json格式的数据进行转化。(json_decode()方法不写后面参数true得到的是对象,写了参数true值得到的是数组)
    
        if($data['UserId']){
          session('UserId',$data['UserId']);
          return $data['UserId'];
        }else{
    
           trigger_error("网页授权失败");
        }
    
    }else{  //获取code值
    
    $appid=$this->appId;
    
      $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirecturl."&response_type=code&scope=snsapi_base&state=12#wechat_redirect";
    
    
    header('Location:'.$url);
    
    }
    
    }
    
    }
    
    

    ###上面getAccessToken()和 authUser()方法都调用了一个方法那就是https_request();

    /https请求(支持GET和POST)
        public 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;
        }
    

    ###现在我已经得到access_token和userid,这时我们就可以根据第一个图中的url获取用户信息啦。

    public function getinfo(){
    	
    
     //获取用户信息
    	$userid=$this->authUser();
    	$access_token=$this->getAccessToken();
    	$url="https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=$access_token&userid=$userid";
    	$info=$this->https_request($url);
    

    转载于:https://my.oschina.net/u/2953372/blog/954861

    展开全文
  • 微信开发者文档地址:http://mp.weixin.qq.com/wiki/... 一. 获取单个用户信息调用接口地址:url = 'https://api.weixin.qq.com/cgi...{}&openid={}&lang=zh_CN'.format(access_token, user_openid) 使用...
        

    微信开发者文档地址:
    http://mp.weixin.qq.com/wiki/...

    一. 获取单个用户信息调用接口地址:
    url = 'https://api.weixin.qq.com/cgi...{}&openid={}&lang=zh_CN'.format(access_token, user_openid)

    使用accesstoken和openid获取下列的信息,格式为json数据

    unionid是微信用户的唯一id,在不同的服务号之间都是唯一的。
    openid是unionid在某一服务号上id标识,一个用户在不同的公众号之间的openid不同
    (网页三方认证登陆能够获取到unionid和openid,但是微信无法使用此openid发送推送消息,只有微信内部登录或者关注后获取的openid可以用于后期推送)
    说明:
    headimgurl是头像地址,sex是性别女0,男1,未填写为2

    {
    "province": "Beijing",
    "openid": "oKMC0wByF5DJWjLiJC0dmThSPZk8",
    "headimgurl": "http://wx.qlogo.cn/mmopen/VRy4bholTtQBlHWXEjHCuURUzaBWywia4QIMb2jOPZdvWFgicdwXXu104nP0QQxiaSm8YpnLM7XSd7La9KE5XPq6BAD8LNcm5EW/0",
    "language": "zh_CN",
    "city": "Haidian",
    "access_token": "OezXcEiiBSKSxW0eoylIeI47j6mju_7Wbx4g8CnYGDNM2ilqNz10k9za0n0_d54qELtDBQzpqNhWJkib8xZk_MvawLMygJG8yNora7MKjiAOS6uaNZs3hY66pABAHGwwxkCF06QyZNrAikTMLiNc6g",
    "unionid": "owHdquIH-AdQD7UMPohiIaQGjfA8",
    "expires_in": 7200,
    "sex": 1,
    "social_provider": "weixin",
    "country": "CN",
    "privilege": [],
    "scope": "snsapi_login",
    "nickname": "xx" ,
    "refresh_token": "OezXcEiiBSKSxW0eoylIeI47j6mju_7Wbx4g8CnYGDNM2ilqNz10k9za0n0_d54qrENOWkKDOCK3am2PMe5pYxtSjTDQHiJE9uQsMCht0Ukgi14TV3GM69yP0yljVtStsKwx9YiQpxiHAq-tov0lUw"
    }

    二. 获取本公众号下所有关注者用户信息
    分两步走:
    接口API官方文档:
    https://mp.weixin.qq.com/wiki...
    1)一次拉取关注公众号的1W个用户(微信默认1w个,这1w个用户的排序是无序的,感觉是按照微信unionid进行排序超过则加NEXT_OPENID)关注者的openid
    接口地址url = 'https://api.weixin.qq.com/cgi...'

    返回的数据格式:

    {
    "total":2,
    "count":2,
    "data":{
        "openid":["","OPENID1","OPENID2"]},
        "next_openid":"NEXT_OPENID"
    }
    

    2)再使用1的方法单个的获取个人信息或者使用access_token+openid批量获取100个用户的信息
    接口地址url = 'https://api.weixin.qq.com/cgi... '
    post的数据为user_list的列表,一次最多只能post请求100个,然后轮番获取即可

    {
    "user_list": [
     {
     "openid": "otvxTs4dckWG7imySrJd6jSi0CWE",
     "lang": "zh-CN"
     },
     .....
    ]
    }
    
    展开全文
  • 微信网页授权获取用户基本信息

    千次阅读 2016-03-03 16:05:27
    微信网页授权获取用户基本信息  最近在搞web端的开发,需要获取从微信当中获取用户信息,因此不得不咬着牙去查看微信公众平台的官方文档,幸运的是,最后还是搞出来了。特此记录一下,分享给大家。  首先,...
  • http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html
  • 微信小程序获取用户信息

    千次阅读 2018-05-27 11:17:36
    开发者可使用以下方式获取或展示用户信息:一、小程序:1、使用 button 组件,并将 open-type 指定为 getUserInfo 类型,获取用户基本信息。详情参考文档:https://developers.weixin.qq.com/miniprogram/dev/co...
  • 通过 wx.login() 获取用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于...
  • 微信小程序获取用户信息方案介绍

    万次阅读 2018-05-24 14:54:51
    虽然我们在设计文档上有提出最好的设计是在真正要用户信息的情况下才去获取用户信息,不过很多开发者并没有按照我们的期望去做,导致用户在使用的时候有很多困扰。归结起来有几点:开发者在首页直接调用 wx....
  • 直接使用uni.getUserInfo会出现获取不到用户信息,腾讯已经做出了修改 ...开发者可使用以下方式获取或展示用户信息: 按照文档加上 open-type=“getUserInfo” bindgetuserinfo=“bindgetuserinfo” <
  • 一、网页授权获取用户基本信息  第一步:用户同意授权,获取code 参数: 参数 是否必须 说明 appid 是 公众号的唯一标识 redirect_uri 是 授权后重定向的回调链接地址,请使用urle
  • 在关注者与公众号产生消息交互后,微信公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。...开发者可通过OpenID来获取用户基本信息。请使用https协议。 接口调用请求说明 ht...
  • 微信小程序API文档:开放接口 · 小程序 在实际的小程序开发中,往往需要用户授权登陆并获取用户的数据,快速对接用户系统。 openId : 用户在当前小程序的唯一标识 unionId : 如果开发者拥有多个移动应用、网站...
  • 一、登录态维护 ...通过 wx.login() 获取用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登...
  • 在开发微信时,都有这么一个问题,如何获取当前用户的信息,比如头像、...在微信开发者文档中https://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html可以看到,获取用户信息需要两个条件,1是access_t
  • 注:内容摘抄于微信公众平台技术文档微信公众平台官方...公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。请注意,如果开发者有在多个公众号,或在公众号、移动应
  • F 修复 删除用户数据目录后开发者工具启动不了的问题 F 修复 未使用体验评分时存在内存泄漏的情况 F 修复 切换页面偶现 WXML 面板内容丢失问题 反馈详情 F 修复 调试 WXML 面板 rpx 计算错误导致样式错乱的问题 ...
  • 最近写了一个微信公众号的项目,要获取用户详细信息及是否关注公众号,需要调用微信的接口。因为第一次用,所以开始的时候是很懵逼的,后来看了很多遍的文档以及百度了很多的CSDN才弄明白了一点。 微信公众号开发...
  • 有人说开发的时候直接看微信开发者文档不就行了?其实可以看,只不过我第一次看没搞明白,到底什么是code,再加上运行项目始终死在code获取不到上。最后我不得不在回过头看看到底什么是code。之后反反复复进行项目...
  • 提取小程序端用户上传的身份证图片上面的信息,存到数据库中,以便做实名认证或者其它业务操作; 操作过程 上传照片 小程序端将身份证图片上传到文件服务得到文件id,小程序开发者将文件id传给后端开发者,后端...
  • 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。...开发者可通过OpenID来获取用户基本信息。请使用https协议。 接口调用请求说明 http请求
  • 如果用户在微信客户端中访问...首先看微信开发者文档 这方面的教程 网页授权获取用户基本信息 http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html 按照里面的步骤 走完一遍 可以参考我下面的范
  • 最近在做一个微信公众号的项目,和微信交互,获取用户基本信息是基本需求。...微信公众平台通过OAUTH认证获取用户信息,这个过程大体分为以下几个步骤: 1、根据appid以及回调url获取code(时效==5min); 2、根
  • 微信网页授权文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 ...(开发 —》开发者工具...一,微信网页授权流程(微信文档都有) 二,前端获取code 禁忌:不要发送请求获取微信的co...

空空如也

1 2 3 4 5 ... 11
收藏数 212
精华内容 84
关键字:

微信开发者文档获取用户信息