文件說明


#

業務約定

三方應用程式接入,只能使用阿里提供的帳號體系進行登入和授權,無法提供獨立帳號註冊功能。

 

通訊約定

#支付服務端支援兩種通訊模式,即http(https)模式與TOP模式。

 

Https通訊方式:適合支付成功後的數娛服務端回呼 使用https通訊方式採用RSA公私鑰加解密。此方式cp需要先在數娛TV開放平台 (http://open.aliplay.com/)填寫開發者的RSA公鑰資訊。數娛使用CP填寫的公鑰加簽,CP 的服務端接到回呼後,使用私鑰進行解簽;回呼的原始內容為json格式,具體欄位定義參照網路支付介面-服務端支付成功後回調通知章節。根據原始內容json字串以及RSA公鑰加密後的內容encryptedData會在http參數的data欄位中供CP利用RSA私鑰解密後使用

 

TOP通訊方式:適合CP主動調用支付服務的場景(如查詢訂單狀態等) 透過TOP通訊方式,該方式CP需使用數娛TV開放平台(http://open.aliplay.com/)入住時頒發的appkey和appsecret(該信息可以在阿里TV開放平台應用程式管理頁面中查看), TOP介面的呼叫請參考//open.taobao.com/doc2/detail.htm? spm=a219a.7629140.0.0.jlQptD&treeId=49&articleId=101617&docType=117&docType=117&docType=

## 

安全規範為了防止雙方約定的介面(服務端)被濫用帶來的不必要的安全風險,接入的合作方需要符合以下要求做好安全控制。如有疑問,可加入旺旺群621730614 諮詢。

 

1. 介面安全規格

#1)介面以HTTP方式開放。

2)設計介面需要有認證,對來源授權,只允許授權的IP存取.

#3)所有的介面呼叫都需要有日誌記錄金鑰的傳遞及保存雙方約定的密鑰,不應大規模郵件傳遞,應以開發人員人對人傳遞。密鑰需要妥善保存,避免洩漏密鑰所造成的安全隱患。

 

2 密鑰及appsecret的傳遞及保存

接入合作方所持有的敏感訊息,不應大範圍郵件傳遞,應以開發人員人對人傳遞。私鑰和appsecret需要妥善保存,避免洩漏私鑰造成的安全隱患。

 

 

    #技術範例

     

    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簽章(sign)演算法範例

     

    Java參考程式碼

    ## 

    /**

        * RSA簽章演算法

        *

    @param privateKey

        *

    @param  ##@param charset

        * @return

        * @throws 呈現

    #    */   

    public

    static

    String sign(String privateKey, String content, String charset) throws Exception {      PKCS8EncodedKeySpec priPKCS8      PKCS 8EncodedKeySpec priPKCS8       PKCS1EncodedKeySpec ( Base64.decodeBase64(privateKey) );

          KeyFactory keyf = KeyFactory.getInstance("RSA");# generatePrivate(priPKCS8);       

          java.security.Signature signature = 制裁.security.Sign .initSign(priKey);      signature.update(content.getBytes(charset) );

          

    byte

    [] signed = signatureature.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. 服務端notify解密demo(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.InvalidKeySpecException;

    #。 java.security.spec.PKCS8EncodedKeySpec;

    import javax.crypto.Cipher;

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

    /**

     *

    ### * @author zhiyong.xiongzy###### *###### */######public class testRSA {###

          私人靜態字串prikey          =「MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMhDP5oVLHPJpM0QDPpA1FpFFpDFpFpMpM 6UOzgK2qEReHUCzda5H j Gar8dmYz3v4UMozNeXhx7iqI7EK4Myp/qjCV2ROgh2LaL1ycugacTVx6dSfFvIOcczyhs8D4BUiJlSMsTWPVCSKsPAx6dSfFvIOcczyhs8D4BUiJlSMsTWPVCSKsPAx6dSfFvIOcczyhs8D4BUiJlSMsTWPVCSKsPAx6dSfFvIOcczyhs8D4BUiJlSMsTWPVCSKsPAx6dSfFvIOcczy ZnqEdGNFap91Ycfz 2BF7mQ3sHQFMpn2nJDtzj0tPsCKtNLHmpOi0ctAxedhzip rOT6obNK POL6czMWGJOaW8zLefxftgZWkT eZactn507xcYwNsO50QQwN5454QDFFiiF5FmFiiwN4545QQwFFiiF55F4Qw&BFiiFFywFFiiF 2zQ 8JrlqE H/7AqqMIxkPjIMC/vJLpkZG4TYMCYXjd4rx7AkEAzoiLGwUsXDApbDJJxxgYV6y50H/oJm6ooIOHoCwrluJhlOD81oUQCCA54QicpezAwpApAp4A4Fii4QiFpTpApAp4A4QTpApTpApApApApApApApAp告訴ApemA4QAFiiFpApApApA4A4AFiidppAp記得ApemApAii告訴他手草QSZ0zw/m5 40eNxc1s5FkRhBoVdQa2w0nZ 81d 3NG3dH4JtQs Lp/WIXAqJfIZXPECoCQJAW8QBgrTuu9toXFuPul1zW2lMel6KiUnD8XJAW8QBgrTuu9toXFuPul1zW2lMel6KiK ZRpWQffh QJBAJyxWEnzZA9dvqEhj6I/BTPJgvzc/boGzZ2lKQlN8j57MDkZHryoWtoKjB3Hp5dvTasweI6WHtIm313TSLuoXrg="jB3Hp5dvTasweI6WHtIm313TSLuoXrg=";

    #      公用靜態無效main(String[] args) {

                 ‧字串內容= "c/BOhNHjhvCXvOenIyNmr0FI1M3870FI1M367/BRv L9oLmArsw35jk43reMFUyemTLnZ4Xw/DXT5xxPzHy4N WLt2/K0mqA2e5PiShf8RX9EdLnoIYZPXKe3Ldnw0ha3RZtP4X2tBsHnoIYZPXKe3Ldnw0ha3RZtP4X2tBsHnoIYZPXKe3Ldnw0ha3RZtP4X2tBsHqU=";## jsonStr;

           嘗試{

    #        //解密

                 System.out. println(jsonStr);

                 //上一個簽章

             catch ( Exception e) {

                 e.printStackTrace();

           }

     #      

          /* *

           * RSA簽章演算法

           * @param privateKey

             * @return

           * @throws Exception

    #       */

          public static String sign(String privateKey, String content, String charset) throws Exception {

              (privateKey) );

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

                 PrivateKey priKey = keyf.generatePrivate(priPKCSCS8);

          java.security.Signature 簽章= java.security.Signature.getInstance ("SHA1WithRSA");

                 signature.initSign(priKey);

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

                 return Base64.encodeBase64String(signed);

          put_charset ) 拋出異常{

                 

                 ;

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

                 cipher.init(Cipher.DECRYPT_MODE, prikey);

            

                 ByteArrayOutputStream writer = new ByteArrayOutputStream ();

                //rsa解密中的位元組大小最多為128,且需要解密的內容,依128位元拆開;

                 int bufl;

                 與已 ((bufl = ins.read(buf))!    while ((bufl = ins.read(buf))!

                        byte[] block = null;

                                     block = buf;

          #                           block = new byte[bufl  for (int i = 0; i < bufl; i ) {

                            #                           }

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

              ) , input_charset);

          }

     

          public static PrivateKey getPrivateKey(String key) 拋出異常{

                 byte[] keyBytes;

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

              PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

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

                 與已回復私鑰;

    ##      }

                 PrivateKey privateKey = keyFactory.generatePrivate(keySpec);


     

    #> demo(php版)

    #$privkey=<<

    #---開始私鑰-----

    MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAN/dCMqrU4GCvJ1s

    QwPxvCnYSsXsm0 wdIzPBajdRiI9rvv g90uWT6bNp5Qf4K3qJWfY6FmWoNDKYyIYjDacAVheAC/Idg/0nKgTUKH

    sowx8iXHnKBB3o7B7XGoKCjFKc2PAg#AECgYEAYEA

    #Xgshiqom3uRslw0eowu5Mwv38aCYOO9t5RBVYOrcUh3HcNK6vgz6SAhQylK/MKk8

    hynSBnawh5/XZUUI7Zqw5NFoLIHgdKx

    hynSBnawh5/XZUUI7Zqw5NFoLIHgdKx

    hyn56H0 AzxAzd M DECQQD4eVHsYzkkmMFaPnJPWcGuLpl7hz1Fte5n83SiZhY/

    6WJsC0FpKiCmpxrGhl2yM3gp0kS4b7/uuulIEQ S35S 3qgxH4X989coyHV6EMNUXd5hO1vz3RnIVRvrx

    sYsuGwJAcV9x2OlBNoiYmKOrprcun1pV375KX9duS3ITQtJPzqOfq rK0sBNG51d

    oz3F3LyNVI/DmWAr9DLGpIJa97I5JQJBALc2/M l3Df7VENv6 MPmckyEjq8tObgog234kXGSf0kytzHpnczpRY8wJqe0CQCNv7Th8

    jnlWQ21UVBL1Lr3KcMM/0RJ0hiVGH46Gp9Agh9c6Gp9 NNc=

    -----END 私鑰-----

    EOT;

    $res = openssl_get_privatekey($privkey);

    //$content = "ycoYI7SXtj9GWHHNS27jeF18x7B0JVFxyb0 X /k4fjHpe7Jvwk7TGdT5VF NWjBKpPVfyv5NRUYMNrHsHSeQgd4AWO6y3e5HWGmhCa92YdAzriS​​​​mwwkuU2fAud4zJQtu1lKQP iM5sc2143HlqoU2fAud4zJQtu1lKQP iM5sc211Klqn 264 W9AhjVoamYhy2X0XoAK6KtcQk7frk9ASqgf8iob0kteFp9HN/86 QFLUiH7BQm Dh3tkDTBzIm4huCN4 bi71FLYLXLUYVWxcSC24S16Z11ic71dFxFp Rf88g==";

    $content = $_POST['data'];

    #$content = base64_decode ($content);

    ##$i = 0;

    $結果= "";

    ##while

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

          $i = 128;

          openssl_private_decrypt $newsource

    ##}

     

    $result = json_decode($result,

    true

    );var_dump($result);

     

     

    SDK存取方法

     1 在eclipse中匯入demo,可以看到2個工程:

    1)AlitvSDKLib包含了SDK可用的lib和res

    2) AlitvSDKDemo引用上述Lib工程## 

    2

    按照以下截圖配置,把SDK引入您的工程

    1.jpg1)在項目屬性中配置

            2.jpg


    #  

    2) 在Java Build Path中設定

    3.jpg

    #3)設定manifest可合併

              在您的工程根目錄中的project.properties加入一行程式碼: manifestmerger.enabled=true

    true

    #true

     ######