1、にオープンプラットフォームが微信登録したアカウントは、関連付けアプレット
2、関連するパラメータへのアプレットのアクセスは、独自のサーバーの舞台裏に提出する
ユーザーの承認を必要とし、次の操作をした後:
wx.login({
success (res) {
if (res.code) {
//获取到code(用户登录凭证)
wx.getUserInfo({
success: function(resp) {
//获取到encryptedData(加密数据)和iv(偏移量)
//发起网络请求,将code、encryptedData和iv都提交到自己服务器后台
wx.request({
url: 'https://test.com/onLogin',
data: {
code: res.code,
encryptedData: resp.encryptedData,
iv: resp.iv
}
})
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
コードSESSIONKEY(独自のサーバー側を行う)ことにより得られる3、
:access_tokenは、以下のリンクを要求するために、アプレットのコードによって提供されたパラメータを取る
https://api.weixin.qq.com/sns/oauth2/jscode2session?appid=APPID&secret=SECRET&js_code = CODE&grant_type = authorization_code
パラメータ説明
パラメータ | あなたがする必要がありますか | 説明 |
---|---|---|
APPID | それはあります | 固有の識別を適用した後、微信オープンプラットフォームでの承認申請の提出を取得します |
秘密 | それはあります | アプリケーションキーAppSecretは、微信オープンプラットフォームで監査を通じて申請書を提出します |
コード | それはあります | コードのパラメータを入力し、最初のステップを買収します |
grant_type | それはあります | 填authorization_code |
@Override
public String getSessionKey(String appid, String appSecret, String code) {
try {
String pattern = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&grant_type=authorization_code&js_code=%s";
String url = String.format(Locale.ENGLISH, pattern, appid, appSecret, code);
ConvertedResponse<String> response = EasyHttp.executeGet(url, new StringResponseConverter());
if (response.convertedResponse != null) {
log.debug(response.convertedResponse);
JSONObject jsonObject = JSON.parseObject(response.convertedResponse);
return jsonObject.getString("session_key");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
正しく返します。
{
"errcode":0,
"errmsg":"",
"openid":"OPEN_ID",
"session_key":"SESSION_KEY",
"uin":"",
"unionid":"UNION_ID"
}
図4は、ユーザ情報を解読するための
正しい復号化は、全体のサードパーティの登録が完了した場合、復号化は、ログインに失敗した失敗し、ステップには現在、復号化するために、前のステップSESSIONKEYとアプレットはEncryptedDataとIVが提供する、unionIdを取得することであったユーザー情報を取得します。
@Override
public String decryptUserInfo(String encryptedData, String iv, String sessionKey) {
try {
byte[] data = Base64.decodeBase64(encryptedData);
byte[] aseKey = Base64.decodeBase64(sessionKey);
byte[] ivData = Base64.decodeBase64(iv);
// 如果密钥不足16位,那么就补足
int base = 16;
if (aseKey.length % base != 0) {
int groups = aseKey.length / base + 1;
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(aseKey, 0, temp, 0, aseKey.length);
aseKey = temp;
}
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec spec = new SecretKeySpec(aseKey, "AES");
AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
params.init(new IvParameterSpec(ivData));
cipher.init(Cipher.DECRYPT_MODE, spec, params);
byte[] result = cipher.doFinal(data);
String info = new String(result, StandardCharsets.UTF_8);
log.debug(info);
return info;
} catch (Exception e) {
log.error(e.getLocalizedMessage(), e);
return null;
}
}
正しい復号結果:
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark": {
"appid":"APPID",
"timestamp":TIMESTAMP
}
}