微信服务号静默授权调用过程记录

安稳与你 提交于 2020-03-26 11:10:47

3 月,跳不动了?>>>

微信静默授权过程相关问题流程记录

  • 相关工具

    • 内网穿透工具

      • 花生壳

      有免费的,一个月1G流量,但是需要本人手持身份证拍照上传,太过于麻烦,弃用。

      • natapp

      使用简单,需要和支付宝扫码,进行登陆实名。

      • 其他。。。 其他朋友还推荐了一些,但是功能已经完成。
    • 微信调试工具

      • 新版

      新版的介绍是,小程序,公众号都可以调试,但是看宣传页的截图,与我之前使用的公众号调试版本差异太大,时间紧张,未作查看

      下载链接

      • 旧版

      旧版本的和之前界面整体未发生变化。

      下载链接

    • nginx

      这里nginx 的作用是,微信重定向回来的时候,给一个默认的nginx 页面。看到效果。

    • 个人测试号

      相关链接

  • 调用思路

    • 首先将电脑映射暴露出去在公网,启动nginx 在外网访问
    • 注意,这里需要设置,nginx 启动默认80端口,所有,你需要设置natapp内网穿透的也是80端口。
    • 设置个人测试号的参数,设置项有 JS接口安全域名 与 授权回调页面域 这里面填写的都是natapp 得到的域名,并且在下面关注测试号。
    • 拼接微信获取code 的url,将你上面的得到的个人测试号的参数拼接进去,将地址发送到自己的微信打开。
    • 打开的url,如有报错,根据报错解决问题,一般就是url 参数错误,未拼接啥的,如果显示重定向地址错误,那么,请按照上面步骤,重新检查你的测试号配置,与 重定向参数。
    • 成功跳转到本地的nginx 页面,这个时候,就可以用微信调试工具,打开,查看code参数。
    • 后面的步骤,就和内网穿透啥的,没关系了,微信也不需要请求你这里了。你只需要把code 参数进行拼接。然后去get 请求 另一个获取ACCESS_TOKEN 和 OpenId 的接口,你甚至可以在你本地的浏览器打开。
  • 相关文档

  • 相关步骤

    • 启动nginx 访问到nginx 默认页面
    • 启动natapp 内网穿透默认的nginx 80端口

      注意这里选择免费隧道的时候,选择web协议,获取自己的authtoken,进行启动

    • 在浏览器访问通过natapp 给与的域名查看,是否可以看到本机启动的nginx 页面,进行验证
    • 打开个人测试号,进行设置。
    • 查看开发文档,进行请求,注意,我这里选择的是静默授权,也就是代码中的scope=snsapi_base 这个参数,参考微信文档查看。
    • 微信重定向成功回到内网穿透的nginx,并携带了code
    • 获取接口,获取openId 成功。
    • 这里的域名不对,是因为每次启动natapp都会变动,而我有的截图,是昨天的,当天有时间在忙,未做完笔记。
  • 相关问题

    这里需要注意,我这边请求的时候,代码写成这样,就一直报错,可以看到,请求过去了,但是一直未能成功获取,怀疑是转码工具包和fastJson 互相影响

    这里注意,我在调试的时候发现,需要关注测试号,才能成功获取open_id ,后经过查看,是只有测试号有这个问题,官方文档不清楚,正式的服务号无此问题。

    测试号 配置JS接口安全域名 与 授权回调页面域名 的时候,需要填写一致。而,请求的redirect_uri 参数,只要在配置的域名下,即可。

    这里还需要注意,微信获取code 链接,必须在微信内打开,然后让微信后面重定向到本地的nginx,这样你就可以在微信看见本地nginx 欢迎页面了。但是,你在微信浏览器内复制url 参数,复制出来的url 里面,没有code 参数的话,请在微信调试工具打开,你就可以在地址栏看见了。

  • 开发代码

    package com.wlpt.swpt.portal.common.wx;
    
    import cn.hutool.core.util.URLUtil;
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.pig4cloud.pigx.common.core.util.R;
    import io.swagger.annotations.Api;
    import lombok.AllArgsConstructor;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    /**
    * @program: swpt
    * @description:
    * @author: fq
    * @create: 2020-03-25 11:55
    **/
    @RestController
    @AllArgsConstructor
    @RequestMapping("/wxauth" )
    @Api(value = "wxauth", tags = "微信授权相关")
    public class WXAuthorizationController {
        /**
        * 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
        */
        private static  String SCOPE_TYPE_SNSAPI_BASE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect";
        /**
        * 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
        */
        private static  String SCOPE_TYPE_SNSAPI_USERINFO = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=%s#wechat_redirect";
        /**
        * appID
        */
        private static final String APPID = "wx1f5a62dc0097bbcb";
        /**
        * appsecret
        */
        private static final String APPSECRET = "bdbef8310434c70f2ff9e5b4f2ac7285";
        /**
        * redirect_uri
        */
        private static  String REDIRECT_URI = "http://iwjez2.natappfree.cc/ptportal/wxauth/wxGetCode";
        /**
        * state
        */
        private static final String STATE = "123";
        /**
        * access_token
        */
        private static  String ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
    
        /**
        * 返回给前端获取微信code的Url
        */
        @GetMapping("/wxGetCode")
        public R wxGetCode(){
            String encodeUrl = URLUtil.encode(REDIRECT_URI);
            String codeUrl = String.format(SCOPE_TYPE_SNSAPI_BASE, APPID,encodeUrl,STATE);
            return R.ok(codeUrl);
        }
    
        @GetMapping("/wxRedirectUri")
        public void wxGetAccessTokenOrOpenId(@RequestParam String code,@RequestParam String state){
            //String codeNew = "071tYiJd0nEmAv1h9YId0og3Jd0tYiJp";
            String accessTokenUrl = String.format(ACCESS_TOKEN,APPID,APPSECRET,code);
            RestTemplate restTemplate = new RestTemplate();
            JSONObject jsonObject = restTemplate.getForObject(accessTokenUrl,String.class);
            System.out.println(jsonObject);
        }
    
        public static void main(String[] args) {
            new WXAuthorizationController().wxGetAccessTokenOrOpenId("xxx","ssss");
        }
    }
    
    

    重点,授权回调页面域名 与 redirect_uri 的关系是,redirect_uri重定向的这个地址,只要在你填写的授权回调页面域名之下就行。

    好了,测试代码调通了,后面就是优化代码了,调用微信授权其实不难,主要是要理清楚,对应的过程,相关的步骤,这样,开发起来,得心应手。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!