使用自定义cURL和PHP代码进行条带收费时的错误

时间:2015-09-07 03:24:16

标签: php api curl stripe-payments

经过3天坚实的研究,并尝试我的absoloute最好地解决手头的问题,我已经到了没有成功的地步,并且不得不意识到这可能是我应该没有尝试过的东西!在我个人尝试失败的情况下,我不得不求助于在初学阶段学习阶段需要一些建议和帮助的专家。

我尝试使用条带提供的PHP代码,但是由于我们在网站上使用的复杂自定义表单以及我们的网站流量很多内部我们需要一种方式来向条形缓存发送付款而不是整合全新php支付流程可以处理来自内部客户端的付款,所以我认为我知道一点cURL,因为在网站流程中已经使用了几个cURL和PHP API调用。

我试过条纹的cURL如下:

    $headers = array(
    'Authorization: Bearer sk_test_my_test_key_here',
);
$ch = curl_init("https://api.stripe.com/v1/charges -H Content-Type=application/x-www-form-urlencoded -u sk_test_my_test_key: -d source[object]=card -d source[number]=4242424242424242 -d source[exp_month]=08 -d source[exp_year]=18 -d source[cvc]=123 -d amount=250 -d currency=gbp -d description=Testing ");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo $response;
curl_close($ch);

{“error”:{“type”:“invalid_request_error”,“message”:“无法识别的请求网址(POST:/ v1 / charge%20-H%20Content-Type = application / x-www-form-urlencoded %20-U%20sk_test_keyP:%20-d%20source [对象] =卡%20-d%20source [数字] = 4242424242424242%20-d%20source [exp_month] = 08%20-d%20source [exp_year] = 18%20-d%20source [cvc] = 123%20-d%20amount = 250%20-d%20currency = gbp%20-d%20description = Testing)。请参阅https://stripe.com/docs或我们可以提供帮助https://support.stripe.com/“。 }}

我试过阅读文档,但没有解释我得到的错误,我认为问题的最大部分是我没有足够的经验来确切知道要研究的内容以及像你这样的关键短语专家知道要抬头。

我已尝试使用和不使用-H Content-Type included并仍然遇到相同的问题但是如果我要将curl复制并粘贴到命令行并使用

从命令执行
curl.exe https://...................

然后消息成功,我得到了我想要回复说卡已被收费的回复。

also tried  `$string = rawurlencode($data) and then http_build_query` on the $string

这是我尝试的足够的例子:

<?php
$headers = array(
    'Authorization: Bearer sk_test_removed_for_stackoverflow',
);

// create curl resource 
$ch = curl_init(); 

// set url 
curl_setopt($ch, CURLOPT_URL, "https://api.stripe.com/v1/charges -u sk_test_removed: -d source[object]=card -d source[number]=4242424242424242 -d source[exp_month]=08 -d source[exp_year]=18 -d source[cvc]=123 -d amount=250 -d currency=gbp -d description=Test "); 

也尝试过这样:

// set url 
curl_setopt($ch, CURLOPT_URL, "https://api.stripe.com/v1/charges -u sk_test_removed: -d source[object]=$card -d source[number]=$number -d source[exp_month]=$expdate -d source[exp_year]=$expmonth -d source[cvc]=$ccv -d amount=$amount -d currency=gbp -d description=$sale "); 

// set headers
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

//return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// $output contains the output string 
$output = curl_exec($ch); 
print($output);

// close curl resource to free up system resources 
curl_close($ch);
?>

我现在老实说处于失败的一端,对于任何能够帮助我并帮助我解决这个问题的人来说,我会非常感激,经过3个艰难的痛苦日子,我真的不知道该怎么办。

作为一名新手学习者,在重新搜索问题时,很难确切知道要搜索什么。我花了3天时间在谷歌上发布了2条警告消息说他们认为我发送的自动查询是因为研究完了多少次!所以任何建议和帮助都会对此有很大帮助。

全部谢谢。

2 个答案:

答案 0 :(得分:6)

使用Stripe PHP bindings不是可能的解决方案吗?这会简单得多:

\Stripe\Stripe::setApiKey("sk_test_...");

// Token creation. In production this should be done client-side via Stripe.js or Checkout.
$token = \Stripe\Token::create([
  "card" => array(
    "number" => "4242424242424242",
    "exp_month" => 8,
    "exp_year" => 18,
    "cvc" => "123"
  )
]);

// Charge creation
try {
    $charge = \Stripe\Charge::create([
      "amount" => 250,
      "currency" => "gbp",
      "source" => $token->id,
      "description" => "Testing"
    ]);
} catch(...) {
    // Handle possible failures. See https://stripe.com/docs/api/php#errors
}

如果你真的坚持使用卷曲,这应该有效:

$apiKey = 'sk_test_...';
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => "https://api.stripe.com/v1/charges",
    CURLOPT_POST => 1,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . $apiKey
    ],
    CURLOPT_POSTFIELDS => http_build_query([
        "amount" => 250,
        "currency" => 'gbp',
        "source" => array(
            "object" => "card",
            "number" => "4242424242424242",
            "exp_month" => 8,
            "exp_year" => 18,
            "cvc" => "123"
        ),
        "description" => "Testing"
    ])
]);
$resp = curl_exec($curl);
curl_close($curl);

注意:

  1. 通过Stripe.jsCheckout自行提供卡片详细信息而无需客户端标记,会引发PCI compliance的问题,但我认为您已了解这一点。

  2. 使用绑定可以更轻松地通过异常处理电荷创建失败。有关详细信息,请参阅the documentation

答案 1 :(得分:-2)

1 step :
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script src="https://js.stripe.com/v2/stripe-debug.js" type="text/javascript"></script>
<script type="text/javascript">



Stripe.setPublishableKey('pk_test_gETzDYx9EWwlU5ZQYvU78OWv');
</script>


          <form action="" method="POST">


<script
    src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="pk_test_gETzDYx9EWwlU5ZQYvU78OWv"
    data-amount="895367"
    data-name="GMR"
    data-description="98000.00"
    data-image="https://d1p3fwm9yfjbr.cloudfront.net/home-pagenew/images/gmr_logo.jpg"
    data-locale="auto">
  </script>
</form>


2nd step :








function curl_stripe($parameters){
            $username="sk_test_TmbzPtTg1KVJz6Y87D0nwaUJ"; 
            $password= "";
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL,$path);
            curl_setopt($ch, CURLOPT_TIMEOUT, 1024); //timeout after 30 seconds
            curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS,"amount=".$parameters['amount']."&currency=usd&source=".$parameters['token']."&metadata[order_id]=".$parameters['order_id']);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
            curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
            $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);   //get status code
            $result=curl_exec ($ch);
            curl_close ($ch);
        return $response = json_decode($result);
    }



$parameter = array('path' =>'https://api.stripe.com/v1/charges','token'=>$_POST['stripeToken'],'amount'=>5986,'order_id'=>99999);

$this->curl_stripe($parameters)