2018-08-06 13:39:11 qq_38366111 阅读数 1204

一、微信获取code。

这两天在做公司的微信公众号开发。慢慢的对code有了一定的了解。有人说开发的时候直接看微信开发者文档不就行了?其实可以看,只不过我第一次看没搞明白,到底什么是code,再加上运行项目始终死在code获取不到上。最后我不得不在回过头看看到底什么是code。之后反反复复进行项目测试的时候,直到成功了,我才深有体会。下面写一下我的心里感受把。

首先关于微信网页授权,参考微信开发者文档。https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842大家可以过一遍看看。最重要的是微信的redirect_uri的填写,文档上说这个uri是要进行这个urlEncode 对链接进行处理。这个的好处并不是加密。是为了如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。容易获取?后面的code和state,这两个值是微信授权页面之后,微信端附加的参数,也就是我们要获取的code,最后直接从url里面获取到参数就行,也就我们获取code。

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

二、使用code获取用户信息。同时牵扯到确定用户是否关注该公众号的问题。

获取用户信息使用access_token和openid。然而access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

openid的获取链接是这个

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

其中code就是上面所说的code。另外appid也就是你自己微信平台的aapid和secret是你自己的APPSECRET。发送http请求可以进一步获取到openid

三、微信的长链接转链接。

微信的长链接转短链接官方api如下。

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433600

/**
     * 长链接转短链接
     * @param accessToken
     * @param long_url
     * @return
     * @throws Exception
     */
    public static Map<String,Object> getLink(String accessToken,String long_url) throws Exception {
        Map<String,Object> returnBack = new HashMap<>();
        // 拼装创建菜单的url
        String url = link_create_url.replace("ACCESS_TOKEN", accessToken);
        String param = "{\"action\":\"long2short\","
                + "\"long_url\":\""+long_url+"\"}";
        // 调用接口创建菜单
        JSONObject jsonObject = httpRequest(url, "POST", param);
        System.out.println(jsonObject);
        if (null != jsonObject) {
            returnBack.put("returnCode", jsonObject.getInt("errcode"));
            returnBack.put("short_url", jsonObject.getString("short_url"));
            return returnBack;
        }else{
            return null;
        }
    }

 

httpRequest

public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr)   {
        HttpsURLConnection httpUrlConn = null;
        OutputStream outputStream = null ;
        InputStream inputStream = null;
        
        JSONObject jsonObject = null;
        StringBuffer buffer = new StringBuffer();
        // 创建SSLContext对象,并使用我们指定的信任管理器初始化
        TrustManager[] tm = { new MyX509TrustManager() };
        try{
        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);
         httpUrlConn = (HttpsURLConnection) url.openConnection();
        httpUrlConn.setSSLSocketFactory(ssf);
        httpUrlConn.setDoOutput(true);
        httpUrlConn.setDoInput(true);
        httpUrlConn.setUseCaches(false);
        // 设置请求方式(GET/POST)
        httpUrlConn.setRequestMethod(requestMethod);

            httpUrlConn.connect();

        // 当有数据需要提交时
        if (null != outputStr) {
             outputStream = httpUrlConn.getOutputStream();
            // 注意编码格式,防止中文乱码
            outputStream.write(outputStr.getBytes("UTF-8"));
            outputStream.close();
        }

        // 将返回的输入流转换成字符串
         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();
        jsonObject = JSONObject.fromObject(buffer.toString());
        }catch(Exception e){
            logger.error("网络请求错误  class-httpRequest-error={}",e);
            e.printStackTrace();
        }finally{
            // 释放资源
            try {
                if(inputStream != null){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            inputStream = null;
            if (httpUrlConn != null ){
                httpUrlConn.disconnect();
            }
        }
        return jsonObject;
    }

大概就这三个方向。是我这一阵子学习的感悟。

 

 

2017-08-05 16:14:58 qq_21583681 阅读数 1378

在微信开发中,通常要获取点击链接的用户的open_id通常需要这几步。

1、获取带code的url,重定向。获取code。

    static public function getURL(array $params)
    {
        $wx_id = $params['wx_id'];
        $domain = self::getWxDate($wx_id)->domain;
        $name = $params['name'];
        $param = [
            'appid' => config('wechat.app_id'),
            'redirect_uri' => $domain .'/wx/' . $name,
            'response_type' => 'code',
            'scope' => 'snsapi_base',
            'state' => 1
        ];
        return 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query($param) . '#wechat_redirect';
    }


2、通过code获取openid
    public function getAuth(Request $request)
    {
        $code = $request->input('code');
        $open_id = Cache::get($code, false);
        if (!$open_id) {
            $params = [
                'appid' => config('wechat.app_id'),
                'secret' => config('wechat.secret'),
                'code' => $request->input('code'),
                'grant_type' => 'authorization_code',
            ];
            $http = new Http();
            $result = $http->get('https://api.weixin.qq.com/sns/oauth2/access_token', $params)->getBody();
            $result = json_decode($result, true);
            if (isset($result['errcode'])) {
                return $result['errmsg'];
            } else {
                $open_id = $result['openid'];
                Cache::put($code, $open_id, 10);
            }
        }
        return view('weixin', ['open_id' => $open_id, 'red' => $data->amount]);
    }

注:因为当通过code来获取openid时,code只能使用一次,这里用了一个小技巧来解决刷新网页code过期。就是上面标红的代码部分。当第一次获取到openid时,将openid缓存起来,刷新时会判断,如果openid存在,就不用通过code来获取openid了。当然这两行代码还有值得注意的地方就是缓存的key为code值。



                                
2015-08-19 14:56:17 inforstack 阅读数 41228

修改微信授权回调域名

1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;

授权回调域名配置规范为全域名

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鉴权

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

第一步:用户同意授权,获取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重定向时候,必须带此参数 

注:回调链接一定要urlencode,不然识别不出


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

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

请求方法

获取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",
   "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

参数描述
access_token网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_inaccess_token接口调用凭证超时时间,单位(秒)
refresh_token用户刷新access_token
openid用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope用户授权的作用域,使用逗号(,)分隔
unionid只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)


	public static Authorize getAuthorize(String code){
		Authorize authorize  = null;
		try{
		Token token = Token.getInstance();
		HttpClient hc = new HttpClient();
		Map<String, String> params = new HashMap<String, String>();
		params.put("appid", token.getAppid());
		params.put("secret", token.getSecret());
		params.put("code", code);
		params.put("grant_type", "authorization_code");
		String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
		authorize =  hc.post(url, params, new JsonParser<Authorize>(Authorize.class));
		} catch (Exception e) {
			log.error("getOpenid erro message:" + e.getMessage(), e);
		}
		return authorize;
	}
	public class Authorize {
		private String errcode;
		private String errmsg;
		private String access_token;
		private String expires_in;
		private String refresh_token;
		private String openid;
		private String scope;
		// get set
	}
