微信开发扫码关注_微信开发 获取扫码关注事件 - CSDN
  • 1、让用户扫描我们的二维码首先需要知道扫描者是否已经关注微信公众号。 2、我们需要知道自己微信公众号的唯一标识。 微信公众号中提供了开发者测试公众号,地址:...

    首先要知道的几点:

    1、让用户扫描我们的二维码首先需要知道扫描者是否已经关注该微信公众号。

    2、我们需要知道自己微信公众号的唯一标识。


    微信公众号中提供了开发者测试公众号,地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

    其中公众号中两个主要的信息是:appid和appsecret。相当于用户名和密码。



    公众号的借口访问需要使用access_token,而appid和appsecret则是访问的凭据。



    微信公众平台已经提供获取access_token的访问接口:


    注意是HTTPS请求:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET


    因为每一个用户在某个公众号的openid都是唯一的,所以需要知道某个用户是否在微信公众号中是否有关注,则需要让微信平台知道需要关注的公众号的信息,才能提供扫描用户在公众号的openid。所以公众号平台提供了此接口,为在未关注或已关注状态的用户网页访问公众号时,提供用户在公众号的唯一openid。





    使用的访问链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

    注意:参数说明如下:



    如果知道了用户所在公众号的唯一openid,则可以根据其调用平台的另一个获取用户基本信息的接口获取关注状态。



    接口地址:GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN


    返回值以json格式展示:如下是接口参数说明,可以使用subscribe参数判断是否已经关注:0-未关注,1-已关注。





    由于微信已经屏蔽掉,网页中通过点击按钮弹出关注页面的方式。可以使用以下链接,访问公众号的页面,可以直接点击图标进行关注。

    https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz="+biz+"&chksm==&scene=110#wechat_redirect

    注意:biz的值不是appid,而是一种特殊字符串。获取方式是:1、分享公众号的一篇文章到其他应用(除了微信)。2、复制链接,可以看到biz参数的值。



    以上是需要考虑到的基本信息,接下来就是实现逻辑。


    1、业务中提供需要访问链接,以二维码的方式访问。

    2、二维码中跳转的链接是:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

    3、DEDIRECT_URI路径是我们处理判断逻辑的后台controller。注意:如果是公众号域名需要通过授权,在公众号接口参数中设置。

    4、第2点的接口中会传递code参数给处理类。处理类中接收code参数,通过code参数获取access_token和openid参数。

    5、注意此access_token参数有效期很短,如有需要可以刷新access_token,或再重新获取。

    6、根据openid和access_token获取用户在公众号中的基本信息。

    7、如果返回的subscribe的值为1,则表示已经关注,直接跳转业务的其他页面。如果为0,则表示未关注,直接根据https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz="+biz+"&chksm==&scene=110#wechat_redirect跳转到公众号的详细页。



    实现代码:

    判断跳转的处理类JudgeWeiXinServlet.java


    package com.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.lang.exception.ExceptionUtils;
    
    import net.sf.json.JSONObject;
    
    import com.entity.Entity;
    import com.util.HttpClientUtil;
    
    public class JudgeWeiXinServlet extends HttpServlet {
    	
    	
    	public static final String APPID = "wx1083c8787cd2b981";//叮叮当当公众号开发者id
    	public static final String BIZ = "MzI1MTY5MTM2OA%3D%3D&chksm";//跳转到公众号的识别码
    	public static final String SECRET = "db515d9f3f90a3e4cc9a7759aeb7114d";//叮叮当当公众号开发者密码
    	public static final String CHARSET = "utf-8";
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		doPost(request,response);
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    
    		String code = request.getParameter("code");
    		String id = request.getParameter("id");
    		
    		try{
    			
    //			out.print(isUserSubscribe(code,id,out)?"<br/><h1>has subscribe</h1>":"<br/><h1>has not subscribe</h1>");
    			if(isUserSubscribe(code,id,out)){
    				//如果已经关注,跳转到项目明细中
    				response.sendRedirect("http://www.ddscan.cn/commoditysaom.htm?coid=133");
    			}
    			else{
    				//未关注,跳转到叮叮当当公众号首页,供关注
    				response.sendRedirect("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz="+BIZ+"==&scene=110#wechat_redirect");
    //				out.print("<a href=\"weixin://contacts/profile/RossLv000\"><b>Contacts Me</b></a>");
    				
    			}
    		}
    		catch(Exception ex){
    			out.print("exception:"+ex.getMessage());
    		}
    		
    		out.flush();
    		out.close();
    	}
    	
    	
    	/** 判断扫描着是否关注公众号 
         * @param code
         * @param id
         * @return true-是,false-否
         */
        private static boolean isUserSubscribe(String code,String id,PrintWriter out)throws Exception{
        	boolean res  = false;
        	
        	//根据用户的openid和公众号开发者id查询用户在公众号是否有关注
        	try{
        		
        	
        	//根据code获取openid和Access_token
        	//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
        	String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APPID+"&secret="+SECRET+"&code="+code+"&grant_type=authorization_code";
        	String result = HttpClientUtil.doGetSSL(url, CHARSET);
        	System.out.println("1============:"+result);
        	out.print("1===========:"+result+"<br/>");
            if(null==result||result.equals("")){
            	return false;
            }
            // json字符串转JavaBean  
     		JSONObject jsonObject = JSONObject.fromObject(result);  
     		Map resultMap = (HashMap) JSONObject.toBean(jsonObject, HashMap.class); 
     		
     		Object errmsg = resultMap.get("errmsg");
     		if(null!=errmsg){
     			throw new Exception(errmsg.toString());
     		}
     		
     		String access_token = resultMap.get("access_token").toString();
     		String openid = resultMap.get("openid").toString();
            
            
    		System.out.println("获取的access_token:"+access_token);
    		System.out.println("openid="+openid);
    		
    		
    		//2、重新获取access_token
    		//https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
    		url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APPID+"&secret="+SECRET;
    		result = HttpClientUtil.doGetSSL(url, CHARSET);
        	System.out.println("2============:"+result);
        	out.print("2===========:"+result+"<br/>");
            if(null==result||result.equals("")){
            	return false;
            }
            // json字符串转JavaBean  
     		jsonObject = JSONObject.fromObject(result);  
     		resultMap = (HashMap) JSONObject.toBean(jsonObject, HashMap.class); 
     		
     		errmsg = resultMap.get("errmsg");
     		if(null!=errmsg){
     			throw new Exception(errmsg.toString());
     		}
     		
     		access_token = resultMap.get("access_token").toString();
    		
    		
    		//3、根据access_token和openid获取用户信息
    		url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
            result = HttpClientUtil.doGetSSL(url, CHARSET);
            if(null==result||result.equals("")){
            	return false;
            }
            
            System.out.println("3===========:"+result+"<br/>");
            out.print("3===========:"+result);
            jsonObject = JSONObject.fromObject(result); 
            Entity entity = (Entity) JSONObject.toBean(jsonObject, Entity.class);
            
            int subscribe = entity.getSubscribe();//获取用户描述符,0-未关注,1-已关注
            
            
            res = (subscribe==1);//如果为1则已经关注
        	
        	}
        	catch(Exception ex){
        		throw new Exception(ExceptionUtils.getFullStackTrace(ex));
        	}
        	
        	return res;
        }
        
        
        public static void main(String[] args) {
    		String a = "{\"subscribe\":1,\"openid\":\"aa\",\"nickname\":\"Ross\",\"tagid_list\":[]}";
    		JSONObject jsonObject = JSONObject.fromObject(a); 
    		Entity result = (Entity) JSONObject.toBean(jsonObject, Entity.class);
            System.out.println(result.getSubscribe());
    		
    	}
    
    }
    


    为可以模拟浏览器访问https协议,使用HttpClient工具类,并封装成HttpClientUtil类和忽略https验证的SSLClient类。

    HttpClientUtil类:


    package com.util;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    
    import net.sf.json.JSONObject;
    
    
    public class HttpClientUtil {
    	/** 
         * https方式 做doget请求
         * @param url       请求路径
         * @param charset   返回编码,默认是utf-8 
         * @return 
         */  
    	public static String doGetSSL(String url,String charset){  
            if(null == charset){  
                charset = "utf-8";  
            }  
            HttpClient httpClient = null;  
            HttpGet httpGet= null;  
            String result = null;  
              
            try {  
                httpClient = new SSLClient();  
                httpGet = new HttpGet(url);  
                  
                HttpResponse response = httpClient.execute(httpGet);  
                if(response != null){  
                    HttpEntity resEntity = response.getEntity();  
                    if(resEntity != null){  
                        result = EntityUtils.toString(resEntity,charset);  
                    }  
                }  
            } catch (Exception e) {  
               try {
    			throw new Exception(e);
    		} catch (Exception e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
            } 
              
            return result;  
        } 
        
        
        
        /** HTTPS方式 做dopost请求
         * @param url
         * @param map
         * @param charset
         * @return
         */
        public static String doPostSSL(String url,Map<String,String> map,String charset){  
            HttpClient httpClient = null;  
            HttpPost httpPost = null;  
            String result = null;  
            try{  
                httpClient = new SSLClient();  
                httpPost = new HttpPost(url);  
                //����  
                List<NameValuePair> list = new ArrayList<NameValuePair>();  
                Iterator iterator = map.entrySet().iterator();  
                while(iterator.hasNext()){  
                    Entry<String,String> elem = (Entry<String, String>) iterator.next();  
                    list.add(new BasicNameValuePair(elem.getKey(),elem.getValue()));  
                }  
                if(list.size() > 0){  
                    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,charset);  
                    httpPost.setEntity(entity);  
                }  
                HttpResponse response = httpClient.execute(httpPost);  
                if(response != null){  
                    HttpEntity resEntity = response.getEntity();  
                    if(resEntity != null){  
                        result = EntityUtils.toString(resEntity,charset);  
                    }  
                }  
            }catch(Exception ex){  
                ex.printStackTrace();  
            }  
            return result;  
        }  
        
        
        /** HTTPS 方式 做dopost请求,格式为JSON
         * @param url
         * @param params
         * @param charset
         * @return
         */
        public static String doJsonPostSSL(String url,Map params,String charset){
        	 HttpClient httpClient = null;  
             HttpPost httpPost = null;  
             String result = null;  
             try{  
                 httpClient = new SSLClient();  
                 httpPost = new HttpPost(url);
                 
                 JSONObject object = new JSONObject();
                 
                 Iterator it = params.keySet().iterator();
                 while(it.hasNext()){
                	 Object key = it.next();
                	 object.put(key, params.get(key));
                 }
                 
    //             Map sendMap = new HashMap();
    //             sendMap.put("scene", new Scene(123));
    //             JSONObject object = new JSONObject();
    //             object.put("expire_seconds", 1800);
    //             object.put("action_name", "QR_SCENE");
    //             object.put("action_info", sendMap);
                 
                 System.out.println("json:"+object.toString());
                 
                 StringEntity entity = new StringEntity(object.toString(),charset);
                 entity.setContentEncoding(charset);
                 entity.setContentType("application/json");
                 httpPost.setEntity(entity);
                 
                 
                 HttpResponse response = httpClient.execute(httpPost);  
                 if(response != null){  
                     HttpEntity resEntity = response.getEntity();  
                     if(resEntity != null){  
                         result = EntityUtils.toString(resEntity,charset);  
                     }  
                 }  
             }
             catch(Exception ex){
            	 ex.printStackTrace();
             }
             return result;
        }
        
        
        
        /** doget请求,解析返回的文件流
         * @param filePath
         * @param url
         */
        public static void dogetContent(String filePath,String url){
        	 
    			 HttpClient httpClient = null;  
    			 HttpGet httpGet= null;  
    			 try {  
    			     httpClient = new SSLClient();  
    			     httpGet = new HttpGet(url);  
    			     HttpResponse response = httpClient.execute(httpGet);  
    			     if(response != null){  
    			         HttpEntity resEntity = response.getEntity();  
    			         if(resEntity != null){  
    			        	 InputStream is = resEntity.getContent();
    			        	 if(is!=null)
    			        		 writeToLocal(filePath, is);
    			        	 System.out.println("����ɹ�");
    			         }  
    			     }  
    			 } catch (Exception e) {  
    			     e.printStackTrace();  
    			 }  
        }
        
        
        
        /** 
         * 将InputStream信息流写入文件 
         * @param destination 目标文件路径 
         * @param input 输入流信息 
         * @throws IOException 
         */  
        private static void writeToLocal(String destination, InputStream input)  
                throws IOException {  
            int index;  
            byte[] bytes = new byte[1024];  
            FileOutputStream downloadFile = new FileOutputStream(destination);  
            while ((index = input.read(bytes)) != -1) {  
                downloadFile.write(bytes, 0, index);  
                downloadFile.flush();  
            }  
            downloadFile.close();  
            input.close();  
        }  
    }
    


    SSLClient类:


    package com.util;
    
    import java.security.cert.CertificateException;  
    import java.security.cert.X509Certificate;  
    import javax.net.ssl.SSLContext;  
    import javax.net.ssl.TrustManager;  
    import javax.net.ssl.X509TrustManager;  
    import org.apache.http.conn.ClientConnectionManager;  
    import org.apache.http.conn.scheme.Scheme;  
    import org.apache.http.conn.scheme.SchemeRegistry;  
    import org.apache.http.conn.ssl.SSLSocketFactory;  
    import org.apache.http.impl.client.DefaultHttpClient; 
    
    
    public class SSLClient extends DefaultHttpClient{
    	public SSLClient() throws Exception{  
    	      super();  
    	      SSLContext ctx = SSLContext.getInstance("TLS");  
    	      X509TrustManager tm = new X509TrustManager() {  
    	              @Override  
    	              public void checkClientTrusted(X509Certificate[] chain,  
    	                      String authType) throws CertificateException {  
    	              }  
    	              @Override  
    	              public void checkServerTrusted(X509Certificate[] chain,  
    	                      String authType) throws CertificateException {  
    	              }  
    	              @Override  
    	              public X509Certificate[] getAcceptedIssuers() {  
    	                  return null;  
    	              }  
    	      };  
    	      ctx.init(null, new TrustManager[]{tm}, null);  
    	      SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  
    	      ClientConnectionManager ccm = this.getConnectionManager();  
    	      SchemeRegistry sr = ccm.getSchemeRegistry();  
    	      sr.register(new Scheme("https", 443, ssf));  
    	  }  
     
    
    }
    


    为方便解析返回的json信息,编写的实体类:Entity类


    package com.entity;
    
    import java.util.List;
    
    public class Entity {
    	private int subscribe;
    	private String openid;
    	private List tagid_list;
    	public int getSubscribe() {
    		return subscribe;
    	}
    	public void setSubscribe(int subscribe) {
    		this.subscribe = subscribe;
    	}
    	public String getOpenid() {
    		return openid;
    	}
    	public void setOpenid(String openid) {
    		this.openid = openid;
    	}
    	public List getTagid_list() {
    		return tagid_list;
    	}
    	public void setTagid_list(List tagid_list) {
    		this.tagid_list = tagid_list;
    	}
    	
    	
    }
    













    展开全文
  • 商家信息管理系统登录时可以用微信扫码登录。 参考文档是微信开放平台,着重需要关注文档(开发前一定看懂流程)的网站应用微信登录开发指南部分。 注意这里是微信开放平台,不同于微信公众平台,还需要另外注册账号...

    文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。

    商家信息管理系统登录时可以用微信扫码登录。
    参考文档是微信开放平台着重需要关注文档(开发前一定看懂流程)网站应用微信登录开发指南部分。

    注意这里是微信开放平台,不同于微信公众平台,还需要另外注册账号。我们在微信开放平台注册账号后,需要填写我们网站的域名,这样我们才能有权使用微信的接口。同样个人没有资质,要向师兄借用账号。

    在进行讲解之前,我们需要明白用户登录一个网站的实质,也就是每一个用户对这个网站唯一的身份标识。而且我们每个微信用户对于一个微信开放平台账户有唯一的openid,这样我们就可以用用户的openid作为网站对这个用户的唯一标识。但不是每个网站都有权限获取用户的openid等信息的,这就需要拥有这个网站的公司到微信开放平台注册一个账号,然后在账号里填入自己网站的域名。然后网站就可以设置一个微信扫码登录按钮,让访问网站的用户点击,点击这个按钮就会访问微信官方给的微信扫码登陆接口,用户扫码同意后,就会回调一个我们在微信扫码登陆接口里设置的return_url,并带上code参数,我们就可以通过code参数,换取openid了。

    过程和微信网页授权过程非常相似。

    第一步访问微信给定的接口(加上自己的appID,appSecret,redirect_url,state参数),会获取CODE,并以CODE和state为参数,回调redirect_url。

    然后以code、appid、appsecret为参数访问微信给的另一个接口,就可以获取openid等信息。

    以上是根据微信官方文档手工方式获取openid的方法,我们也可以使用SDK的方式获取,还是weixin-java-tools这个SDK。
    分以下两步:

    第一步 先声明好bean。

       @Bean
        public WxMpService wxOpenService(){
            WxMpService wxOpenService=new WxMpServiceImpl();
            wxOpenService.setWxMpConfigStorage(wxOpenConfigStorage());
            return wxOpenService;
        }
        @Bean
        public WxMpConfigStorage wxOpenConfigStorage(){
            WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage=new WxMpInMemoryConfigStorage();
            wxMpInMemoryConfigStorage.setAppId(accountConfig.getOpenAppId());
            wxMpInMemoryConfigStorage.setSecret(accountConfig.getOpenAppSecret());
            return wxMpInMemoryConfigStorage;
        }

    第二步 构造自己的url,访问

      @GetMapping("/qrAuthorize")
        public String qrAuthorize(@RequestParam("returnUrl") String returnUrl){
            String url=projectUrlConfig.getWechatOpenAuthorize()+"/sell/wechat/userInfo";
            String redirectUrl=wxOpenService.buildQrConnectUrl(url,WxConsts.QRCONNECT_SCOPE_SNSAPI_LOGIN,URLEncoder.encode(returnUrl));
            return "redirect:"+redirectUrl;
        }
        @GetMapping("qrUserInfo")
        public String qrUserInfo(@RequestParam("code") String code,
                                 @RequestParam("state") String returnUrl){
            WxMpOAuth2AccessToken wxMpOAuth2AccessToken=new WxMpOAuth2AccessToken();
            try{
                wxMpOAuth2AccessToken=wxOpenService.oauth2getAccessToken(code);
            }catch (WxErrorException e){
                log.error("【微信网页】{}",e);
                throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg());
            }
            log.info("wxMpOAuth2AccessToken={}",wxMpOAuth2AccessToken);
            String openId=wxMpOAuth2AccessToken.getOpenId();
            return "redirect:"+returnUrl+"?openid="+openId;
        }

    出处:https://github.com/sqmax/springboot-project/wiki/%E7%BD%91%E7%AB%99%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E5%BE%AE%E4%BF%A1%E6%89%AB%E7%A0%81%E7%99%BB%E5%BD%95

    展开全文
  • 基本思路:1、扫描带参数二维码时,微信会返回二维码带的参数,和扫码微信的信息,2、在代码中接收参数,3,处理业务逻辑,基本流程;1、在哪里接收微信返回的参数?首先要在微信公共号的基本配置里共号的基本配置...

    基本思路:

    1、扫描带参数二维码时,微信会返回二维码带的参数,和扫码的微信的信息,

    2、在代码中接收参数,

    3,处理业务逻辑,

    基本流程;

    1、在哪里接收微信返回的参数?

    首先要在微信公共号的基本配置里共号的基本配置里的服务器URL,这个 URL指向的文件就是微信返回参数的地方 

    2、怎么接收返回的数据?

     $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  //微信返回的数据 ,

    如果上一种不行则换这种 $postStr =   file_get_contents("php://input");

    想要查看具体内容可以把它写入一个文件:

    file_put_contents(dirname(__FILE__).'/ccc.txt', $postStr);

    这样就可以在ccc.txt 文件里查看到下边的xml内容

    具体内容如下:

    <xml><ToUserName><![CDATA[gh_76693edca3e7]]></ToUserName>
    <FromUserName><![CDATA[o8mVJ1ZQ7KlUhYeD2Z2sxdwuf-K4]]></FromUserName>
    <CreateTime>1516207510</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe]]></Event>
    <EventKey><![CDATA[qrscene_10]]></EventKey>
    <Ticket><![CDATA[gQE08TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNWZUQ3NuT0JkOWwxMDAwME0wM1YAAgTPyl5aAwQAAAAA]]></Ticket>
    </xml>

    其中包含了扫码者的openid和参数值

    openid;  <FromUserName><![CDATA[o8mVJ1ZQ7KlUhYeD2Z2sxdwuf-K4]]></FromUserName>

    参数值;       <EventKey><![CDATA[qrscene_10]]></EventKey>

    怎么取出这两个值呢?

    创建解析xml的对象

      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

    然后去获取想要的值

    $openid = (string)$postObj->FromUserName;  值为o8mVJ1ZQ7KlUhYeD2Z2sxdwuf-K4
          $parent_id = trim((string)$postObj->EventKey);值为qrscene_10

    这时再用字符串拆分获取到最后的parent_id = 10

    注意事项:

    这里是服务返回的数据,无法把parent_id = 10 保存在session 里,可以写入数据库,进行保存

    展开全文
  • 最近着手开发微信网页扫码登录和公众号授权登录收获颇丰,两者的开发很类似。以下是我个人摸索过程中发现的两者的异同: 两者都可以通过微信客户端扫码授权的方式,让第三方页面获得微信用户的一些基本信息(昵称...

    最近着手开发了微信网页扫码登录和公众号授权登录收获颇丰,两者的开发很类似。以下是我个人摸索过程中发现的两者的异同:

    • 两者都可以通过微信客户端扫码授权的方式,让第三方页面获得微信用户的一些基本信息(昵称、性别、所在地、在微信唯一标示等……)。他们都是通过提供一个链接让用户授权的方式。但网页版需要在页面打开二维码之后授权,而公众号则需要用户先关注了我们的公众号,然后点开公众号里面的链接,确认授权即可。
    • 网页扫码登录需要将授权的链接(二维码链接)在网页中打开、而公众号授权登录的链接必须要微信客户端中打开。
    • 无论网页扫码登录还是在公众号中授权登录,都是通过授权的方式获得一个code参数,之后通过code参数获取access_token和openid和通过access_token和openid去获取用户的基本信息的请求链接是一样的。

     

    展开全文
  • 企业微信扫码登录

    2020-03-21 17:57:44
    最近公司的系统需要和企业微信进行打通,首先需要公司的人员可以使用企业微信进行扫码登录。使用企业微信扫码登录的流程比较简单,我做一个demo记录一下。 注意:下面代码中重定向的地址是我进行穿透的地址。 第一...
  • PHP微信开放平台扫码登录源码PHP微信开放平台扫码登录源码PHP微信开放平台扫码登录源码PHP微信开放平台扫码登录源码
  • 微信扫码 - 关注公众号后网站自动注册并登录的实现 需求描述 在自己网站上点击微信登录,网站自己弹出一个二维码、扫描二维码后...微信开发文档 实现原理 公众平台提供了生成带参数二维码的接口。使用该接口可...
  • 微信中,打开app下载链接,或者使用微信扫app下载二维码,都是无法下载app的。因为腾讯为了自身利益,屏蔽了其他app直接在微信中下载。 而访问指定网页的链接在微信内分享转发次数多了就会被微信拦截,...
  • 微信公众号扫码功能 1 引用微信的SDK npm install weixin-js-sdk --save import wx from 'weixin-js-sdk' 2 开始调用 getcode() { // 点击扫码开始执行函数 this.http("/wx/sign", { // 向后台请求appid ...
  • 用户扫描了二维码会给微信发送信息,然后微信把信息以XML格式发送给我们的服务器 3.接收数据,并把数据保存于数据库或者缓存,代码如下: $wechatObj = new wechatCallbackapiTest(); $xml = file_get_contents('...
  • 一、微信用户扫码登录业务逻辑 微信用户登录的时候,每次都会带着openid(用户唯一标志),因此当用户第一次登录的时候,我们就需要将这个openid保存到数据库,或者保存到redis中,当用户再次登录的时候,我们需要...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  •   上周二开晨会分配任务的时候,分配到了一个微信扫码关注公众号的需求。刚开始以为只要截个公众号二维码的图,然后按照UI出的设计稿把二维码放到指定位置,再加上一波加边框加阴影的操作提交就完事了。所以当部门...
  • 最近接到新需求,为将用户引流到公众号,官网实现微信扫码关注公众号并登陆官网。由于第一次需求没有说清楚,只是说了微信登陆,所以想到微信开放平台实现微信登陆,后来做完后发现是为了向公众号引流,需要关注...
  • 对于微信公众号的文档,呃~ 就不过多的吐槽了。 说起开发流程本身是很简单的,申请公众号 -- 配置域名【就是token验证,检查服务器的有效性】-- 编写代码。 先说一下我开发中踩过的坑,希望对大家有所帮助能够在...
  • 本篇介绍的二维码登录不是微信开发平台的二维码登录,而是利用微信公众号临时二维码扫码事件关注公众号进行登录注册, 浏览器判断扫码状态有两种方式, 第一种是ajax每隔一秒进行轮询,如果用户扫码了则后台给个...
  • thinkphp5微信公众号二维码扫码关注推广二维码事件实现, 给出实现的全部方法: 获取二维码,让微信公众号跳转到以下代码的code方法即可,用户点击二维码后,通过二维码获取关注用户信息及二维码推广者信息,以及...
  • 此篇文章记录自己开发中的微信客户端扫码登录的实例以及步骤,便于以后自行学习记起的关键,看到的网友有借鉴的地方就借鉴,看不懂的也请别吐槽,毕竟每个人的思维和思路以及记录东西的方式不一样; 1.首先需要一...
  • 微信开放平台扫码登录的功能只有已经认证过的微信公众号才可以使用,很多学习微信的同学可能没办法使用这个功能,但是别担心,以下网址中有很多账号可以使用:【想要获取更多公众账号可以关注微信公众号:小D课堂】 ...
  • PHP微信扫码登录看起来简单,但做起来有点复杂,微信接口的坑有点多,稍不注意,就费很多时间。PHP判断是否首次关注公众号,获取微信用户头像、openid和省市等信息
1 2 3 4 5 ... 20
收藏数 12,976
精华内容 5,190
关键字:

微信开发扫码关注