微信开发 网页获取openid_php微信公众号网页开发获取openid - CSDN
精华内容
参与话题
  • 微信开发之微信网页授权获取openid

    千次阅读 2019-09-11 16:44:06
    不知觉间已经接触了几次微信支付开发,而要进行微信支付就需要用户的唯一标识:openid。还记得第一次获取用户openid的时候就踩了很多坑。这两天又接触了一下,想着索性就把他记录下来,也便于以后查阅 一、准备...

    wechatOAuth_logo

    不知觉间已经接触了几次微信支付开发,而要进行微信支付就需要用户的唯一标识:openid。还记得第一次获取用户openid的时候就踩了很多坑。这两天又接触了一下,想着索性就把他记录下来,也便于以后查阅


    一、准备工具

    不管开发什么,官方的文档应该是第一个想到的这里把官方文档贴出来:微信网页授权文档
    除此之外,我们还需要一个内网穿透的工具在开发环境下让微信能访问到我们的域名。我使用的是natapp。此类工具网上有很多,大家可以自行寻找。
    这里我们使用微信提供的**测试账号**来作为演示

    二、开始开发

    内网穿透就不在这里演示了,下面我们直入主题:
    1.填写网页授权域名
    在这篇文档的一开始就埋了一个坑
    wechatOAuth_1
    这段话就是说,我们在开发前需要在图片中框红的位置填入我们所要开发的域名。这里我们使用的是测试环境,所以需要在测试账号管理页面的这个位置填入我们自己的域名,这里要注意填入域名的规则。
    wechatOAuth_2
    2.文档阅读
    接着阅读文档我们可以发现网页授权有两种scope,
    snsapi_base和snsapi_userinfo。两种scope都可以获取到opeid,不同的是snsapi_userinfo除了openid外还可以获取到用户的基本信息,但是需要用户手动进行确认。
    再往下阅读我们可以看到官方文档的授权步骤

    • 第一步:用户同意授权,获取code
    • 第二步:通过code换取网页授权access_token以及openid
    • 第三步:刷新access_token(如果需要)
    • 第四步:拉取用户信息(需scope为 snsapi_userinfo)

    我们只需要openid,所以我们只开发到第二步就好了。下面我们就按着官方步骤来开发。

    3.获取code
    查看文档后我们发现我们需要拼接一个url并且访问它。url的参数文档中写的很清楚了。看他的例子也能看个清楚。这里比较重要的是redirect_uri。这个参数所填的是一个链接。我们访问url后会自动转发到这个链接并且将我们需要的code以及拼接url中的state的值作为参数。这个redirect_uri的值要填入的是我们代码中的controller的位置。
    所以这里我们需要一段代码:

    /**
     * <pre>
     * Description: wechat OAuth2.0
     * Author:      lllx
     * Version:     1.0
     * Created at:  2018/2/1
     * </pre>
     */
    @RestController
    @RequestMapping("/weixin")
    @Slf4j
    public class WeixinController {
    
        @GetMapping("/auth")
        public void auth(@RequestParam("code") String code,@RequestParam("state") String state){
            log.info("auth开始了。。。。");
            log.info("code={}",code);
            log.info("state={}",state);
        }
    }
    
    

    我拼接的url,这里大家要注意根据自己的情况进行拼接。拼接成功后需要在微信app中进行访问

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=http://xxx/sell/weixin/auth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
    

    访问后的结果
    wechatOAuth_3
    这样我们就拿到了code
    4.获取openid
    继续查看文档,发现我们只需要使用获取到的code再访问另一个url就可以获取到我们想要的了。接着上面的代码

    /**
     * <pre>
     * Description: wechat OAuth2.0
     * Author:      lllx
     * Version:     1.0
     * Created at:  2018/2/1
     * </pre>
     */
    @RestController
    @RequestMapping("/weixin")
    @Slf4j
    public class WeixinController {
    
        @GetMapping("/auth")
        public void auth(@RequestParam("code") String code,@RequestParam("state") String state){
            log.info("auth开始了。。。。");
            log.info("code={}",code);
            log.info("state={}",state);
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxxx&secret=xxxx&code="+code+"&grant_type=authorization_code";
            RestTemplate restTemplate = new RestTemplate();
            String result = restTemplate.getForObject(url, String.class);
            log.info("result={}",result);
        }
    }
    

    这时我们再次访问第三步拼接的url就可以看到如下结果。
    wechatOAuth_4
    将结果格式化一下我们可以就看到我们想要的openid
    wechatOAuth_5

    三、总结

    流程看起来还是很简单的。但以上只是一个最简单、最直接的手工获取openid的例子。真正在使用过程中需要结合自身的业务流程来进行开发,这时可能就有些麻烦了。此时我们也可以借助一些网上第三方sdk来开发。例如:weixin-java-tools。


    本文作者: catalinaLi
    本文链接: http://catalinali.top/2018/wechatOAuth/
    版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。

    展开全文
  • 前几天开发微信的项目,一直比较忙,也没有时间记录一下经验,然后今天静下来想了一下,准备把自己工作中踩到的一些坑给大家分享一下,大牛自动忽略就好了,主要是自我记录,如果有不足的地方,请留言多多指教,下边...

    前几天开发微信的项目,一直比较忙,也没有时间记录一下经验,然后今天静下来想了一下,准备把自己工作中踩到的一些坑给大家分享一下,大牛自动忽略就好了,主要是自我记录,如果有不足的地方,请留言多多指教,下边进入正题。

    这次做得是一个微信公众号类型的,其实博主以前也是做微信公众号开发,但是把,后来搁浅了一年就给忘干净了,然后这次相当于重新复习了一遍。因为我们没有公众号,只能申请一个测试公众号来进行测试

    申请测试公众号的链接:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    测试接口地址:https://mp.weixin.qq.com/debug/

    网页授权文档说明:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

    第一步

         嗯,看文档,其实文档写的已经很清晰了,反正我个人觉得很清晰了,申请一个微信测试公众号,下边是我已经申请好的一个测试公众号,可以获取到 AppID AppSercret 信息,这两个信息很重要一定要保存下来!!!

    第二步

         然后配置 Js 安全域名,这个相当于你的回调域名,用来获取 Code 信息

    第三步

         开始开发网页授权获取 OpenId ,配置完这个 Js 安全域名,就可以进行下一步的开发了,创建一个 Controller ,这个地方我们就叫 WxLogin(叫啥不重要重要的是内容),下边说一下详细的步骤

    首先进入的方法一定是 login 方法,然后通过 login 方法 redirect 重定向到 getRedireceUrl() 方法中(其实这个地方,你也可以不用做重定向跳转,直接进来就可以获取值,主要核心的代码还是下方获取 code 信息 和 根据 code 信息获取 openID 的那一部分)

    然后去获取 Code 的信息,也就是我们的第二个方法

    通过我们设置的回调地址,拿到我们所需要的 code 的信息,然后用我们的 code 信息去获取 openID 

    package org.ry.demo;
    
    import com.alibaba.fastjson.JSONObject;
    import org.apache.log4j.Logger;
    import org.ry.utils.HttpUtil;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.util.HashMap;
    
    /**
     * @ClassName:WxLogin
     * @Description:TODO 微信登录,授权,详细文档说明请查看 instructions/wx_login_txt 文件
     * @Author LinLuoChen
     * @Date 2019/11/25/17:25
     * @Version V1.0
     **/
    @Controller
    @RequestMapping("wxLogin")
    public class WxLogin {
    
        // 引入日志文件
        static Logger log = Logger.getLogger(WxLogin.class.getClass());
    
        // 获取定义的 appId
        @Value("${appId}")
        private String appId;
    
        // 获取定义的 appSecret
        @Value("${appSecret}")
        private String appSecret;
    
        /**
         * 微信登录地址
         * @param response
         * @throws IOException
         */
        @RequestMapping(value = "login", method = {RequestMethod.POST,RequestMethod.GET})
        public String login(HttpServletResponse response, HttpServletRequest request) throws IOException {
            String wxurl = getRedirectUrl(request);
            return "redirect:"+wxurl;
        }
    
        /**
         * @Description 获取 code 信息,网页授权不需要 token
         * @Author LinLuoChen
         * @Date  17:32
         **/
        private String getRedirectUrl(HttpServletRequest request){
            // 获取 Code 信息
            String wxurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
            log.info(wxurl);
            // 拼接回调地址,必须是微信白名单才可以!!!
            String ecodeurl = URLEncoder.encode("https://填写你配置的回调域名/rescue/wechatlogin/getUsercode");
            wxurl=wxurl.replaceAll("REDIRECT_URI",ecodeurl);
            log.info("Code:"+wxurl);
            return wxurl;
        }
    
        /**
         * @Description 获取到 openID
         * @Author LinLuoChen
         * @Date  9:38
         * @Param [code]
         * @return java.lang.String
         *  code 值是根据回调地址从微信获取的参数信息
         **/
        @RequestMapping("getUsercode")
        public String getUsercode(String code, HttpSession session){
            String url ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
            // 替换 appid 和 secret
            // 转换连接请求为 GET 方式
            url = url.replace("APPID",appId).replace("SECRET",appSecret).replace("CODE",code);
            String json = HttpUtil.doGet(url,new HashMap<String,Object>(),"");
            // 根据 Code 拿到 OpenId
            JSONObject obj = JSONObject.parseObject(json);
            // 在日志打印出报文
            log.info(obj.toJSONString());
            // 拿到 openid
            String openId = obj.getString("openid");
            return openId;
        }
    
    
    }
    

    由于写本文的时候没有连贯起来,所以导致可能后边有些简陋,不过这也是获取 openID 的核心代码

    主要注意的点也是就配置回调域名,然后获取 code 的值,其余的其实都是一样写的

    博主 QQ :3044793043 ,有疑惑的地方欢迎私信或者评论

    展开全文
  • 一:配置接口 注意:这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头, 二:定义一个公众号菜单,跳转授权页面(或者链接直接跳转) String url = ...

    一:配置接口



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




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

    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";
        
            CommonButton btn11 = new CommonButton();
            btn11.setName("跳转授权页面");
            btn11.setType("view");
            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

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


    四:根据code去获取access_token

    前端ajax请求:

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

    后台java代码:

    Controller:

           /**
    	 * 网页授权获取用户openid
    	 * @Title: getOpenId 
    	 * @param @param code
    	 * @throws
    	 */
    	@RequestMapping(value = "getOpenId", method = RequestMethod.GET)
    	@ResponseBody 
    	public String getOpenId(@RequestParam("code") String code) 
    	{
    		System.out.println("cede="+code);
    		//通过code获取openId
    	    JSONObject jsonDate = CommonUtil.getOpenId(code);
    	    if(jsonDate.isNull("errcode")){
    	    	return jsonDate.getString("openid");
    	    }
    	    return "";
    	    
    	}

    CommonUtil:

             /**
    	   * 网页授权获取openId
    	   * @Title: getOpenId 
    	   * @Description: TODO
    	   * @param code
    	   * @return JSONObject
    	   */
    	public static JSONObject getOpenId(String code) {
    		String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    		String requestUrl = url.replace("APPID", WeChatInfo.WX_APPID).replace("SECRET", WeChatInfo.WX_APPSECRET).replace("CODE", code);
    		
    		JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
    		return jsonObject;
    	}


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


    WeCharInfo:


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



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

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

    错误时微信会返回JSON数据包如下(示例为Code无效错误):

    {"errcode":40029,"errmsg":"invalid code"}


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




    展开全文
  • 微信公众号网页授权获取用户openid

    万次阅读 2017-09-21 16:36:36
    最近一个项目是在微信公众号内二次开发,涉及到微信公众号支付,根据文档要求想要支付就必须要获取到用户的openid。这是微信官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842官方流程 ...

    最近一个项目是在微信公众号内二次开发,涉及到微信公众号支付,根据文档要求想要支付就必须要获取到用户的openid。

    这是微信官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

    官方流程
    网页授权流程分为四步:
    1、引导用户进入授权页面同意授权,获取code
    2、通过code换取网页授权access_token(与基础支持中的access_token不同)
    3、如果需要,开发者可以刷新网页授权access_token,避免过期
    4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

    我的思路
    1、首先是要在公众号后台进行配置,设置回调路径,具体要求参照官方文档。

    这里写图片描述

    要将这里的txt文件放在项目根路径下,否则上面的回调域名是无法保存的。

    这里写图片描述

    这里写图片描述
    2、用户访问第三方页面时,先去请求一个api,获取code和state

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

    请求API参数拼接
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxXXXXXXXXXXXXXXXXXXXXXX&redirect_uri=http://XXXXXXXXXXX/ydx-business/payWeiXin/getOpenId&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect

    这里的scope分为两种:一种是静默方式(snsapi_base);一种是非静默方式(snsapi_userinfo),需要用户去手动点击同意才能获取用户的信息。

    这是非静默方式授权

    非静默方式

    静默方式直接就获取到了openid

    这里写图片描述

    3、在1中配置的回调方法中根据获取到的code和state再去请求如下接口,获取access_token 和openid。

    获取code后,请求以下链接获取access_token:
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

    代码段

    
    @SuppressWarnings("null")
        @RequestMapping("/getOAuth")
        public String getOAuth(){       
            String code = request.getParameter("code");//获取微信服务器授权返回的code值
            String state = request.getParameter("state");//验证是否来自微信重定向的请求
            PrintWriter pw = null;
            try {
                pw = response.getWriter();
                if(Constant.STATE.equals(state)){
                    /**
                     * 构造请求链接
                     * https://api.weixin.qq.com/sns/oauth2/access_token?
                     * appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
                     */
                    String url = Constant.ACCESS_TOKEN_URL+Constant.APP_ID+"&secret="+Constant.APP_SECRET+"&code="+code+"&grant_type=authorization_code";                   
                    String jsonStr = HttpUtil.httpRequest(url);
                    String openid = JSONObject.parseObject(jsonStr).getString("openid");
                    System.out.println(openid+"==========================");
                    session = request.getSession();
                    session.setAttribute("openid", openid);
                    return "login/wx_login";//登录页面
                }else{
                    response.setContentType("text/html;charset=utf-8");
                    pw.write("<script>alert('授权失败!');</script>");
                    pw.flush();
                    pw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                response.setContentType("text/html;charset=utf-8");
                pw.write("<script>alert('发生后台异常!');</script>");
                pw.flush();
                pw.close();
            }
            return null;
        }

    总结:到此就已经获取到了用户的openid,因为只涉及支付业务所用就不再往下获取用户的个人信息。感觉微信这里的官方文档逻辑还都比较清楚,照着流程走下来一般都没什么问题,具体如何获取到openid的代码可以参考我前文里的那段,已经在实际项目中实践过。

    展开全文
  • 如何在微信网页里获取用户的openid? 准备: 首先你要有一个公众号,还有一个外网可访问的域名,这里就以企业号为例了。获取openid需要的公众号的appid 和 secret(登陆公众平台 开发----->基本配置中的...
  • 已经获得code现在要访问 ...返回的JSON数据包如下: ...现在要获取openid,怎么在后台访问这个链接回调后处理json数据,然后筛选出openid,直接赋给变量。 最终目的:string openid=回调后处理筛选好的openid。
  • 微信订阅号获取openId

    万次阅读 2015-03-06 14:14:19
    最近用到微信开发,需要获取到微信用户的openId. 开始开发之前,用的是公司的微信测试账号,账号是服务号。可以通过“网页授权获取用户基本信息”获取openId. 项目开发完后准备上线工作。登陆微信账号,一看,...
  • function getCookie() { var url = location.search; //获取url中"?"符后的字串 var theRequest = new Object(); if (url.indexOf("?") != -1) { var str = url.substr(1); strs = str.split(
  • 本文demo下载:wisdomdd.cn在开发微信公众号时,一旦... OpenId相应于用户唯一主键注意: 上面视频中漏掉了一个很重要的点: 网页授权获取用户基本信息需要修改其相应的域名(这个域名也是访问项目的域名) 如果没有相...
  • 开发场景: 在微信客户端打开某个网页可以获取到用户的openId获取用户openid步骤如下:参考微信公众平台开发文档 第一步:引导微信公众平台的用户打开如下链接 ...response_t...
  • uniapp 开发微信小程序——获取openid

    千次阅读 2019-07-23 09:59:35
    1、初始化微信云函数 //初始化微信云函数 wx.cloud.init({ // 此处请填入环境 ID, 环境 ID 可打开云控制台查看 env: '********', traceUser: true, }) 2、调用云函数 // 调用云函数...
  • 微信开发获取openid中遇到的坑

    万次阅读 2016-04-13 18:58:50
    1:微信后台设置授权回调页面域名 注意不要加http:// 2:去微信授权回调的url列如:...
  • h5怎么获取微信用户openId,h5如何获取微信用户openId

    万次阅读 多人点赞 2016-11-23 10:15:53
    1.获取微信openid; 2.通过openid获取用户信息;无用户信息需要绑定 3.输入手机并确认绑定信息; 4.验证手机短信绑定; 这里主要讲述一下如何获取微信openid 参考链接 一丶进入微信后台配置授权界面,我...
  • 我需要用户接收微信分享的链接后,点击进入给参加活动的用户【点赞】,然后需要后台获取微信用户的 openid 作为唯一的标记信息,以便保证该用户下次进入后进行数据库的比对,直接提取其对应的操作信息...
  • 微信公众号H5页面中获取openId

    万次阅读 2018-09-23 18:46:49
    必要条件 已经认证的公众号(企业号可以,个人号是不能绑定H5的) https认证域名,没有认证的域名微信中不能配置...通过code就可以配置参数获取openId(注意这个openId和access_token是一起获取的) 没错,只需要...
  • 一、微信网页授权获取用户openid以及用户信息的步骤 开发文档 ...
  • 微信小程序案例:获取微信访问用户的openid

    万次阅读 热门讨论 2017-01-06 17:01:03
    微信开发项目中,获取openid是项目常遇的问题,本文通过主要讲解实现在微信小程序中如何获取用户的openid,案例实现非常简单  具体实现方法是通过登录接口获取登录凭证,然后通过request请求微信的公共API,将...
  • 微信支付授权获取Openid

    千次阅读 2017-11-28 13:41:59
    1、appid ,AppSecret (登陆微信公众平台–开发–基本配置)...3、https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 文档中“微信网页开发微信网页授权”中可以查看获取openid的方法(文档中的第
  • 通过微信官方提供的接口https://api.weixin.qq.com/sns/oauth2/access_token接口,获取openid,结果获取不到。 报错代码 WechatUserInfo(accessToken=null, expiresIn=null, refreshToken=null, openid=null, ...
  • 微信小程序 获取session_key和openid

    万次阅读 2017-01-15 11:03:30
    说说获取session_key和openid的条件 1.AppID(小程序ID),需要通过微信认证; 2.AppSecret(小程序密钥); 3.登录时获取code;注意:即使获取到了appid,未通过微信认证,也是不能拿到code的. 打印出来是这样的. 获取...
1 2 3 4 5 ... 20
收藏数 12,657
精华内容 5,062
关键字:

微信开发 网页获取openid