Laravel Cashier(Stripe) createAsStripeCustomer函数调用报错求助
createAsStripeCustomer()参数错误的问题 看起来你遇到的问题核心是传递给createAsStripeCustomer()的参数格式不对,而不是单纯的API版本不兼容,咱们一步步来理清楚:
1. 先排查最可能的原因:Android端传递的不是原始Stripe令牌
你提到传入的是Android端生成的$token,但报错里的mCard、mCreated这些字段,明显是Stripe Android SDK里Token对象的内部属性(Java/Kotlin的字段命名风格)——这说明你大概率把整个Token对象序列化(比如转成JSON再转成数组)传过来了,而不是提取出原始的令牌字符串(格式一般是tok_xxxxxxxxx)。
正确的做法是在Android端,从Stripe生成的Token对象里调用getId()方法,拿到纯字符串格式的令牌,再传递给后端。比如Android端代码大概是这样:
Stripe.createToken(card, new TokenCallback() { @Override public void onSuccess(Token token) { String stripeTokenId = token.getId(); // 这才是要传给后端的内容 // 把stripeTokenId发送到你的Laravel后端 } @Override public void onError(Exception error) { // 处理错误 } });
2. 验证后端接收的参数格式
在调用createAsStripeCustomer()之前,先打印一下你接收到的$token:
dd($token);
如果输出是一个包含mCard、mId等键的数组/对象,那肯定是错的;正确的应该是类似tok_123456789abcdef的字符串。
3. 正确调用createAsStripeCustomer()的方式
当你拿到正确的令牌字符串后,需要把它放到数组的source键里传给方法(Cashier v9的要求):
$user->createAsStripeCustomer([ 'source' => $valid_stripe_token_string ]);
4. 关于API版本兼容性的补充
Laravel Cashier v9.0对应的Stripe API版本是2019-02-19,如果你Android端用的是较新的Stripe SDK(比如支持PaymentMethod API的版本),可能会遇到令牌类型不匹配的问题。不过先解决上面的参数格式问题,如果还是报错,再考虑:
- 要么在Android端切换回生成传统Token的方式(如果SDK支持的话);
- 要么考虑升级Cashier版本,但Laravel 5.7最高兼容到Cashier v10,升级前要仔细看官方迁移文档,避免依赖冲突。
先按上面的步骤排查,应该能解决这个参数错误的问题。
内容的提问来源于stack exchange,提问作者Zoka

