目錄
1、注冊微信開發平臺
2、微信開發平臺添加網站應用
3、PC微信登錄流程介紹
4、獲取用戶基本信息(UnionID機制)
1、注冊微信開發平臺
官網網址 自行注冊,需要注意的是注冊郵箱號不用與騰訊其他產品同號。
2、微信開發平臺添加網站應用
以上資料提交之后等待TX審核,審核時間大概2天左右,審核通過之后就可以查看AppID AppSecret以及申請微信登錄。
注意:如果注冊完的開放平臺之后有進行開發者認證時,審核通過之后微信登錄默認是開通的,如果沒有進行開發者認證點擊申請開通 時會提醒進行開發者認證(如下圖)
3、PC微信登錄流程介紹
網站應用微信登錄是基于OAuth2.0協議標準構建的微信OAuth2.0授權登錄系統。進一步了解OAuth2.0-----理解OAuth2.0 官方介紹資料
大致的步驟如下:
- 第三方發起微信授權登錄請求,微信用戶允許授權第三方應用后,微信會拉起應用或重定向到第三方網站,并且帶上授權臨時票據code參數;
- 通過code參數加上AppID和AppSecret等,通過API換取access_token;
- 通過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操作。

具體的步驟如下:
第一步:請求CODE
參數 | 是否必須 | 說明 |
---|---|---|
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支付
一張二維碼集成微信、支付寶支付
源碼下載地址
記錄學習的點滴,以此勉勵不斷奮斗的自己?????? 如果對你有幫助記得點喜歡告訴我