Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PC 微信扫码登陆

PC 微信扫码登陆

作者头像
Javen
发布于 2018-08-21 03:10:59
发布于 2018-08-21 03:10:59
4.8K00
代码可运行
举报
文章被收录于专栏:酷玩时刻酷玩时刻
运行总次数:0
代码可运行

1、注册微信开发平台

官网网址 自行注册,需要注意的是注册邮箱号不用与腾讯其他产品同号。

2、微信开发平台添加网站应用

添加网站应用

填写基本信息

填写基本信息2

网站信息登记表模板

网站应用名称不能重复

添加授权回调域-可以修改

以上资料提交之后等待TX审核,审核时间大概2天左右,审核通过之后就可以查看AppID AppSecret以及申请微信登录注意:如果注册完的开放平台之后有进行开发者认证时,审核通过之后微信登录默认是开通的,如果没有进行开发者认证点击申请开通 时会提醒进行开发者认证(如下图)

审核通过

基本信息、开发信息

提醒进行开发者认证

开发者资质认证

3、PC微信登录流程介绍

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。进一步了解OAuth2.0-----理解OAuth2.0 官方介绍资料

大致的步骤如下:

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

获取access_token时序图

具体的步骤如下:

第一步:请求CODE

接口说明

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

参数说明

参数

是否必须

说明

appid

应用唯一标识

redirect_uri

重定向地址,需要进行UrlEncode

response_type

填code

scope

应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可

state

用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

返回说明

用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数


redirect_uri?code=CODE&state=STATE


若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数


redirect_uri?state=STATE


接口封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private static String qrconnect_url = "https://open.weixin.qq.com/connect/qrconnect";

 
    /**
     * 生成网页二维码授权链接
     * @param appId 应用id
     * @param redirect_uri 回跳地址
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri) {
        return getQrConnectURL(appId, redirect_uri, null);
    }
    
    /**
     * 生成网页二维码授权链接
     * @param appId 应用id
     * @param redirect_uri 回跳地址
     * @param state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri, String state) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appId);
        params.put("response_type", "code");
        params.put("redirect_uri", redirect_uri);
        params.put("scope", "snsapi_login");
        if (StrKit.isBlank(state)) {
            params.put("state", "wx#wechat_redirect");
        } else {
            params.put("state", state.concat("#wechat_redirect"));
        }
        String para = PaymentKit.packageSign(params, false);
        return qrconnect_url + "?" + para;
    }

接口测试

1、设置AppId、APPSecret以及回调域名

2、PC访问测试。开源项目中访问地址为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://域名/[项目名称]/toWebOauth

设置AppId、APPSecret以及回调域名


代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//pc扫描登陆
public void toWebOauth(){
    String calbackUrl=PropKit.get("domain")+"/oauth/webCallBack";
    String url=SnsAccessTokenApi.getQrConnectURL(PropKit.get("webAppId"), calbackUrl,"666");
    redirect(url);
}

如果授权回调域名与开发平台中的填写不一致将会出现以下提示

回调域名与接口调用时填写的域名不一致

第二步:通过code获取access_token
第三步:通过access_token调用接口获取用户信息

第二步、第三步过程与微信公众号授权登录一样可以参考之前写的一篇文章授权获取用户信息

授权后接口调用(UnionID)

获取用户个人信息(UnionID机制)

此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。

官方介绍文档

接口封装可以参考开源项目中

网页授权(公众号、PC)获取用户信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.jfinal.kit.StrKit;
import com.jfinal.weixin.sdk.kit.ParaMap;
import com.jfinal.weixin.sdk.kit.PaymentKit;
import com.jfinal.weixin.sdk.utils.HttpUtils;
import com.jfinal.weixin.sdk.utils.RetryUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;


public class SnsAccessTokenApi
{
    private static String url = "https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code";
    private static String authorize_uri = "https://open.weixin.qq.com/connect/oauth2/authorize";
    private static String qrconnect_url = "https://open.weixin.qq.com/connect/qrconnect";
    
    /**
     * 生成Authorize链接
     * @param appId 应用id
     * @param redirect_uri 回跳地址
     * @param snsapiBase snsapi_base(不弹出授权页面,只能拿到用户openid)snsapi_userinfo(弹出授权页面,这个可以通过 openid 拿到昵称、性别、所在地)
     * @return url
     */
    public static String getAuthorizeURL(String appId, String redirect_uri, boolean snsapiBase) {
        return getAuthorizeURL(appId, redirect_uri, null, snsapiBase);
    }
    
    /**
     * 生成Authorize链接
     * @param appId 应用id
     * @param redirectUri 回跳地址
     * @param state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
     * @param snsapiBase snsapi_base(不弹出授权页面,只能拿到用户openid)snsapi_userinfo(弹出授权页面,这个可以通过 openid 拿到昵称、性别、所在地)
     * @return url
     */
    public static String getAuthorizeURL(String appId, String redirectUri, String state, boolean snsapiBase) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appId);
        params.put("response_type", "code");
        params.put("redirect_uri", redirectUri);
        // snsapi_base(不弹出授权页面,只能拿到用户openid)
        // snsapi_userinfo(弹出授权页面,这个可以通过 openid 拿到昵称、性别、所在地)
        if (snsapiBase) {
            params.put("scope", "snsapi_base");
        } else {
            params.put("scope", "snsapi_userinfo");
        }
        if (StrKit.isBlank(state)) {
            params.put("state", "wx#wechat_redirect");
        } else {
            params.put("state", state.concat("#wechat_redirect"));
        }
        String para = PaymentKit.packageSign(params, false);
        return authorize_uri + "?" + para;
    }
    

    /**
     * 生成网页二维码授权链接
     * @param appId 应用id
     * @param redirect_uri 回跳地址
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri) {
        return getQrConnectURL(appId, redirect_uri, null);
    }
    
    /**
     * 生成网页二维码授权链接
     * @param appId 应用id
     * @param redirect_uri 回跳地址
     * @param state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri, String state) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appId);
        params.put("response_type", "code");
        params.put("redirect_uri", redirect_uri);
        params.put("scope", "snsapi_login");
        if (StrKit.isBlank(state)) {
            params.put("state", "wx#wechat_redirect");
        } else {
            params.put("state", state.concat("#wechat_redirect"));
        }
        String para = PaymentKit.packageSign(params, false);
        return qrconnect_url + "?" + para;
    }
    
    /**
     * 通过code获取access_token
     *
     * @param code   第一步获取的code参数
     * @param appId  应用唯一标识
     * @param secret 应用密钥AppSecret
     * @return SnsAccessToken
     */
    public static SnsAccessToken getSnsAccessToken(String appId, String secret, String code)
    {
        final Map<String, String> queryParas = ParaMap.create("appid", appId).put("secret", secret).put("code", code).getData();
        
        return RetryUtils.retryOnException(3, new Callable<SnsAccessToken>() {
            
            @Override
            public SnsAccessToken call() throws Exception {
                String json = HttpUtils.get(url, queryParas);
                return new SnsAccessToken(json);
            }
        });
    }
}

