PC 微信扫码登陆
来源:互联网 发布:淘宝腾讯视频会员 编辑:程序博客网 时间:2024/06/07 04:02
1、注册微信开发平台
官网网址 自行注册,需要注意的是注册邮箱号不用与腾讯其他产品同号。
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进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
具体的步骤如下:
第一步:请求CODE
接口说明
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数说明
若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。
返回说明
用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数
redirect_uri?code=CODE&state=STATE
若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数
redirect_uri?state=STATE
接口封装
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访问测试。开源项目中访问地址为:
http://域名/[项目名称]/toWebOauth
//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)获取用户信息
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机制)
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); }}
推荐阅读
Android版-微信APP支付
极速开发微信公众号之微信买单
极速开发微信公众号之公众号支付
极速开发微信公众号之扫码支付
极速开发微信公众号之刷卡支付
极速开发微信公众号之现金红包
[Android版-支付宝APP支付](http://www.jianshu.com/p/3d91248aea4b
)
支付宝Wap支付
一张二维码集成微信、支付宝支付
源码下载地址
记录学习的点滴,以此勉励不断奋斗的自己✌️✌️✌️
- PC 微信扫码登陆
- 微信PC端网站 微信扫码登陆
- 国内pc端登陆LINE
- 移动免费视频电话应用Tango登陆PC
- 移动版&PC版微信登陆功能
- PC网站微信第三方登陆
- PC网站QQ第三方登陆
- JavaScript判断是手机登陆还是pc登陆
- JavaWeb:后台判断是手机登陆还是Pc登陆
- 破解iTunes 登陆 PC授权 设备授权 购买安装协议。
- 微信:实现 pc 端 扫描二维码登陆 的误区
- 微信PC二维码登陆的一种思路
- 微信登陆 (微信PC扫码授权登陆) 简单的php代码
- 微信登陆 (微信PC扫码授权登陆) 简单的php代码
- 第三方登陆 ,微信扫码登陆
- pc
- 程序员们记得还是八五年PC登陆我国时候的事?
- PC端QQ用某个账号登陆未响应情况解决
- 为了解决linux配置Nginx 只能关闭防火墙才能访问的问题
- 熟悉机器学习术语,西瓜书概念整理(chapter 1-2)
- 为什么Java可以跨平台
- zabbix监控非rpm方式安装的mysql报错的原因及解决方案
- BeautifulSoup使用
- PC 微信扫码登陆
- tensorflow可视化模块 tensorboard
- Ubuntu rpm安装 rpm转deb
- borde和outline的区别
- web编程从入门到项目实战-npm-scripts篇
- java--22--为架包添加javadoc文档
- spring 事务的propagation配置
- easyUI属性汇总
- Java Web开发Tomcat中三种部署项目的方法