├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── libs
└── CloudPayments_AndroidSDK.aar
├── res
├── drawable-hdpi
│ └── ic_launcher.png
├── drawable-ldpi
│ └── ic_launcher.png
├── drawable-mdpi
│ └── ic_launcher.png
├── drawable-xhdpi
│ └── ic_launcher.png
├── values
│ ├── styles.xml
│ └── strings.xml
└── layout
│ ├── custom_activity.xml
│ ├── main.xml
│ ├── build_in_form.xml
│ └── card_data_view.xml
├── .gitignore
├── src
└── ru
│ └── cloudpayments
│ └── sdk
│ └── demo
│ ├── custom
│ ├── CardDataViewListener.java
│ ├── CardDataView.java
│ └── CustomActivity.java
│ ├── Constants.java
│ ├── Launcher.java
│ └── buildIn
│ └── BuildInActivity.java
├── AndroidManifest.xml
└── README.md
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cloudpayments/CloudPayments_AndroidSDKDemo/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/libs/CloudPayments_AndroidSDK.aar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cloudpayments/CloudPayments_AndroidSDKDemo/HEAD/libs/CloudPayments_AndroidSDK.aar
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cloudpayments/CloudPayments_AndroidSDKDemo/HEAD/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-ldpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cloudpayments/CloudPayments_AndroidSDKDemo/HEAD/res/drawable-ldpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cloudpayments/CloudPayments_AndroidSDKDemo/HEAD/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cloudpayments/CloudPayments_AndroidSDKDemo/HEAD/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *classpath*
2 | */.idea/
3 | *.idea/
4 | */lib/
5 | */bin/
6 | */out/
7 | */gen/
8 | */build/
9 | */gradle/
10 | *build/
11 | *.project
12 | *.settings
13 | *.iml
14 | local.properties
15 | .gradle
16 | gradlew*
17 | manifest-merger-release-report.txt
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Aug 29 15:56:06 YEKT 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
7 |
--------------------------------------------------------------------------------
/src/ru/cloudpayments/sdk/demo/custom/CardDataViewListener.java:
--------------------------------------------------------------------------------
1 | package ru.cloudpayments.sdk.demo.custom;
2 |
3 | import java.lang.String; /**
4 | * Created by Nastya on 29.09.2014.
5 | */
6 | public interface CardDataViewListener {
7 |
8 | void makeCharge(String cardNumber, String expDate, String cvv, String holderName, double amount, String currency, String desc);
9 | void makeAuth(String cardNumber, String expDate, String cvv, String holderName, double amount, String currency, String desc);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/ru/cloudpayments/sdk/demo/Constants.java:
--------------------------------------------------------------------------------
1 | package ru.cloudpayments.sdk.demo;
2 |
3 | /**
4 | * Created by Nastya on 28.09.2014.
5 | */
6 | public class Constants {
7 |
8 | /**
9 | * Тестовый publicId для подключения, его вам нужно получить в личном кабинете на сайте cloudpayments.ru
10 | */
11 | public static final String publicId = "pk_348c635ba69b355d6f4dc75a4a205";
12 |
13 | public static final String currency = "USD";
14 | public static final String invoiceId = "testInvoiceId";
15 | public static final String accountId = "test_acc@mail.ru";
16 | }
17 |
--------------------------------------------------------------------------------
/res/layout/custom_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
17 |
--------------------------------------------------------------------------------
/res/layout/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
14 |
15 |
21 |
--------------------------------------------------------------------------------
/src/ru/cloudpayments/sdk/demo/Launcher.java:
--------------------------------------------------------------------------------
1 | package ru.cloudpayments.sdk.demo;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 |
8 | import ru.cloudpayments.sdk.demo.buildIn.BuildInActivity;
9 | import ru.cloudpayments.sdk.demo.custom.CustomActivity;
10 |
11 |
12 | public class Launcher extends Activity {
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 |
18 | setContentView(R.layout.main);
19 | }
20 |
21 | public void onBuildInForm(View view) {
22 | startActivity(new Intent(Launcher.this, BuildInActivity.class));
23 | }
24 |
25 | public void onCustomForm(View view) {
26 | startActivity(new Intent(Launcher.this, CustomActivity.class));
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
14 |
16 |
17 |
18 |
19 |
20 |
21 |
23 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/res/layout/build_in_form.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
15 |
16 |
25 |
26 |
34 |
35 |
41 |
42 |
46 |
--------------------------------------------------------------------------------
/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | CloudPayments SDK Demo
4 | Оплата через встроенную форму
5 | Оплата через свою форму
6 |
7 | Введите сумму
8 | Введите валюту
9 | Введите назначение
10 | Оплатить
11 |
12 | [Оплата не завершена]\u0020
13 | [Ошибка]\u0020
14 | [Оплата завершена]\u0020
15 | [Операция отменена]\u0020
16 | Оптатить (3ds)
17 |
18 | Номер карты
19 | Срок действия карты
20 | Имя держателя карты
21 | CVV
22 | ****************
23 | mmyy
24 | Имя деражателя карты
25 | ***
26 | Оплатить [Charge]
27 | Оплатить [Auth]
28 |
29 | Введите номер карты
30 | Введите срок действия карты
31 | Введите CVV
32 | Введите Имя держателя карты
33 | Введите сумму
34 | Введите валюту
35 | Введите назначение
36 | Сумма
37 | Валюта
38 | Назначение
39 |
40 |
--------------------------------------------------------------------------------
/res/layout/card_data_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
10 |
11 |
16 |
17 |
25 |
26 |
31 |
32 |
40 |
41 |
46 |
47 |
54 |
55 |
60 |
61 |
69 |
70 |
75 |
76 |
84 |
85 |
90 |
91 |
99 |
100 |
105 |
106 |
113 |
114 |
120 |
121 |
127 |
128 |
--------------------------------------------------------------------------------
/src/ru/cloudpayments/sdk/demo/buildIn/BuildInActivity.java:
--------------------------------------------------------------------------------
1 | package ru.cloudpayments.sdk.demo.buildIn;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.EditText;
8 | import android.widget.TextView;
9 |
10 | import ru.cloudpayments.sdk.PaymentWidget;
11 | import ru.cloudpayments.sdk.business.domain.model.BaseResponse;
12 | import ru.cloudpayments.sdk.business.domain.model.billing.CardsAuthConfirmResponse;
13 | import ru.cloudpayments.sdk.business.domain.model.billing.CardsAuthResponse;
14 | import ru.cloudpayments.sdk.demo.Constants;
15 | import ru.cloudpayments.sdk.demo.R;
16 | import ru.cloudpayments.sdk.view.PaymentTaskListener;
17 |
18 | import static ru.cloudpayments.sdk.utils.Logger.log;
19 |
20 | /**
21 | * Created by Nastya on 12.08.2015.
22 | */
23 | public class BuildInActivity extends Activity {
24 |
25 | private PaymentTaskListener paymentTaskListener = new PaymentTaskListener() {
26 |
27 | @Override
28 | public void success(BaseResponse response) {
29 | log("BuildInActivity got success " + response);
30 | if (response instanceof CardsAuthConfirmResponse)
31 | showResult(getString(R.string.payment_finished) + ((CardsAuthConfirmResponse) response).transaction.cardHolderMessage + "\n");
32 | else if (response instanceof CardsAuthResponse) {
33 | showResult(getString(R.string.payment_finished) + ((CardsAuthResponse) response).auth.cardHolderMessage + "\n");
34 | } else {
35 | showResult(getString(R.string.payment_finished) + response + "\n");
36 | }
37 | }
38 |
39 | @Override
40 | public void error(BaseResponse response) {
41 | log("BuildInActivity got error " + response);
42 | if (response instanceof CardsAuthConfirmResponse)
43 | showResult(getString(R.string.payment_not_finished) + ((CardsAuthConfirmResponse) response).transaction.cardHolderMessage + "\n");
44 | if (response instanceof CardsAuthResponse)
45 | showResult(getString(R.string.payment_not_finished) + ((CardsAuthResponse) response).auth.cardHolderMessage + "\n");
46 | else
47 | showResult(getString(R.string.error) + response.message + "\n");
48 | }
49 |
50 | @Override
51 | public void cancel() {
52 | log("BuildInActivity got cancel");
53 | showResult(getString(R.string.operation_canceled) + "\n");
54 | }
55 | };
56 |
57 | private TextView resultView;
58 |
59 | @Override
60 | protected void onCreate(Bundle savedInstanceState) {
61 | super.onCreate(savedInstanceState);
62 |
63 | setContentView(R.layout.build_in_form);
64 | resultView = (TextView) findViewById(R.id.result);
65 | }
66 |
67 | @Override
68 | protected void onSaveInstanceState(Bundle outState) {
69 | outState = new Bundle();
70 | outState.putString("result", ((TextView) findViewById(R.id.result)).getText().toString());
71 | super.onSaveInstanceState(outState);
72 | }
73 |
74 | @Override
75 | protected void onRestoreInstanceState(Bundle savedInstanceState) {
76 | super.onRestoreInstanceState(savedInstanceState);
77 | if (savedInstanceState.containsKey("result"))
78 | showResult(savedInstanceState.getString("result"));
79 | }
80 |
81 | public void onPay(View view) {
82 | Double amount = 0.;
83 | try {
84 | amount = Double.parseDouble(((EditText) findViewById(R.id.edtAmount)).getText().toString());
85 | } catch (Exception e) {
86 |
87 | return;
88 | }
89 |
90 | String desc = ((EditText) findViewById(R.id.edtDesc)).getText().toString();
91 | String currency = ((EditText) findViewById(R.id.edtCurrency)).getText().toString();
92 |
93 | Intent intent = new Intent(BuildInActivity.this, PaymentWidget.class);
94 | intent.putExtra(PaymentWidget.EXTRA_AMOUNT, amount); // Сумма оплаты
95 | intent.putExtra(PaymentWidget.EXTRA_DESCRIPTION, desc); // Описание
96 | intent.putExtra(PaymentWidget.EXTRA_CURRENCY, currency); // Код валюты
97 | intent.putExtra(PaymentWidget.EXTRA_PUBLIC_ID, Constants.publicId); // Ваш public ID
98 | intent.putExtra(PaymentWidget.EXTRA_INVOICE_ID, Constants.invoiceId); // ID заказа в вашей системе
99 | intent.putExtra(PaymentWidget.EXTRA_ACCOUNT_ID, Constants.accountId); // ID покупателя в вашей системе
100 | intent.putExtra(PaymentWidget.EXTRA_DATA, "{\"age\":27,\"name\":\"Ivan\",\"phone\":\"+79998881122\"}"); // Произвольный набор параметров
101 | intent.putExtra(PaymentWidget.EXTRA_TYPE, PaymentWidget.TYPE_AUTH); // Тип платежа: TYPE_CHARGE (одностадийный) или TYPE_AUTH (двухстадийный)
102 |
103 | PaymentWidget.taskListener = paymentTaskListener;
104 |
105 | startActivity(intent);
106 | }
107 |
108 | public void showResult(String text){
109 | resultView.setText(text);
110 | }
111 |
112 | }
113 |
--------------------------------------------------------------------------------
/src/ru/cloudpayments/sdk/demo/custom/CardDataView.java:
--------------------------------------------------------------------------------
1 | package ru.cloudpayments.sdk.demo.custom;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.util.AttributeSet;
6 | import android.view.View;
7 | import android.widget.EditText;
8 | import android.widget.LinearLayout;
9 |
10 | import ru.cloudpayments.sdk.demo.R;
11 |
12 | /**
13 | * Created by Nastya on 28.09.2014.
14 | */
15 | public class CardDataView extends LinearLayout {
16 |
17 | private CardDataViewListener cardDataViewListener;
18 | private EditText edtCardNumber;
19 | private EditText edtCardExp;
20 | private EditText edtCardCvv;
21 | private EditText edtCardHolderName;
22 | private EditText edtAmount;
23 | private EditText edtCurrency;
24 | private EditText edtDesc;
25 |
26 | public CardDataView(Context context) {
27 | super(context);
28 | }
29 |
30 | public CardDataView(Context context, AttributeSet attrs) {
31 | super(context, attrs);
32 | }
33 |
34 | @Override
35 | protected void onFinishInflate() {
36 | super.onFinishInflate();
37 | ((Activity) getContext()).getLayoutInflater().inflate(R.layout.card_data_view, this);
38 |
39 | setupView();
40 | }
41 |
42 | private boolean validate() {
43 | if (edtCardNumber.getText().length() < 16) {
44 | edtCardNumber.setError(getContext().getString(R.string.enter_card_number));
45 | return false;
46 | }
47 | if (edtCardExp.getText().length() < 4) {
48 | edtCardExp.setError(getContext().getString(R.string.enter_exp));
49 | return false;
50 | }
51 | if (edtCardCvv.getText().length() < 3) {
52 | edtCardCvv.setError(getContext().getString(R.string.enter_cvv));
53 | return false;
54 | }
55 | if (edtCardHolderName.getText().length() == 0) {
56 | edtCardHolderName.setError(getContext().getString(R.string.enter_card_holder_name));
57 | return false;
58 | }
59 |
60 | if (edtAmount.getText().length() == 0) {
61 | edtAmount.setError(getContext().getString(R.string.enter_amount));
62 | return false;
63 | }
64 |
65 | if (edtCurrency.getText().length() == 0) {
66 | edtCurrency.setError(getContext().getString(R.string.enter_currency));
67 | return false;
68 | }
69 |
70 | if (edtDesc.getText().length() == 0) {
71 | edtDesc.setError(getContext().getString(R.string.enter_desc));
72 | return false;
73 | }
74 |
75 | return true;
76 | }
77 |
78 | private void setupView() {
79 | edtCardNumber = (EditText) findViewById(R.id.edtCardNumber);
80 | edtCardExp = (EditText) findViewById(R.id.edtCardExp);
81 | edtCardCvv = (EditText) findViewById(R.id.edtCardCvv);
82 | edtCardHolderName = (EditText) findViewById(R.id.edtCardHolderName);
83 | edtAmount = (EditText) findViewById(R.id.edtAmount);
84 | edtDesc = (EditText) findViewById(R.id.edtDesc);
85 | edtCurrency = (EditText) findViewById(R.id.edtCurrency);
86 |
87 | findViewById(R.id.btnCharge).setOnClickListener(new OnClickListener() {
88 | @Override
89 | public void onClick(View v) {
90 |
91 | if (!validate()) return;
92 |
93 | if (cardDataViewListener != null) {
94 | cardDataViewListener.makeCharge(
95 | edtCardNumber.getText().toString(),
96 | edtCardExp.getText().toString(),
97 | edtCardCvv.getText().toString(),
98 | edtCardHolderName.getText().toString(),
99 | Double.valueOf(edtAmount.getText().toString()),
100 | edtCurrency.getText().toString(),
101 | edtDesc.getText().toString()
102 | );
103 | }
104 | }
105 | });
106 | findViewById(R.id.btnAuth).setOnClickListener(new OnClickListener() {
107 | @Override
108 | public void onClick(View v) {
109 |
110 | if (!validate()) return;
111 |
112 | if (cardDataViewListener != null) {
113 | cardDataViewListener.makeAuth(
114 | edtCardNumber.getText().toString(),
115 | edtCardExp.getText().toString(),
116 | edtCardCvv.getText().toString(),
117 | edtCardHolderName.getText().toString(),
118 | Double.valueOf(edtAmount.getText().toString()),
119 | edtCurrency.getText().toString(),
120 | edtDesc.getText().toString()
121 | );
122 | }
123 | }
124 | });
125 | }
126 |
127 | public void setCardDataViewListener(CardDataViewListener cardDataViewListener) {
128 | this.cardDataViewListener = cardDataViewListener;
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/src/ru/cloudpayments/sdk/demo/custom/CustomActivity.java:
--------------------------------------------------------------------------------
1 | package ru.cloudpayments.sdk.demo.custom;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.widget.TextView;
6 |
7 | import ru.cloudpayments.sdk.CardFactory;
8 | import ru.cloudpayments.sdk.ICard;
9 | import ru.cloudpayments.sdk.IPayment;
10 | import ru.cloudpayments.sdk.PaymentFactory;
11 | import ru.cloudpayments.sdk.business.domain.model.BaseResponse;
12 | import ru.cloudpayments.sdk.business.domain.model.billing.CardsAuthConfirmResponse;
13 | import ru.cloudpayments.sdk.business.domain.model.billing.CardsAuthResponse;
14 | import ru.cloudpayments.sdk.demo.Constants;
15 | import ru.cloudpayments.sdk.demo.R;
16 | import ru.cloudpayments.sdk.view.PaymentTaskListener;
17 |
18 | import static ru.cloudpayments.sdk.utils.Logger.log;
19 |
20 | public class CustomActivity extends Activity {
21 |
22 | private PaymentTaskListener paymentTaskListener;
23 |
24 | private TextView resultView;
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 |
30 | setContentView(R.layout.custom_activity);
31 |
32 | paymentTaskListener = new PaymentTaskListener() {
33 |
34 | @Override
35 | public void success(BaseResponse response) {
36 | log("CustomActivity got success " + response);
37 | if (response instanceof CardsAuthConfirmResponse)
38 | showResult(getString(R.string.payment_finished) + ((CardsAuthConfirmResponse) response).transaction.cardHolderMessage + "\n");
39 | else if (response instanceof CardsAuthResponse) {
40 | showResult(getString(R.string.payment_finished) + ((CardsAuthResponse) response).auth.cardHolderMessage + "\n");
41 | } else {
42 | showResult(getString(R.string.payment_finished) + response + "\n");
43 | }
44 | }
45 |
46 | @Override
47 | public void error(BaseResponse response) {
48 | log("CustomActivity got error " + response);
49 | if (response instanceof CardsAuthConfirmResponse)
50 | showResult(getString(R.string.payment_not_finished) + ((CardsAuthConfirmResponse) response).transaction.cardHolderMessage + "\n");
51 | if (response instanceof CardsAuthResponse)
52 | showResult(getString(R.string.payment_not_finished) + ((CardsAuthResponse) response).auth.cardHolderMessage + "\n");
53 | else
54 | showResult(getString(R.string.error) + response.message + "\n");
55 | }
56 |
57 | @Override
58 | public void cancel() {
59 | log("CustomActivity got cancel");
60 | showResult(getString(R.string.operation_canceled) + "\n");
61 | }
62 | };
63 |
64 | resultView = (TextView) findViewById(R.id.result);
65 | ((CardDataView) findViewById(R.id.cardDataView)).setCardDataViewListener(new CardDataViewListener() {
66 | @Override
67 | public void makeCharge(String cardNumber, String expDate, String cvv, String holderName, double amount, String currency, String desc) {
68 |
69 | ICard card = CardFactory.create(cardNumber, expDate, cvv);
70 | try {
71 | String cardCryptogram = card.cardCryptogram(Constants.publicId);
72 | if (card.isValidNumber()) {
73 | IPayment paymentCharge = PaymentFactory.charge(CustomActivity.this,
74 | Constants.publicId,
75 | "accId",
76 | "invId",
77 | cardCryptogram,
78 | holderName,
79 | amount,
80 | currency,
81 | desc,
82 | "{\"age\":27,\"name\":\"Ivan\",\"phone\":\"+79998881122\"}");
83 | paymentCharge.run(paymentTaskListener);
84 | } else {
85 | showResult("CardNumber is not valid");
86 | }
87 | } catch (Exception e) {
88 | showResult("Error get card cryptogram");
89 | }
90 | }
91 |
92 | @Override
93 | public void makeAuth(String cardNumber, String expDate, String cvv, String holderName, double amount, String currency, String desc) {
94 |
95 | ICard card = CardFactory.create(cardNumber, expDate, cvv);
96 | try {
97 | String cardCryptogram = card.cardCryptogram(Constants.publicId);
98 | if (card.isValidNumber()) {
99 | IPayment paymentAuth = PaymentFactory.auth(CustomActivity.this,
100 | Constants.publicId,
101 | "accId",
102 | "invId",
103 | cardCryptogram,
104 | holderName,
105 | amount,
106 | currency,
107 | desc,
108 | "{\"age\":27,\"name\":\"Ivan\",\"phone\":\"+79998881122\"}");
109 | paymentAuth.run(paymentTaskListener);
110 | } else {
111 | showResult("CardNumber is not valid");
112 | }
113 | } catch (Exception e) {
114 | showResult("Error get card cryptogram");
115 | }
116 | }
117 | });
118 | }
119 |
120 | @Override
121 | protected void onSaveInstanceState(Bundle outState) {
122 | outState = new Bundle();
123 | outState.putString("result", ((TextView) findViewById(R.id.result)).getText().toString());
124 | super.onSaveInstanceState(outState);
125 | }
126 |
127 | @Override
128 | protected void onRestoreInstanceState(Bundle savedInstanceState) {
129 | super.onRestoreInstanceState(savedInstanceState);
130 | if (savedInstanceState.containsKey("result"))
131 | ((TextView) findViewById(R.id.result)).setText(savedInstanceState.getString("result"));
132 | }
133 |
134 | public void showResult(String text){
135 | resultView.setText(text);
136 | }
137 | }
138 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | CloudPayments Android SDK
2 | =====================
3 | ### Использование
4 |
5 | Приложение CloudPayments_AndroidSDKDemo демонстрирует работу SDK для платформы Android с платежным шлюзом CloudPayments
6 | Полная информация об использовании на сайте http://cloudpayments.ru/docs/mobileSDK
7 | Схемы проведения платежа http://cloudpayments.ru/Docs/Integration#schemes
8 |
9 | ### Требования
10 | Для работы CloudPayments AndroidSDK необходим Android версии 4.3 и выше (API level 18).
11 | ### Инсталяция
12 | Клонируйте проект на свой компьютер и откройте его в Android Studio:
13 | git clone https://github.com/cloudpayments/CloudPayments_AndroidSDKDemo.git
14 |
15 | Или подключите SDK к своему проекту, для этого скопируте папку libs в директорию своего проекта и добавьте в [_build.gradle_][build-config] вашего проекта следующее
16 | ```groovy
17 | dependencies {
18 | compile(name: 'CloudPayments_AndroidSDK', ext: 'aar')
19 | }
20 |
21 | repositories {
22 | flatDir{
23 | dirs 'libs'
24 | }
25 | }
26 | ```
27 | ### Описание работы приложения с SDK CloudPayments
28 |
29 | SDK CloudPayments (CloudPaymentsAPI.framework) позволяет:
30 | * Проводить проверку карточного номера на корректность
31 | ```java
32 | ru.cloudpayments.sdk.ICard card = ru.cloudpayments.sdk.CardFactory.create(java.lang.String number);
33 | boolean card.isValidNumber();
34 | ```
35 | * Определять тип платежной системы
36 | ```java
37 | ru.cloudpayments.sdk.ICard card = ru.cloudpayments.sdk.CardFactory.create(java.lang.String number);
38 | java.lang.String card.getType();
39 | ```
40 | * Шифровать карточные данные и создавать криптограмму для отправки на сервер
41 | ```java
42 | ru.cloudpayments.sdk.ICard card = ru.cloudpayments.sdk.CardFactory.create(java.lang.String number);
43 | java.lang.String card.cardCryptogram(java.lang.String publicId) throws
44 | java.io.UnsupportedEncodingException,
45 | javax.crypto.NoSuchPaddingException,
46 | java.security.NoSuchAlgorithmException,
47 | ava.security.NoSuchProviderException,
48 | javax.crypto.BadPaddingException,
49 | javax.crypto.IllegalBlockSizeException,
50 | java.security.InvalidKeyException;
51 | ```
52 | ### Проведение оплаты
53 |
54 | ### Пример использования SDK и API CloudPayments
55 |
56 | В примере publicId это тестовые реквизиты для подключения, Вам нужно получить их в личном кабинете на сайте CloudPayments.
57 |
58 | ##### Пример отправки запроса на списание средств с банковской карты через 3ds, через встроенную форму:
59 | ```java
60 | Intent intent = new Intent(Launcher.this, PaymentWidget.class);
61 | PaymentWidget.taskListener = paymentTaskListener;
62 | intent.putExtra(PaymentWidget.EXTRA_AMOUNT, amount); // Сумма оплаты
63 | intent.putExtra(PaymentWidget.EXTRA_DESCRIPTION, desc); // Описание
64 | intent.putExtra(PaymentWidget.EXTRA_CURRENCY, currency); // Код валюты
65 | intent.putExtra(PaymentWidget.EXTRA_PUBLIC_ID, Constants.publicId); // Ваш public ID
66 | intent.putExtra(PaymentWidget.EXTRA_INVOICE_ID, Constants.invoiceId); // ID заказа в вашей системе
67 | intent.putExtra(PaymentWidget.EXTRA_ACCOUNT_ID, Constants.accountId); // ID покупателя в вашей системе
68 | intent.putExtra(PaymentWidget.EXTRA_DATA, "{\"age\":27,\"name\":\"Ivan\",\"phone\":\"+79998881122\"}"); // Произвольный набор параметров
69 | intent.putExtra(PaymentWidget.EXTRA_TYPE, PaymentWidget.TYPE_AUTH); // Тип платежа: TYPE_CHARGE (одностадийный) или TYPE_AUTH (двухстадийный)
70 |
71 | startActivity(intent);
72 | ```
73 |
74 | где
75 | ```java
76 | private PaymentTaskListener paymentTaskListener = new PaymentTaskListener() {
77 | @Override
78 | public void success(BaseResponse baseResponse) {
79 | // успешно
80 | // baseResponse instanceof CardsAuthConfirmResponse - оплата 3ds
81 | // baseResponse instanceof CardsAuthResponse
82 | }
83 |
84 | @Override
85 | public void error(BaseResponse baseResponse) {
86 | // ошибка
87 | }
88 |
89 | @Override
90 | public void cancel() {
91 | // отменено пользователем
92 | }
93 | };
94 | ```
95 |
96 | Описание успешного ответа
97 | ```java
98 | public class CardsAuthConfirmResponse extends BaseResponse {
99 | public CardTransaction transaction;
100 | }
101 |
102 | public class CardsAuthResponse extends BaseResponse {
103 | public CardAuth auth;
104 | }
105 |
106 | public class CardTransaction {
107 | public int transactionId;
108 | public String cardHolderMessage;
109 | public String accountId;
110 | public String token;
111 | }
112 |
113 | public class CardAuth extends CardTransaction {
114 | public String paReq;
115 | public String acsUrl;
116 | }
117 | ```
118 | Подробнее см. ru.cloudpayments.sdk.demo.buildIn.BuildInActivity.java
119 |
120 | ### Пример отправки запроса на списание средств с банковской карты через 3ds, через свою форму:
121 |
122 | **Одностадийная оплата**
123 |
124 | ```java
125 | ICard card = CardFactory.create(cardNumber, expDate, cvv);
126 | if (card.isValidNumber()) {
127 | IPayment paymentCharge = PaymentFactory.charge(CustomActivity.this,
128 | Constants.publicId, "accId", "invId",
129 | card.cardCryptogram(Constants.publicId),
130 | holderName, amount, currency, desc,
131 | "{\"age\":27,\"name\":\"Ivan\",\"phone\":\"+79998881122\"}");
132 | paymentCharge.run(paymentTaskListener);
133 | } else {
134 | //CardNumber is not valid
135 | }
136 | ```
137 |
138 | **Двухстадийная оплата**
139 |
140 | ```java
141 | ICard card = CardFactory.create(cardNumber, expDate, cvv);
142 | if (card.isValidNumber()) {
143 | IPayment paymentAuth = PaymentFactory.auth(CustomActivity.this,
144 | Constants.publicId, "accId", "invId",
145 | card.cardCryptogram(Constants.publicId),
146 | holderName, amount, currency, desc,
147 | "{\"age\":27,\"name\":\"Ivan\",\"phone\":\"+79998881122\"}");
148 | paymentAuth.run(paymentTaskListener);
149 | } else {
150 | //CardNumber is not valid
151 | }
152 | ```
153 | **Constants.publicId** - Ваш public ID, его необходимо получить в личном кабинете.
154 | **accId** - ID покупателя в вашей системе.
155 | **invId** - ID заказа в вашей системе.
156 |
157 | Подробнее см. ru.cloudpayments.sdk.demo.custom.CustomActivity.java
158 |
159 | ### Тестирование
160 | https://cloudpayments.ru/Docs/Test - данные банковских карт для тестирования.
161 |
162 | ### Ключевые моменты
163 |
164 | В демо-проекте частично используется код из библиотеки https://github.com/LivotovLabs/3DSView. Все права на код этой библиотеки принадлежат авторам библиотеки.
--------------------------------------------------------------------------------