문서 설명


Business Agreement

3자 애플리케이션 액세스는 Alibaba에서 제공하는 계정 시스템을 통해서만 로그인할 수 있습니다. in 및 Authorization은 독립적인 계정 등록 기능을 제공할 수 없습니다.

통신 계약

결제 서버는 두 가지 통신 모드를 지원합니다. 즉 http(https) 모드와 TOP 모드입니다.

Https 통신 방식: 결제 성공 후 디지털 엔터테인먼트 서버 콜백에 적합하며, RSA 공개 및 개인 키 암호화 및 복호화를 사용합니다. 이 CP 방식에서는 먼저 Digital Entertainment TV Open Platform(http://open.aliplay.com/)에 개발자의 RSA 공개키 정보를 입력해야 합니다. Digital Entertainment는 CP가 입력한 공개 키를 사용하여 서명합니다. CP의 서버는 콜백을 수신한 후 개인 키를 사용하여 서명을 해독합니다. 콜백의 원본 내용은 json 형식이며 특정 필드 정의는 #🎜을 참조합니다. 🎜#네트워크 결제 인터페이스 - 서버 콜백 알림 결제 성공 후 장. 원본 콘텐츠 json 문자열과 RSA 공개 키를 기반으로 한 암호화된 데이터는 CP가 RSA 개인 키

#🎜🎜를 사용하여 해독하기 위해 http 매개변수의 데이터 필드에 사용됩니다. #TOP 통신 방식 : CP가 결제 서비스(주문 상태 확인 등)를 적극적으로 호출하는 시나리오에 적합합니다. TOP 통신 방식을 통해 이 방식에서는 CP가 Digital Entertainment TV Open Platform(http: //open.aliplay.com/) 체크인 시. appsecret(이 정보는 Alibaba TV 오픈 플랫폼 애플리케이션 관리 페이지에서 확인할 수 있습니다.) TOP 인터페이스 호출은 //open.taobao.com/을 참조하세요. doc2/detail.htm? spm=a219a.7629140.0.0.jlQptD&treeId=49&articleId=101617&docType =1

안전 사양#🎜🎜 #양 당사자가 합의한 인터페이스(서버)의 남용으로 인한 불필요한 보안 위험을 방지하기 위해 액세스 파트너는 다음 요구 사항을 충족하고 보안 제어를 구현해야 합니다. 궁금하신 사항은 왕왕그룹 621730614에 가입하셔서 상담받으시면 됩니다.

1. 인터페이스 보안 사양

1) 인터페이스가 HTTP 모드로 열려 있습니다.

