ドキュメントの説明


ビジネス契約

サードパーティ アプリケーション アクセスでは、ログインと認証、および独立したアカウント登録機能のために Alibaba が提供するアカウント システムのみを使用できます。ご提供できません。

通信規約

決済サーバーは、http (https) モードと TOP モードという 2 つの通信モードをサポートしています。

HTTPS 通信方式: 支払いが成功した後のデジタル エンターテイメント サーバーのコールバックに適しています。https 通信方式を使用し、RSA 公開キーと秘密キーの暗号化と復号化を使用します。この CP 方法では、まず、Digital Entertainment TV Open Platform (http://open.aliplay.com/) に開発者の RSA 公開鍵情報を入力する必要があります。 Digital Entertainment は、CP によって入力された公開キーを使用して署名します。CP のサーバーがコールバックを受信した後、秘密キーを使用して署名を復号化します。コールバックの元のコンテンツは json 形式です。特定のフィールドの定義については、# を参照してください。 ##ネットワーク支払いインターフェイス - 成功後のサーバー支払いコールバック通知 章。元のコンテンツ json 文字列と RSA 公開キーに基づくコンテンツ encryptedData は、RSA 秘密キーを使用した復号化の後、CP によって http パラメーターのデータ フィールドで使用されます。

TOP 通信メソッド: 支払サービスをアクティブに呼び出す CP シナリオ (注文状況の照会など) に適しています。 TOP 通信メソッドを介して、このメソッドでは、CP は Digital Entertainment TV Open Platform (http: //open.aliplay.com/) チェックイン時 (この情報は Alibaba TV オープン プラットフォーム アプリケーション管理ページで確認できます) TOP インターフェイスの呼び出しについては、//open.taabao.com/doc2 を参照してください。 /detail.htm? spm=a219a.7629140.0.0.jlQptD&treeId=49&articleId=101617&docType=1

セキュリティ仕様In双方が合意したインターフェース(サーバー)の悪用による不要なセキュリティリスクを防ぐため、アクセスパートナーは以下の要件を遵守し、セキュリティ管理を行う必要があります。ご質問がある場合は、Wangwang グループ 621730614 に参加してご相談ください。

1. インターフェースのセキュリティ仕様

1) インターフェースは HTTP モードでオープンします。

2) 設計インターフェイスには ID 認証が必要で、ソースを承認し、承認された IP アクセスのみを許可する必要があります。

3) すべてのインターフェイス呼び出しをログに記録して、データの転送と保存を記録する必要があります。合意されたキーは電子メールで大規模に配信されるべきではなく、開発者から開発者へと配信される必要があります。キーの漏洩によるセキュリティリスクを避けるために、キーは適切に保管する必要があります。

2 キーとアプリシークレットの送信と保管

