国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

原創(chuàng):微信小程序java實現(xiàn)AES解密并獲取unionId

supernavy / 3523人閱讀

摘要:來自微信小程序聯(lián)盟如果大家使用小程序的同時還在使用公眾號的話,可能會用到這種功能,由于公司業(yè)務(wù)需要,我們需要使用,具體使用方法,請參考微信開放平臺的說明,但是在微信小程序的文檔中只給出了部分語言實現(xiàn)的源碼,竟然沒有的,小程序的開發(fā)人員是有多

來自:微信小程序聯(lián)盟

如果大家使用小程序的同時還在使用公眾號的話,可能會用到unionId這種功能,由于公司業(yè)務(wù)需要,我們需要使用unionId,具體使用方法,請參考微信開放平臺的說明,但是在微信小程序的文檔中只給出了部分語言實現(xiàn)的源碼,竟然沒有java的,小程序的開發(fā)人員是有多么懶。難道大家都不用java寫后臺???

什么鬼,然后開始了各種AES踩坑之路,其實參考了很多的網(wǎng)上的教程,再次不能一一列出來給大家了,(因為我寫這篇文章的時候,已經(jīng)是解決問題一周以后了),也收到管理員的很多幫助,再次寫個帖子回饋大家吧,在此只列出unionId的解密方式,如果有什么問題,聯(lián)系我或者回帖都可以。

另外稍加吐槽一下,
https 不要用startcom提供的免費證書!
https 不要用startcom提供的免費證書!
https 不要用startcom提供的免費證書!

重要的事情說三遍!!!!

AES.java

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;
public class AES {
    public static boolean initialized = false;
    /**
     * AES解密
     * @param content 密文
     * @return
     * @throws InvalidAlgorithmParameterException
     * @throws NoSuchProviderException
     */
    public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
        initialize();
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
            Key sKeySpec = new SecretKeySpec(keyByte, "AES");
            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    public static void initialize(){
        if (initialized) return;
        Security.addProvider(new BouncyCastleProvider());
        initialized = true;
    }
    //生成iv
    public static AlgorithmParameters generateIV(byte[] iv) throws Exception{
        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
        params.init(new IvParameterSpec(iv));
        return params;
    }
}

WxPKCS7Encoder.java

import java.nio.charset.Charset;
import java.util.Arrays;
/**
* Created by Kevin Dong on 2017/1/5.
*/
public class WxPKCS7Encoder {
    private static final Charset CHARSET = Charset.forName("utf-8");
    private static final int BLOCK_SIZE = 32;
    /**
     * 獲得對明文進行補位填充的字節(jié).
     *
     * @param count 需要進行填充補位操作的明文字節(jié)個數(shù)
     * @return 補齊用的字節(jié)數(shù)組
     */
    public static byte[] encode(int count) {
        // 計算需要填充的位數(shù)
        int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
        if (amountToPad == 0) {
            amountToPad = BLOCK_SIZE;
        }
        // 獲得補位所用的字符
        char padChr = chr(amountToPad);
        String tmp = new String();
        for (int index = 0; index < amountToPad; index++) {
            tmp += padChr;
        }
        return tmp.getBytes(CHARSET);
    }
    /**
     * 刪除解密后明文的補位字符
     *
     * @param decrypted 解密后的明文
     * @return 刪除補位字符后的明文
     */
    public static byte[] decode(byte[] decrypted) {
        int pad = decrypted[decrypted.length - 1];
        if (pad < 1 || pad > 32) {
            pad = 0;
        }
        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
    }
    /**
     * 將數(shù)字轉(zhuǎn)化成ASCII碼對應(yīng)的字符,用于對明文進行補碼
     *
     * @param a 需要轉(zhuǎn)化的數(shù)字
     * @return 轉(zhuǎn)化得到的字符
     */
    public static char chr(int a) {
        byte target = (byte) (a & 0xFF);
        return (char) target;
    }
}

調(diào)用方法解密如下:

