PHP集成PayPal API提示传入令牌不存在问题排查
问题原因
调用接口返回The token passed in was not found in the system是PayPal环境不匹配导致的:
- 获取访问令牌的代码调用的是沙箱测试环境接口
https://api.sandbox.paypal.com/v1/oauth2/token,生成的token仅在沙箱环境有效 - 后续发起支付请求时,你调用的是正式生产环境接口
https://api.paypal.com/v1/payments/payment
PayPal沙箱和生产环境的凭证、token完全隔离,生产环境无法识别沙箱生成的token,就会抛出该错误。
修复方法
根据当前使用场景统一两个接口的环境域名即可:
- 开发调试阶段:把支付请求的接口地址改为沙箱地址,和获取token的环境保持一致
curl_setopt($ch, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/payments/payment");
- 正式上线阶段:把获取token的接口地址替换为生产环境地址
https://api.paypal.com/v1/oauth2/token,同时确认代码中配置的$PAYPAL_CLIENT_ID和$PAYPAL_SECRET是生产环境的应用凭证,不要混用沙箱凭证。
其他优化建议
- 生产环境不要设置
CURLOPT_SSL_VERIFYPEER => false,该配置会绕过SSL证书校验,存在中间人攻击的安全风险,正式环境请开启该选项并配置正确的CA证书路径。 - 不建议直接拼接字符串生成JSON请求体,若传入参数包含双引号、特殊字符会导致JSON格式解析失败,推荐先构造PHP数组,再通过
json_encode()函数生成合法的请求JSON内容。 - 你当前使用的v1/payments是PayPal旧版接口,官方已逐步推进弃用流程,长期使用建议迁移到最新的V2版本支付接口。
内容的提问来源于stack exchange,提问作者Amy
相关产品推荐
相关产品推荐