アクセス パートナーが保持する機密情報は、電子メールで大規模に送信せず、開発者に送信する必要があります。個人的に人々に渡されました。秘密キーの漏洩によるセキュリティ リスクを回避するには、秘密キーとアプリ シークレットを適切に保管する必要があります。

    技術例

    1. RSA鍵の生成方法

    RSA は、署名に使用できる非対称アルゴリズムです。つまり、署名キー (秘密キー) と検証キー (公開キー) が異なります。秘密キーは署名に使用され、公開キーは署名に使用されます。検証。 。このアルゴリズムを使用した署名は、秘密キーは署名者だけが知っているため、データの改ざんを防ぐだけでなく、否認も防ぐことができます。 Openssl RSA キー生成ツールを使用して、RSA 公開キーと秘密キーのセットを生成できます。

    RSA 鍵生成コマンド:

    RSA 秘密鍵の生成

     openssl genrsa -out rsa_private_key.pem 1024


    RSA 公開鍵の生成

     openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

    RSA 秘密キーを PKCS8 形式に変換します
     openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

    このツールによって生成されたキー ファイルには、いくつかのコメント、キャリッジ リターン、ライン フィードが含まれており、文字列を形成するには削除する必要があります!

    2. RSA 署名 (署名) ) アルゴリズムの例

    Java リファレンス コード

    /**

    * RSA 署名アルゴリズム

    * @param privateKey

    * @param content

    * @param charset

    * @return

    * @throws 例外

    */

    public static 文字列署名(文字列 privateKey、文字列コンテンツ、文字列文字セット) throws 例外 {

    PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec ( Base64.decodeBase64(privateKey) );

    KeyFactory keyf = KeyFactory.getInstance("RSA");

    PrivateKey priKey = keyf.generatePrivate(priPKCS8);

    .initSign(priKey);

    signature.update(content.getBytes(charset) );

    byte

    [] signed = signed.sign();

    return

    Base64.encodeBase64String(signed);

    }


    PHP リファレンス コード

    $privkey = file_get_contents("rsa_private_key.pem"); //

    PKCS8 に変換する必要はありません

    $res = openssl_get_privatekey($privkey);

    openssl_sign($data, $sign, $ res);

    $sign =base64_encode ($sign);

    3.サーバー側通知復号化デモ (Java バージョン)

    package testRsa;import java.io.ByteArrayInputStream;

    import java。 io.ByteArrayOutputStream;

    import java.io.InputStream;

    import java.io.UnsupportedEncodingException;

    import java.security.InvalidKeyException;

    import java.security.KeyFactory;

    import java.security.NoSuchAlgorithmException;

    import java.security.PrivateKey;

    import java.security.SignatureException;

    import java.security.spec.InvalidKeySpecException;

    import java.security.spec.PKCS8EncodedKeySpec;

    import javax.crypto.Cipher;

    import org.apache.commons .codec.binary.Base64;

    /**

    *

    * @author zhiyong.xiongzy

    *

    */

    パブリック クラス testRSA {

    プライベート静的文字列 prikey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMhDP5oVLHPJpM0QDuAGPupAkF4N3bMOD252BIYncKd8ppYJP0sA1wxnJxrVJN6UOzgK2qERe HUCzda5Hj GaR8dmYz3v4UMozNeXhx7iqI7EK4Myp/qjCV2ROgh2LaL1ycugacTVx6dSfFvIOcczyhs8D4BUiJlSMsTWPVCSKsPAgMBAAECgYEAkL5KUgvLvUSZIL3ignkBMD7KGbDb9HbNIIGcc3o KlAl93tni8ZnqEdGNFap 91YcFz2BF7mQ3sHQFMpn2nJDtzj0tPsCKtNLHmpOi0ctAxedhzip rOT6obNK POL6czMWGJOaW8zLefxftgZWkT eZactn507xc GiwNsodAMECQQD4OjjnMhQWaSv8kHI27pH92PTv4zFb1msB0H65Im2 zQ 8JrlqEH/7AqqMIxkPjIMC/vJLpkZG4TYMCYXjd4rx7AkeAzoiLGwUsXDApbDJXXSgYV6y50H/oJm6ooIOHoCwrluJhlOD81oUQyrLGfgNL95v4avvuQezZ4kmkeWDPvQ35fQJACBM8zqieZqw9Nh Ys4QSZ0zw/m540eNxc1s5FkRhBoVdQa2w0nZ 81d 3Ng3dH4JtQs Lp/WIXAqJfIZXPECoCQJAW8QBgrTuu9tOXFuPul1zW2lMel6KiKD8Xa1zUnCtwXG h8bbsHkZN btGMpgM5libC6Z80LI oKm14ZRpWQffhQJBAJyxWEnzZA9dvqEhj6I/BTPJgvzc/boGzZ2lKQlN8j57MDkZHryoWtoKjB3Hp5dvTasweI6WHtIm313TSLuoXrg=";

    public static void main(String[] args) {

    String content = "c/BOhNHjhvCXvOenIyNqmr0FI1M3cYt/BR/WEoMgoi37ZFvKe418xOlRU4AN/QyvY2H7g2osL9oLmArsw35jk43reMFUyemTLnZ4Xw/DXT5xxPzH y4NWLt2/K0mqA2e5PiShf8RX9EdLnoIYZPXKe3Ldnw0ha3RZtP4X2tBsHqU=";

    文字列 jsonStr;

    試してみてください{

    //解密

    jsonStr = decrypt(content, prikey, "UTF-8");

    System.out.println(jsonStr);

    //sign签名

    System.out.println(sign(prikey, content, "UTF-8"));

    } catch (例外 e) {

    # e.printStackTrace();

    }

    }

    /**

    * RSA 署名アルゴリズム

    * @param privateKey

    * @param content

    * @param charset

    * @return

    * @throws 例外

    */

    public static Stringsign(String privateKey, String content, String charset) が例外をスローします {

    PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decodeBase64(privateKey) );

    KeyFactory keyf = KeyFactory .getInstance("RSA");

    PrivateKey priKey = keyf.generatePrivate(priPKCS8);

    java.security.Signature 署名 = java.security.Signature.getInstance ("SHA1WithRSA");

    signature.initSign(priKey);

    signature.update(content.getBytes(charset) );

    byte[] signed = 署名。 sign();

    return Base64.encodeBase64String(signed);

    }

    public static String decrypt(String content, String private_key, String input_charset ) 例外 {

    PrivateKey prikey = getPrivateKey(private_key);

    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.DECRYPT_MODE, prikey);

    InputStream ins = new ByteArrayInputStream(Base64.decodeBase64(content.getBytes()));

    ByteArrayOutputStream ライター = new ByteArrayOutputStream ();

    //rsa解密的文字节大小最大128,要解密的内容,按128位拆开解密

    byte[] buf = new byte[128];

    int bufl;

    while ((bufl = ins.read(buf)) != -1) {

    byte[] block = null;

    if (buf.length == bufl) {

    block = buf;

    }それ以外の場合は{

    block = new byte[bufl];

    for (int i = 0; i < bufl; i ) {

    ブロック[i] = buf[i];

    writer.write(cipher.doFinal(block));

    新しい文字列を返す(writer.toByteArray() 、input_charset);

    }

    public static PrivateKey getPrivateKey(String key) が例外をスローします {

    byte[] keyBytes;

    keyBytes = Base64.decodeBase64(key.getBytes());

    //PKCS8 を使用する

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

    KeyFactory keyFactor y = キーファクトリー。 getInstance("RSA");

    return privateKey;

    }

    }

    PrivateKey privateKey = keyFactory.generatePrivate(keySpec);


    4. サービス务端通知解密デモ(php版)


    <?php

    $privkey=<<<EOT

    -- ---プライベートキーの開始-----

    MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAN/dCMqrU4GCvJ1s

    QwPxvCnYSsXsm0 wdIzPBajdRiI9rvgtxRDq10yHGwXs RNOGxaglj0F 9kRQ7l5

    BEkN/ HgPg90uWT6bNp5Qf4K3qJWfY6FmWoNDKYyIYjDacAVheAC/Idg/0nKgTUKH

    sowx8iXHnKBB3o7B7XGoKCjFKc2PAgMBAAECgYEAjIVAqYdVyav5HZABmQ46oMGm

    Xgshiqom3uRslw0eowu5Mwv38aCYOO9t5RBVYOrcUh3HcNK6vgz6SAhQylK/MKk8

    hynSBnawh5/XZUUI7Zqw5NFoLIHgdKxcNzGhp5a6eTGOyPVXBi9/ PczeD5Enf2n

    2RSCJV2yyAzxAzdM DECQQD4eVHsYzkkmMFaPnJPWcGuLpl7hz1Fte5n83SiZhY/

    6WJsC0FpKiCmpxrGhl2yM3gp0kS4b7/uuulIEQyPOAWdAkEA5qTiHZL/ GJOtxwU

    kvvVplEmOKGHEcUSoLgxnBYS35S3qgxH4X9 89coyHV6EMNUXd5hO1vz3RnIVRx

    sYsuGwJAcV9x2OlBNoiYmKOrprcun1pV375KX9duS3ITQtJPzqOfq rK0sBNG51d

    oz3F3LyNVI/DmWAr9DLGpIJa97I5JQJBALcqTmAKM7m/6J9Gb5hi4sMYQvBKZwfX

    p/l3Df7VENv6 MPmckyEjq8tObgog234kXGSf0kytzHpnczpRY8wJqe0CQCNv7Th8

    jnlWQ21UVBL1Lr3KcMM/0RJ0hiVGH46Gp93h9c2zsAgHQ01HLi1BeRcM1tZZNPIh

    GqEuuIa/iXjzNNc=

    -----END プライベートキー-----

    EOT;

    $res = openssl_get_privatekey($privkey);

    //$content = "ycoYI7SXtj9GWHHNS27jeF18x7B0JVFxyb0 X /k4fjHpe7Jvwk7TGdT5VF NWjBKpPVfyv5NRUYMNrHsHSeQgd4AWO6y3e5HWGmhCa92YdAzriS​​qoU2fAud4zJQtu1lKQP iM5sC21GhSHlhm 2q443kKjuUX2Fl6wv4 H2onXBmbw2KHbz knQ W9AhjVoamYhy2X0XoAK6KtcQk7frk9ASqgf8iob0kteFp9HN/86 QFLUiH7BQm Dh3tkDTBzIm4huCN4 bi71FLYLXLUYVWxcSC24S16Z11ihm771dFa 4w2taeAlhOEZHcE1w8uBXZPMlxlkT66Ohv QXZRf88g==";

    $content = $_POST['data'];

    $content =base64_decode($content);

    $i = 0;

    #$result = "";

    while($head = substr($content, $i, 128)) {

    $i = 128;

    openssl_private_decrypt($head,$newsource,$res);

    $result .= $newsource;

    }

    $result = json_decode($result,

    true);

    var_dump($result);

    SDK 接続方法

    1 Eclipse でデモを導入すると、2 つのステップが見られます:

    1.jpg

    1)AlitvSDKLib には SDK 用のライブラリとリソースが含まれています

    2)AlitvSDKDemo 参照上記の Lib 工程

    2

    以下の図の構成に従って、SDK を導入する工程

    1) 項目プロパティ内の構成

    2.jpg


    2) Java ビルド パスでの構成

    3.jpg

    3) マージされるマニフェストを構成する

    プロジェクトのルート ディレクトリにある project.properties にコード行を追加します:manifestmerger.enabled=true