WechatOpenIdRes wechatInfo  = getWehatInfoByCode(code);
        if(wechatInfo != null && wechatInfo.isOk()){
            boolean isNew = true;
            try {
                AES aes = new AES();
                byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(wechatInfo.getSession_key()), Base64.decodeBase64(iv));
                if(null != resultByte && resultByte.length > 0){
                    String userInfo = new String(WxPKCS7Encoder.decode(resultByte));
                    WxInfo wxInfo = GsonUtil.fromGson(userInfo, WxInfo.class);
                    if(wxInfo != null) {
                        logger.debug("xxxxxunionid===="+wxInfo.getUnionId());
                    }
                }
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

編譯環(huán)境為java1.8
另外我引入的support 包為
bcprov-jdk16-139.jar 此包已上傳附件,
順帶附上我試用的小程序js中的代碼吧,

var code ="";
wechat.login()
      .then(function(res){
        code = res.code;        
      })
      .then(function(){
        return wechat.getUserInfo();
      })
      .then(function(res){
var encryptedData = res.encryptedData
var iv = res.iv;
return userservice.getUserToken(code,encryptedData,iv);
      })

上面的代碼使用了promise,其中最后一句userservice.getUserToken為請求服務(wù)器的方法,參數(shù)為獲取到的code+加密內(nèi)容+初始化向量
有什么問題可以聯(lián)系我。
qq:403125094
源碼下載地址:http://www.wxapp-union.com/po...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66545.html

相關(guān)文章

  • 原創(chuàng)信小程序java實現(xiàn)AES解密獲取unionId

    摘要:來自微信小程序聯(lián)盟如果大家使用小程序的同時還在使用公眾號的話,可能會用到這種功能,由于公司業(yè)務(wù)需要,我們需要使用,具體使用方法,請參考微信開放平臺的說明,但是在微信小程序的文檔中只給出了部分語言實現(xiàn)的源碼,竟然沒有的,小程序的開發(fā)人員是有多 來自:微信小程序聯(lián)盟 如果大家使用小程序的同時還在使用公眾號的話,可能會用到unionId這種功能,由于公司業(yè)務(wù)需要,我們需要使用unionId,...

    jackzou 評論0 收藏0
  • 程序登錄、微信網(wǎng)頁授權(quán)(Java版)

    摘要:小程序登錄微信網(wǎng)頁授權(quán)版首先呢,登錄授權(quán)授權(quán)登錄,是一樣的意思,不用糾結(jié)。寫小程序授權(quán)登錄的代碼前,需要了解清楚與的區(qū)別,這里再簡單介紹一下騰訊有個微信開放平臺,只有企業(yè)才能注冊賬號,可理解為微信體系里,最頂級的賬號。 小程序登錄、微信網(wǎng)頁授權(quán)(Java版) 首先呢,登錄、授權(quán)、授權(quán)登錄,是一樣的意思,不用糾結(jié)。 寫小程序授權(quán)登錄的代碼前,需要了解清楚openid與unionid的區(qū)別...

    joywek 評論0 收藏0
  • 信小程序授權(quán)登錄、解密unionId出錯

    摘要:注沒有在微信開放平臺做開發(fā)者資質(zhì)認證的就不要浪費時間了,沒認證無法獲取,認證費用元年,微信授權(quán)登錄流程第一步獲取用戶臨時登錄憑證第二步獲取加密過的數(shù)據(jù)和解密參數(shù)第三步把步驟一二中的傳到開發(fā)者自己服務(wù)端第三步服務(wù)端獲取到之后用方法請求如下微信 注:沒有在微信開放平臺做開發(fā)者資質(zhì)認證的就不要浪費時間了,沒認證無法獲取unionId,認證費用300元/年,emmmm.... 微信授權(quán)登錄流程...

    tinysun1234 評論0 收藏0
  • 信小程序Java登錄流程(ssm實現(xiàn)具體功能和加解密隱私信息問題解決方案)

    摘要:文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號好好學(xué),獲取優(yōu)質(zhì)學(xué)習(xí)資源。一登錄流程圖二小程序客戶端獲取用戶信息非必填默認為請求服務(wù)端的登錄接口臨時登錄憑證用戶非敏感信息簽名用戶敏感信息解密算法的向量調(diào)用服務(wù)端登錄接口 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號:好好學(xué)java,獲取優(yōu)質(zhì)學(xué)習(xí)資源。 一、登錄流程圖 showImg(htt...

    QiShare 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<