• 微信测试号开发之九 微信网页授权:页面获取用户openid


    原文链接:https://blog.csdn.net/qq_37936542/article/details/78981369

    一:配置接口



    注意:这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头,




    二:定义一个公众号菜单,跳转授权页面(或者链接直接跳转)

    1. String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx59be073ef6eac757&redirect_uri=http://wx.intmote.com/debo_wx/index.html&response_type=code&scope=snsapi_base&state=123#wechat_redirect";  
    2.       
    3.         CommonButton btn11 = new CommonButton();  
    4.         btn11.setName("跳转授权页面");  
    5.         btn11.setType("view");  
    6.         btn11.setUrl(url);  


    appid 公众号的唯一标识

    redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理

    response_type 返回类型,请填写code

    scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )

    state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

    #wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数



    三:获取code

    点击菜单按钮后,页面将跳转至 http://wx.intmote.com/debo_wx/index.html/?code=CODE&state=STATE。

    返回错误码说明:

    10003 redirect_uri域名与后台配置不一致
    10004 此公众号被封禁
    10005 此公众号并没有这些scope的权限
    10006 必须关注此测试号
    10009 操作太频繁了,请稍后重试
    10010 scope不能为空
    10011 redirect_uri不能为空
    10012 appid不能为空
    10013 state不能为空
    10015 公众号未授权第三方平台,请检查授权状态
    10016 不支持微信开放平台的Appid,请使用公众号Appid


    在index.html页面获取code

    1. var code = GetQueryString("code");  
    2.         
    3. //获取地址栏后面的参数  
    4. function GetQueryString(name){  
    5.        var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");  
    6.        var r = window.location.search.substr(1).match(reg);  
    7.        if(r!=null)return  unescape(r[2]); return null;  
    8.  }  


    四:根据code去获取access_token

    前端ajax请求:

    1. //获取用户的openId  
    2. $.ajax({  
    3.     url : "getOpenId.action",  
    4.     dataType : "json",  
    5.     type : "get",  
    6.     data : "code="+GetQueryString("code"),  
    7.     success : function(data){  
    8.            //返回的data即为openid,拿到openid实现业务  
    9.     }  
    10.  })  

    后台java代码:

    Controller:

    1.       /**  
    2.  * 网页授权获取用户openid  
    3.  * @Title: getOpenId   
    4.  * @param @param code  
    5.  * @throws  
    6.  */  
    7. @RequestMapping(value = "getOpenId"method = RequestMethod.GET)  
    8. @ResponseBody   
    9. public String getOpenId(@RequestParam("code") String code)   
    10. {  
    11.     System.out.println("cede="+code);  
    12.     //通过code获取openId  
    13.     JSONObject jsonDate = CommonUtil.getOpenId(code);  
    14.     if(jsonDate.isNull("errcode")){  
    15.         return jsonDate.getString("openid");  
    16.     }  
    17.     return "";  
    18.       
    19. }  

    CommonUtil:
    1.         /**  
    2.    * 网页授权获取openId  
    3.    * @Title: getOpenId   
    4.    * @Description: TODO  
    5.    * @param code  
    6.    * @return JSONObject  
    7.    */  
    8. public static JSONObject getOpenId(String code) {  
    9.     String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";  
    10.     String requestUrl = url.replace("APPID", WeChatInfo.WX_APPID).replace("SECRET", WeChatInfo.WX_APPSECRET).replace("CODE", code);  
    11.       
    12.     JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);  
    13.     return jsonObject;  
    14. }  


    appid公众号的唯一标识
    secret公众号的appsecret
    code填写第一步获取的code参数
    grant_type填写为authorization_code


    WeCharInfo:


    1. public class WeChatInfo {  
    2.     public static final String WX_APPID = "wx59bte0732ef6eeac757";  
    3.     public static final String WX_APPSECRET = "3ade4c386340aa47bb55dae0d9b9ac7d73";  
    4. }  



    requestUrl请求完成返回的JSON数据包如下:

    1. { "access_token":"ACCESS_TOKEN",  
    2. "expires_in":7200,  
    3. "refresh_token":"REFRESH_TOKEN",  
    4. "openid":"OPENID",  
    5. "scope":"SCOPE" }  
    参数               描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope 用户授权的作用域,使用逗号(,)分隔

    错误时微信会返回JSON数据包如下(示例为Code无效错误):
    1. {"errcode":40029,"errmsg":"invalid code"}  


    结束了,如果要获取用户的其他信息,参考微信开发文档,我是直接根据openid去数据库查询用户信息(关注时保存用户信息到数据库)

    文末福利:

    福利一:前端,Java,产品经理,微信小程序,Python等10G资源合集大放送:https://www.jianshu.com/p/e8197d4d9880

    福利二:微信小程序入门与实战全套详细视频教程

    【领取方法】

    关注 【编程微刊】微信公众号:

    回复【小程序demo】一键领取130个微信小程序源码demo资源。

    回复【领取资源】一键领取前端,Java,产品经理,微信小程序,Python等资源合集10G资源大放送。


    image

    原文作者:祈澈姑娘
    原文链接:https://www.jianshu.com/u/05f416aefbe1
    创作不易,转载请告知

    90后前端妹子,爱编程,爱运营,爱折腾。
    坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。


  • 相关阅读:
    先装.NET SDK 后装IIS导致的错误
    proc
    C# FTP上传
    English Word
    Window服务程序
    DataView排序 疑惑
    移除字符串末尾制定个数字符
    树状列表
    updatepanel 中按钮下载文件出错解决
    如何删除vs最近打开的项目
  • 原文地址:https://www.cnblogs.com/wangting888/p/9701631.html
Copyright © 2020-2023  润新知