サードパーティプラットフォームシリーズの記事は、今日ようやく再び更新され始めました。今日は、Wechat(wechat)認定のサードパーティログインについて学習を続けています。
1.準備
1.WeChatパブリックテストアカウントに申し込む
私たちは個人の開発者であるため、WeChatパブリックプラットフォームのテストアカウントを登録して申請する必要があります
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
WeChatスキャンコードでログインすると、appIDとappsecretを取得できます
2.公開テスト番号に従ってください
3.コールバックドメイン名を構成します
「Webサービス」で「Webアカウント」を検索し、「ユーザー基本情報を取得するためのWeb認証」インターフェースのコールバックドメイン名を変更します。
注:ここで言うと、構成Webページのコールバック許可ドメイン名は、通常、サードパーティのインターフェイスとドッキングされており、同じではありません。コールバックの完全なアドレスは入力しませんが、コールバックドメイン名、ドメイン名の下のコールバックコールバックアドレスを入力します。
- 例:
コールバックアドレス:http
://www.baidu.com/wechat/back then here:baidu.com
初心者は一般的にここで混乱しやすいです。設定が完了したら、[確認]をクリックします。
2.開発を開始します
1.アプリケーション情報を取得します
取得したappIDとappsecretを構成ファイル(ここではSpringBootプロジェクト)に書き込み、application.ymlファイルに入れます。
2.mavenの依存関係を導入します
<!-- 网络请求 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<!-- alibaba的fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
ここでは、ネットワークリクエストとJSONオブジェクトの変換を使用する必要があるため、httpclientとfastjson、およびその他の依存関係を紹介しました。自己紹介してください。
3.構成ファイルから「wechat」構成情報を取得します
/**
* 公众平台提供的 appid 和 appsecret
*/
@Value("${wechat.oauth.appid}")
public String APPID;
@Value("${wechat.oauth.appsecret}")
public String APPKEY;
@Value("${wechat.oauth.callback}")
public String URL;
4.認証ページにリダイレクトします
/**
* 请求授权页面
*/
@RequestMapping("/auth")
public String token(HttpSession session) throws Exception {
// 用于第三方应用防止CSRF攻击
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
session.setAttribute("state", uuid);
// Step1:获取Authorization Code
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
"appid=" + APPID +
"&redirect_uri=" + URLEncoder.encode(URL) +
"&response_type=code" +
"&scope=snsapi_userinfo" +
"&state=" + uuid +
"#wechat_redirect";
return PasswordUtils.redirectTo(url);
}
- Step1のパラメータは次のように説明されています。
パラメータ | あなたはする必要がありますか | 説明 |
---|---|---|
appid | はい | 公式アカウントの一意の識別子 |
redirect_uri | はい | 承認後にリダイレクトされたコールバックリンクアドレス。urlEncodeを使用してリンクを処理してください |
response_type | はい | 返品タイプ、コードを入力してください |
範囲 | はい | アプリケーション認証スコープ、snsapi_base(認証ページをポップアップせず、直接ジャンプし、ユーザーopenidのみを取得します)、snsapi_userinfo(認証ページをポップアップし、openidを介してニックネーム、性別、場所を取得できます。また、心配していなくても、ユーザーが許可されている限り、情報を取得できます) |
状態 | 番号 | リダイレクト後、状態パラメーターが取得され、開発者はa-zA-Z0-9のパラメーター値を最大128バイトまで入力できます。 |
#wechat_redirect | はい | 直接開くか、302ページのリダイレクトを行うかにかかわらず、このパラメーターを持参する必要があります |
このとき、アクセスすると認証ページが表示されます
5.認証コールバック
/**
* 授权回调
*/
@GetMapping(value = "/callback")
public void callback(HttpServletRequest request) throws Exception {
HttpSession session = request.getSession();
// 得到Authorization Code
String code = request.getParameter("code");
// 我们放在地址中的状态码
String state = request.getParameter("state");
String uuid = (String) session.getAttribute("state");
// 验证信息我们发送的状态码
if (null != uuid) {
// 状态码不正确,直接返回登录页面
if (!uuid.equals(state)) {
return PasswordUtils.redirectTo("/login");
}
}
// Step2:通过Authorization Code获取Access Token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=" + APPID +
"&secret=" + APPKEY +
"&code=" + code +
"&grant_type=authorization_code";
JSONObject resJson = HttpRequestUtils.httpRequestGet(url);
if (null == resJson) {
return PasswordUtils.redirectTo("/login");
}
String accessToken = resJson.getString("access_token");
String openId = resJson.getString("openid");
if (StringUtils.isBlank(accessToken) || StringUtils.isBlank(openId)) {
return PasswordUtils.redirectTo("/login");
}
url = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=" + accessToken +
"&openid=" + openId +
"&lang=zh_CN";
// Step3: 获取微信用户信息
resJson = HttpRequestUtils.httpRequestGet(url);
/**
* TODO 这时就该写自己的业务逻辑了
*/
}
- ステップ2のパラメーターは次のように説明されます。
パラメータ | あなたはする必要がありますか | 説明 |
---|---|---|
appid | はい | 公式アカウントの一意の識別子 |
秘密 | はい | 公式アカウントの秘密 |
コード | はい | 最初のステップで取得したコードパラメータを入力します |
grant_type | はい | authentication_codeとして入力します |
- ステップ3のパラメーターは次のように説明されます。
パラメータ | あなたはする必要がありますか | 説明 |
---|---|---|
アクセストークン | はい | Webページ認証インターフェイスの呼び出し資格情報、注:このaccess_tokenは、サポートされている基本的なaccess_tokenとは異なります。 |
openid | はい | ユーザーの一意のID |
lang | はい | 国と地域の言語バージョンに戻る、zh_CN簡略化、zh_TWトラディショナル、英語 |
6.ネットワークリクエスト方法
ステップ2とステップ3はどちらもGETリクエストメソッドです
/**
* GET 请求
*/
public static JSONObject httpRequestGet(String url) throws IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "UTF-8");
return JSONObject.parseObject(result);
}
httpGet.releaseConnection();
return null;
}
3.ドキュメント
WeChat許可ログインのドキュメントアドレスは次のとおりです。
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
4、まとめ
承認認証プロセスは、基本的なOAuth2認証プロセスに準拠しています。アプリケーションの場合、プロセスは、図に示すように、承認コードの取得と承認コードを介したアクセストークンの取得の2つのステップで構成されます。
読み不足を見つけたら、メッセージを残してください!!!