注:HttpClient 是被封住带工具类。我们获取openid,和相应带用户绑定,那么接下来就可以实现发送消息.


2019-12-26 11:39:31 wangwengrui40 阅读数 16

学习微信开发的第一步就是获取用户信息。那么我们用C#怎么开发呢?

根据开发者文档获取用户信息分为4步: 获取code(授权标识)--->通过code掉微信接口获取OpenId(微信公众号每个用户的唯一标识)-->获取accessToken(调接口标识)---》通过OpenId、accessToken 掉接口获取 用户信息

下面介绍获取code的原理(注意是原理,你可以更具这个原理,写一个页面获取也可以,写一个接口获取)

获取code

获取code原理

把你要获取code的地址,封装成下面的连接,让用户点击

https://open.weixin.qq.com/connect/oauth2/authorize?appid=你自己公众的appId&redirect_uri=你获取code的地址&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

用户点击授权后会自动跳到你的地址,并带上code参数

你获取code的地址?code

演示:

我写了个 获取参数地址的页面

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <script>
   window.onload = function(){ 
    
	var url = document.location.toString();//获取url地址
    var urlParmStr = url.slice(url.indexOf('?')+1);//获取问号后所有的字符串
    var arr = urlParmStr.split('&');//通过&符号将字符串分割转成数组
    var code = arr[0].split("=")[1];//获取数组中第一个参数
	document.getElementById("code").innerHTML=code;
  } 

  </script>
</head>

<body>
<p id="code"> </P>
</body>

写好后发布,并到公众号-->功能设置,把网页授权给你的域名(必须是域名,它要求下载的文件放到,)

如果没有域名可以用花生壳进行映射一个域名

最后引导用户点击这个加了微信前缀的连接就可以,得到code了。

2018-11-28 17:59:21 gt15886435708 阅读数 731

/**
     * 根据url获取json数据
     * @param url
     * @return
     * @throws IOException 
     */
    public static String getUserInfo(String token,String code) throws IOException {
        StringBuilder json = new StringBuilder();
        BufferedReader in = null;
        HttpURLConnection conn = null;
        try {
            URL url = new URL("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token="+token+"&code="+code);
            conn = (HttpURLConnection) url.openConnection();
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
            String inputLine = null;
            while ((inputLine = in.readLine()) != null) {
                json.append(inputLine);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            in.close();
            conn.disconnect();
        }
        return json.toString();
    }

运行结果:

{
    "UserId": "zhagnsan",
    "DeviceId": "864253035285998",
    "errcode": 0,
    "errmsg": "ok",
    "user_ticket": "4TmADZ0hfsAw4QWIayl6IepHr6f9rQTwsSoowj4VuqXLQf2yWOoAXW8zKOnvPOZjb4hJI-MHsisDfkDKQbITqxo0a1P5XnYw6ZtHlsTjMTI",
    "expires_in": 1800
}

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