すべてのプロダクト
Search
ドキュメントセンター

Dataphin:カスタム承認システム統合インターフェース

最終更新日:Feb 06, 2025

このトピックでは、サードパーティの承認プロセスを Dataphin BPMS と統合する方法の概要を説明し、オープンインターフェース機能、統合手順、および使用例の詳細について説明します。

前提条件

Dataphin システム内で [承認設定] が構成されていることを確認します。構成の詳細については、「承認設定」をご参照ください。テナント操作については、[承認システムの選択] の下の [承認設定][その他] の設定項目を参照してください。

承認インターフェース

重要

{url}: サードパーティ承認フローの統合アドレス。承認リクエストを送信するための URL は http(s)://{url} です。

  1. 接続テスト

    リクエストメソッド: POST を使用します。

    リクエスト URL: http(s)://{url}/dataphin/bpms/check/connect.

    リクエスト時系列チャート

    image

    クエリパラメータ

    パラメータ名

    パラメータタイプ

    説明

    accessToken

    String

    サーバーサイド API を呼び出すために使用される資格情報。

    Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.

    timestamp

    String

    情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.

    リクエストボディパラメータ

    checkEvent (String): このパラメータは、接続性のチェックなどの接続テストを表します。

    戻り値パラメータ

    checkResult (String): チェックの結果を示します。「success」の戻り値は、接続テストの成功を示します。その他の値は、接続テストの失敗を示します。例: 'success'.

  2. 承認の送信

    リクエストメソッド: POST

    リクエストアドレス: http(s)://{url}/dataphin/bpms/processinstance/create

    承認送信時系列チャート

    image

    クエリパラメータ

    パラメータ名

    パラメータタイプ

    説明

    accessToken

    String

    サーバーサイド API を呼び出すために使用される資格情報。

    Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.

    timestamp

    String

    情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.

    ボディパラメータ

    パラメータ名

    パラメータタイプ

    説明

    applyId

    String

    Dataphin 承認オーダー ID。例: 1223.

    title

    String

    Dataphin 承認オーダーのタイトル。例: dataphin bpms.

    content

    String

    Dataphin 承認オーダーの内容。例: bpms content。「承認メッセージコンテンツメタデータの説明」をご参照ください。

    type

    String

    • 承認オーダータイプ: APPROVAL_DOC_TYPE.

    • コードレビュー: CODE_REVIEW.

    • 公開制御: PUBLISH.

    • ビジネスプランニング: BIZ_PLANNING.

    • 承認の承認: AUTH.

    • デフォルト: DEFAULT.

    templateCode

    String

    承認テンプレートのコード。空のままにすることができ、ページ構成に関連しています。

    承認メッセージコンテンツメタデータの説明

    パラメータ名

    パラメータタイプ

    説明

    resourceType

    String

    承認タスクのタイプ。列挙値であり、次のタイプが含まれます。

    • PhysicalTable: 物理テーブル。

    • LogicTable: 論理テーブル。

    • MetaTable: リアルタイムメタテーブル。

    • MirrorTable: ミラーテーブル。

    • Fun: 関数。

    • DataSource: データソース。

    • FeatureConfig: 機能権限構成。

    • OSAPP: データサービス APP。

    • OSAPI: データサービス API。

    • OSLogicUnit: データサービスユニット。

    • OSDS: データサービスデータソース。

    • SECRET_KEY:_KEY: キー。

    • GLOBAL_PARAM: グローバル変数。

    grantToUsers

    List<GrantToUser>

    承認済みユーザーのリスト。「GrantToUser」をご参照ください。

    bpmsEnvironment

    BpmsEnvironment

    承認システム環境に関する情報。「BpmsEnvironment」をご参照ください。

    operates

    List<String>

    リクエストされた権限のタイプ。次のものが含まれます。

    • SYNC_READ: データソースのリードスルー。

    • SYNC_WRITE: データソースのライトスルー。

    • SQL_QUERY: 物理テーブルおよび論理テーブルの SQL クエリ。

    • SQL_WRITE: 物理テーブルの SQL 書き込み。

    • SQL_ALTER: 物理テーブルの SQL 変更。

    • SQL_DROP: 物理テーブルおよび論理テーブルの SQL 削除。

    • SELECT: データサービス API のクエリ。

    • WRITE: 書き込み権限。

    • DEV: 開発権限。

    • USE: 使用権限。

    • UPDATE: テーブルデータの変更。

    • PIPELINE_ENCRY: 統合暗号化。

    • PIPELINE_DECRY: 統合復号。

    levels

    List<String>

    権限レベル。HIGH、MIDDLE、LOW など。

    operations

    List<String>

    権限タイプ。次のものが含まれます。

    • SELECT - クエリ。

    • DESCRIBE - テーブル構造の説明。

    • UPDATE - テーブルデータの変更。

    • ALTER - テーブル構造の変更。

    • DELETE - テーブルの削除。

    • COPY_TASK - コピー。

    resources

    List<BpmsResource>

    リソースコンテンツ。「BpmsResource」をご参照ください。

    applyObject

    ApplyObject

    アプリケーション オブジェクト情報。「ApplyObject」をご参照ください。

    reason

    String

    申請理由。

    GrantToUser

    パラメータ名

    パラメータタイプ

    説明

    account

    Account

    承認済みアカウントのリスト。「Account」をご参照ください。

    period

    Period

    有効期間。「Period」をご参照ください。

    Account

    パラメータ名

    パラメータタイプ

    説明

    accountType

    String

    承認タイプには、個人アカウントテナントアカウント、およびアプリケーションアカウントが含まれます。

    • PERSONAL: 個人アカウント。

    • TENANT: テナントアカウント。

    • APPLICATION: アプリケーションアカウント。

    userName

    String

    アカウントに関連付けられているユーザー名。形式は yyyy-mm-dd です。例: 2022-09-11.

    Period

    パラメータ名

    パラメータタイプ

    説明

    periodType

    String

    有効期間タイプには、長期 (LONG_TERM) オプションのサポートが含まれます。

    periodEnd

    String

    権限の有効期限。形式は yyyy-mm-dd です。例: 2022-09-11.

    BpmsEnvironment

    パラメータ名

    パラメータタイプ

    説明

    projectName

    String

    プロジェクトの名前。

    bizUnitName

    String

    ビジネスユニットの名前。

    resourceEnv

    String

    環境。本番環境と開発環境に分類されます。

    • PROD: 本番。

    • DEV: 開発。

    BpmsResource

    パラメータ名

    パラメータタイプ

    説明

    resourceType

    String

    承認メッセージコンテンツメタデータの説明」をご参照ください。

    resourceName

    String

    リソースの名前。

    children

    List<Children>

    フィールドのリスト。「Children」をご参照ください。

    operations

    List<String>

    承認メッセージコンテンツメタデータの説明」の operates を参照してください。

    authTypes

    String

    申請権限のタイプ。

    Children

    パラメータ名

    パラメータタイプ

    説明

    resourceName

    String

    フィールドの名前。

    resourceProperties

    String

    フィールドのプロパティ。

    ResourceProperties

    パラメータ名

    パラメータタイプ

    説明

    columnType

    String

    フィールドのデータ型。

    columnIsPartition

    String

    フィールドがパーティションフィールドかどうかを示します。

    columnIsPk

    String

    フィールドがプライマリキーかどうかを指定します。

    ApplyObject

    パラメータ名

    パラメータタイプ

    説明

    objectName

    String

    アプリケーションに関連するオブジェクトの名前。

    codeContent

    String

    アプリケーションに関連付けられているコードの内容。

    name

    String

    ビジネスアクティビティの英語名。

    bizObjectType

    String

    ビジネスオブジェクトのタイプ。

    bizObjectChangeType

    String

    ビジネスオブジェクトの変更タイプ。

    bizObjectPkField

    String

    ビジネスオブジェクトのプライマリキーフィールド。

    bizObjectParent

    String

    ビジネスオブジェクトが属する親オブジェクト。

    bizObjectChildren

    String

    ビジネスオブジェクトに関連する下流の子オブジェクト。

    bizProcessCn

    String

    ビジネスアクティビティの中国語名。

    bizProcessType

    String

    ビジネスアクティビティのタイプ。

    bizProcessChangeType

    String

    ビジネスプロセスの変更タイプ。

    bizProcessNodes

    String

    ビジネスプロセスフロー内のノード。

    atomicIndexCn

    String

    インデックスの中国語名。

    dataType

    String

    インデックスのデータ型。

    unit

    String

    インデックスの測定単位。

    bizProcess

    String

    ビジネスプロセスの名前。

    des

    String

    ビジネスプロセスの説明または口径。

    derivedLogic

    String

    ビジネスプロセスから派生したロジック。

    protoLogics

    String

    ビジネスプロセスの基礎となるロジック。

    戻り値パラメータ

    processInstanceId (String): サードパーティ承認インスタンスの ID。例: 6d1b2n1c.

    承認の取り消し

    説明

    送信後に申請内容が期待どおりでない場合は、承認を取り消すことができます。

    リクエストメソッド: POST

    リクエストアドレス: http(s)://{url}/dataphin/bpms/processinstance/revoke

    クエリパラメータ

    パラメータ名

    パラメータタイプ

    説明

    accessToken

    String

    サーバーサイド API を呼び出すために使用される資格情報。

    Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.

    timestamp

    String

    情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.

    ボディパラメータ

    パラメータ名

    パラメータタイプ

    説明

    applyId

    String

    Dataphin 承認オーダー ID。例: 1223.

    processInstanceId

    String

    サードパーティ承認インスタンスの ID。例: 6d1b2a3c.

    operatingUserId

    String

    オペレーター ID。例: 6d1bx1d2.

    戻り値パラメータ

    result (String): 取り消しの結果を示す情報。戻り値が「success」の場合、操作は成功したとみなされます。

  3. 承認インスタンス URL のクエリ

    リクエストメソッド: GET

    リクエスト URL: http(s)://{url}/dataphin/bpms/processinstance/apply.

    クエリパラメータ

    パラメータ名

    パラメータタイプ

    説明

    accessToken

    String

    サーバーサイド API を呼び出すために使用される資格情報。

    Dataphin ページで自動的に生成されるか、ユーザーが手動で生成して Dataphin に入力します。例: 6d1b2n1c.

    timestamp

    String

    情報が送信された時刻 (ミリ秒単位)。例: 1654156836531.