2) 디자인 인터페이스에는 신원 인증, 소스 승인이 필요하며 승인된 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

                                                                                     

    *

    @throws

    예외*/

    public

    static

    문자열 기호(String privateKey, String content, String charset) throws 예외 {

    PKCS8EncodedKeySpec priPKCS8 =

    new

    PKCS8EncodedKeySpec ( Base64. decodeBase64 (privateKey) ); KeyFactory keyf = KeyFactory.getInstance("RSA");

    PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature 서명 = java.security. getInstance("SHA1WithRSA");

    Signature.initSign(priKey); Signature.update(content.getBytes(charset) );

    byte

    [] signed = Signature.sign();

                         " rsa_private_key.pem"); //PKCS8로 변환할 필요가 없습니다$res = openssl_get_privatekey($privkey);

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

    $sign = base64_encode($sign);

    3. ) age ack ack ack ack ack ack ack ack ack ack java.io .BytearRayInputStream; import java.io.bytearRayoutputStream;

    import java.io.inputstream;

    import java.io.unsupportedencodection;

    import java. security.InvalidKeyException;

    import java.security.NoSuchAlgorithmException;

    import java.security.PrivateKey;

    import java.security.SignatureException;

    import java.security.spec.InvalidKeySpecException;

    $privkey = file_get_contents("rsa_private_key.pem"); //无需转PKCS8

    $res = openssl_get_privatekey($privkey);

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

    $sign = base64_encode($sign);import java.security.spec. PKCS8EncodedKeySpec;

    import javax.crypto.Cipher;

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

    /**

    *

    * @author zhiyong.xiongzy

    *

    */

    공개 클래스 테스트RSA {

          비공개 정적 문자열 prikey          = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMhDP5oVLHPJpM0QDuAGPupAkF4N3bMOD252BIYncKd8ppYJP0sA1wxnJxrVJ N6UOzgK2qEReHUCzda5Hj+GaR8dmYz3v4UMozNeXhx7iqI7EK4Myp/qjCV2ROgh2LaL1ycugacTVx6dSfFvIOcczyhs8D4BUiJlSMsTWPVCSKsPAgMBAAECgYEAkL5KUgvLvUSZIL3ignkBMD7KGbDb9HbNIIGcc3 o+KlAl93tni8ZnqEdGNFap91YcFz2BF7mQ3sHQFMpn2nJDtzj0tPsCKtNLHmpOi0ctAxedhzip+rOT6obNK+POL6czMWGJOaW8zLefxftgZWkT+eZactn507xc+GiwNsodAMECQQD4OjjnMhQWaSv8 kHI27pH92PTv4zFb1msB0H65Im2zQ+8JrlqEH/7AqqMIxkPjIMC/vJLpkZG4TYMCYXjd4rx7A kEAzoiLGwUsXDApbDJJxxgYV6y50H/oJm6ooIOHoCwrluJhlOD81oUQyrLGfgNL95v4avvuQez Z4kmkeWDPvQ35fQJACBM8zqieZqw9NhYs4QSZ0zw/m540eNxc1s5FkRhBoVdQa2w0nZ+81d+3Ng3dH4JtQs+Lp/WIXAqJfIZXPECoCQJAW8QBgrTuu9tOXFuPul1zW2lMel6KiKD8 Xa1zUnCtwXG+h8bbsHkZN+btGmpgM5libC6Z80LIoKm14ZRpWQffhQJBAJyxWEnzZA9dvqEhj6I/BTPJgvzc/ boGzZ2lKQlN8j57MDkZHryoWtoKjB3Hp5dvTasweI6WHtIm313TSLuoXrg=";

          public static void main(String[] args) {

                문자열 내용 = "c/BOhNHjhvCXvOenIyNqmr0FI1M3cYt/BR/WEoMgoi37ZFvKe418xOlRU4AN/QyvY2H7g2osL9oLmArsw35jk43reMFUyemTLnZ4Xw/DXT5xxPzHy4NWLt2/K0mqA2e5PiShf8R X9EdLnoIYZPXKe3Ldnw0ha3RZtP4X2tBsHqU=" ;

                 String jsonStr;

           시도해 보세요 {

           //解密

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

                 System.out.println(jsonStr);

                //sign签name

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

           } catch (예외 e) {

                e.printStackTrace();

    }

                 

          }

          

          /**

    * RSA 서명 알고리즘

    * @param privateKey

    * @param charset#🎜 🎜#

    * @return#🎜🎜 #

    * @ 예외 발생

    */# 🎜🎜#

          공개 정적 문자열 기호(문자열 privateKey, 문자열 콘텐츠, 문자열 문자 집합)는 예외 {

               PKCS8EncodedKeySpec priPKCS8   = new PKCS8EncodedKeySpec( Base64.decodeBase64(privateKey) actor 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 = Signature.sign();

                return Base64.encodeBase64String(signed);

          }

     

          decrypt(문자열 내용, 문자열 private_key, 문자열 input_charset ) 예외 발생 {

                

                

                 PrivateKey prikey = getPrivateKey(private_key);

                 Cipher cipher = Cipher.get Instance("RSA");

                 cipher.init(Cipher.DECRYPT_MODE, prikey);

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

                 ByteArrayOutputStreamwriter = new ByteArrayOutputStream();

                //rsa解密的字节大小最多是128,将需要解密的内容,按128位拆开|ㅋㅋㅋ > i < i++) {

                                  block[i] = buf[i];

                                }

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

                }

                 새 문자열 반환(작성자 .toByteArray(), input_charset);

          }

     

          public static PrivateKey getPrivateKey(String key)에서 예외 발생 {

                byte[] keyBytes;

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

    //사용PKCS8  

                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

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

                 privateKey 반환;

          }

     

    }

                PrivateKey privateKey = keyFactory.generatePrivate(keySpec);


     

     

    4. 服务端notify解密demo(php版)


    <?php

    $privkey=<< ;<EOT

    -----개인 키 시작-----

    MIICdwiBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAN/dCMqrU4GCvJ1s

    QwPxvCnYSsXsm0+wdIzPBajdRiI9 rvgtx RDq10yHGwXs+RNOGxaglj0F+9kRQ7l5

    BEkN/HgPg90uWT6bNp5Qf4K3qJ WfY6FmWoNDKYyIYjDacAVheAC/Idg/0nKgTUKH

    sowx8iXHnKBB3o7B7XGoKCjF Kc2PAg MBAAECgYEAjiVAqYdVyav5HZABmQ46oMGm

    XGSHIQOM3URSLW0EOWUUUUUUUUUB38ACYOOO9T5RBVYORCUH3HCNK6VGZ6SAHQKILK/MKK8

    HYNSBNAWH5/XZUUI7ZQW5N PCZED5NFXCJED 5N+QUICPVXBI9/+ qd4evhsyzkkmmfnjpwcgulpl7hz1fte5n83s izhy/

    6wjsc0fpkicmpxrghl22ym3gp0ks4b7/uuulieqypoawawea5qtihzl/+gjotxwu

    kohochugolegxcucusolgx35S35S35S35S35S35S35S35S 6EMNUXD5 HO1VZ3RNIVRVRX

    SYSUGWJACV9X2OLBNOIYMKORPRCUN1PV375KX9DUS3ITQTJPZQOFQ+RK0SBNG51DAZ3F3F3LYNVI/DMWAR9DLGPIJA97I5JQJBALCQJBACTMCM7M 4. Kzwfx

    p/l3df7venv6mpmckyejq8tobgog234kxgsf0kytzhpnczpry8wjqe0cqcnv7th8

    jnlWQ21UVBL1Lr3KcMM/0RJ0hiVGH46Gp93h9c2zs AgHQ01HLi1BeRcM1tZZNPIh

    GqEuuIa /iXjzNNc=

    ------END 개인 키------

    EOT;

    $res = openssl_ get_privatekey($privkey);

    //$content = "ycoYI7SXtj9GGHHNS27jeF18x7B0JVFxyb0+ X/k4fjH pe7Jvwk7TGdT5VF+NWjBKpPVfyv5NRUYMNrHsHSeQgd4AWO6y3e5HWGmhCa92YdAzriSqoU2fAud4zJQtu1lKQP+iM5sC21GhSHlhm +2q443kKjuUX2Fl6wv4 + 2KHbz + knQW9AhjVoamYhy2 6Z11ihm771dFa+4w2taeAlhOEZHcE1w8uBXZPMlxlkT66OhvQXZRf88g==";

    $content = $_POST['data'];

    $content = base64_decode($content);

    $i = 0 ;

    $result = "";

    while

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

          $i += 128;      openssl_private_decrypt($head,$newsource,$ res ).按Photo以下截图配置, 把SDK引入您의工程

    1)  지금 项目属性中配置

    2.jpg


    j

    Java 빌드 경로에서

    3.jpg

    3 구성) 엔지니어링 루트 디렉터리에

    Project.properties를 결합하도록 Manifest를 구성하면 다음 코드 줄이 추가됩니다. ManifestMergerger .enabled=

    사실