目录

1、注册微信开发平台

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

3、PC微信登录流程介绍

4、获取用户基本信息(UnionID机制)

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

参数说明

参数 是否必须 说明
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


接口封装


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支付

支付宝Wap支付

一张二维码集成微信、支付宝支付

源码下载地址:http://git.oschina.net/javen205/weixin_guide

记录学习的点滴,以此勉励不断奋斗的自己✌️✌️✌️

PC 微信扫码登陆的更多相关文章

  1. 分享一下,PHP实现第四方QQ微信扫码登陆,不接入qq互联以及微信开发者平台就可以实现用户对接鹅厂,phpQQ微信扫码登陆

    自己抓的QQ包以及整合了网上一些已经封装好了的代码具体如下:QQ: <?php class QQ extends Curl_Api { //获取登录验证码 public function QRc ...

  2. 微信扫码登陆(JAVA)

    在web端用到weChat扫码登录,在手机扫码登陆成功后,跳转到相应的界面. 1.第一步请求code 调用接口:https://open.weixin.qq.com/connect/qrconnect ...

  3. 微信扫码登陆js

    先贴一个微信开发文档教程 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.ht ...

  4. 微信扫码登陆,qq登陆,微博登陆等第三方登陆成功后返回原来的页面并进行跳转

    原理很简单,主要是利用到window.open的第二个属性,name 前端: 原来的网页给window命名为 window.name="single" window.open(“第 ...

  5. PC 端微信扫码注册和登录

    一.前言 先声明一下,本文所注重点为实现思路,代码及数据库设计主要为了展现思路,如果对代码效率有着苛刻要求的项目切勿照搬. 相信做过微信开发的人授权这块都没少做过,但是一般来说我们更多的是为移动端的网 ...

  6. php实现微信扫码自动登陆与注册功能

    本文实例讲述了php实现微信扫码自动登陆与注册功能.分享给大家供大家参考,具体如下: 微信开发已经是现在程序员必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单 ...

  7. PHP实现微信扫码自动登陆与注册,参考实例

    微信开发已经是现在phper必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单,这里我们一起来看一个微信自动登陆注册的例子. php 微信扫码 pc端自动登陆注 ...

  8. asp源码微信扫码授权登陆电脑版

    网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台)电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登录 ...

  9. 【微信开发】PC端 微信扫码支付成功之后自动跳转

    场景: PC端   微信扫码支付 结果: 支付成功 自动跳转 实现思路: 支付二维码页面,写ajax请求支付状态,请求到结果,无论成功还是失败,都跳转到相应的结果页面 具体实现方法: html部分: ...

随机推荐

  1. Python 中函数的 收集参数 机制

    定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...

  2. Docker 传奇之 dotCloud

    2010年,几个大胡子年轻人在旧金山成立了一家做 PaaS 平台的公司,起名为「dotCloud」,这个名字让我想起了微软的「DotNet」. dotCloud 主要是基于 PaaS 平台为开发者或开 ...

  3. WIN8系统中 任务管理器 性能栏 显示CPU利用率(已暂停)怎么回事?

    解决办法: 点上方的 查看--更新速度--普通

  4. 用格式工厂将mts文件转换成其它格式flv,mpg失败

    通常情况下,是由帧速率的改变引起的! 看一看你的MTS帧速率是多少,则转换成FLV时,帧速率要一样!----------  这是非常重要的!!!

  5. 让DELPHI自带的richedit控件显示图片

    让DELPHI自带的richedit控件显示图片 unit RichEx; { 2005-03-04 LiChengbin Added: Insert bitmap or gif into RichE ...

  6. 【elasticsearch】关于elasticSearch的基础概念了解【转载】

    转载原文:https://www.cnblogs.com/chenmc/p/9516100.html 该作者本系列文章,写的很详尽 ================================== ...

  7. dev的documentManager,多个tab窗体

    private void AddDocument(Funcation CurrentModel) { if (!string.IsNullOrWhiteSpace(CurrentModel.Funct ...

  8. WordPress主题开发:开启feed功能

    开启feed功能 步骤一:在模版文件的<head></head>元素中添加wp_head()函数,且wp_head()函数要放在</head>标签之前,而且紧邻&l ...

  9. libcurl下载文件

    一.初始化 CURL *pHandler = curl_easy_init();   二.设置请求参数: 调用curl_easy_setopt方法,设置选项 curl_easy_setopt(pHan ...

  10. SVG.js Mask覆盖和ClipPath裁剪

    一.SVG.Mask 覆盖物设置 1. var draw = SVG('svg1').size(300, 300); //SVG.Mask 覆盖物设置 var ellipse = draw.ellip ...