2015-12-23 20 views
6

Đối với Braintree_PaymentMethod::create() chức năng, một trong những lựa chọn là:Trong Braintree có thể xác minh phương thức thanh toán trùng lặp cho chỉ một khách hàng thay vì toàn bộ kho tiền không?

'failOnDuplicatePaymentMethod' 
bool 

If this option is passed and the payment method has already been added to the Vault, the request will fail. This option will not work with PayPal payment methods. 

này dường như là một so sánh toàn cầu. tức là nếu thông tin thẻ tín dụng tồn tại trong kho lưu trữ bất kể id khách hàng thì điều này sẽ không thành công.

Có cách nào để kiểm tra các bản sao trên một khách hàng cụ thể không?

+0

Tôi đã liên hệ với bộ phận hỗ trợ về điều này ~ 2 năm trước và câu trả lời là không, nhưng nó chắc chắn đáng xem xét lại. – Evan

Trả lời

7

Tiết lộ đầy đủ: Tôi làm việc tại Braintree. Nếu bạn có thêm bất kỳ câu hỏi nào, vui lòng liên hệ support.

Bạn và Evan là chính xác: đây là cách duy nhất được tạo trước khi không thành công trùng lặp tạo ra bất kể khách hàng tạo ra. Bạn có thể đạt được những gì bạn đang cố gắng làm với tự động hóa của riêng bạn, tuy nhiên.

Để thực hiện việc này, chỉ cần thu thập credit card unique ids đã tồn tại từ the customer object. Sau đó, khi bạn create the new payment method, so sánh nó với các loại thẻ hiện có:

function extractUniqueId($creditCard){ 
    return $creditCard->uniqueNumberIdentifier; 
} 

$customer = Braintree_Customer::find('your_customer'); 
$unique_ids = array_map(extractUniqueId,$customer->creditCards); 

$result = Braintree_PaymentMethod::create(array(
    'customerId' => 'your_customer', 
    'paymentMethodNonce' => 'fake-valid-discover-nonce', 
)); 

if ($result->success) { 
    if(in_array(extractUniqueId($result->paymentMethod), $unique_ids)) { 
     echo "Do your duplicate logic"; 
    } else { 
     echo "Continue with your unique logic"; 
    } 
} 

Tùy thuộc vào những gì bạn muốn làm, bạn có thể xóa các phương thức thanh toán mới hoặc bất cứ điều gì khác mà bạn cần.

+0

Cảm ơn bạn đã trả lời đầy đủ! Bất kỳ thông tin chi tiết nào về lý do tại sao mỗi khách hàng không tồn tại? – Evan

+0

Không, ngoại trừ việc nói có rất nhiều cách để giải quyết các vấn đề như thế này. Trong việc phát hành các tính năng mới, chúng tôi luôn xem xét phản hồi từ sự hỗ trợ của Braintree. Hãy tiếp tục cho nó! :) –

+0

Cảm ơn câu trả lời Raymond! Vì vậy, đây là 'uniqueNumberIdentifier' một số loại băm chỉ trên số thẻ tín dụng? Hoặc tất cả dữ liệu bao gồm hết hạn? Có phải là người bán cụ thể không? – Revent

1

Kiểm tra với sự hỗ trợ Braintree - vẫn chưa sẵn out of the box:

Nếu bạn sử dụng failOnDuplicatePaymentMethod bất kỳ yêu cầu thêm thông tin phương thức thanh toán trùng lặp vào Vault sẽ thất bại.

Hiện tại, chúng tôi không có chức năng ngăn khách hàng thêm thẻ trùng lặp vào hồ sơ của họ trong khi vẫn cho phép thêm thẻ trùng lặp trong nhiều cấu hình. Nếu đây là điều bạn quan tâm, bạn sẽ phải xây dựng logic của riêng mình.

-1
// Search for customer in Braintree Vault 
try $braintree_result_find = Braintree_Customer::find($cust_id); 

// prepare Braintree sale, but do not execute (yet) 
$sale_array = array(
    'amount' => $amt, 
    // other braintree Parameters 
    'options' => array(
     'submitForSettlement' => true, 
     'storeInVaultOnSuccess' => $save_cc_chk_bool 
    ) 
); 

// customer does not yet exist in Braintree Vault 
if (!isset($braintree_result_find) || !$braintree_result_find) 
    $sale_array["customer"]['id'] = $cust_id; 
// customer does exist in Braintree Vault 
else 
    $sale_array['customerId'] = $cust_id; 

$braintree_result_sale = Braintree_Transaction::sale($sale_array); 
0

@Raymond Berg, tôi thực hiện thay đổi soem trong mã của bạn, Đây là mã Cập nhật:
1. đã qua sử dụng foreach thay vì in_array
2. Cũng xóa các thẻ bổ sung Nếu phát hiện trùng lặp

$customer = Braintree_Customer::find('your_customer'); 
$unique_ids = array_map(extractUniqueId,$customer->creditCards); 

$result = Braintree_PaymentMethod::create(array(
    'customerId' => 'your_customer', 
    'paymentMethodNonce' => 'fake-valid-discover-nonce', 
)); 

if ($result->success) { 
    $cardAlreadyExist = false; 
$currentPaymentMethod = $this->extractUniqueId($result->paymentMethod); 
//The in_array function was not working so I used foreach to check if  card identifier exist or not 
    foreach ($unique_ids as $key => $uid) { 
     if($currentPaymentMethod == $uid->uniqueNumberIdentifier) 
     { 
      $cardAlreadyExist = true; 
//Here you have to delete the currently added card 
      $payment_token = $result->paymentMethod->token; 
      Braintree_PaymentMethod::delete($payment_token); 
     } 
} 


    if($cardAlreadyExist) { 
     echo "Do your duplicate logic"; 
    } else { 
     echo "Continue with your unique logic"; 
    } 

} 
+0

Có lỗi cú pháp trong mã, –

+0

@ harishsharma Vui lòng bật báo cáo lỗi php của bạn và bạn có thể sửa lỗi cú pháp. Ngoài ra, hãy đăng lỗi cú pháp trong nhận xét. tôi đã không nhìn thấy và lỗi cú pháp? –

+0

'if ($ cardAlreadyExist)) {' chk dòng này, –

Các vấn đề liên quan