如何使用php在条带支付网关中的同一客户中添加多张卡

时间:2017-03-10 04:06:44

标签: php stripe-payments

我在测试模式下实现了条带支付。这里我得到了一个错误,比如再次使用相同的令牌。是否有任何不同的方式来添加多张牌。 或者我需要在一个单独的页面中调用retrive函数,以便相同的令牌冲突永远不会再来。我应该如何设置一个卡默认值。

public function createToken($data)
{

        $TokenResult=Token::create(array(
            "card" => array(
            "name" => $data['name'],
            "number" => $data['card_number'],
            "exp_month" => $data['month'],
            "exp_year" => $data['year'],
            "cvc" => $data['cvc']
            )));
        //echo "<pre>";;
        //print_r($TokenResult);
        $this->token=$TokenResult['id'];//store token id into token variable
        $this->chargeCard($this->token);    //call chargecard function via passing token id
}
/*
* function to create customer
*/
public function createCustomer($data,$token=null)//pass form data and token id
{
    $customer=Customer::create(array(
    "email"=>$data['email'],
    "description" => $data['name'],
    "source" => $token // obtained with Stripe.js
    ));
    $customerId=$customer['id'];
    $this->retriveCustomer($customerId,$token);
}
/*
* function to retrive current customers for adding multiple cards to same customers*/
public function retriveCustomer($customerid,$token)
{
    echo $this->token;
    //die('here');
    $retriveResult=Customer::retrieve($customerid);
    $retriveResult->sources->create(array("source" =>$this->token));
    return $retriveResult;
}

3 个答案:

答案 0 :(得分:1)

首先,请注意,除非您获得PCI认证且允许直接操作卡数据,否则您永远不应该在服务器端代码中访问卡号。

应通过CheckoutElements在客户端创建卡片令牌。您的服务器应该只处理客户端创建的卡令牌,而不应该处理PCI敏感信息(卡号和CVC)。这将大大降低PCI合规性的负担,并使您符合PCI SAQ A的资格。

在PHP中,这是您add a card对现有客户对象的方式:

$customer = \Stripe\Customer::retrieve("cus_...");
$card = $customer->sources->create(array(
    "source" => $token  // token created by Checkout or Elements
));

答案 1 :(得分:0)

我认为你不需要在添加新卡时创建令牌。当您更新某张卡时它会有所帮助。因此,添加流程与您为第一张卡创建的流程相同。

我不知道你正在使用哪个条纹版本,我使用的是旧版本:

$card_array = array(
               'card' => array(
               'number' => $number,
               'exp_month' => $exp_month,
               'exp_year' => $exp_year,
               'cvc' => $cvc,
               'name' => $name
               )
           );


$card_obj = $this->setData("\Stripe\Customer", "retrieve", $customer_id, TRUE);
$card =  $card_obj->sources->create($card_array);

答案 2 :(得分:0)

Stripe的文档没有解释很多更细微的过程,因此您必须进行大量测试。

假设您有一个客户对象$ cu,其中包含您通过结帐或使用的任何令牌:

$card = $cu->sources->create(['source'=>$token]);

将向客户添加卡。它只是将卡添加到列表中。随后的通话会将卡片添加到列表中。请注意,它不会检查重复项,因此同一张卡可以多次出现在列表中。它还不会将新卡设置为活动卡。要将卡设置为默认卡(或激活卡),请使用

$cu->default_source = $card
$cu->save();

使用较旧的卡界面:

$cu->card = $token;
$cu->save();

新卡将替换默认卡。它不会使以前的默认卡无效。它将删除当前默认值,并使新卡成为活动默认值。如果您一次只允许将一张卡附加到客户,那么卡界面是最简单的。