You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

技术疑问

  1. 如何修复“商家账户未确认邮箱”错误?
  2. 沙箱或生产环境中,PayPal商家账户是否需要额外验证设置?
  3. 该问题是否与Client ID或PayPal账户类型相关?

错误截图

Vendor account does not have a confirmed email - image


问题解答

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:03:13