精华内容
参与话题
问答
  • OpenId

    2020-01-08 17:54:51
    OpenID 用户希望访问其在example.com的账户 example.com (在OpenID的黑话里面被称为“Relying Party”) 提示用户输入他/她/它的OpenID 用户给出了他的OpenID,比如说”http://user.myopenid.com” example.com ...

    OpenID

    1. 用户希望访问其在example.com的账户
    2. example.com (在OpenID的黑话里面被称为“Relying Party”) 提示用户输入他/她/它的OpenID
    3. 用户给出了他的OpenID,比如说”http://user.myopenid.com”
    4. example.com 跳转到了用户的OpenID提供商“mypopenid.com”
    5. 用户在”myopenid.com”(OpenID provider)提示的界面上输入用户名密码登录
    6. “myopenid.com” (OpenID provider) 问用户是否要登录到example.com
    7. 用户同意后,”myopenid.com” (OpenID provider) 跳转回example.com
    8. example.com 允许用户访问其帐号
    展开全文
  • OpenID

    2019-09-26 03:16:04
    OpenId是一个以用户为中心的数字身份识别框架,它具有开放、分散、自由等特性。OpenId的创建是基于这样一个概念:我们可以通过URI(或者URL网址)来识别一个网站。同样,我们也可以通过这样的方式来识别一个用户的...

    OpenId是一个以用户为中心的数字身份识别框架,它具有开放、分散、自由等特性。OpenId的创建是基于这样一个概念:我们可以通过URI(或者URL网址)来识别一个网站。同样,我们也可以通过这样的方式来识别一个用户的身份。OpenId系统的身份认证就是通过URI来认证用户身份。目前绝大部分网站都是通过用户名与密码来登录认证用户身份,这就要求大家在每个你要使用的网站上注册一个帐号。如果使用OpenId,你可以在一个提供OpenId的网站上注册一个OpenId,以后你可以使用这个OpenId去登录支持OpenId的网站。这正是一处注册,到处使用的体现。

    登录一个支持 OpenID 的网站非常简单(即便你是第一次访问这个网站也是一样)。只需要输入你注册好的 OpenID 用户名,然后你登录的网站会跳转到你的 OpenID 服务网站,在你的 OpenID 服务网站输入密码(或者其它需要填写的信息)验证通过后,你会回到登录的网站并且已经成功登录。 OpenID 系统可以应用于所有需要身份验证的地方,既可以应用于单点登录系统,也可以用于共享敏感数据时的身份认证。

    除了一处注册到处通行以外,OpenID 给所有支持 OpenID 的网站带来了价值--共享用户资源。用户可以清楚的控制哪些信息可以被共享,例如姓名、地址、电话号码等。今天,OpenID 作为以用户为中心的身份验证系统已经为数百万的用户提供了服务。

    二、OpenID相关术语

    • End User:终端用户,使用OP与RP的服务
    • Relying Party依赖方:简称RP,服务提供者,需要OP鉴权终端用户的身份
    • OpenID Provider:OpenID提供者,简称OP,对用户身份鉴权
    • Identifier标识符:标识符可以是一个HTTP、HTTPS或者XRI(可扩展的资源标识)
    • User-Agent:实现了HTTP1.1协议的用户浏览器
    • OP Endpoint URL:OP鉴权的URL,提供给RP使用
    • OP Identifier:OP提供给终端用户的一个URI或者XRI,RP根据OP Identifier来解析出OP Endpoint URL与OP Version
    • User-Supplied Identifier:终端用户使用的ID,可能是OP提供的OpenID,也可以是在RP注册的ID。RP可以根据User-Supplied Identifier来解析出OP Endpoint URL、OP Version与OP_Local Identifer
    • Claimed Identifier:终端用户声明自己身份的一个标志,可以是一个URI或者XRI
    • OP-Local Identifier:OP提供的局部ID

    三、OpenID验证流程

    1. 终端用户请求登录RP网站,用户选择了以OpenID方式来登录
    2. RP将OpenId的登录界面返回给终端用户
    3. 终端用户以OpenID登陆RP网站
    4. RP网站对用户的OpenID进行标准化,此过程非常负责。由于OpenID可能是URI,也可能是XRI,所以标准化方式各不相同。具体标准化过程是:如果OpenID以xri://、xri://$ip或者xri://$dns开头,先去掉这些符号;然后对如下的字符串进行判断,如果第一个字符是=、@、+、$、!,则视为标准的XRI,否则视为HTTP URL(若没有http,为其增加http://)。
    5. RP发现OP,如果OpenId是XRI,就采用XRI解析,如果是URL,则用Yadis协议解析,若Yadis解析失败,则用Http发现。
    6. RP跟OP建立一个关联。两者之间可以建立一个安全通道,用于传输信息并降低交互次数。
    7. OP处理RP的关联请求
    8. RP请求OP对用户身份进行鉴权
    9. OP对用户鉴权,请求用户进行登录认证
    10. 用户登录OP
    11. OP将鉴权结果返回给RP
    12. RP对OP的结果进行分析

    转载于:https://www.cnblogs.com/catherine9192/p/9101400.html

    展开全文
  • <div><p>The enki.yml requires the URL of openid; for google this is Directed Identity (see http://lists.openid.net/pipermail/openid-general/2009-July/009271.html), which means (fsr) the app doesn'...
  • ve been testing the latest version of ruby-openid in our development environment and found that we are no longer able to successfully complete login. We started seeing <pre><code> Unexpected OpenID ...
  • 最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台点击进入里面的很有接口,就比较常见的翻译,语音识别,...

        最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识别,地理位置等等,都挺好的。好了,不多说,进入正题好了。

        我想,做微信公众号开发的,对于想获取关注了公众号的用户信息,或者说是当前与后台服务器进行交互的当前用户信息,这个功能是很重要的吧。因为,通过这个,可以直接获取到当前的用户信息,而不需要,每次都是进行自己输入信息,这个只会让用户感觉到很不适。。。所以,为了解决这个需求,那咱们来研究研究,如何获取微信的个人信息~!

    大家可以关注我的微信公众号:Java菜鸟进阶之路

     (一)思路

    我们来研究一下,要想获取到个人信息,是如何一个流程呢?

    路线图:

    上面,画了一个简单的一个流程图,我想,看着这个应该觉得不难吧。是的,确实思路很简单,但是,,里面的坑也不少。接下来,我对两种情况都进行讲解。

    (二)情况一:通过用户与服务器进行消息交互,来获取用户信息

    思路:针对这种情况的话,比较简单,因为,我们在做用户与服务器进行消息交互的时候,我们可以知道,用户发送的内容是以XML的形式进行发送的,然后服务器,首先接受到XML,然后再把XML转为Map对象,再从Map对象中获取对应的内容即可。那么,发送的XML的字段是个怎么样呢?

    字段信息:

    ToUserName:发送给谁的ID
    FromUserName:发消息方的ID(其实也就是用户的OpenId)
    CreateTime:消息发送时间,时间戳
    MsgType:消息类似,有文本,图片,音频,视频,事件推送等
    Content:发送的内容

    通过这个,我想大家,再结合上面给的流程图,是不是发现了什么呢?是的,这个OpenId,我们已经获取了呀,那是不是可以直接获取到用户信息了呢?。。。。emmmmmm,这样说吧。差不多是可以的,那具体是怎么做呢?紧接着往下看,仔细看我其中的注释

    步骤:

    1:解析发送过来的XML信息格式,将其转为Map格式

    /**
         * XML格式转为map格式
         * @param request
         * @return
         */
        public static Map<String , String> xmlToMap(HttpServletRequest request){
            Map<String ,String> map = new HashMap<String , String>();
            try {
                InputStream inputStream =null;
                inputStream = request.getInputStream();
                SAXReader reader = new SAXReader();
                Document doc = reader.read(inputStream);
                Element rootElement = doc.getRootElement();
                List<Element> elements = rootElement.elements();
                for (Element el:elements) {
                    map.put(el.getName() , el.getText());
                }
                inputStream.close();
                return map ;
            } catch (Exception e) {
                e.printStackTrace();
                return null ;
            }
        }

    备注:记得导入相应的包哦。。比如dom4j还有xsreader。。

    2:获取用户的个人信息

    package com.hnu.scw.utils;
    
    import com.hnu.scw.model.AccessToken;
    import net.sf.json.JSONObject;
    
    /**
     * @author scw
     * @create 2018-01-18 16:42
     * @desc 用于获取微信用户的信息
     **/
    public class WeiXinUserInfoUtils {
        private static final String GET_USERINFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
        /**
         * 获取微信用户账号的相关信息
         * @param opendID  用户的openId,这个通过当用户进行了消息交互的时候,才有
         * @return
         */
        public static String getUserInfo(String opendID){
            AccessToken accessToken = WeiXinUtils.getAccessToken();
            //获取access_token
            String token = accessToken.getToken();
            String url = GET_USERINFO_URL.replace("ACCESS_TOKEN" , token);
            url = url.replace("OPENID" ,opendID);
            JSONObject jsonObject = WeiXinUtils.doGetStr(url);
            return jsonObject.toString();
        }
    }

    备注:传入的参数就是咱们之前说过的,FromUserName的值,这个应该不用多解释吧。因为,对于传入的XML,我们已经存入了Map中,那么直接从Map取出对应的字段信息就可以了,

    String fromUserName = map.get("FromUserName");

    3:通过上面,我们就得到了具体的用户信息的Json格式了,当然,我上面的方法将Json内容转为了String,我这里只是用于查看是否获取到信息了而已,所以,你们就根据各自的需求进行处理就可以了,该解析的就解析即可。。

    总结:

    上面的这种方法是不是很简单,这个没什么难的,而且这个根据微信公众号的开发手册也可以分析出来。

    缺点:我们发现了,这种方法,只有当用户进行了消息交互,才会有FromUserName(这时候可以等价看成是OpenId),那么我们在实际开发中,肯定遇到了一种情况,就是用户没有进行消息交互,直接点击一个菜单按钮,然后就把用户信息自动显示到了一个页面中,那这样是怎么做,方法是一样吗?不多说,继续看下面~~~~~~~~~

    (三)情况二:通过点击按钮,来直接获取到用户信息

    思路:首先,点击菜单按钮,要先到网页授权的接口去请求(主要是获取Code,这是必须要的一个参数),然后再重定向到我们自己菜单按钮实际想去的URL,然后再获取OpenId,再通过OpenId,获取用户信息。。哇塞,咦,思路挺简单的嘛。。那么,我们开始工作。。

    步骤:

    1:创建菜单

    对于这个自定义菜单的话,不是主要介绍的了,这个如果做过微信公众号开发的,应该都明白吧。所以,我这就贴一点关键代码:

    ViewButton viewButton = new ViewButton();
            viewButton.setName("view菜单");
            viewButton.setType("view");
            //viewButton.setUrl("http://myjava.ngrok.xiaomiqiu.cn/tomainpage");
            viewButton.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXX&redirect_uri=http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");

    备注:大家,请注意,这个view菜单的URL,和我们平常的跳转的区别再哪里。。

     

    分析:

    知识点1:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXX

    这个就是网页授权的接口地址,其中的appid就是我们自己微信公众号申请的时候,给我们的唯一值,这个大家去微信公众号查看即可。

     

    知识点2:

    redirect_uri=http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");

    这个就是我们实际想要点击按钮,跳转到的页面,这个就和咱们平常的跳转是一样的,所以一定要记住,要先去授权页面,再重定向回去(主要是为了获取code参数)。

     

    2:配置微信公众号的网页授权域名

    备注:这个是在自己微信公众号的开发管理模块里面的,而且,我这里用的是测试号进行的(当然,如果有企业号这更加好呀。界面也是一样)

    注意点:对添加的回调页面域名:首先,不能加入http://这个,对于平常的链接,我想都有这个,这个是请求协议,但这里千万不能加入;另外,只需要写总的域名地址,不需要精确到最内层。打个比方:

    一般的:

    http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo

    这里就配置就只需要:(其实就是配置我们的服务器域名即可)

    myjava.ngrok.xiaomiqiu.cn

    3:编写,相应的处理内容(关键代码,请仔细看)

    备注:我用的是SSH(SpringMVC+Spring+Hibernate)框架来进行开发的,当然,用Servlet也可以,用SSM(SpringMVC+Spring+Mybatis)或者用SSH(Struts+Spring+Hibernate)都可以,这个根据自己的需求即可相应的改变呢!!(另外,这个几个框架,我其他的文章都有很详细的介绍了,所以自己看看相应配置即可)

    Controller层代码:

    package com.hnu.scw.controller;
    import com.hnu.scw.bean.WeiXinUser;
    import com.hnu.scw.service.WeiXinUserInfoService;
    import com.hnu.scw.utils.WeiXinUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @author scw
     * @create 2018-01-18 17:47
     * @desc 获取微信用户的所有信息,这个主要是为了不要用户自己填写个人信息
     **/
    @Controller
    public class WeiXinUserInfoController {
    
        @Autowired
        private WeiXinUserInfoService userService;
    
        /**
         * 进行网页授权,便于获取到用户的绑定的内容
         * @param request
         * @param session
         * @param map
         * @return
         */
        @RequestMapping("/tologin/userinfo")
        public String check(HttpServletRequest request , HttpSession session, Map<String, Object> map) {
            //首先判断一下session中,是否有保存着的当前用户的信息,有的话,就不需要进行重复请求信息
            WeiXinUser  weiXinUser = null ;
            if(session.getAttribute("currentUser") != null){
                weiXinUser = (WeiXinUser) session.getAttribute("currentUser");
            }else {
                /**
                 * 进行获取openId,必须的一个参数,这个是当进行了授权页面的时候,再重定向了我们自己的一个页面的时候,
                 * 会在request页面中,新增这个字段信息,要结合这个ProjectConst.Get_WEIXINPAGE_Code这个常量思考
                 */
                String code = request.getParameter("code");
                try {
                    //得到当前用户的信息(具体信息就看weixinUser这个javabean)
                    weiXinUser = getTheCode(session, code);
                    //将获取到的用户信息,放入到session中
                    session.setAttribute("currentUser", weiXinUser);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            map.put("weiXinUser", weiXinUser);
            return "hello";
        }
    
        /**
         * 获取用户的openId
         * @param session
         * @param code
         * @return 返回封装的微信用户的对象
         */
        private WeiXinUser getTheCode(HttpSession session, String code) {
            Map<String , String>  authInfo = new HashMap<>();
            String openId = "";
            if (code != null)
            {
                // 调用根据用户的code得到需要的授权信息
                authInfo= userService.getAuthInfo(code);
               //获取到openId
                openId = authInfo.get("Openid");
            }
            // 获取基础刷新的接口访问凭证(目前还没明白为什么用authInfo.get("AccessToken");这里面的access_token就不行)
            String accessToken = WeiXinUtils.getAccessToken().getToken();
            //获取到微信用户的信息
            WeiXinUser userinfo = userService.getUserInfo(accessToken ,openId);
    
            return userinfo;
        }
    }

    Service层接口:

    package com.hnu.scw.service;
    import com.hnu.scw.bean.WeiXinUser;
    import java.util.Map;
    /**
     * 用于进行微信用户个人信息的操作接口
     */
    public interface WeiXinUserInfoService {
         /**
          * 获取到微信个人用户的信息
          * @param accessToken
          * @param openId
          * @return
          */
         WeiXinUser getUserInfo(String accessToken, String openId);
    
         /**
          *用于获取网页授权后的信息字段,其中主要是获取openId
          * @param code  授权码
          * @return
          */
         Map<String , String > getAuthInfo(String code);
    
         /**
          * 进行网页授权的认证
          * @param code 授权码
          * @return
          */
         Map<String,String> oauth2GetOpenid(String code);
    }
    

    Service层实现:

     

    package com.hnu.scw.service.imp;
    import com.hnu.scw.bean.WeiXinUser;
    import com.hnu.scw.projectconst.ProjectConst;
    import com.hnu.scw.service.WeiXinUserInfoService;
    import com.hnu.scw.utils.WeiXinUtils;
    import net.sf.json.JSONObject;
    import org.springframework.stereotype.Service;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @author scw
     * @create 2018-01-18 17:51
     * @desc 用于获取微信用户的信息
     **/
    @Service
    public class WeiXinUserInfoImlp implements WeiXinUserInfoService {
        /**
         * 获取微信用户的信息
         * @param accessToken
         * @param openId
         * @return
         */
        @Override
        public WeiXinUser getUserInfo(String accessToken, String openId) {
            WeiXinUser weixinUserInfo = null;
            // 拼接获取用户信息接口的请求地址
            String requestUrl = ProjectConst.GET_WEIXIN_USER_URL.replace("ACCESS_TOKEN", accessToken).replace(
                    "OPENID", openId);
            // 获取用户信息(返回的是Json格式内容)
            JSONObject jsonObject = WeiXinUtils.doGetStr(requestUrl);
    
            if (null != jsonObject) {
                try {
                    //封装获取到的用户信息
                    weixinUserInfo = new WeiXinUser();
                    // 用户的标识
                    weixinUserInfo.setOpenId(jsonObject.getString("openid"));
                    // 昵称
                    weixinUserInfo.setNickname(jsonObject.getString("nickname"));
                    // 用户的性别(1是男性,2是女性,0是未知)
                    weixinUserInfo.setSex(jsonObject.getInt("sex"));
                    // 用户所在国家
                    weixinUserInfo.setCountry(jsonObject.getString("country"));
                    // 用户所在省份
                    weixinUserInfo.setProvince(jsonObject.getString("province"));
                    // 用户所在城市
                    weixinUserInfo.setCity(jsonObject.getString("city"));
                    // 用户头像
                    weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
                } catch (Exception e) {
                    if (0 == weixinUserInfo.getSubscribe()) {
                        System.out.println("用户并没有关注本公众号");
                    } else {
                        int errorCode = jsonObject.getInt("errcode");
                        String errorMsg = jsonObject.getString("errmsg");
                        System.out.println("由于"+errorCode +"错误码;错误信息为:"+errorMsg+";导致获取用户信息失败");
                    }
                }
            }
            return weixinUserInfo;
        }
    
        /**
         * 进行用户授权,获取到需要的授权字段,比如openId
         * @param code 识别得到用户id必须的一个值
         * 得到网页授权凭证和用户id
         * @return
         */
        @Override
        public Map<String, String> oauth2GetOpenid(String code) {
            //自己的配置appid(公众号进行查阅)
            String appid = ProjectConst.PROJECT_APPID;
            //自己的配置APPSECRET;(公众号进行查阅)
            String appsecret = ProjectConst.PROJECT_APPSECRET;
            //拼接用户授权接口信息
            String requestUrl = ProjectConst.GET_WEBAUTH_URL.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
            //存储获取到的授权字段信息
            Map<String, String> result = new HashMap<String, String>();
            try {
                JSONObject OpenidJSONO = WeiXinUtils.doGetStr(requestUrl);
                //OpenidJSONO可以得到的内容:access_token expires_in  refresh_token openid scope
                String Openid = String.valueOf(OpenidJSONO.get("openid"));
                String AccessToken = String.valueOf(OpenidJSONO.get("access_token"));
                //用户保存的作用域
                String Scope = String.valueOf(OpenidJSONO.get("scope"));
                String refresh_token = String.valueOf(OpenidJSONO.get("refresh_token"));
                result.put("Openid", Openid);
                result.put("AccessToken", AccessToken);
                result.put("scope", Scope);
                result.put("refresh_token", refresh_token);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    
        /**
         * 获取到微信用户的唯一的OpendID
         * @param code  这是要获取OpendId的必须的一个参数
         * @return
         */
        @Override
        public Map<String , String> getAuthInfo(String code) {
            //进行授权验证,获取到OpenID字段等信息
            Map<String, String> result = oauth2GetOpenid(code);
            // 从这里可以得到用户openid
            String openId = result.get("Openid");
    
            return result;
        }
    }

    4:GET请求接口的代码:

    package com.hnu.scw.utils;
    import com.hnu.scw.menu.BaseButton;
    import com.hnu.scw.menu.ClickButton;
    import com.hnu.scw.menu.CustomeMenu;
    import com.hnu.scw.menu.ViewButton;
    import com.hnu.scw.model.AccessToken;
    import net.sf.json.JSONObject;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    /**
     * @author scw
     * @create 2018-01-17 14:13
     * @desc 用户获取access_token,众号调用各接口时都需使用access_token
     **/
    public class WeiXinUtils {
        /**
         * Get请求,方便到一个url接口来获取结果
         * @param url
         * @return
         */
        public static JSONObject doGetStr(String url){
            DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            JSONObject jsonObject = null;
            try{
                HttpResponse response = defaultHttpClient.execute(httpGet);
                HttpEntity entity = response.getEntity();
                if(entity != null){
                    String result = EntityUtils.toString(entity, "UTF-8");
                    jsonObject = JSONObject.fromObject(result);
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return jsonObject;
        }

    5:获取Access_Token代码:(这个就是在4中的类中的方法)

    /**
         * 获取access_token
         * @return
         */
        public static AccessToken getAccessToken(){
            AccessToken accessToken = new AccessToken();
            String url = ACCESS_TOKEN_URL.replace("APPID" ,APPID).replace("APPSECRET",APPSECRET);
            JSONObject jsonObject = doGetStr(url);
            if(jsonObject !=null){
                accessToken.setToken(jsonObject.getString("access_token"));
                accessToken.setExpireIn(jsonObject.getInt("expires_in"));
            }
            return accessToken;
        }

    6:Access_Token的实体类

    package com.hnu.scw.model;
    /**
     * @author scw
     * @create 2018-01-17 14:35
     * @desc 封装AccessToken的实体
     **/
    public class AccessToken {
        private String token;
        private int expireIn;
    
        public String getToken() {
            return token;
        }
        public void setToken(String token) {
            this.token = token;
        }
        public int getExpireIn() {
            return expireIn;
        }
        public void setExpireIn(int expireIn) {
            this.expireIn = expireIn;
        }
    }

    7:用户信息的实体类

    package com.hnu.scw.bean;
    /**
     * @author scw
     * @create 2018-01-18 17:11
     * @desc 对于微信用户本身存在的信息的一个javabean,不需要在数据库中进行处理
     **/
    public class WeiXinUser {
        // 用户的标识
        private String openId;
        // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
        private int subscribe;
        // 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
        private String subscribeTime;
        // 昵称
        private String nickname;
        // 用户的性别(1是男性,2是女性,0是未知)
        private int sex;
        // 用户所在国家
        private String country;
        // 用户所在省份
        private String province;
        // 用户所在城市
        private String city;
        // 用户的语言,简体中文为zh_CN
        private String language;
        // 用户头像
        private String headImgUrl;
        public String getOpenId() {
            return openId;
        }
        public void setOpenId(String openId) {
            this.openId = openId;
        }
        public int getSubscribe() {
            return subscribe;
        }
        public void setSubscribe(int subscribe) {
            this.subscribe = subscribe;
        }
        public String getSubscribeTime() {
            return subscribeTime;
        }
        public void setSubscribeTime(String subscribeTime) {
            this.subscribeTime = subscribeTime;
        }
        public String getNickname() {
            return nickname;
        }
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
        public int getSex() {
            return sex;
        }
        public void setSex(int sex) {
            this.sex = sex;
        }
        public String getCountry() {
            return country;
        }
        public void setCountry(String country) {
            this.country = country;
        }
        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 getLanguage() {
            return language;
        }
        public void setLanguage(String language) {
            this.language = language;
        }
        public String getHeadImgUrl() {
            return headImgUrl;
        }
        public void setHeadImgUrl(String headImgUrl) {
            this.headImgUrl = headImgUrl;
        }
    }

    8:一些静态常量的接口地址:

    package com.hnu.scw.projectconst;
    
    /**
     * @author scw
     * @create 2018-01-18 15:31
     * @desc 项目相关的静态量
     **/
    public class ProjectConst {
        /**
         * 用于获取当前与微信公众号交互的用户信息的接口(一般是用第一个接口地址)
         */
        public static final String GET_WEIXIN_USER_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
        public final static String GetPageUsersUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
        /**
         * 用于进行网页授权验证的接口URL,通过这个才可以得到opendID等字段信息
         */
        public final static String GET_WEBAUTH_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    
        /**
         * 用于进行当点击按钮的时候,能够在网页授权之后获取到code,再跳转到自己设定的一个URL路径上的接口,这个主要是为了获取之后于
         * 获取openId的接口相结合
         * 注意:参数:toselfURL  表示的是当授权成功后,跳转到的自己设定的页面,所以这个要根据自己的需要进行修改
         */
        public final static String Get_WEIXINPAGE_Code = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=toselfURL&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
        /**
         * 获取access_token的URL
         */
        private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    
    }

    9:大功告成。。。。哇塞,完美解决。。

    总结:

    这种方式,相对于上面的话,好处就在于,不需要进行消息交互就可以获取到用户的信息,这样其实更符合我们的业务需求,相对于更加好。但是,第一种情况也是有实用价值的,所以,我们要客观的进行评价和使用~~~~当然,这里面还有很多的可以优化的地方,就是,比如获取Access_Token,我们一般都是弄到本地,因为微信公众号一天请求的次数有限制(2000),所以这可以进行优化哦。。。。其他的根据需求来就可以啦!!!!!!!!

         好了,这个就介绍这个多了,都是经过本人亲自测试通过后的代码,所以,大家可以放心的使用,有问题的话,可以进行留言交流哦。。。

    Github仓库地址:

    https:https://github.com/qq496616246/WeChatCode.git

    git:git@github.com:qq496616246/WeChatCode.git

    彩蛋:

    如果你想利用闲暇零散的学习技术,那么不妨关注我的公众号阅读你想要的文章哦!

    公众号搜索:Java菜鸟进阶之路

    展开全文
  • OpenID support

    2020-11-30 06:25:25
    <div><ul><li>Ability to register using OpenID</li><li>Ability to log in using OpenID</li><li>Ability to tie an OpenID to an existing account</li></ul>该提问来源于开源项目:pump-io/pump.io</p></...
  • <div><p>In 263a6c7f299a71f5dd59a7feb2d62b93bb6a577c, made <code>Auth_OpenID_ConsumerResponse::identity_url</code> and <code>Auth_OpenID_ConsumerResponse::endpoint</code> private, then redeclared them ...
  • <div><p>I followed http://railscasts.com/episodes/170-openid-with-authlogic and http://stackoverflow.com/questions/787894/ruby-openid-requiring-email-address-from-openid-provider. User can login with ...
  • however, this protocol is outdated as neither major identity providers nor resource providers support it (e.g., <a href="https://developers.google.com/identity/protocols/OpenID2">Google suspended ...
  • <div><p>I'm getting the following test failures. I guess this happens because my system resolves localhost to ::1 (IPv6) while the fetchers seems to be initialized with...openid/ruby-openid</p></div>
  • Lost slash in openid URL...

    2020-11-23 09:34:57
    <div><p>I tried registering on meld.de with my OpenID URI: <code>strk.kbt.io</code> - I was successfully redirected and verified as being the owner of that url and then brought back to the ...
  • $openid = new LightOpenID($steamauth['domainname']); if(!$openid->mode) { $openid->identity = 'http://steamcommunity.com/openid'; header('Location: ' . $openid->authUrl()); } elseif ($...
  • at _requestAuthentication (/home/swatinem/Coding/Seiten/nodestuff/node-openid/openid.js:863:3) at /home/swatinem/Coding/Seiten/nodestuff/node-openid/openid.js:790:13 at /home/swatinem/Coding/Seiten...
  • to the openid consumer, but the current OpenID provider was preventing that. <p>MemoryStore is still the default value for storage, but now if you explicitly pass 'storage=None' it will ...
  • ve added OpenID UI extension support to ruby-openid. I also did same thing for rack-openid. Can you please pull my changes and update ruby-openid gem? Then I'll send pull request to rack-openid. ...
  • 一、openId是什么? openId是用户在当前公众号下的唯一标识(‘身份证’),就是说通过这个openId,就能区分在这个公众号下具体是哪个用户。 二、openId有什么用? 假如用户A在当前公众号下购买了一件商品,用户的...
  • After Enable CSRF protection, OpenID authentication is never worked. Because OpenID redirect POST from provider site, it cannot include CSRF token. That causes following error. ...
  • 最近在做微信公众号开发,调用公众号接口获取粉丝列表的时候,会由接口返回一个openid列表,还有一个next_openid。请问其中的openid是按什么规则排序的? 公众号开发者文档中说:当公众号关注者数量超过10000时...
  • s Kiali negotiate authentication with an extenal IdP provider as described in <a href="https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth">section 3.1 of the OpenID spec</a>....
  • 5、获取到的openid做本地存储,判断没有openid进行获取openid操作 6、这边的操作是不需要弹出授权框,且code不能重复使用,所以做了关注二维码弹窗且不能关闭弹窗操作 // 强制关注公众号,获取openid getCode = ...
  • s no verification going on when a user sets is OpenID URI. This means you can "homestead" another person's OpenID so the very first time such user would use that OpenID he will be ...
  • if cookies.signed_or_encrypted[:we_openid].blank? && params[:code].blank? redirect_to oauth2_url elsif cookies.signed_or_encrypted[:we_openid].blank? && params[:code].present? &...
  • 微信小程序获取用户openid

    万次阅读 多人点赞 2018-03-26 17:12:53
    1、wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。2、code 换取 ...

    1、wx.login(OBJECT)

       调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。

    2、code 换取 session_key

    ​  这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。
    接口地址:
    https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    详细的介绍请看小程序APIhttps://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject

    3、获取用户openid实例

    //app.js
    App({
        globalData:{
            appid:'1wqas2342dasaqwe2323424ac23qwe',//appid需自己提供,此处的appid我随机编写
            secret:'e0dassdadef2424234209bwqqweqw123ccqwa',//secret需自己提供,此处的secret我随机编写
    
        },
        onLaunch: function () {
         var that = this
         var user=wx.getStorageSync('user') || {};  
         var userInfo=wx.getStorageSync('userInfo') || {}; 
         if((!user.openid || (user.expires_in || Date.now()) < (Date.now() + 600))&&(!userInfo.nickName)){ 
            wx.login({  
            success: function(res){ 
                if(res.code) {
                    wx.getUserInfo({
                        success: function (res) {
                            var objz={};
                            objz.avatarUrl=res.userInfo.avatarUrl;
                            objz.nickName=res.userInfo.nickName;
                            //console.log(objz);
                            wx.setStorageSync('userInfo', objz);//存储userInfo
                        }
                    });
                    var d=that.globalData;//这里存储了appid、secret、token串  
                    var l='https://api.weixin.qq.com/sns/jscode2session?appid='+d.appid+'&secret='+d.secret+'&js_code='+res.code+'&grant_type=authorization_code';  
                    wx.request({  
                        url: l,  
                        data: {},  
                        method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT  
                        // header: {}, // 设置请求的 header  
                        success: function(res){ 
                            var obj={};
                            obj.openid=res.data.openid;  
                            obj.expires_in=Date.now()+res.data.expires_in;  
                            //console.log(obj);
                            wx.setStorageSync('user', obj);//存储openid  
                        }  
                    });
                }else {
                    console.log('获取用户登录态失败!' + res.errMsg)
                }          
            }  
          }); 
        } 
       },
    })


    展开全文
  • SQL command <code>SELECT openid FROM user WHERE nickname=…</code> returns <code>https://launchpad.net/~v6ak b. My profile page links to <code>https://launchpad.net/~v6ak</code> OpenID <p>Actual ...
  • node-openid, node.js的OpenID 用于 Node.js的node.js的OpenID是 Node.js.的( 是的,你猜到了) 实现突出显示和特性包括:完全 OpenID 1.0/1. 1/2 兼容依赖方实施非常简单的API关联状态的简单扩展点下载库可以通
  • 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools.html#1 开发步骤 1、引导用户进入授权页面同意授权,...
  • 获取code、access_token、openid、用户昵称、地区、性别、头像等 官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Web_Developer_Tools .html#1 开发步骤 1、引导用户进入授权页面同意授权...

空空如也

1 2 3 4 5 ... 20
收藏数 11,250
精华内容 4,500
关键字:

openid