java - 我无法使用我的用户登录并使用 PayPal 沙箱通过
问题描述
我使用适当的教程实施了 PayPal 沙箱,一切正常,但有一件事......我无法使用沙箱登录我的 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();
}
}
}
解决方案
推荐阅读
- spartacus-storefront - 如何在 cx-slots 周围添加容器
- django - Django UpdateView 测试时不保存新数据
- postgresql - 将 ASCII 转换为 UTF8 数据库
- python - 多回归的导出失败,“不支持将多分类模型导出到 cpp”
- javascript - 我的烧瓶登录/注册功能有什么问题?
- python - Python数据框在特定条件下替换字符串
- java - UI 自动完成输入字段在 VNC 查看器中引发验证错误
- excel - 具有不同变量的标准模块中的VBA循环类模块?
- java - 我应该如何使用 Jackson 将包含一个对象的列表类型的对象属性转换为对象类型的属性?
- r - 如何使用 ggplot 绘制矩阵图