我正在尝试使用基于某些变量的curl 在 Stripe 中创建客户,但是当我将令牌分配给变量时,它在 Stripe 上给我一个错误,说它不存在。但是,如果我直接输入文本,它就会起作用。我如何使用该$TOKEN
变量,是否有什么东西改变了我没有意识到的值?
Michael$ curl https://api.stripe.com/v1/customers -u $access_token: -d source=tok_1CjvRiDZ5DqZ0yaUVWXXXXXX
{
"error": {
"code": "token_already_used",
"doc_url": "https://stripe.com/docs/error-codes/token-already-used",
"message": "You cannot use a Stripe token more than once: tok_1CjvRiDZ5DqZ0yaUVWXXXXXX.",
"type": "invalid_request_error"
}
}
Michael$ curl https://api.stripe.com/v1/customers -u $access_token: -d source=$TOKEN
{
"error": {
"code": "resource_missing",
"doc_url": "https://stripe.com/docs/error-codes/resource-missing",
"message": "No such token: \"tok_1CjvRiDZ5DqZ0yaUVWXXXXXX\"",
"param": "source",
"type": "invalid_request_error"
}
}
$TOKEN
像这样分配
OUTPUT="$(curl https://api.stripe.com/v1/tokens -u $access_token: -d customer=$external_customer_id)"
TOKEN="$(echo $OUTPUT | jq .id)"
答案1
jq
给出引用的输出,这适用于 JSON。
$ echo '{ "foo": "foobar" }' | jq .foo
"foobar"
引号最终成为 , 内容的一部分TOKEN
,并且在变量展开时不会被删除。 (那时他们只是普通角色。)
但是,有一个选项专门用于此目的:
--raw-output
/-r
:使用此选项,如果过滤器的结果是字符串,那么它将直接写入标准输出,而不是格式化为带引号的 JSON 字符串。这对于使 jq 过滤器与非基于 JSON 的系统对话非常有用。
所以,改用TOKEN="$(echo "$OUTPUT" | jq -r .id)"
吧。