用户管理接口,获取用户基本信息(UnionID机制)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.jfinal.weixin.sdk.kit.ParaMap;
import com.jfinal.weixin.sdk.utils.HttpUtils;
import com.jfinal.weixin.sdk.utils.JsonUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户管理 API
 * <pre>
 * https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
 * </pre>
 */
public class UserApi {
    
    private static String getUserInfo = "https://api.weixin.qq.com/cgi-bin/user/info";
    private static String getFollowers = "https://api.weixin.qq.com/cgi-bin/user/get";
    private static String batchGetUserInfo = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=";

    /**
     * 获取用户基本信息(包括UnionID机制)
     * @param openId 普通用户的标识,对当前公众号唯一
     * @return ApiResult
     */
    public static ApiResult getUserInfo(String openId) {
        ParaMap pm = ParaMap.create("access_token", AccessTokenApi.getAccessTokenStr()).put("openid", openId).put("lang", "zh_CN");
        return new ApiResult(HttpUtils.get(getUserInfo, pm.getData()));
    }
    
    /**
     * 获取用户列表
     * @param nextOpenid 第一个拉取的OPENID,不填默认从头开始拉取
     * @return ApiResult
     */
    public static ApiResult getFollowers(String nextOpenid) {
        ParaMap pm = ParaMap.create("access_token", AccessTokenApi.getAccessTokenStr());
        if (nextOpenid != null)
            pm.put("next_openid", nextOpenid);
        return new ApiResult(HttpUtils.get(getFollowers, pm.getData()));
    }
    
    /**
     * 获取用户列表
     * @return ApiResult
     */
    public static ApiResult getFollows() {
        return getFollowers(null);
    }

