精华内容
下载资源
问答
  • 上一个博客也写了微信公众号获取OpenId,但是现在这个和上一个有什么区别呢。 其实呢,是差不多的,只是这个是通过用户授权。 但是,又会有人问了,明明可以未授权获取到用户的openId,那我为什么要让用户进行...

    上一个博客也写了微信公众号获取OpenId,但是现在这个和上一个有什么区别呢。

    其实呢,是差不多的,只是这个是通过用户授权。


    但是,又会有人问了,明明可以未授权获取到用户的openId,那我为什么要让用户进行授权呢,我偷偷的获取不就好了吗?

    好像很有道理,但是呢,那微信又干嘛多一个接口呢?


    其实,授权和未授权的区别就是:未授权的获取方式是需要用户关注你的公众号的,但是,授权的情况下,只要用户点击确定,用户是不需要去关注你的公众号的,你就可以获取到用户的openId以及用户的基本信息!!!

    下面我讲一下流程:其实呢,流程是和上一个博客差不多的(请注意加红部分)(最后我会附上我的Utils)



    1.在公众号后台设置回调的域名(大多情况下是你的项目)

    开发-接口权限-网页账号-用户授权获取用户基础信息中修改


    2.在页面上访问下面的网址

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=*******&redirect_uri=你回调的地址&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

    上面的会返回到你回调的地址?code=xxxxxxxxx

    也就是说它会返回到你回调的地址并且带上code参数,一般情况下,回调的地址设置为后端的action即可,然后就可以获取到code了,当你获取到code,已经成功了一大半。


    3.根据code获取到网页授权access_token(此token不是基础服务里的access_token,请记得区分),返回值内就含有openId


    4.然后根据openId以及access_token你就可以获取用户基本信息了


    下面我附上我的代码,已经封装好了,你只需修改appId以及secret即可,还有记得导入JSONObject的包哦,MyX509TrustManager就不贴了。


    Utils:


    package com.survey.common.wechat;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ConnectException;
    import java.net.URL;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    
    import com.survey.toysrus.model.WeChatAccessToken;
    import com.survey.toysrus.model.WechatUserinfo;
    
    import net.sf.json.JSONObject;
    
    import com.survey.toysrus.model.WechatAccessTokenCheck;
    
    public class weChatUtils {
    	// 微信公众号的appId以及secret
    	private static String appId = "";
    	private static String secret = "";
    	// 获取网页授权access_token的Url,和基础服务access_token不同,记得区分
    	private static String getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    	// 刷新网页授权access_token的Url,和基础服务access_token不同,记得区分
    	private static String getRefreshAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";
    	// 检验授权凭证access_token是否有效,和基础服务access_token不同,记得区分
    	private static String checkAccessTokenUrl = "https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID";
    	// 获取用户信息的Url
    	private static String getWXUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
    	/**
    	 * 根据code获取到网页授权access_token
    	 * 
    	 * @author Shen
    	 * @param code
    	 *            微信回调后带有的参数code值
    	 */
    	public static WeChatAccessToken getAccessToken(String code) {
    		String url = weChatUtils.getAccessTokenUrl.replace("APPID", weChatUtils.appId).replace("SECRET", secret)
    				.replace("CODE", code);
    		JSONObject jsonObj=JSONObject.fromObject(httpRequest(url, "POST", null));
    		return (WeChatAccessToken) JSONObject.toBean(jsonObj,WeChatAccessToken.class);
    	}
    
    	/**
    	 * 根据在获取accessToken时返回的refreshToken刷新accessToken
    	 * 
    	 * @author Shen
    	 * @param refreshToken
    	 */
    	public static WeChatAccessToken getRefreshAccessToken(String refreshToken) {
    		String url = weChatUtils.getRefreshAccessTokenUrl.replace("APPID", weChatUtils.appId).replace("REFRESH_TOKEN",
    				refreshToken);
    		JSONObject jsonObj=JSONObject.fromObject(httpRequest(url, "POST", null));
    		return (WeChatAccessToken) JSONObject.toBean(jsonObj,WeChatAccessToken.class);
    	}
    
    	/**
    	 * 获取微信用户信息
    	 * 
    	 * @author Shen
    	 * @param openId
    	 *            微信标识openId
    	 * @param accessToken
    	 *            微信网页授权accessToken
    	 */
    	public static WechatUserinfo getWXUserInfoUrl(String openId, String accessToken) {
    		String url = weChatUtils.getWXUserInfoUrl.replace("OPENID", openId).replace("ACCESS_TOKEN", accessToken);
    		JSONObject jsonObj=JSONObject.fromObject(httpRequest(url, "POST", null));
    		return (WechatUserinfo) JSONObject.toBean(jsonObj,WechatUserinfo.class);
    	}
    
    	/**
    	 * 检验授权凭证accessToken是否有效
    	 * 
    	 * @author Shen
    	 * @param openId
    	 * @param accessToken
    	 */
    	public WechatAccessTokenCheck checkAccessToken(String openId, String accessToken) {
    		String url = weChatUtils.checkAccessTokenUrl.replace("OPENID", openId).replace("ACCESS_TOKEN", accessToken);
    		JSONObject jsonObj=JSONObject.fromObject(httpRequest(url, "POST", null));
    		return (WechatAccessTokenCheck) JSONObject.toBean(jsonObj,WechatAccessTokenCheck.class);
    	}
    
    	/**
    	 * get或者post请求
    	 * 
    	 * @author Shen
    	 * @param requestUrl
    	 * @param requestMethod
    	 *            GET or POST 需要大写*
    	 * @param outputStr
    	 * @return
    	 */
    	public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {
    		StringBuffer buffer = new StringBuffer();
    		try {
    			// 创建SSLContext对象,并使用我们指定的信任管理器初始化
    			TrustManager[] tm = { new MyX509TrustManager() };
    			SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
    			sslContext.init(null, tm, new java.security.SecureRandom());
    			// 从上述SSLContext对象中得到SSLSocketFactory对象
    			SSLSocketFactory ssf = sslContext.getSocketFactory();
    			URL url = new URL(requestUrl);
    			HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
    			httpUrlConn.setSSLSocketFactory(ssf);
    			httpUrlConn.setDoOutput(true);
    			httpUrlConn.setDoInput(true);
    			httpUrlConn.setUseCaches(false);
    			// 设置请求方式(GET/POST)
    			httpUrlConn.setRequestMethod(requestMethod);
    			if ("GET".equalsIgnoreCase(requestMethod))
    				httpUrlConn.connect();
    			// 当有数据需要提交时
    			if (null != outputStr) {
    				OutputStream outputStream = httpUrlConn.getOutputStream();
    				// 注意编码格式,防止中文乱码
    				outputStream.write(outputStr.getBytes("UTF-8"));
    				outputStream.close();
    			}
    			// 将返回的输入流转换成字符串
    			InputStream inputStream = httpUrlConn.getInputStream();
    			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
    			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    			String str = null;
    			while ((str = bufferedReader.readLine()) != null) {
    				buffer.append(str);
    			}
    			bufferedReader.close();
    			inputStreamReader.close();
    			// 释放资源
    			inputStream.close();
    			inputStream = null;
    			httpUrlConn.disconnect();
    		} catch (ConnectException ce) {
    			System.out.println("Weixin server connection timed out." + ce.getMessage());
    		} catch (Exception e) {
    			System.out.println("https request error:{}" + e.getMessage());
    		}
    		return buffer.toString();
    	}
    
    }
    
    WeChatAccessToken:
    package com.survey.toysrus.model;
    
    /**
     * 此AccessToken不是基础模块的AccessToken,是一个特殊的网页授权access_token,请记得区分
     * 
     * @author Shen date : 2018-01-22
     */
    public class WeChatAccessToken {
    	/**
    	 * 直接引用了微信的返回值,不使用驼峰等命名 access_token
    	 * 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 expires_in
    	 * access_token接口调用凭证超时时间,单位(秒) refresh_token 用户刷新access_token openid
    	 * 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID scope
    	 * 用户授权的作用域,使用逗号(,)分隔
    	 */
    	private String access_token;
    	private int expires_in;
    	private String refresh_token;
    	private String openid;
    	private String scope;
    
    	// 额外的信息
    	private int errcode;
    	private String errmsg;
    
    	public int getErrcode() {
    		return errcode;
    	}
    
    	public void setErrcode(int errcode) {
    		this.errcode = errcode;
    	}
    
    	public String getErrmsg() {
    		return errmsg;
    	}
    
    	public void setErrmsg(String errmsg) {
    		this.errmsg = errmsg;
    	}
    
    	public String getAccess_token() {
    		return access_token;
    	}
    
    	public void setAccess_token(String access_token) {
    		this.access_token = access_token;
    	}
    
    	public int getExpires_in() {
    		return expires_in;
    	}
    
    	public void setExpires_in(int expires_in) {
    		this.expires_in = expires_in;
    	}
    
    	public String getRefresh_token() {
    		return refresh_token;
    	}
    
    	public void setRefresh_token(String refresh_token) {
    		this.refresh_token = refresh_token;
    	}
    
    	public String getOpenid() {
    		return openid;
    	}
    
    	public void setOpenid(String openid) {
    		this.openid = openid;
    	}
    
    	public String getScope() {
    		return scope;
    	}
    
    	public void setScope(String scope) {
    		this.scope = scope;
    	}
    
    }







    展开全文
  • openId是微信对于用户的唯一辨识,只要有用户关注你的公众号,微信会通过公众号和用户微信号通过一种算法生成一种唯一标识码,也就是openId,用数学表达式也就是说: x=你的公众号,y=用户微信号,f()函数表示...

    文章的一开始,我先解释下微信公众号的openId。

    openId是微信对于用户的唯一辨识,只要有用户关注你的公众号,微信会通过公众号和用户微信号通过一种算法生成一种唯一标识码,也就是openId,用数学表达式也就是说:

    x=你的公众号,y=用户微信号,f()函数表示算法

    那么openId = f(x,y);

    后面就讲讲怎么获取到openId把,我下面先讲一种简易的方式(还有一种后续有空加上)

    1.在公众号后台设置回调的域名(大多情况下是你的项目)

    开发-接口权限-网页账号-用户授权获取用户基础信息中修改

    2.在页面上访问下面的网址

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=*******&redirect_uri=你回调的地址&response_type=code&scope=snsapi_base&state=1#wechat_redirect

    上面的会返回到你回调的地址?code=xxxxxxxxx

    也就是说它会返回到你回调的地址并且带上code参数,一般情况下,回调的地址设置为后端的action即可,然后就可以获取到code了,当你获取到code,已经成功了一大半。

    3.然后在后端访问下面的网址

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=***&secret=***&code=***&grant_type=authorization_code

    code的参数用刚刚返回的code值。

    4.上面网页将会返回json,其中openId就在其中。


    至此,openId就获取到了,但是要注意:此处只获取到了openId,也就是不需要用户授权的,要获取用户其它的信息请参考接口文档。还有就是每次获取openId请重新获取code,code值不要重复使用,防止出错。

    在微信页面上我是把获取到的openId保存在cookie中的,这样就可以防止openId的重复获取,我只在用户第一次进入或者cookie中的openId失效的时候进行再次获取的。至今没什么问题,但是我不知道大神们是把openId是放在哪里,我也只是给大家一个意见而已。

    如果文档中有什么问题希望指出,如果需要帮助请私信。


    展开全文
  • 主要为大家详细介绍了.NET微信公众号获取OpenID和用户信息的方法,用户OpenID对于微信公众平台开发尤为重要,感兴趣的小伙伴们可以参考一下
  • 现在有这么一个需求,用户不需要关注公众号什么的...好像目前只能获取openid,但是我发现总是和公众号扯在一起,不关注公众号使用OAuth2.0静默认证可以完成这个需求吧。具体怎么操作,求指教!或者说有没有更好的办法?
  • 公众号获取openid

    2021-05-18 11:32:19
    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 关于网页授权回调域名的说明 1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台...

    文档地址 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#1

    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

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

    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)关注了公众号后,才能调用成功的。

    关于网页授权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机制)

    第一步:用户同意授权,获取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的安全性。

    参数说明

    第二步:通过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获取用户信息等步骤,也必须从服务器发起。

    请求方法

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

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

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

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

    请求方法

     

    展开全文
  • 微信公众号获取openid

    2017-11-01 10:36:26
    两种方式获取微信用户openid,有图文介绍,代码是全的,可以直接拿来用
  • 1、从微信后台获取code:用户请求微信后台,带上appid等参数 “https://open.weixin.qq.com/connect/oauth2/authorize?appid=” + appId + “&redirect_uri=” + redirectUri + “&response_type=code&scope=snsapi_...
  • 首先了解openid到底是个啥:所谓的openid就是公众号普通用户的一个唯一的标识,只针对当前的公众号有效,开发者可以通过openID获取用户的基本信息,比如说:所在城市,省份,国家,性别等等。(对不同的公众号同一...

             网上参考了很多,从中总结了一下(适合自己的才是最好的)。这里大致总结一些细节性的东西,配置步骤啥的参考他人的即可。首先了解openid到底是个啥:所谓的openid就是公众号普通用户的一个唯一的标识,只针对当前的公众号有效,开发者可以通过openID来获取用户的基本信息,比如说:所在城市,省份,国家,性别等等。(对不同的公众号同一个人普通用户的openID是不同的!

    环境配置阶段

    1.申请测试微信公众号(没什么限制性的地方,只需设置几个关键的地方即可)

    申请网址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    2.知己知彼(名词理解)

    APPID:微信公众号ID

    ASPECTSECRET:微信公众号密钥

    URL:进行相关接口开发的URL

    TOKEN:验证接口的令牌,可以自己定义(需要与在后台自定义的token进行校验,验证成功后才会配置成功

    JS域名:安全设置,调用微信JS-SDK的时候,域名与此相同。一般调试的话填写映射地址,无http://

     

    之后的操作当时我只是为了调试是否能得到openID,所以只用到了App ID和ASPECTSECRET,后面的配置没怎么用到,到文章最后再总结一下其他参数的配置。

    后台实现阶段

    1.用到的主要的maven依赖包-------------------weixin-java-mp.

            <!--weixin-->
            <dependency>
                <groupId>com.github.binarywang</groupId>
                <artifactId>weixin-java-mp</artifactId>
                <version>2.6.0</version>
            </dependency>

    2.配置类(主要是里面WxMpService,我们需要将其封装为我们自己的service,也就是需要写入APPID和SECRET)

    @Component
    public class WxMpConfig {
        @Value("${wxconfig.AppId}")
        private String AppId;
    
        @Value("${wxconfig.Secret}")
        private String Secret;
    
    
        @Bean
        public WxMpService wxMpService(){
            WxMpService wxMpService = new WxMpServiceImpl();
            WxMpInMemoryConfigStorage ConfigStorage = new WxMpInMemoryConfigStorage();
            ConfigStorage.setAppId(AppId);
            ConfigStorage.setSecret(Secret);
            wxMpService.setWxMpConfigStorage(ConfigStorage);
            return wxMpService;
        }
    }

    注意:配置文件的信息要配置好,我这里用的是yml格式,用Value进行读取。

    3.应用层进行获取openID以及重定向路由:

    @RestController
    @Slf4j
    @RequestMapping("wx")
    public class WinxinController {
    
        //这个就是我们封装好的service
        @Autowired
        private WxMpService wxMpService;
    
        @GetMapping("openid")
        public Map<String,Object> getOpenId(@RequestParam String code) {
    
            log.info("微信获取openID 入参:{}",code);
           Map<String,Object> resultMap = new HashMap<>();
            if (StringUtils.isEmpty(code)){
                resultMap.put("404","参数为空");
                return resultMap;
            }
           
            try {
                //未登录过获取openId进行授权
                String openID = null;
                WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
                openID = accessToken.getOpenId();
                resultMap.put("openId",openID);
                return resultMap;
    
            }catch (WxErrorException e) {
               // e.printStackTrace();    //尽量不要使用这个打印异常,会造成内存锁,使用log日志就好
                log.error(e.getError().getErrorMsg());
                resultMap.put("404","参数为空");
                return resultMap;
            }
    
    
    @GetMapping("authorize")
        public SinochemHttpResponse<Object> getAuthorize(@RequestParam String url,@RequestParam String state){
            log.info("重定向的页面路由URL:{}",url);
            log.info("获取用户自定义信息:{}",state);
    
            Map<String,Object> resultMap = new HashMap<>();
            try {
                String redictUrl = wxMpService.oauth2buildAuthorizationUrl(url,WxConsts.OAUTH2_SCOPE_BASE,URLEncoder.encode(state,"UTF-8"));
                resultMap.put("redictUrl",redictUrl);
                return SinochemHttpResponse.success(resultMap);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return SinochemHttpResponse.error("404","获取失败(重定向路由)!");
            }
        }
     }
    

                 第二个GET请求主要是用来重定向路由的,如果你的请求在微信直接访问是会报错的,微信有专门的访问机制,先到微信服务器然后回调你自己的路由才能正确的跳转返回数据。WxMpservice里面的函数oauth2buildAuthorizationUrl(),第一个参数是你要跳转的路由,也就是回调地址;第二个参数是作用域范围,(snsapi_userinfo指的是弹出用户授权页面,获取用户的基本信息,即使用户未关注的情况下,只要用户点击确定就可以获取基本信息;snsapi_base指的是不跳出授权页面只能获取用到的openid信息)这里选基本snsapi_base即可;第三个参数state一般是用户自定义的附加信息,可以加密后进行后续调用验证.(个人理解),函数里面的实现都是封装好的,拿来用就可以,也可以你自己去拼接路由:

    例如:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的APPID&redirect_uri=你的回调地址(也就是跳转地址)&response_type=code&scope=选择的作用域&state=如果有附带信息就写没有就是null#wechat_redirect

    第二个GET请求返回的结果就是上面的这种格式.

    测试阶段

    1.在测试之前我们需要做一件事情,那就是请求需要公网,需要把内网进行映射一下.(当然有自己的服务器就更完美啦)

        具体怎么映射,参考上一篇博客:https://blog.csdn.net/H_XINGHAI/article/details/95339243

    还有一点就是:端口号最好设置成8080进行调试

    2.下载微信开发者工具.进行调试.

    3.选择公众号网页调试.如下:

    4.请求第二个GET请求

    这里的参数是第一个GET请求的路由,目的就是为了获取openID

    发送请求后返回的重定向结果也就是之前处理过并且拼接好的字符串放到微信开发者工具里面进行调试,发送请求后既可以得到redictUrl.(并且会把code以及state携带到重定向后的url中)

    如下:

    然后复制这个网址到微信开发者工具再次访问后结果如下:

    已经获取到了openid,然后就可以接下来我们自己服务接口的操作了.

    遇到问题的解决方案

    1.{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: xxxxxxxxx ]"}

         这个问题是我发送了两次请求,导致报错:

    查找相关资料后了解到:微信网页授权得到的code只能使用一次(5min内有效)使用一次后马上失效.

    解决方案的话个人感觉就是前端怎么存储了,存储到cookie里设置一个有效时间,授权后直接取到用即可;也可以每次获取openid的时候,先判断她是否为空,如果是空的话,就调用重定向接口,去获取openid.这样也能拿到新的openid;

    2.{‘errcode’:40029,’errmsg’:’invalid code, hints: [ req_id: 0407ns44 ]’}

         这个问题主要原因是code失效问题

    查找网上的资料都说时域名出错.我本地测试都是内网穿透工具生成的映射公网,估计会有些许问题.到生产环境应该没问题.

    写在最后(遗留问题的补充)

             之前问题是我们只用到了APPID和SECRET剩下的几个参数没有用到.参考这篇博客就可以大致了解了

    https://blog.csdn.net/lovePaul77/article/details/78556059

        我再总结几个需要注意的地方:

    1.在微信公众平台接口配置信息模块的token在后台实现时需要保持一致,也就是需要写验证token的代码(加密,解密的过程)

    配置好后先重启,将代码运行起来! 将代码运行起来! 将代码运行起来! 重要的事情说三遍!!!  点击提交显示配置成功

    2.js接口安全域名的域名是你内网穿透后没有http://后的部分,点击提交 配置成功.

    3.最后要修改的地方就是网页服务----->网页账号------>网页授权获取用户基本信息里面的 授权回调页面域名也是没有http://的部分.

     

     

    以上如果没错的话,基本上微信公众平台环境就搭建好了,就看个人怎么开发了.

    展开全文
  • 用java代码通过OAuth授权获取openid,有时会返回invalid code错误,有时不会。具体是什么原因?求大神们解答
  • class WechatsignController { private $appId = ''; private $appSecret= ''; function getBaseInfo(){ //1.获取到code $appid=$this-&gt;appId;//这里的appid是假的演示用 ...
  • 微信公众号开发示例 一、拥有80端口配置: 1、微信公众号相关配置 ...1、需要通过中间服务器(IIS、tomcat)转发获取code然后传递到后台获取access_token和openId 2、微信公众号菜单配置跳转路径: https://open.weixi
  • 首先微信个人用户,关注了 微信公众号 我需要通过代码获取这个用户针对于... 现在的微信公众号接口好像只能批量把用户的openid获取出来,自己再进行匹配 ,我需要针对某一个用户获取openid,有办法吗?谢谢大家了。
  • 1、H5页面是运行在微信浏览器的 2、需要与公众号关联(即需要openid) 3、判断需求是否需要弹窗告知用户授权...// 强制关注公众号获取openid getCode = function () { if (sessionStorage.getItem("openid")&&ses
  • 微信官方文档——unionID 代码示例: 微信小程序——前端JS ... onLoad: function () { var that = this wx.login({ success: res =>... // 获取用户的openID 判断是否是新用户 wx.request({ url: ur.
  • 一上来就问:子恒老师,我怎么获取公众号粉丝的信息呢? 我可以理解这些学员的心情, 毕竟不希望被微信一封杀就什么都没有了。 其实获取用户的信息需要两个步骤: 获取到用户的...
  • 微信公众号获取用户openid有两种方式 一种需要用户授权获取的用户数据相对较多,如用户名称、头像等,还有一种无需授权获取直接上代码, 获取用户openid首先要获取code,然后将code作为参数调用微信api获取openid...
  • 你已经把公众号粉丝的openid获取到, 现在就可以通过openid获取这个用户的详细信息了。 微信提供给我们的用户信息包括下面几个方面: 昵称、头像、性别、所在城市、语言和关注时间等等, 子恒老师将跟...
  • 做为一名开发人员,在测试当中也经常需要用到openid,但是微信公众号获取openid的方法也是特别麻烦!网页授权是最常见的方式, 但是网页授权的流程太复杂,不仅要开发,还要在公众号后台设置回调域名(必须备案域名...
  • 1、H5页面是运行在微信浏览器的 2、需要与公众号关联(即需要openid) ...5、获取到的openid做本地存储,判断没有openid进行获取openid操作 6、这边的操作是不需要弹出授权框,且code不能重复使用,所...
  • 获取用户基本信息用户在关注公众号之后,你可以获取到用户的openID(加密后的微信号,每个用户对应每个公众号的openID是唯一的)。通过openID可以获取到包括昵称、头像、性别、所在城市、语言和关注时间的用户信息。...
  • 微信公众号获取用户openId 拼接的参数【可以直接配菜单中】: ... redirect_uri参数错误 注意要点:redirect_uri回调的地址不能是网站根目录……我特么气死,所以默认进入跳转login页面; 文章传送门: 官方文档说明 ...
  • java微信公众号获取用户openid

    千次阅读 2020-05-13 15:48:51
    * 获取用户openid,获取token链接在公众号上 * */ @RequestMapping(value="getopenIDCODE.do") public String getopenIDCODE(String code, String openid, HttpServletRequest request, HttpServletResponse ...
  • 微信公众号获取用户的openid

    万次阅读 2017-09-01 20:09:01
    公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号OpenID是唯一的。对于不同公众号,同一...公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
  • 微信公众号OpenID获取

    2016-01-29 17:08:42
    本应用便于微信公众号公众号管理 自己公众号关注用户。 1.列表 显示公众号关注用户。 2. 可以以Excel形式将用户信息 发送到PC或手机上。 3. 显示微信公众号发红包 需要的用户OpenID
  • 文章目录 1、工具类的构建 2、数据实体类的构建 3、批量获取用户openid 4、批量获取用户信息 1、工具类的构建 首先创建如下代码到RestTemplateUtil.java文件中,RestTemplateUtil这个类将帮助我们解析微信服务器...
  • requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId); // 通过网页授权获取用户信息 String urlResult = HttpUtil.get(requestUrl); JSONObject jsonUrl = JSONUtil....
  • 本文demo下载:wisdomdd.cn在开发微信公众号时,一旦用户关注了微信公众号,用户后续的操作已经跟用户的信息进行了绑定,那这些绑定的信息其它是通过OpenId进行的,每个用户关注不同的微信公众号时会产生唯一且不同...
  • 最近在做微信公众号开发,调用公众号接口获取粉丝列表的时候,会由接口返回一个openid列表,还有一个next_openid。请问其中的openid是按什么规则排序的? 公众号开发者文档中说:当公众号关注者数量超过10000时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,809
精华内容 2,323
关键字:

关注公众号获取openid