Paypal Java SDK - пытается создать зашифрованную кнопку - не работает, не может найти документацию - PullRequest
1 голос
/ 13 июня 2011

Недавно я получил книгу Дэймона Уильямса "Pro Paypal E-Commerce".Это копия 2007 года, поэтому следует ожидать, что некоторые вещи, такие как код, со временем изменятся.

Я пытаюсь заставить этот код ниже работать.Я скачал файл paypal_base.jar, а также файл paypal_wpstoolkit.jar и поместил их в мою папку lib под jakarta-tomcat (где находятся все остальные мои jar-файлы).У меня проблемы с компиляцией кода.

Этот пример кода взят из книги, а также http://en.csharp -online.net / Encrypted_Website_Payments% E2% 80% 94Using_the_PayPal_Java_SDK

Я немного изменил его.

import com.paypal.sdk.profiles.EWPProfile;
import com.paypal.sdk.profiles.ProfileFactory;

import com.paypal.wpstoolkit.services.EWPServices;

import com.paypal.sdk.exceptions.PayPalException;


    public class PaypalTest {


      // path to your PKCS12 file
      public static final String PKCS12 = "./Certs/my_pkcs12.p12";

      // path to PayPal's public certificate
      public static final String PAYPAL_CERT = "./Certs/paypal_cert_pem.txt";

      // use https://www.sandbox.paypal.com if testing
      //public static final String URL = "https://www.paypal.com";
      public static final String URL = "https://sandbox.paypal.com";

      public static void main (String args[]) {

        // Check to see if the user provided a password
        if (args.length != 1) {
          System.out.println("You must provide a password.");
          System.exit(0);
        }

        // password used to encrypt your PKCS12 files
        // obtained from the command line
        String USER_PASSWORD = args[0];


        // First we will create the EWPProfile object
        try {
          com.paypal.sdk.profiles.EWPProfile ewpProfile = ProfileFactory.createEWPProfile();

          ewpProfile.setCertificateFile(PKCS12);
          ewpProfile.setPayPalCertificateFile(PAYPAL_CERT);
          ewpProfile.setPrivateKeyPassword(USER_PASSWORD);
          ewpProfile.setUrl(URL);

          String buttonParameters = "cmd=_xclick\nbusiness=buyer@hotmail.com\nitem_name=vase\nitemprice=25.00";

          // Next we will create the EWPServices object
          // and tell it which EWPProfile object to use
          EWPServices ewpServices = new EWPServices();
          ewpServices.setEWPProfile(ewpProfile);

          // Finally we are ready to call the method to perform the button encryption
          String encryptedButton = ewpServices.encryptButton(buttonParameters.getBytes());

          System.out.println(encryptedButton);
        } catch (PayPalException ppe) {
          System.out.println("An exception occurred when creating the button.");
          ppe.printStackTrace();
        }       

    }

}//class    

Ошибки, которые я получаю во время компиляции, следующие:

java:51: cannot find symbol
symbol: method setEWPProfile(com.paypal.sdk.profiles.EWPProfile)
location: class com.paypal.wpstoolkit.services.EWPServices
ewpServices.setEWPProfile(ewpProfile);


java:55: encryptButton(byte[],java.lang.String,java.lang.String.,java.lang.String.,java.lang.String) in com.paypal.wpstoolkit.services.EWPServices cannot be applied to (byte[])
ewpServices.encryptButton(buttonParameters.getBytes());

В paypal_base jar есть только NVPCallerServices.classи не EWPServices.EWPServices находится в wpstoolkit jar.

Как исправить ошибки?У меня проблемы с поиском документации по классам PayPal.

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

Обновленную документацию по Java SDK + API можно найти здесь :

https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_Java_NVP_SDK.zip

Распакуйте этот .zip и откройте docs / index.html

Здесь вы можете найти всю документацию по API.Похоже, вы пытаетесь сделать вызовы методов, которые больше не существуют.Посмотрите новые классы и посмотрите, что будет работать для вас.

1 голос
/ 23 ноября 2012

Похоже, что в новом Paypal API требуется, чтобы весь код кнопки был сгенерирован из их веб-службы, поскольку они, похоже, удалили класс EWPService из SDK.Но потом я заметил, что они все еще предоставляют клиентскую утилиту, с помощью которой вы можете вручную сгенерировать код здесь .После небольшой настройки я получил код, чтобы сделать то, что мне нужно (локально зашифровать кнопку загрузки корзины).