    /**
     * 批量获取用户基本信息, by Unas
     * @param jsonStr json字符串
     * @return ApiResult
     */
    public static ApiResult batchGetUserInfo(String jsonStr) {
        String jsonResult = HttpUtils.post(batchGetUserInfo + AccessTokenApi.getAccessTokenStr(), jsonStr);
        return new ApiResult(jsonResult);
    }
    
    /**
     * 批量获取用户基本信息
     * @param openIdList openid列表
     * @return ApiResult
     */
    public static ApiResult batchGetUserInfo(List<String> openIdList) {
        Map<String, List<Map<String, Object>>> userListMap = new HashMap<String, List<Map<String, Object>>>();
        
        List<Map<String, Object>> userList = new ArrayList<Map<String,Object>>();
        for (String openId : openIdList) {
            Map<String, Object> mapData = new HashMap<String, Object>();
            mapData.put("openid", openId);
            mapData.put("lang", "zh_CN");
            userList.add(mapData);
        }
        userListMap.put("user_list", userList);
        
        return batchGetUserInfo(JsonUtils.toJson(userListMap));
    }
    
    private static String updateRemarkUrl = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=";
    
    /**
     * 设置备注名
     * @param openid 用户标识
     * @param remark 新的备注名,长度必须小于30字符
     * @return {ApiResult}
     */
    public static ApiResult updateRemark(String openid, String remark) {
        String url = updateRemarkUrl + AccessTokenApi.getAccessTokenStr();
        
        Map<String, String> mapData = new HashMap<String, String>();
        mapData.put("openid", openid);
        mapData.put("remark", remark);
        String jsonResult = HttpUtils.post(url, JsonUtils.toJson(mapData));
        
        return new ApiResult(jsonResult);
    }
}

源码下载地址

