Я внедрил песочницу PayPal с соответствующим учебным пособием, все работает отлично, но 1 вещь ... Я не могу войти в свою учетную запись PayPal, используя песочницу, утверждая, что это неправильно, хотя я могу войти с ней на их веб-сайте.
2019-11-08 16:59:33.406 2205-2205/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2019-11-08 16:59:33.407 2205-2205/? E/Zygote: accessInfo : 1
2019-11-08 16:59:47.442 2205-2748/com.capstone.araba E/Camera_APM :: [APM]APM's Thread is started
2019-11-08 16:59:47.443 2205-2748/com.capstone.araba E/Camera_APM :: [APM] This app is forground app
2019-11-08 17:00:05.962 2205-2734/com.capstone.araba E/paypal.sdk: request failure with http statusCode:401,exception:
2019-11-08 17:00:05.963 2205-2734/com.capstone.araba E/paypal.sdk: request failed with server response:{"error":"invalid_user","error_description":"Invalid user credentials"}
2019-11-08 17:00:05.965 2205-2205/com.capstone.araba E/paypal.sdk: invalid_user
2019-11-08 17:00:06.039 2205-2205/com.capstone.araba E/InputMethodManager: prepareNavigationBarInfo() rootView is null
2019-11-08 17:00:06.048 2205-2205/com.capstone.araba E/InputMethodManager: prepareNavigationBarInfo() rootView is null
2019-11-08 17:00:06.155 2205-2205/com.capstone.araba E/ViewRootImpl: sendUserActionEvent() returned.
2019-11-08 17:00:07.009 2205-2205/com.capstone.araba E/ViewRootImpl: sendUserActionEvent() returned.
2019-11-08 17:02:28.358 2205-2205/com.capstone.araba E/RecyclerView: No adapter attached; skipping layout
2019-11-08 17:02:45.879 2205-2205/com.capstone.araba E/RecyclerView: No adapter attached; skipping layout
Это код, который я использовал для реализации PayPal SDK: Я старался изо всех сил, даже могследовал этому руководству на YouTube: https://www.youtube.com/watch?v=k5lPy_50f0Y&t=687s
package com.capstone.araba.config;
public class Config {
public static final String PAYPAL_CLIENT_ID = "AW_BtWNOeAwHWiSEUeMfrlB395P1GXgCQaB6K29mnBPw46VnqC27kMhZISw4y1hijEv3TLzPtKsK5-T5";
}
package com.capstone.araba;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.capstone.araba.config.Config;
import com.paypal.android.sdk.payments.PayPalConfiguration;
import com.paypal.android.sdk.payments.PayPalPayment;
import com.paypal.android.sdk.payments.PayPalService;
import com.paypal.android.sdk.payments.PaymentActivity;
import com.paypal.android.sdk.payments.PaymentConfirmation;
import java.math.BigDecimal;
public class MembershipActivity extends AppCompatActivity {
public static final int PAYPAL_REQUEST_ID = 7171;
private static PayPalConfiguration config = new PayPalConfiguration()
.environment(PayPalConfiguration.ENVIRONMENT_SANDBOX)
.clientId(Config.PAYPAL_CLIENT_ID);
Button bronze, silver, gold;
TextView b, s, g;
String amount = "";
@Override
protected void onDestroy() {
stopService(new Intent(this, PayPalService.class));
super.onDestroy();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_membership);
Intent intent = new Intent(this, PayPalService.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
startService(intent);
bronze = findViewById(R.id.bronze);
silver = findViewById(R.id.silver);
gold = findViewById(R.id.gold);
b = findViewById(R.id.b);
s = findViewById(R.id.s);
g = findViewById(R.id.g);
bronze.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bronzePayment();
}
});
silver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
silverPayment();
}
});
gold.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
goldPayment();
}
});
}
private void goldPayment() {
amount = g.getText().toString();
PayPalPayment payPalPayment = new PayPalPayment(new BigDecimal(amount), "USD", "Buy the gold membership", PayPalPayment.PAYMENT_INTENT_SALE);
Intent intent = new Intent(this, PaymentActivity.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payPalPayment);
startActivityForResult(intent, PAYPAL_REQUEST_ID);
}
private void silverPayment() {
amount = s.getText().toString();
PayPalPayment payPalPayment = new PayPalPayment(new BigDecimal(amount), "USD", "Buy the silver membership", PayPalPayment.PAYMENT_INTENT_SALE);
Intent intent = new Intent(this, PaymentActivity.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payPalPayment);
startActivityForResult(intent, PAYPAL_REQUEST_ID);
}
private void bronzePayment() {
amount = b.getText().toString();
PayPalPayment payPalPayment = new PayPalPayment(new BigDecimal(amount), "USD", "Buy the bronze membership", PayPalPayment.PAYMENT_INTENT_SALE);
Intent intent = new Intent(this, PaymentActivity.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payPalPayment);
startActivityForResult(intent, PAYPAL_REQUEST_ID);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PAYPAL_REQUEST_ID) {
if (resultCode == RESULT_OK) {
assert data != null;
PaymentConfirmation paymentConfirmation = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
if (paymentConfirmation != null) {
try {
String paymentDetails = paymentConfirmation.toJSONObject().toString(4);
startActivity(new Intent(this, PaymentDetails.class)
.putExtra("PaymentDetails", paymentDetails)
.putExtra("PaymentAmount", amount));
} catch (Exception e) {
e.printStackTrace();
}
}
} else if (resultCode == Activity.RESULT_CANCELED) {
Toast.makeText(this, "Cancel", Toast.LENGTH_SHORT).show();
}
} else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID) {
Toast.makeText(this, "Invalid", Toast.LENGTH_SHORT).show();
}
}
}
package com.capstone.araba;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Objects;
public class PaymentDetails extends AppCompatActivity {
TextView txtId, txtAmount, txtStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment_details);
txtId = findViewById(R.id.txtId);
txtAmount = findViewById(R.id.txtAmount);
txtStatus = findViewById(R.id.txtStatus);
Intent intent = getIntent();
try {
JSONObject jsonObject = new JSONObject(Objects.requireNonNull(intent.getStringExtra("PaymentDetails")));
showDetails(jsonObject.getJSONObject("Response"), intent.getStringExtra("PaymentAmount"));
} catch (JSONException e) {
e.printStackTrace();
}
}
@SuppressLint("SetTextI18n")
private void showDetails(JSONObject response, String paymentAmount) {
try {
txtId.setText(response.getString("id"));
txtStatus.setText(response.getString("state"));
txtAmount.setText("AED" + paymentAmount);
} catch (JSONException e) {
e.printStackTrace();
}
}
}