公众号授权_公众号授权给第三方 - CSDN
  • 微信公众号授权登录

    2019-03-11 10:06:00
    学会用微信授权登录,绑定自己的业务系统 适用人群 同学们需要熟悉Java开发,了解OAuth2.0 课程简介 让同学们快速撑握OAuth2.0,实现微信授权登录,开发工具采用SpringBoot2.x,通过HttpClient调用微信授权接口 ,...
  • 李纲明老师鼎力之作,是微信公众号开发类课程,本课程按照腾讯最新技术要求, 于2019年发布的全新微信公众号开发视频教学课程。 课程特点: 1.紧贴最新官方文档 2.课程包含实战案例 3.课程提供源程序,提供课程...
  • 微信公众号授权登录、获取用户信息(openid) 实现方式也是两种: 1.静默授权登录 授权登录以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知...

    微信公众号网页授权思路解析及具体代码

    微信开发文档
    实现方式也是两种:

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

    2.非静默授权登录
    非静默授权以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
    (区别:除了scope不一样,以及调用微信接口不一样,功能上,静默授权不需要用户确认,只需要用户访问某个网页,属于嵌套在普通网页里的授权形式,但是只能获取到用户的唯一标示openid和union id,无法拿到用户的微信头像、微信名称等个人信息,对于用户的简单认证还是很有用的。)

    非静默授权

    微信公众号技术开发文档: [https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432]
    首先编写一个工具类

    package com.wlw.util;
    import java.io.IOException;
    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.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
     
    import net.sf.json.JSONObject;
     
    /**
     * 
     * 工具类
     * 用来根据接口地址进行网络请求
     * @author wlw
     *
     */
    public class AuthUtil {
    	public static final String APP_ID = "****************";     //填写自己的APPID
    	public static final String APP_SECRET = "**************";   //填写自己的APPSECRET
        public static JSONObject doGetJson(String url) throws Exception, IOException {
    		JSONObject jsonObject=null;
    		//初始化httpClient
    		DefaultHttpClient client=new DefaultHttpClient();
    		//用Get方式进行提交
    		HttpGet httpGet=new HttpGet(url);
    		//发送请求
    		HttpResponse response= client.execute(httpGet);
        	//获取数据
    		HttpEntity entity=response.getEntity();
    		//格式转换
    		if (entity!=null) {
    			String result=EntityUtils.toString(entity,"UTF-8");
    			jsonObject=JSONObject.fromObject(result);
    		}
    		//释放链接
    		httpGet.releaseConnection();
    		return jsonObject;
        }
    	   
    }
    

    1.引导用户进入授权页面同意授权,获取code
    主要是发送请求:https://open.weixin.qq.com/connect/oauth2/authorize?appid="+wx_appid+"&redirect_uri="+api.wx_reg+"&response_type=code&scope=snsapi_login,snsapi_userinfo&state=1,0#wechat_redirect
    其中各个参数的意义:

    2.如果用户同意授权,页面将跳转至 redirect_uri并且携带"?code=CODE&state=STATE"
    通过code换取网页授权access_token(后台操作)以及通过access_token换取用户信息

    package com.wlw.servlet;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.wlw.util.AuthUtil;
    import net.sf.json.JSONObject;
     
    /**
     * 回调地址
     * 
     * @author wlw
     *
     */
    @WebServlet("/redirect_uri")
    public class CallBackServlet extends HttpServlet {
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		/**
    		 * 获取code
    		 */
    		String code=req.getParameter("code");
    	String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+AuthUtil.APP_ID
    			+ "&secret="+AuthUtil.APP_SECRET
    			+ "&code="+code
    			+ "&grant_type=authorization_code";
    	JSONObject jsonObject;
    	try {
    		jsonObject = AuthUtil.doGetJson(url);
    		String openid=jsonObject.getString("openid");
    		String token=jsonObject.getString("access_token");
    		/**
    		 * 拉取用户信息
    		 */
    		String infoUrl="https://api.weixin.qq.com/sns/userinfo?access_token="+token
    				+ "&openid="+openid
    				+ "&lang=zh_CN";
    		JSONObject userInfo=AuthUtil.doGetJson(infoUrl);//这里的userInfo已经是用户的信息了
    		System.out.println(userInfo);
    		//使用微信用户信息直接登录,无需注册和绑定
    		req.setAttribute("info", userInfo);
    		req.getRequestDispatcher("/index1.jsp").forward(req, resp);
    	} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	}
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		super.doPost(req, resp);
    	}
    }
    

    这里解释一下回调函数:回调地址是当我们用户同意授权后,程序会进行对回调地址的访问。所以回调地址必须在公网上能够进行访问的。(用我自己的理解就相当于是你给腾讯平台发送请求,获取用户的信息,当你参数携带正确的情况下,腾讯就会向你发送一个请求,而这个请求的路径就是上面的redirect_uri所指的路径,所以回调函数的调用只有可能在公网上进行调用)

    以上就是微信非静默授权登录的代码部分,至于微信公众平台里的配置,看我下一个文章吧~

    一下是另外两种登录的api,跟上面类似步骤,知识参数不一样而已,详细看开发文档,对应参数,详细你一定可以解决的…………
    网站的微信授权登录是以二维码的形式 api网址 api https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

    手机端微信授权登录api网址 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN

    特殊情况:html页面,controller不方便控制页面跳转的情况,公众平台上菜单的地址就不能写接口的地址,但是如果对微信接口的回调参数理解透彻的话,就很好吧,公众平台的菜单地址同样可以直接写它自身的授权接口,同时,回调地址写进入的页面,这样,相当于是通过菜单直接调微信授权接口,然后微信再跳转到你的网页页面上,同时可以携带上需要的code,页面上从路径中截取到code发送给后台,后台再进行access_token和openid的值的请求,就能正常的走通……

    参考文献

    在确保微信公众账号拥有授权作用域(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
    var getRequest = GetRequest();
    var code = null;
    if (getRequest.code) {
        code = getRequest.code;
        var data = {};
        var url = getWeiContextPath() + "接口路径";
        data.code = code;//课程
        //同步ajax,供方法中调接口
        $.ajax({
            type: "POST",
            cache: false,
            data: data,
            async: false,
            url: url,
            success: function (result) {
                    //信息完整,直接进入测试页面
                    window.location.href = "index.html"
            },
            error: function (result) {
                alert(result.msg)
            }
        });
    } else {
        //没有code,再次请求获取code
        var pageUrl = window.location.href
            .replace(/[/]/g, "%2f")
            .replace(/[:]/g, "%3a")
            .replace(/[#]/g, "%23")
            .replace(/[&]/g, "%26")
            .replace(/[=]/g, "%3d");
        var url =
            "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
            "wx7813bb6299b9b52a" +
            "&redirect_uri=" +
            pageUrl +
            "&response_type=code&scope=snsapi_base&state=STATE&connect_redirect=1#wechat_redirect";
        window.location.href = url;
    }
    
    
    //获取页面请求路径中的参数
    function GetRequest() {
        var url = location.search; //获取url中"?"符后的字串
        var theRequest = new Object();
        if (url.indexOf("?") != -1) {
            var str = url.substr(1);
            strs = str.split("&");
            for (var i = 0; i < strs.length; i++) {
                theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
            }
        }
        return theRequest;
    }
    
    展开全文
  • 微信公众号授权登陆

    2019-07-25 07:07:23
    微信网页授权文档地址 :...1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信息(需scope为 snsapi_userinf...

    微信网页授权文档地址 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

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

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

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

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

    <?php
    
    //获取code
    $code = $_GET['code'];
    
    
    // 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是完整域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
    $appid          = 'your appid';        // 微信公众平台申请的APPID
    $secret         = 'your secret';       // 微信公众平台申请的AppSecret
    
    
    // 前端访问以下地址进行授权登陆, 例子: 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
    
    
    //获取access_token
    $token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';
    $token_res = https_request($token_url);
    
    $token_data = json_decode($token_res,true);
    $token = $token_data['access_token'];
    $openid = $token_data['openid'];
    
    //获取用户信息
    $userinfo_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$token.'&openid='.$openid.'&lang=zh_CN';
    $userinfo_res = https_request( $userinfo_url);
    
    //转换用户信息
    $userinfo_data  = json_decode($userinfo_res,true);
    
    if (empty($userinfo_data['unionid'])) {
        echo '授权失败, 请重试';
    } else {
        // 数据处理
        $data['nickname']       = $userinfo_data['nickname'];       // 用户昵称
        $data['sex']            = $userinfo_data['sex'];            // 用户性别,1为男性,2为女性
        $data['province']       = $userinfo_data['province'];       // 用户个人资料填写的省份
        $data['city']           = $userinfo_data['city'];           // 用户个人资料填写的城市
        $data['country']        = $userinfo_data['country'];        // 国家,如中国为CN
        $data['headimgurl']     = $userinfo_data['headimgurl'];     // 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
        $data['unionid']        = $userinfo_data['unionid'];        // 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。
        $data['openid']         = $userinfo_data['openid'];         // 用户唯一标识。
    
        echo '授权登陆成功';
    }

     

    转载于:https://www.cnblogs.com/howey/p/10299170.html

    展开全文
  • 微信公众号开发之授权登录 1、微信公众号技术开发文档阅读 微信公众号的开发首先对开发文档的阅读,技术版本可能有变化,博客里面的内容一段时间过后,可能就出现有些小问题。 微信公众号技术开发文档:...

     

    微信公众号开发之授权登录

    1、微信公众号技术开发文档阅读

    微信公众号的开发首先对开发文档的阅读,技术版本可能有变化,博客里面的内容一段时间过后,可能就出现有些小问题。

    微信公众号技术开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432

    2、微信公众号开发工具

    微信公众号开发工具,可以使用微信web开发者工具,可以很好的模拟微信公众号开发的大部分功能(微信公众号支付不行,目前,其他,如授权登录,消息模板,地理位置等等都是可以的)。

    微信web开发者工具:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140

    只要关注就行,使用测试号,其他的账号使用需要关注你的测试号才能使用。

    3、授权登录开发准备

    3.1、使用第三方工具,生成内网映射,可以使用花生壳,生成一个可用的域名,在授权的时候使用

    花生壳地址:https://hsk.oray.com/

    3.2、可以使用微信公众号的测试号,项目上线请申请认证号,认证需要一些费用,但对于微信公众号的大部分的功能实现,已经足够了,目前微信公众号开发的微信支付是不支持的。

    申请测试账号,微信公众平台:https://mp.weixin.qq.com/

    3.3、微信公众号授权登录的微信开发配置,网页授权获取用户基本信息修改

    域名是从花生壳中获取,在授权回调页面域名中不要加上http://,目前微信公众号开发的配置路径都是一样,不要添加http://

    这边有一个注意的地方,认证号即上线的时候微信公众号授权登录,需要上传一个文件到服务器中,这个在微信公众号认证号的配置的时候是有提示的,只需要上传认证文件,到服务器就行了。

    4、微信授权登陆开发的步骤

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

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

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

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

    snsapi_base: 到第二步就结束了,获取到openid,其他操作在这个基础上(比如记录该用户访问时间次数信息)

    snsapi_userinfo: 获取openid和用户资料(昵称、头像、国、省、城市、性别、权限)

    第一步:

    @RequestMapping("loginInit.do")
    public String loginInit(HttpServletRequest request,HttpServletResponse response)  {
    	    //回调地址,要跟下面的地址能调通(getWechatGZAccessToken.do)
    	    String backUrl="http://3261045722cwy.vicp.io/wx/getWechatGZAccessToken.do";
    	    /**
    		*这儿一定要注意!!首尾不能有多的空格(因为直接复制往往会多出空格),其次就是参数的顺序不能变动
    	    **/
    	    //AuthUtil.APPID微信公众号的appId
    	    String url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + AuthUtil.APPID+
    				"&redirect_uri=" + URLEncoder.encode(backUrl,"UTF-8")+
    				"&response_type=code" +
    				"&scope=snsapi_userinfo" +
    				"&state=STATE#wechat_redirect";
    	    return "redirect:"+url;
    }
    

    下面就可以实现了,对于微信公众号一般做免登陆,可以将用户跟openid,进行绑定,查询是否已经绑定,从而不用进行用户登陆

    @RequestMapping("getWechatGZAccessToken.do")
    public String getWechatGZAccessToken(HttpServletRequest request,HttpServletResponse response) throws Exception{
    		//微信公众号的APPID和APPSECRET
    		String code=request.getParameter("code");
            String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + AuthUtil.APPID+
                    "&secret=" +AuthUtil.APPSECRET+
                    "&code=" +code+
                    "&grant_type=authorization_code";
            String result = HttpClientManager.getUrlData(url);
    		Map<String,Object> data = JSONObject.fromObject(result);
            String openid=data.get("openid").toString();
            String token=data.get("access_token").toString();
            //获取信息
            String infoUrl="https://api.weixin.qq.com/sns/userinfo?access_token=" +token+
                    "&openid=" +openid+
                    "&lang=zh_CN";
            String infoResult = HttpClientManager.getUrlData(infoUrl);
            
    	}

     HttpClientManager工具类

    package com.baosteel.qcsh.wap.controllers.thirdpartylogin.wechat;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class HttpClientManager {
    	/**
    	 * 执行url请求数据
    	 * 
    	 * @param urlStr
    	 * @return
    	 * @throws Exception
    	 * @throws IOException
    	 */
    	public static String getUrlData(String urlStr) throws Exception {
    		URL url = new URL(urlStr);
    		URLConnection connection = url.openConnection();
    		// 一旦发送成功,用以下方法就可以得到服务器的回应:
    		String sCurrentLine = "";
    		StringBuffer sTotalString = new StringBuffer();
    		InputStream l_urlStream = connection.getInputStream();
    		// 传说中的三层包装阿!
    		BufferedReader l_reader = new BufferedReader(new InputStreamReader(
    				l_urlStream, "UTF-8"));
    		while ((sCurrentLine = l_reader.readLine()) != null) {
    			sTotalString.append(sCurrentLine);
    		}
    		return sTotalString.toString();
    	}
    
    	/**
    	 * 执行url请求数据
    	 * 
    	 * @param urlStr
    	 * @return
    	 * @throws Exception
    	 * @throws IOException
    	 */
    	public static String postUrlData(String urlStr, String data)
    			throws Exception {
    		URL url = new URL(urlStr);
    		HttpURLConnection http = (HttpURLConnection) url.openConnection();
    		http.setRequestMethod("POST");
    		http.setRequestProperty("Content-Type",
    				"application/x-www-form-urlencoded");
    		http.setDoOutput(true);
    		http.setDoInput(true);
    		System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒28
    		System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒29
    																			// 30
    		OutputStream os = http.getOutputStream();
    		os.write(data.getBytes("UTF-8"));// 传入参数
    		os.flush();
    		os.close();
    		// 一旦发送成功,用以下方法就可以得到服务器的回应:
    		String sCurrentLine = "";
    		String sTotalString = "";
    		InputStream l_urlStream = http.getInputStream();
    		// 传说中的三层包装阿!
    		BufferedReader l_reader = new BufferedReader(new InputStreamReader(
    				l_urlStream, "UTF-8"));
    		while ((sCurrentLine = l_reader.readLine()) != null) {
    			sTotalString += sCurrentLine;
    		}
    		return sTotalString;
    	}
    }
    

     

     

     

     

     

     

     

     

    展开全文
  • 公众号授权

    2020-06-17 17:41:21
    <?php $weixin=new weixinhuoquxinxi(); $weixin->appid='wx0a01a5ed7857bad7'; $weixin->secret='4d5be00eaa31ca639f5078b04f20a177'; if(isset($_GET['code'])&&!...weilog.

    服务器配置验证用

            $timestamp = $_GET['timestamp'];        
            $nonce     = $_GET['nonce'];
            $token     = 'weixuegu';
            $signature = $_GET['signature'];
            $array     = array($timestamp,$nonce,$token);
            sort($array);
            //将排序后的三个参数拼接之后参数拼接之后进行sha1加密
            $tmpstr    = implode('',$array);
            
            $tmpstr    = sha1($tmpstr); 
            
        
    //  $file_write = file_put_contents("./".time().'.text',$signature.",".json_encode($tmpstr));
            //将加密后的字符串与signature进行对比;
            if($tmpstr == $signature && isset($_GET['echostr'])){
                    echo $_GET['echostr'];
                    exit;
            }else{
                 
                $this->responseMsg();
             
            }
     
    

    去权限设置,授权登录,设置域名
    在这里插入图片描述
    微信授权

     <?php
     
    $weixin=new weixinhuoquxinxi();
    $weixin->appid='wx0a01a5ed7857bad7'; 
    $weixin->secret='4d5be00eaa31ca639f5078b04f20a177';
    if(isset($_GET['code'])&&!empty($_GET['code'])){
    		$weixin->weiixnhuidiao();
    	}else{
    		$weixin->weilogin();	
    	} 
    	
    class weixinhuoquxinxi{
    		public $appid; 
        public $secret;
    	
        public function weilogin(){
    			$appid= $this->appid;
    			$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=";
    			$url.=$appid;
    			$url.="&redirect_uri=";
    			$url.="http://".$_SERVER['SERVER_NAME']."/weixindengllu.php";
    			$url.="&response_type=code";
    			$url.="&scope=snsapi_userinfo";
    			$url.="&state="."123";
    			$url.="#wechat_redirect";
    			header("location:$url") ;
    		}
    		public function weiixnhuidiao(){
    			//第二步   
    			if(!isset($_SESSION["openid"]) || empty($_SESSION["openid"])){
    			$appid= $this->appid;
    			$secret= $this->secret; 
    			$code = $_GET['code'];
    			$get_token_url='https://api.weixin.qq.com/sns/oauth2/access_token?appid=';
    			$get_token_url.=$appid;
    			$get_token_url.='&secret=';
    			$get_token_url.=$secret;
    			$get_token_url.='&code=';
    			$get_token_url.=$code;
    			$get_token_url.='&grant_type=authorization_code'; 
    			$curl = curl_init(); // 启动一个CURL会话
    				curl_setopt($curl, CURLOPT_URL, $get_token_url); 
    				curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书检查
    				curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    				$res = curl_exec($curl); 
    				if($res === FALSE ){
    					echo "CURL Error:".curl_error($curl);
    				}
    				$json_obj=json_decode($res,true);
    				
    	
    			 $_SESSION["access_token "]=$json_obj['access_token '];
    			$_SESSION["openid"]=$json_obj['openid'];
    
    			}
    		//第四步
    			$access_token=$_SESSION['access_token'];
    			$openid=$_SESSION["openid"];
    			$get_user_info_url='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
    			$curl1 = curl_init(); // 启动一个CURL会话
    				curl_setopt($curl1, CURLOPT_URL, $get_user_info_url);
    				curl_setopt($curl1, CURLOPT_RETURNTRANSFER, 1);// 跳过证书检查
    				curl_setopt($curl1, CURLOPT_SSL_VERIFYPEER, false); 
    				$res1 = curl_exec($curl1);     //返回api的json对象
    				//关闭URL请求
    				if($res1 === FALSE ){
    				echo "CURL Error:".curl_error($curl1);
    				} 
    			////解析json  
    			$user_obj=json_decode($res1,true); 
    			$data=$user_obj;
    			var_dump($data); 
    			//参数	描述
    			//openid	用户的唯一标识
    			//nickname	用户昵称
    			//sex	用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    			//province	用户个人资料填写的省份
    			//city	普通用户个人资料填写的城市
    			//country	国家,如中国为CN
    			//headimgurl	用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
    			//privilege	用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) 
    			die;
    		}
     }
    	
    	
    
     
    
    展开全文
  • 微信公众号开发之授权 开发前准备 首先准备自己的服务器资源,已有服务器的请忽略服务器资源。 我这里演示新浪云服务器环境搭建:(新注册号有免费云豆可用) 服务器资源(https://sae.sina.com.cn) access_...

    微信公众号开发之授权

    开发前准备

    首先准备自己的服务器资源,已有服务器的请忽略服务器资源。
    我这里演示新浪云服务器环境搭建:(新注册号有免费云豆可用)

    服务器资源(https://sae.sina.com.cn

    在这里插入图片描述

    access_token与服务器接入在这里插入图片描述

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181128100456310.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxNDI5Mzk1,size_16,color_FFFFFF,t_70

    access_token与服务器接入

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    微信授权登录,获取登录信息

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    ##费话不多说,直接上代码(php TP框架),第一个文件WechatController.php

    <?php
    namespace Home\Controller;
    use Think\Controller;
    use Common\Model\UserModel as UserModel;
    
    class WechatController extends Controller{
    
        private $appid;
        private $appkey;
        private $baseurl ;
    
        //微信公众号授权
        public function __construct(){
            parent::__construct();
            $this->appid = C("WEIXIN_INFO.AppID");
            $this->appkey = C("WEIXIN_INFO.AppSecret");
            $this->baseurl = "https://api.weixin.qq.com/";
        }
    
    
        //第一步:用户同意授权,获取code
        public function index(){
            $scope = "snsapi_userinfo";
            $callback = urlencode(C('SITE_URL')."Home/Wechat/callback");
            $state = time();
    
            $URL_GET_CODE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$this->appid&redirect_uri=$callback&response_type=code&scope=$scope&state=$state#wechat_redirect";
            //echo $URL_GET_CODE;
            header("Location: $URL_GET_CODE");
            exit();
        }
    
        //回调
        public function callback(){
            header("content-type:text/html; charset=utf-8");
            $code = I("get.code");
            $state = I("get.state");
            if($code && $state){
                $data = $this->access_token($code);
                if($data){
                    $access_token = $data['access_token'];
                    $openid = $data['openid'];
                    $userinfo = $this->userinfo($access_token,$openid);
                    if($this->login_sccess($userinfo)){
                        $ref = session("ref");
                        if(!$ref){
                            header('Location:/Home/Index/index');
                        }else{
                            header("Location:$ref");
                            session("ref",null);
                        }
                        exit();
                    }
                }
            }
            header('Location:/Home/Wechat/login_failure');
        }
        //第二步:通过code换取网页授权access_token
        private function access_token($code){
            $URL_GET_ACCESS_TOKEN ="sns/oauth2/access_token?appid=$this->appid&secret=$this->appkey&code=$code&grant_type=authorization_code";
    
            $content = https_get($this->baseurl.$URL_GET_ACCESS_TOKEN);
            if($content){
                $data = json_decode($content,true);
                return $data;
            }else{
                return false;
            }
    
        }
        //第三步:刷新access_token(如果需要)
        public function refresh_token($access_token){
            $URL_REFRESH_TOKEN = "sns/oauth2/refresh_token?appid=$this->appid&grant_type=refresh_token&refresh_token=$access_token ";
            $content = https_get($this->baseurl.$URL_REFRESH_TOKEN);
        }
    
        //第四步:拉取用户信息(需scope为 snsapi_userinfo)
        private function userinfo($access_token,$openid){
    
            $URL_GET_USER_INFO = "sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";
            $content = https_get($this->baseurl.$URL_GET_USER_INFO);
            if($content)
            {
                $json = json_decode($content,true);
                return $json;
            }else{
                return false;
            }
        }
    
        private function login_sccess( $userinfo){
    
            if($userinfo && $userinfo['errcode']){
                echo $userinfo['errmsg'];
                exit();
            }
    
            $userModel = new UserModel();
    
            if($userinfo && $userinfo['openid'])
            {
                $user = $userModel->where(array('openid' =>$userinfo['openid']))->find();
                if(!$user){
                    $data['openid'] = $userinfo['openid'];
                    $data['nickname'] = filterEmoji($userinfo['nickname']);
                    $data['sex'] = $userinfo['sex'];
                    $data['headimg'] = $userinfo['headimgurl'];
    				
                    //$userModel->data($data)->add();
                    $userModel -> addUser($data['openid'], $data['nickname'], $data['headimg'],$data['sex']);
                    $userid = $userModel->getLastInsID();
                    $user = $userModel->where(array('user_id' =>$userid))->find();
                }
                session('user', $user);
                return true;
            }
            return false;
    
        }
        public function login_failure()
        {
            header("content-type:text/html; charset=utf-8");
            echo "登陆失败";
        } 
    }
    

    ##费话不多说,直接上代码(php TP框架),第二个文件WechatController中要用到的function function.php

    <?php
    
    /**
     * 手机号正则
     */
    function is_mobile($telphone) {
        if (preg_match("/^1[34578]{1}\d{9}$/", $telphone)) {
            return true;
        }
        return false;
    }
    /**
     * 邮箱正则
     */
    function is_email($email) {
        if (preg_match("/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/", $email)) {
            return true;
        }
        return false;
    }
    /**
     * 身份证号正则
     */
    function is_id_number($id_number) {
        if (preg_match("/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/", $id_number)) {
            return true;
        }
        return false;
    }
    //HTTPS GET
    function https_get($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_SSLVERSION, 1); // CURL_SSLVERSION_TLSv1
    
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $content = curl_exec($curl);
        $status = curl_getinfo($curl);
        
        curl_close($curl);
        if (intval($status["http_code"]) == 200) {
            return $content;
        } else {
            return false;
        }
    }
    
    //HTTPS POST
    function https_post($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);
        $content = curl_exec($curl);
        $status = curl_getinfo($curl);
        curl_close($curl);
        if (intval($aStatus["http_code"]) == 200) {
            return $content;
        } else {
            return false;
        }
    }
    
    /**
     * 返回固定长度的随机字符串,组成:a-z,A-Z,0-9
     * @param type $length 随机字符总长度
     */
    function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
    
    function getIP() {
        global $ip;
        if (getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } else if (getenv("HTTP_X_FORWARDED_FOR")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        } else if (getenv("REMOTE_ADDR")) {
            $ip = getenv("REMOTE_ADDR");
        } else {
            $ip = "Unknow";
        }
        return $ip;
    }
    
    /**
     * 字体库
     * 生成证书时用到
     */
    function fontFamily() {
        $array = array(
            "1" => array('name' => "默认字体", 'file' => ROOT_PATH . "/Public/css/ttfs/simsun.ttf"),
            "2" => array('name' => "Calibri", 'file' => ROOT_PATH . "/Public/css/ttfs/calibri.ttf"),
            "3" => array('name' => "超黑粗体", 'file' => ROOT_PATH . "/Public/css/ttfs/hanyi_chaochu_hei.ttf"),
            "4" => array('name' => "斜体", 'file' => ROOT_PATH . "/Public/css/ttfs/yun_xieti.ttf"), //云字体
            "5" => array('name' => "Georgia Bold", 'file' => ROOT_PATH . "/Public/css/ttfs/georgiab.ttf"), //
            "6" => array('name' => "constantia", 'file' => ROOT_PATH . "/Public/css/ttfs/constantia.ttf"),
            "7" => array('name' => "Arial", 'file' => ROOT_PATH . "/Public/css/ttfs/Arial.ttf"), //
            "8" => array('name' => "arialbd", 'file' => ROOT_PATH . "/Public/css/ttfs/arialbd.ttf"), //
            "9" => array('name' => "HelveticaLT", 'file' => ROOT_PATH . "/Public/css/ttfs/Helvetica LT 33 Thin Extended.ttf"), //
            "10" => array('name' => "Helvetica Narrow Bold", 'file' => ROOT_PATH . "/Public/css/ttfs/Helvetica Narrow Bold.ttf"), //
            "11" => array('name' => "Helvetica Bold", 'file' => ROOT_PATH . "/Public/css/ttfs/Helvetica Bold.ttf"), //
            "12" => array('name' => "Helvetica", 'file' => ROOT_PATH . "/Public/css/ttfs/Helvetica.ttf"), //
        );
        return $array;
    }
    
    /**
     * 日期格式库
     * 生成证书时用到
     */
    function dateFormat() {
    //    $format1 = "F d,Y";
    //    $format2 = "jS F Y";
    //    $array = array(
    //     '1' => array("name" => date($format1, $time), 'format' => $format1, 'formatM' => array("F d", "F d Y"), 'formatD' => array('F d', 'd Y')),
    //     '2' => array("name" => date($format2, $time), 'format' => $format2, 'formatM' => array("jS F", "jS F Y"), 'formatD' => array('jS', 'jS F Y')),
    //    );
        $format1 = "F d,Y";
        $format2 = "jS F Y";
        $format3 = "F jS,Y";
        $format4 = "jS/F/Y";
        $format5 = "F j Y";
        $format6 = "m.d.Y";
        $format7 = "m/d/y";
        $format8 = "jS                       F             Y";
    
        $time = 1488507632;
        $array = array(
            '1' => array("name" => date($format1, $time), 'format' => $format1, 'formatM' => array("F d", "d, Y"), 'formatD' => array('F d', 'd, Y')),
            '2' => array("name" => date($format2, $time), 'format' => $format2, 'formatM' => array("jS F", "jS F Y"), 'formatD' => array('jS', 'jS F Y')),
            '3' => array("name" => date($format3, $time), 'format' => $format3, 'formatM' => array("F jS ", " F jS Y"), 'formatD' => array('F jS ', ' jS,Y')),
            '4' => array("name" => date($format4, $time), 'format' => $format4, 'formatM' => array("jS/F/Y", "jS/F/Y"), 'formatD' => array('jS/F/Y', 'jS/F/Y')),
            '5' => array("name" => date($format5, $time), 'format' => $format5, 'formatM' => array("F j", "j,Y"), 'formatD' => array("F j", "j,Y")),
            '6' => array("name" => date($format6, $time), 'format' => $format6, 'formatM' => array("m.d", "d.Y"), 'formatD' => array("m.d", "d.Y")),
            '7' => array("name" => date($format7, $time), 'format' => $format7, 'formatM' => array("m/d/y", "m/d/y"), 'formatD' => array('m/d/y', 'm/d/y')),
            '8' => array("name" => date($format8, $time), 'format' => $format8), //十字星证书专用
        );
        return $array;
    }
    
    /**
     * 删除给定的文件
     */
    function delFile($filename) {
        @unlink($filename);
    }
    
    /**
     * 获得名称的拼音
     */
    function getPinYin($title) {
        $title = trim($title);
        vendor("pinyin");
        $pinyin = new pinyin();
        if (preg_match_all('/^[0-9a-zA-Z]{1,}$/', $title, $match)) {
            $pinyinString = $title;
        } else {
            $data = $pinyin->get($title, 'utf8');
            $pinyinString = $data['res'];
            //$short_py = $this->data['short_res'];
        }
        return $pinyinString;
    }
    
    /**
     * json格式验证
     */
    function analyJson($json_str) {
        $json_str = str_replace('\\', '', $json_str);
        $out_arr = array();
        preg_match('/{.*}/', $json_str, $out_arr);
        if (!empty($out_arr)) {
            $result = json_decode($out_arr[0], TRUE);
            return $result;
        }
        return false;
    }
    /**
     * 过滤掉emoji表情
     */
    function filterEmoji($str) {
        $str = preg_replace_callback(
                '/./u', function (array $match) {
            return strlen($match[0]) >= 4 ? '' : $match[0];
        }, $str);
    
        return $str;
    }
    
    /**
     * 判断字符串是否为英文、空格、下划线组成
     */
    function judge_eng_str($str) {
        if (preg_match('/^[a-zA-Z_\s]+$/', $str)) {
            return true;
        }
        return false;
    }
    
    /**
     * 返回日期连接符(生成证书时)
     */
    function date_connector_sel($date_connector) {
        $date_connector_arr = array(
            '1' => '-',
            '2' => '&',
        );
        if (array_key_exists($date_connector, $date_connector_arr)) {
            return $date_connector_arr[$date_connector];
        } else {
            return '-';
        }
    }
    
    
    展开全文
  • 1.公众号授权给第三方 2.用户授权 1.公众号授权给第三方 第三方平台获取预授权码(pre_auth_code) 引导用户进入授权页(授权注册页面扫码授权,点击移动连接快速授权) 用户确认并同意登录授权给第三方平台方 ...
  • 开发微信登录,必须有一个开放平台账号(公众号授权可以不用,后面会讲到)。开放平台下面可以申请多个应用或绑定微信公众号(必须为服务号)。如下图所示 APP登录就得申请移动应用(做了微信支付的都知道怎么回...
  • 微信公众号网页授权登录: 前端时间做了一个微信公众号的项目,就是微信公众号的菜单点击我的个人中心,就向用户授权登录 获取用户的信息,进行业务逻辑的操作,微信公众号官方文档,这是我写的文章,里面有很多...
  • 微信公众号是我们经常使用的行业资讯平台,通过公众号我们可以更有效的传播我们的服务信息、提供更改的服务水平、效率。有时候我们需要授权第三方平台来进行操作会更加方便,那么如何在微信公众平台授权第三方平台呢...
  • 微信公众号嵌入项目开发基本操作 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数; 通过code参数加上AppID和AppSecret等,通过...
  • 小程序通过webview向公众号授权 1.设置公众号授权域名 2.小程序的webview的src通过带上小程序的openid以及其他的一些参数向网页授权域名下的网站发起请求。 ps:这里有个坑!!!!如果src的url太长,是的!太长...
  • 近期做了一个uniapp的h5项目,然后需要做公众号授权,之前没有做过,也爬了不少坑,分享一下。 第一个就是路由的问题,我采用的是hash模式的路由,你们也知道,路由中带#会被自动忽略后半截,所以查文档,文档上面...
  • 微信公众号授权给微信开放平台 微信公众号即运营商,微信开放平台即本人所在公司。 当微信公众号授权给微信开放平台时,我们就能帮助微信公众号去实现他们所想实现的内容,现在运营商想要实现微信支付,我们就替他...
  • vue微信公众号授权插件
  • 如何在本地进行微信公众号授权调试 原因 最近前端同事开发微信公众号,接近后期,当涉及到授权登录,支付等等的时候js就会校验安全域名和ip,那么就意味每次同事做了更改都要把微信公众号打包部署到线上服务器才能...
  • 最近写了一个公众号 授权及分享 所遇到的问题 首先是授权问题 这个是自己去第三方调的,然后自己本地保存一下自己所需要的东西就好了 分享问题 给后台传的url是动态获取的,而且还得分割,当时没有分割,导致分享...
  • 一、微信公众号授权步骤 首先到微信公众平台注册账号,可以看到有四种类型(服务号,订阅号,小程序,企业微信),用到服务号,而且还需要认证,但注册服务号需要公司的资质,我是注册了一个订阅号(为了后续申请...
  • C# 微信公众号授权登录DEMO,请在Global文件中配置好微信的appid以及AppSecret。
1 2 3 4 5 ... 20
收藏数 44,522
精华内容 17,808
关键字:

公众号授权