记录学习的点滴,以此勉励不断奋斗的自己✌️✌️✌️ 如果对你有帮助记得点喜欢告诉我

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
端口扫描工具合集
端口扫描这个词,大家并不陌生,无论是在边界资产探测,还是在内网服务扫描,都离不开端口扫描这个技术,当然,不可能手工来做,必须依赖工具进行,那么有哪些端口扫描工具可以用呢?它们又有那些特点呢?
信安之路
2022/10/04
3.5K1
端口扫描工具合集
网络安全自学篇之Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
Web渗透技术的核心是发现Web漏洞,发现漏洞有手工和软件自动化扫描两种方式。对于用户验证漏洞、用户凭证管理问题、权限特权及访问控制漏洞、缓存漏洞、跨站脚本漏洞、加密漏洞、路径切换漏洞、代码注入漏洞、配置漏洞、数据和信息泄露、输入验证码漏洞、操作系统命令脚本注入、资源管理漏洞、SQL注入等常见Web漏洞,都可以通过Web扫描器进行扫描。
用户5836910
2022/06/02
2.8K0
网络安全自学篇之Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
扫描系统漏洞的工具_免费漏洞扫描工具
这是一种最为普通的扫描方法,这种扫描方法的特点是:扫描的速度快,准确性高,对操作者没有权限上的要求,但是容易被防火墙和IDS(防入侵系统)发现
全栈程序员站长
2022/10/01
6.9K0
扫描系统漏洞的工具_免费漏洞扫描工具
从原理上分析端口扫描技术
现在我们已经知道了目标的IP,下一步就是想办法如何侵入目标系统,如果没有办法物理接触目标,那么我们的方法就只能是线上了,那么入侵的途径就是端口了,只有对方开了端口,我们的数据才能流动过去,所以接下来就讲讲如何对端口开放情况进行扫描
意大利的猫
2020/08/20
1.4K0
扫描工具Nmap使用教程图文教程(超详细)
kali的命令行中可以直接使用 nmap 命令,打开一个「终端」,输入 nmap 后回车,可以看到 nmap 的版本,证明 nmap 可用。
IT运维技术圈
2023/02/02
6.8K0
如何实现简单的UDP端口扫描工具
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,属于OSI参考模型的一部分。它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP协议使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。
孟斯特
2024/04/11
1.2K0
如何实现简单的UDP端口扫描工具
端口扫描那些事
在渗透测试中端口扫描是非常重要的一环,不管是在外围对企业边界信息收集的过程还是在内网渗透中对内网的信息收集。如何判断主机或服务器端口的开放情况就显得尤为重要,下面就盘点一下可以作为端口扫描的工具与方式方法。
信安之路
2018/08/08
1.9K0
端口扫描那些事
如何在服务器中Ping特定的端口号,如telnet Ping,nc Ping,nmap Ping等工具的详细使用教程(Windows、Linux、Mac)
在日常开发和运维中,我们经常需要检查目标主机上的某个端口是否开启,并确定网络连通性。本文将为你详细介绍使用 telnet、nc(Netcat) 和 nmap 等工具,在 Windows、Linux 和 macOS 上如何高效地 Ping 某个特定端口。
猫头虎
2024/12/31
9.3K0
如何在服务器中Ping特定的端口号,如telnet Ping,nc Ping,nmap Ping等工具的详细使用教程(Windows、Linux、Mac)
Web安全学习笔记之Nmap扫描原理与用法
Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一。最新版的Nmap6.0在2012年5月21日发布,详情请参见:www.nmap.org。
Jetpropelledsnake21
2019/02/28
2.3K0
安全工具系列 -- 信息收集
信息收集一般都是渗透测试前期用来收集,为了测试目标网站,不得不进行各种信息收集。信息收集要根据不同目标进行不同方向收集,工具部分会在下节课程进行讲解,根据个人渗透测试经验总结文章。本文只是抛砖引玉,希望可以给大家一个好的思路。如果文章中有环境搭建部分,靶场后续会在公众号中发布。视频在关注公众号以后,回复我要视频,管理员会在最快时间进行回复。
HACK学习
2019/08/07
3.3K0
安全工具系列 -- 信息收集
macOS 系统 SIP 功能介绍及开启关闭教程
SIP 全称为「System Integrity Protection」, 中文名「系统完整性保护」,是macos系统的一项安全技术,SIP 将一些文件目录和系统应用保护了起来。但这会影响我们一些使用或设置,比如:更改系统应用图标、终端操作系统目录文件提示「Operation not permitted」、Finder 无法编辑系统目录里的文件。
MAC先森
2019/08/30
8.9K0
macOS 系统 SIP 功能介绍及开启关闭教程
信息收集和漏洞扫描的阶段性总结
渗透测试的流程大家都耳熟能详,具体操作工具五花八门,其中的核心就是信息收集和字典,今天写信息收集和漏洞扫描的一些技巧总结,方便新手学习。
FB客服
2020/09/04
1.1K0
信息收集和漏洞扫描的阶段性总结
Kali Linux 网络扫描秘籍 第三章 端口扫描(三)
另一个可以对远程系统执行 TCP 连接扫描的 替代工具就是 Dmitry。不像 Nmap 和 Metasploit,Dmitry 是个非常简单的工具,我们可以使用它来执行简单快速的扫描,而不需要任何配置。这个秘籍展示了如何使用 Dmitry 来自执行 TCP 连接扫描。
ApacheCN_飞龙
2022/12/01
1.5K0
如何使用 ss、netstat、lsof 和 nmap 扫描开放端口
有很多可用的端口扫描工具,但您也可以使用以下 Linux 命令扫描任何目标机器的开放端口。
网络技术联盟站
2022/12/13
2.6K0
如何使用 ss、netstat、lsof 和 nmap 扫描开放端口
0×1 Python教程:端口扫描程序
在本教程中,我们将演示如何通过构建基本端口扫描程序与Python建立网络连接。我们将要做的是基于ip / port组合反复建立网络套接字连接。为了实现这一目标,我们将引入一个新概念,即for循环:
重生信息安全
2020/04/27
5790
kali扫描工具_nmap批量扫描
例如下面我们对IP为192.168.43.137的主机进行扫描,显示的内容如下
全栈程序员站长
2022/11/10
2.6K0
kali扫描工具_nmap批量扫描
[工具使用]之NMAP
下载: kail:apt-get install nmap windows:下载官网
李鹏华
2024/03/12
2390
[工具使用]之NMAP
常用端口扫描技术
这 是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么 connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被察觉的,并且很容易被防火墙将扫描信息包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。
网e渗透安全部
2019/08/09
3.5K0
上帝之眼-Nmap【含超多常用命令】
使用Nmap命令做测试时,不要扫描未经授权的IP或网站,避免给自己带来一些不必要的麻烦。请使用自己搭建的虚拟机环境进行测试。
用户10781703
2024/08/22
2740
Nmap命令扫描详解
在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,这就是端口号
全栈程序员站长
2022/09/01
1.8K0
相关推荐
端口扫描工具合集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验