Если вы используете Java 5+, просто убедитесь, что вы это и это в вашем классе.Теперь код не идеален, поскольку содержит кучу устаревших методов, но для такой тривиальной задачи, как шифрование кода кнопки, он работает просто отлично.

public String getButtonEncryptionValue(String _data,
        String _privateKeyPath, String _certPath, String _payPalCertPath,
        String _keyPass) throws IOException, CertificateException,
        KeyStoreException, UnrecoverableKeyException,
        InvalidAlgorithmParameterException, NoSuchAlgorithmException,
        NoSuchProviderException, CertStoreException, CMSException {
    _data = _data.replace(',', '\n');
    CertificateFactory cf = CertificateFactory.getInstance("X509", "BC");

    // Read the Private Key
    KeyStore ks = KeyStore.getInstance("PKCS12", "BC");
    ks.load(new FileInputStream(_privateKeyPath), _keyPass.toCharArray());

    String keyAlias = null;
    Enumeration<String> aliases = ks.aliases();
    while (aliases.hasMoreElements()) {
        keyAlias = aliases.nextElement();
    }

    PrivateKey privateKey = (PrivateKey) ks.getKey(keyAlias,
            _keyPass.toCharArray());

    // Read the Certificate
    X509Certificate certificate = (X509Certificate) cf
            .generateCertificate(new FileInputStream(_certPath));

    // Read the PayPal Cert
    X509Certificate payPalCert = (X509Certificate) cf
            .generateCertificate(new FileInputStream(_payPalCertPath));

    // Create the Data
    byte[] data = _data.getBytes();

    // Sign the Data with my signing only key pair
    CMSSignedDataGenerator signedGenerator = new CMSSignedDataGenerator();

    signedGenerator.addSigner(privateKey, certificate,
            CMSSignedDataGenerator.DIGEST_SHA1);

    ArrayList<X509Certificate> certList = new ArrayList<X509Certificate>();
    certList.add(certificate);
    CertStore certStore = CertStore.getInstance("Collection",
            new CollectionCertStoreParameters(certList));
    signedGenerator.addCertificatesAndCRLs(certStore);

    CMSProcessableByteArray cmsByteArray = new CMSProcessableByteArray(data);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    cmsByteArray.write(baos);
    System.out.println("CMSProcessableByteArray contains ["
            + baos.toString() + "]");

    CMSSignedData signedData = signedGenerator.generate(cmsByteArray, true,
            "BC");

    byte[] signed = signedData.getEncoded();

    CMSEnvelopedDataGenerator envGenerator = new CMSEnvelopedDataGenerator();
    envGenerator.addKeyTransRecipient(payPalCert);
    CMSEnvelopedData envData = envGenerator.generate(
            new CMSProcessableByteArray(signed),
            CMSEnvelopedDataGenerator.DES_EDE3_CBC, "BC");

    byte[] pkcs7Bytes = envData.getEncoded();

    return new String(DERtoPEM(pkcs7Bytes, "PKCS7"));

}

public static byte[] DERtoPEM(byte[] bytes, String headfoot) {
    ByteArrayOutputStream pemStream = new ByteArrayOutputStream();
    PrintWriter writer = new PrintWriter(pemStream);

    byte[] stringBytes = Base64.encode(bytes);

    System.out.println("Converting " + stringBytes.length + " bytes");

    String encoded = new String(stringBytes);

    if (headfoot != null) {
        writer.print("-----BEGIN " + headfoot + "-----\n");
    }

    // write 64 chars per line till done
    int i = 0;
    while ((i + 1) * 64 < encoded.length()) {
        writer.print(encoded.substring(i * 64, (i + 1) * 64));
        writer.print("\n");
        i++;
    }
    if (encoded.length() % 64 != 0) {
        writer.print(encoded.substring(i * 64)); // write remainder
        writer.print("\n");
    }
    if (headfoot != null) {
        writer.print("-----END " + headfoot + "-----\n");
    }
    writer.flush();
    return pemStream.toByteArray();
}
0 голосов
/ 24 января 2013

Более простой способ сделать это - не зашифровать, а использовать незашифрованную кнопку, а затем хэш-трюк для обнаружения взлома. Я объясняю это здесь с помощью PHP, но вы можете перевести на Java.

Как сделать зашифрованную кнопку PayPal "Купить сейчас" с настраиваемыми полями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...