(JAVA)Alipayアプレットのログイン関連(authTokenはユーザーの一意のuserId、encryptedData、復号化された携帯電話番号を取得します)

序文:

最近、同社はAlipay userIdを一意のユーザーIDとして使用してAlipayの小さなプログラムプロジェクトを作成し、バックグラウンドの復号化データはユーザーAlipayにバインドされた携帯電話番号情報を復号化しました。

パラメータ:authTokenとencryptedDataは両方ともフロントエンドからインポートされ、フロントエンドと連携して開発する必要があります。

テキストが始まります:

郵便番号:

1.authtoken get userId フロントエンドドキュメント  バックエンドドキュメント

public String findUserId(String authCode) throws AdminException, AlipayApiException {
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.url, AlipayConfig.app_id, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.public_key, AlipayConfig.signtype);
        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
        request.setGrantType("authorization_code");
        request.setCode(authCode);
        // request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");
        AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
        //String accessToken = response.getAccessToken();
        if (response.isSuccess()) {
            //log.info("调用成功");
            //log.info("支付宝用户唯一id:" + response.getUserId());
            // log.info("token令牌:" + response.getAccessToken());   //访问令牌。通过该令牌调用需要授权类接口
            return response.getUserId();
        }
        return null;
    }

私はその中でaccessTokenを使用していません。コメントを外すために使用できます。プロテストで取得できます。

2.encryptedDataが電話番号を復号化します。

//解密手机号
        JSONObject jsonObject =JSONObject.parseObject(userSmallLoginRequest.getEncryptedData());
        String phoneResult = AESCBCUtil.RealDecrypt(jsonObject.getString("response"), AlipayConfig.aesSecretKey);
        JSONObject jsonObject1 = JSONObject.parseObject(phoneResult);
        if(!"10000".equals(jsonObject1.getString("code"))){
            throw new AdminException("用户手机号解密失败");
        }
        String phone = jsonObject1.getString("mobile");

AlipayConfig.aesSecretKeyは、Alipayアプレットによって設定されたキーです

ステッカーツール:

package com.dq.utils;


import com.alipay.api.internal.util.codec.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * @author: martin
 * @date: 2018/8/21 20:11
 * @description:
 */
public class AESCBCUtil {
    /**
     *
     * @param content 密文
     * @param key aes密钥
     * @return 原文
     */
    public static String RealDecrypt(String content, String key) throws Exception {

        //反序列化AES密钥
        SecretKeySpec keySpec = new SecretKeySpec(Base64.decodeBase64(key.getBytes()), "AES");

        //128bit全零的IV向量
        byte[] iv = new byte[16];
        for (int i = 0; i < iv.length; i++) {
            iv[i] = 0;
        }
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

        //初始化加密器并加密
        Cipher deCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        deCipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
        byte[] encryptedBytes = Base64.decodeBase64(content.getBytes());
        byte[] bytes = deCipher.doFinal(encryptedBytes);
        return new String(bytes);

    }
}

電話番号、JSONObjectアリババのfastjsonを取得することで暗号化された文字列、電話を着信ため、どのuserSmallLoginRequest.getEncryptedData()、コードの先端部は、取得することである公式のリンクを

my.getPhoneNumber({
    success: (res) => {
        let encryptedData = res.response;
        my.request({
            url: '你的后端服务端',
            data: encryptedData,
        });
    },
    fail: (res) => {
        console.log(res);
        console.log('getPhoneNumber_fail');
    },
});

バックエンドに渡されるデータ形式は次のとおりです。

{"response": "","xx":"xxx"}

 ビジネスロジックによって解析される形式は次のとおりです。

{
  "code": "10000",
  "msg": "Success",
  "mobile": "1597671905"
}

Mobileは携帯電話の番号ですが、なくなりました。

17件の元の記事を公開 35 件を賞賛 30,000回以上の閲覧

おすすめ

転載: blog.csdn.net/weixin_42359392/article/details/105594790
おすすめ