С некоторых пор PayPal предлагает возможность добавления функционала, связанного с оплатой, непосредственно в Android-приложения. Пользователям, в этом случае, нет необходимости заходить на сайт PayPal, все происходит непосредственно в программе. Для этих целей доступен SDK. О том, как его использовать я расскажу в этот раз.
Настройка приложения
Для начала качаем SDK с официального сайта.
Затем создаем Android-приложение в Eclipse.
В архиве с PayPal SDK есть jar-файл PayPal_MPL.jar, который нам необходимо положить в подкаталог lib внутри каталога с исходным кодом нашего приложения (подкаталог lib создаем руками, никто за нас автоматически этого не сделает).
Затем идем в настройки проекта в раздел Java Build Path и на вкладке Libraries с помощью кнопки Add JARs… добавляем эту библиотеку в список используемых в нашем проекте.

В созданном приложении в манифесте необходимо добавить следующие строки:
<activity android:name="com.paypal.android.MEP.PayPalActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
После этого можно приступать к написанию кода.
Кодинг
SDK позволяет создавать брендированные кнопки для вызова окна оплаты. И вот при создании activity (в методе onCreate()) мы создадим такую кнопку и добавим в layout.
private static final String PAYPAL_APP_ID = "APP-80W284485P519543T";
PayPal mPayPal;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPayPal = PayPal.initWithAppID(
MainActivity.this.getBaseContext(),
PAYPAL_APP_ID,
PayPal.ENV_SANDBOX);
CheckoutButton payButton = mPayPal.getPaymentButton(PayPal.BUTTON_278x43, this, PayPal.PAYMENT_TYPE_HARD_GOODS);
payButton.setOnClickListener(mPayButtonListener);
LinearLayout mainLayout = (LinearLayout)findViewById(R.id.main_layout);
mainLayout.addView(payButton,
new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
Как видно из кода, у нас используется строка с PayPal Application ID. В примере используется тестовый ID приложения. Его можно посмотреть на странице аккаунта разработчика после регистрации на X.com.
Также хотелось бы отметить, что PayPal позволяет тестировать приложения с использованием “песочницы” (sandbox), а уже после тестирования можно настроить все так, чтобы приложение работало с реальным сайтом. В тестовом приложении мы указываем тип подключения PayPal.ENV_SANDBOX, который указывает что мы используем “песочницу”.
После того, как мы выполнили указанные выше действия, у нас должно получиться что-то вроде этого:

Отлично, кнопку мы добавили, но это всего лишь кнопка, она ничего не делает. Для того, чтобы она что-то делала, необходимо к ней добавить обработчик нажатия:
OnClickListener mPayButtonListener = new OnClickListener() {
@Override
public void onClick(View v) {
PayPalPayment newPayment = new PayPalPayment();
newPayment.setAmount("5.00");
newPayment.setCurrency("USD");
newPayment.setRecipient("zombie_1285772993_biz@wxwidgets.info");
newPayment.setItemDescription("My Super Item");
newPayment.setMerchantName("John Doe");
Intent paypalIntent = new Intent(MainActivity.this, PayPalActivity.class);
paypalIntent.putExtra(PayPalActivity.EXTRA_PAYMENT_INFO, newPayment);
MainActivity.this.startActivityForResult(paypalIntent, 1);
}
};
E-mail получателя платежа можно получить в песочнице, предварительно создав аккаунт продавца в разделе Test Accounts.
После нажатия на кнопку на экране появляется activity, в которой можно произвести оплату:

E-mail отправителя платежа можно также получитьв “песочнице” после создания тестового аккаунта.

После завершения оплаты нам необходимо как-то узнать результат (оплата может быть отменена пользователем, может произойти ошибка отправки средств и т.д.). Для этого нам необходимо реализовать метод onActivityResult():
public void onActivityResult(int requestCode, int resultCode, Intent data) {
String label = "";
String transactionID = data.getStringExtra(PayPalActivity.EXTRA_TRANSACTION_ID);
switch(resultCode) {
case Activity.RESULT_OK:
label = "OK";
break;
case Activity.RESULT_CANCELED:
label = "Cancelled";
break;
case PayPalActivity.RESULT_FAILURE:
label = "Failure";
break;
}
TextView resultLabelView = (TextView)findViewById(R.id.result_label);
resultLabelView.setText(label + ": " + transactionID);
}
Вместе с SDK поставляется неплохая документация, так что все вопросы решаются довольно быстро. В принципе, работа с PayPal MPL оставила только положительные ощущения, все просто и понятно, не глючит. Примеры, которые идут в поставке тоже работают нормально. Видно что SDK – цельный продукт.
Ну вот, собственно и все.
Напоследдок несколько ссылок:
Исходные коды тестового приложения.
да есть такая тема. однако, думается мне что это немного не то, что вшито в айфон.
гугл утверждает, что удалять он будет (кстати он лишь оставляет право, но удалять, думаю, будет только в крайнем случае) не те программы, которые он хочет, а именно те которые нарушают соглашение android market. темболее гугл утверждает что будет возвращать затраченные пользователем средства на эту софтину.
я представляю себе это так:
написал чувачёк програмульку типа “блокнот”, привязал к ней какойнить руткит и выложил в android market. прогу купило какоето количество пиплов и тут гугле обнаруживает, что в проге сидит руткит. “отзывает” эту софтину и возврашает деньги.
в то время как apple убивала софт без объяснения причин и без явных нарушений каких-либо договоров.
итого
причина гугле – забота о безопасности юзеров.
причина аппле – забота о своём кошельке.
—
с одной стороны можно сказать, что я предвзято отношусь к гугле считая их вселенским добром, а аппле считая злым деньгозарабатователем. однако, за аппле уже были грешки, а вот за гуглом не наблюдал.
как-то так.
Вот нашел оригинальный текст Android Market Policies… Ну, не смертельно, но там все далеко не так радужно как хотелось бы..
Еще и эта штука с возвратом в течении суток… Например возврат какого-нибудь твикера, который раз всего в течении жизни смартфона будет использоваться, может оказаться очень неприятным для разработчиков.
Как-то участвовал в бета-тестировании твикера для смартфонов и получил от компании-разработчика лицензию в качестве благодарности за тестирование, так вот, пользовался я им всего один раз, и больше как-то смысла не вижу, ОС я на смартфоне не перустанавливаю, пожтому он мне как бы и не нужен. С возвратом в течении суток такой класс утилит потенциально теряет привлекательность для разработчиков…
Но это, в общем-то, тема уже совсем другой истории.. 🙂
О, спасибо. Интересный линк, полистаем.
Я думаю что это первое время народ будет озадачен, а потом как разберётся что к чему всё встанет на свои места.
а что за твикер?
я сейчас пытаюсь придумать какое такое приложение нужно что бы запустить его 1 раз и больше его плодами не пользоваться и что-то в голову ничего не лезет.
SmartTweaker
Насчет утилит-твикеров – ну почему же они потеряют привлекательность.. Отнюдь нет, можно лишь чуть по-другому их оформить. Например, если утилита при деинсталляции будет откатывать все сделанные изменения – тогда все становится на свои места. Ты пробуешь твикер, если не понравилось – в течение суток возвражаешь его назад, вместе с плодами его работы. А если понравилось – то просто оставляешь его в смартфоне, вместе с плодами усилий.