Android集成PayPal遇错误:商家账户邮箱未确认及账户无效问题排查
PayPal Android集成支付错误排查与解决
问题概述
我用Java给Android应用集成PayPal,集成完成后支付时遇到错误:
PayPal Payment Failed - Vendor account does not have a confirmed email
API响应错误详情:
{ "name": "PAYEE_ACCOUNT_INVALID", "message": "Payee account is invalid." }
测试步骤
- 沙箱测试:使用沙箱Client ID,用测试Visa卡4242 4242 4242 4242发起支付,同样报错
- 生产环境测试:
- 使用生产Client ID,用HDFC卡支付,问题依旧
- 登录PayPal账户后无法定位原因
集成代码
package com.example.paypalproject; import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.util.UUID; import java.math.BigDecimal; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; 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; public class MainActivity extends AppCompatActivity { private static final String PAYPAL_CLIENT_ID = ""; // sandbox client id i have used here private static final int PAYPAL_REQUEST_CODE = 123; private String transactionReferenceId; private TextView paymentStatus; private ActivityResultLauncher<Intent> paymentResultLauncher; private PayPalConfiguration payPalConfig; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); paymentStatus = findViewById(R.id.payment_status); Button paypalpayButton = findViewById(R.id.paypalpay_button); // Initialize PayPal configuration payPalConfig = new PayPalConfiguration() .environment(PayPalConfiguration.ENVIRONMENT_SANDBOX) // Use sandbox for testing .clientId(PAYPAL_CLIENT_ID); // Start PayPal service Intent intent = new Intent(this, PayPalService.class); intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, payPalConfig); startService(intent); // Generate unique transaction reference ID transactionReferenceId = "T" + UUID.randomUUID().toString().substring(0, 8); Log.d("UPI Payment", "transactionReferenceId: " + transactionReferenceId); // Set onClickListener for the PayPal pay button paypalpayButton.setOnClickListener(v -> initiatePayPalPayment()); } private void initiatePayPalPayment() { // Create a PayPal payment object double inrAmount = 1; // Amount in INR double conversionRate = 86.39; double usdAmount = inrAmount / conversionRate; PayPalPayment payment = new PayPalPayment(new BigDecimal(usdAmount), "USD", "Live Payment", PayPalPayment.PAYMENT_INTENT_SALE); // Create an intent for PayPal payment Intent intent = new Intent(this, PaymentActivity.class); intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, payPalConfig); intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payment); // Launch PayPal payment activity startActivityForResult(intent, PAYPAL_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PAYPAL_REQUEST_CODE) { if (resultCode == RESULT_OK && data != null) { PaymentConfirmation confirmation = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION); if (confirmation != null) { try { // Log and handle the payment confirmation String paymentDetails = confirmation.toJSONObject().toString(4); Log.d("PayPalPayPalPayPal", "Payment Confirmation: " + paymentDetails); paymentStatus.setText("Payment successful!"); Toast.makeText(this, "Payment successful!", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Log.e("PayPalPayPalPayPal", "Error: " + e.getMessage()); } } } else if (resultCode == RESULT_CANCELED) { paymentStatus.setText("Payment canceled."); Toast.makeText(this, "Payment canceled.", Toast.LENGTH_SHORT).show(); } else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID) { paymentStatus.setText("Invalid Payment."); Toast.makeText(this, "Invalid Payment.", Toast.LENGTH_SHORT).show(); } } } @Override protected void onDestroy() { stopService(new Intent(this, PayPalService.class)); super.onDestroy(); } }
技术疑问
- 如何修复“商家账户未确认邮箱”错误?
- 沙箱或生产环境中,PayPal商家账户是否需要额外验证设置?
- 该问题是否与Client ID或PayPal账户类型相关?
错误截图

问题解答
1. 修复“商家账户未确认邮箱”错误
- 沙箱环境:登录PayPal开发者后台的沙箱账户管理页面,找到对应的商家沙箱账户,检查邮箱状态。如果未确认,点击账户详情里的“确认邮箱”按钮,然后在开发者平台的沙箱邮件收件箱中点击确认链接完成验证。
- 生产环境:登录你的PayPal生产商家账户,进入账户设置-通知设置,查看邮箱是否已验证。如果未验证,PayPal会发送确认邮件到注册邮箱,点击邮件内的链接完成验证即可。
2. 沙箱/生产环境的额外验证要求
- 沙箱环境:除邮箱确认外,无需额外验证即可接收测试支付;若要模拟真实场景,可给沙箱商家账户添加测试用的银行账户或信用卡信息。
- 生产环境:必须完成邮箱验证,此外还需提交个人/企业身份信息、证件完成账户实名认证,否则无法接收真实支付,甚至会被限制账户功能。
3. 与Client ID/账户类型的关系
- Client ID:如果沙箱Client ID对应未验证邮箱的沙箱商家账户,或生产Client ID对应未验证的生产商家账户,都会触发该错误。需确认Client ID所属账户的邮箱验证状态。
- 账户类型:只有商家账户(Business Account)才能接收支付,若使用个人账户(Personal Account)的Client ID集成收款,也会出现“收款人账户无效”的类似错误。需检查账户类型,确保沙箱和生产环境都使用对应商家账户。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