コールバックインターフェース

重要
  • コールバック URL (https://{callbackUrl}) は、[その他] セクション内の 承認設定 で構成されます。

  • accessToken: サーバーサイド API を呼び出すための資格情報。Dataphin ページによって自動的に生成されるか、ユーザーが生成して Dataphin に入力します。

  • callBackAesKey: コールバック認証資格情報。Dataphin ページによって自動的に生成されるか、ユーザーが生成して Dataphin に入力します。

  • コールバックメソッド

    リクエストメソッド: POST を使用します。

    リクエスト URL: http://{callbackUrl}.

    クエリパラメータ

    パラメータ名

    パラメータタイプ

    説明

    signature

    String

    署名はメッセージ認証コードです。暗号化および復号化の方法については、関連ドキュメントを参照してください。

    timestamp

    String

    タイムスタンプは、情報が送信された時刻 (ミリ秒単位) を表します。例: 1654156836531.

    nonce

    String

    nonce は、一度だけ使用される乱数です。暗号化および復号化の方法については、対応するドキュメントを参照してください。

    リクエストボディパラメータ

    encrypt (String): 暗号化された情報。例: ajls384k.

    戻り値パラメータ

    encrypt (String): コールバックステータスを表す暗号化された情報。例: ajls384k.

  • コールバック暗号化コンテンツ

    コールバック接続検証

    • 暗号化パラメータを入力します。

      applyStatus (String): このパラメータは、接続を確認するために使用されます。たとえば、「CHECK」を使用して接続パラメータを確認します。

    • 暗号化パラメータを返します。

      success: コールバックの戻り値が成功しました。

    コールバック戻り値 bpms インスタンス承認結果

    • 入力暗号化パラメータ:

      パラメータ名

      パラメータタイプ

      説明

      applyId

      String

      Dataphin 承認オーダー ID。例: 1223.

      processInstanceId

      String

      サードパーティ承認インスタンスの ID。例: 6d1b2a3c.

      comment

      String

      承認インスタンスのコメントに関する情報。

      applyStatus

      String

      • accept: 承認する。

      • reject: 申請の却下。

      • revoke: 申請の取り消し。

    • 暗号化パラメータを返します。

      success: コールバックの戻り値が成功しました。

  • 暗号化および復号化の方法

    暗号化の例:

    Map<String, String> callBackJson = Maps.newHashMap();
    callBackJson.put("applyId", "1");
    callBackJson.put("applyStatus", "accept");
    callBackJson.put("processInstanceId", "2");
    callBackJson.put("comment", "test");
    String callBackResult = JSON.toJSONString(callBackJson);
    
    ThirdPartyCrypto callbackCrypto = new ThirdPartyCrypto(token, aesKey);
    
    String timestamp = String.valueOf(System.currentTimeMillis());
    String nonce = ThirdPartyCrypto.Utils.getRandomStr(16);
    String encrypt = callbackCrypto.encrypt(nonce, callBackResult);
    String signature = callbackCrypto.getSignature(token, timestamp,nonce, encrypt);

    復号の例:

    String encryptMsg = JSONObject.parseObject(encrypt);
    String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, encryptMsg);
    if ("success".equalsIgnoreCase(decryptMsg)) {
     log.error("call back success");
    }

    暗号化および復号化ツール

    import com.alibaba.fastjson.JSON;
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.io.ByteArrayOutputStream;
    import java.lang.reflect.Field;
    import java.nio.charset.Charset;
    import java.nio.charset.StandardCharsets;
    import java.security.MessageDigest;
    import java.security.Permission;
    import java.security.PermissionCollection;
    import java.security.Security;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    /**
     * Dataphin オープン プラットフォームの暗号化および復号化の方法
     */
    public class ThirdPartyCrypto {
    
     private static final Charset CHARSET = StandardCharsets.UTF_8;
     private static final Base64 BASE_64 = new Base64();
     private final byte[] AES_KEY;
     private final String TOKEN;
    
     /**
     * ask getPaddingBytes key 固定長
     **/
     private static final Integer AES_ENCODE_KEY_LENGTH = 43;
     /**
     * 暗号化ランダム文字列バイト長
     **/
     private static final Integer RANDOM_LENGTH = 16;
    
     /**
     * コンストラクタ
     *
     * @param token 開発者が設定したトークン
     * @param encodingAesKey 開発者が設定した EncodingAESKey
     *
     * @throws ThirdPartyEncryptException 実行に失敗しました。この例外のエラーコードと具体的なエラーメッセージを確認してください
     */
     public ThirdPartyCrypto(String token, String encodingAesKey) throws ThirdPartyEncryptException {
     if (null == encodingAesKey || encodingAesKey.length() != AES_ENCODE_KEY_LENGTH) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.AES_KEY_ILLEGAL);
     }
     this.TOKEN = token;
     AES_KEY = Base64.decodeBase64(encodingAesKey + "=");
     }
    
     public Map<String, String> getEncryptedMap(String plaintext) throws ThirdPartyEncryptException {
     return getEncryptedMap(plaintext, System.currentTimeMillis(), Utils.getRandomStr(16));
     }
    
     /**
     * Dataphin と同期されるメッセージ本文を暗号化し、暗号化された Map を返します
     *
     * @param plaintext 送信されるメッセージ本文のプレーンテキスト
     * @param timeStamp タイムスタンプ
     * @param nonce ランダム文字列
     * @return
     * @throws ThirdPartyEncryptException
     */
     public Map<String, String> getEncryptedMap(String plaintext, Long timeStamp, String nonce)
     throws ThirdPartyEncryptException {
     if (null == plaintext) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.ENCRYPTION_PLAINTEXT_ILLEGAL);
     }
     if (null == timeStamp) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.ENCRYPTION_TIMESTAMP_ILLEGAL);
     }
     if (null == nonce) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.ENCRYPTION_NONCE_ILLEGAL);
     }
     // 暗号化
     String encrypt = encrypt(Utils.getRandomStr(RANDOM_LENGTH), plaintext);
     String signature = getSignature(TOKEN, String.valueOf(timeStamp), nonce, encrypt);
     Map<String, String> resultMap = new HashMap<String, String>();
     resultMap.put("msg_signature", signature);
     resultMap.put("encrypt", encrypt);
     resultMap.put("timeStamp", String.valueOf(timeStamp));
     resultMap.put("nonce", nonce);
     return resultMap;
     }
    
     /**
     * 暗号文を復号化します
     *
     * @param msgSignature 署名文字列
     * @param timeStamp タイムスタンプ
     * @param nonce ランダム文字列
     * @param encryptMsg 暗号文
     * @return 復号化された元のテキスト
     * @throws ThirdPartyEncryptException
     */
     public String getDecryptMsg(String msgSignature, String timeStamp, String nonce, String encryptMsg)
     throws ThirdPartyEncryptException {
     // 署名を検証します
     String signature = getSignature(TOKEN, timeStamp, nonce, encryptMsg);
     if (!signature.equals(msgSignature)) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_SIGNATURE_ERROR);
     }
     // 復号化
     return decrypt(encryptMsg);
     }
    
     /**
     * プレーンテキストを暗号化します
     * @param plaintext 暗号化するプレーンテキスト
     * @return 暗号化された base64 エンコード文字列
     */
     public String encrypt(String random, String plaintext) throws ThirdPartyEncryptException {
     try {
     byte[] randomBytes = random.getBytes(CHARSET);
     byte[] plainTextBytes = plaintext.getBytes(CHARSET);
     byte[] lengthByte = Utils.int2Bytes(plainTextBytes.length);
     ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
     byteStream.write(randomBytes);
     byteStream.write(lengthByte);
     byteStream.write(plainTextBytes);
     byte[] padBytes = PKCS7Padding.getPaddingBytes(byteStream.size());
     byteStream.write(padBytes);
     byte[] unencrypted = byteStream.toByteArray();
     byteStream.close();
     Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
     SecretKeySpec keySpec = new SecretKeySpec(AES_KEY, "AES");
     IvParameterSpec iv = new IvParameterSpec(AES_KEY, 0, 16);
     cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
     byte[] encrypted = cipher.doFinal(unencrypted);
     String result = BASE_64.encodeToString(encrypted);
     return result;
     } catch (Exception e) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_ENCRYPT_TEXT_ERROR);
     }
     }
    
     /**
     * 暗号文を復号化します
     * @param text 復号化する暗号文
     * @return 復号化されたプレーンテキスト
     */
     private String decrypt(String text) throws ThirdPartyEncryptException {
     byte[] originalArr;
     try {
     // 復号化モードを AES CBC モードに設定します
     Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
     SecretKeySpec keySpec = new SecretKeySpec(AES_KEY, "AES");
     IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(AES_KEY, 0, 16));
     cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
     // BASE64 を使用して暗号文をデコードします
     byte[] encrypted = Base64.decodeBase64(text);
     // 復号化
     originalArr = cipher.doFinal(encrypted);
     } catch (Exception e) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_DECRYPT_TEXT_ERROR);
     }
    
     String plainText;
     try {
     // パディング文字を削除します
     byte[] bytes = PKCS7Padding.removePaddingBytes(originalArr);
     // 16 ビットのランダム文字列、ネットワークバイトオーダー、および corpId を分離します
     byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
     int plainTextLegth = Utils.bytes2int(networkOrder);
     plainText = new String(Arrays.copyOfRange(bytes, 20, 20 + plainTextLegth), CHARSET);
     } catch (Exception e) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_DECRYPT_TEXT_LENGTH_ERROR);
     }
    
     return plainText;
     }
    
     /**
     * デジタル署名
     *
     * @param token isv トークン
     * @param timestamp タイムスタンプ
     * @param nonce ランダム文字列
     * @param encrypt 暗号化されたテキスト
     * @return
     * @throws ThirdPartyEncryptException
     */
     public String getSignature(String token, String timestamp, String nonce, String encrypt)
     throws ThirdPartyEncryptException {
     try {
     String[] array = new String[] {token, timestamp, nonce, encrypt};
     Arrays.sort(array);
     System.out.println(JSON.toJSONString(array));
     StringBuffer sb = new StringBuffer();
     for (int i = 0; i < 4; i++) {
     sb.append(array[i]);
     }
     String str = sb.toString();
     System.out.println(str);
     MessageDigest md = MessageDigest.getInstance("SHA-1");
     md.update(str.getBytes());
     byte[] digest = md.digest();
    
     StringBuffer hexstr = new StringBuffer();
     String shaHex = "";
     for (int i = 0; i < digest.length; i++) {
     shaHex = Integer.toHexString(digest[i] & 0xFF);
     if (shaHex.length() < 2) {
     hexstr.append(0);
     }
     hexstr.append(shaHex);
     }
     return hexstr.toString();
     } catch (Exception e) {
     throw new ThirdPartyEncryptException(ThirdPartyEncryptException.COMPUTE_SIGNATURE_ERROR);
     }
     }
    
     public static class Utils {
     public Utils() {
     }
    
     public static String getRandomStr(int count) {
     String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
     Random random = new Random();
     StringBuffer sb = new StringBuffer();
    
     for (int i = 0; i < count; ++i) {
     int number = random.nextInt(base.length());
     sb.append(base.charAt(number));
     }
    
     return sb.toString();
     }
    
     public static byte[] int2Bytes(int count) {
     byte[] byteArr = new byte[] {(byte)(count >> 24 & 255), (byte)(count >> 16 & 255), (byte)(count >> 8 & 255),
     (byte)(count & 255)};
     return byteArr;
     }
    
     public static int bytes2int(byte[] byteArr) {
     int count = 0;
    
     for (int i = 0; i < 4; ++i) {
     count <<= 8;
     count |= byteArr[i] & 255;
     }
    
     return count;
     }
     }
    
     public static class PKCS7Padding {
     private static final Charset CHARSET = StandardCharsets.UTF_8;
     private static final int BLOCK_SIZE = 32;
    
     public PKCS7Padding() {
     }
    
     public static byte[] getPaddingBytes(int count) {
     int amountToPad = 32 - count % 32;
     if (amountToPad == 0) {
     amountToPad = 32;
     }
    
     char padChr = chr(amountToPad);
     String tmp = new String();
    
     for (int index = 0; index < amountToPad; ++index) {
     tmp = tmp + padChr;
     }
    
     return tmp.getBytes(CHARSET);
     }
    
     public static byte[] removePaddingBytes(byte[] decrypted) {
     int pad = decrypted[decrypted.length - 1];
     if (pad < 1 || pad > 32) {
     pad = 0;
     }
    
     return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
     }
    
     private static char chr(int a) {
     byte target = (byte)(a & 255);
     return (char)target;
     }
     }
    
     public static class ThirdPartyEncryptException extends Exception {
     public static final int SUCCESS = 0;
     public static final int ENCRYPTION_PLAINTEXT_ILLEGAL = 900001;
     public static final int ENCRYPTION_TIMESTAMP_ILLEGAL = 900002;
     public static final int ENCRYPTION_NONCE_ILLEGAL = 900003;
     public static final int AES_KEY_ILLEGAL = 900004;
     public static final int SIGNATURE_NOT_MATCH = 900005;
     public static final int COMPUTE_SIGNATURE_ERROR = 900006;
     public static final int COMPUTE_ENCRYPT_TEXT_ERROR = 900007;
     public static final int COMPUTE_DECRYPT_TEXT_ERROR = 900008;
     public static final int COMPUTE_DECRYPT_TEXT_LENGTH_ERROR = 900009;
     public static final int COMPUTE_DECRYPT_TEXT_CORPID_ERROR = 900010;
     private static Map<Integer, String> msgMap = new HashMap();
     private Integer code;
    
     static {
     msgMap.put(0, "成功");
     msgMap.put(900001, "暗号化プレーンテキストが不正です");
     msgMap.put(900002, "暗号化タイムスタンプパラメータが不正です");
     msgMap.put(900003, "暗号化ランダム文字列パラメータが不正です");
     msgMap.put(900005, "署名が一致しません");
     msgMap.put(900006, "署名の計算に失敗しました");
     msgMap.put(900004, "不正な AES キー");
     msgMap.put(900007, "暗号化テキストの計算エラー");
     msgMap.put(900008, "復号化テキストの計算エラー");
     msgMap.put(900009, "復号化テキストの長さが一致しません");
     msgMap.put(900010, "復号化テキストの corpId が一致しません");
     }
    
     public Integer getCode() {
     return this.code;
     }
    
     public ThirdPartyEncryptException(Integer exceptionCode) {
     super((String)msgMap.get(exceptionCode));
     this.code = exceptionCode;
     }
     }
     static {
     try {
     Security.setProperty("crypto.policy", "limited");
     RemoveCryptographyRestrictions();
     } catch (Exception var1) {
     }
    
     }
     private static void RemoveCryptographyRestrictions() throws Exception {
     Class<?> jceSecurity = getClazz("javax.crypto.JceSecurity");
     Class<?> cryptoPermissions = getClazz("javax.crypto.CryptoPermissions");
     Class<?> cryptoAllPermission = getClazz("javax.crypto.CryptoAllPermission");
     if (jceSecurity != null) {
     setFinalStaticValue(jceSecurity, "isRestricted", false);
     PermissionCollection defaultPolicy = (PermissionCollection)getFieldValue(jceSecurity, "defaultPolicy", (Object)null, PermissionCollection.class);
     if (cryptoPermissions != null) {
     Map<?, ?> map = (Map)getFieldValue(cryptoPermissions, "perms", defaultPolicy, Map.class);
     map.clear();
     }
    
     if (cryptoAllPermission != null) {
     Permission permission = (Permission)getFieldValue(cryptoAllPermission, "INSTANCE", (Object)null, Permission.class);
     defaultPolicy.add(permission);
     }
     }
    
     }
     private static Class<?> getClazz(String className) {
     Class clazz = null;
    
     try {
     clazz = Class.forName(className);
     } catch (Exception var3) {
     }
    
     return clazz;
     }
     private static void setFinalStaticValue(Class<?> srcClazz, String fieldName, Object newValue) throws Exception {
     Field field = srcClazz.getDeclaredField(fieldName);
     field.setAccessible(true);
     Field modifiersField = Field.class.getDeclaredField("modifiers");
     modifiersField.setAccessible(true);
     modifiersField.setInt(field, field.getModifiers() & -17);
     field.set((Object)null, newValue);
     }
     private static <T> T getFieldValue(Class<?> srcClazz, String fieldName, Object owner, Class<T> dstClazz) throws Exception {
     Field field = srcClazz.getDeclaredField(fieldName);
     field.setAccessible(true);
     return dstClazz.cast(field.get(owner));
     }
    
    }