2013-04-14 63 views
5

Tôi đang làm việc trên một tích hợp Stripe và tôi bối rối bởi các phản hồi thực tế tôi nhận được từ API PHP. Tôi bắt đầu tin rằng tham chiếu API là chính xác và phản hồi sẽ là một chuỗi JSON như được hiển thị cho mỗi phương thức. Tôi nhanh chóng phát hiện ra những khác biệt đáng kể. Thông thường, trường id bị thiếu trong phản hồi JSON. Ngoài ra, phản ứng có vẻ là một chuỗi, một vật thể, và có lẽ một số cấu trúc khác, tất cả cùng một lúc.Cấu trúc của phản ứng phương thức API PHP API là gì?

Đây là mã gỡ lỗi của tôi. Tôi đang sử dụng thư viện Stripe PHP mới nhất, phiên bản 1.7.15.

function var_dump_ret($mixed=null) 
{ 
    ob_start(); 
    var_dump($mixed); 
    $content=ob_get_contents(); 
    ob_end_clean(); 
    return($content); 
} 

$token=$_POST['stripeToken']; 
$customer=Stripe_Customer::create(array(
    "card"=>$token, 
    "plan"=>"agency") 
); 

$custVarDump=var_dump_ret($customer); 
$cDecoded=json_decode($customer); 
$Debug="Invidual attributes of JSON decoded customer object:"._EOL; 
$Debug.="object:".$cDecoded->object._EOL; 
$Debug.="created:".$cDecoded->created._EOL; 
$Debug.="id:".$cDecoded->id._EOL; 
$Debug.="livemode:".$cDecoded->livemode._EOL; 
$Debug.="description:".$cDecoded->description._EOL; 
$Debug.="active_card.object:".$cDecoded->active_card->object._EOL; 
$Debug.="active_card.last4:".$cDecoded->active_card->last4._EOL; 
$Debug.="active_card.type:".$cDecoded->active_card->type._EOL; 
$Debug.="active_card.exp_month:".$cDecoded->active_card->exp_month._EOL; 
$Debug.="active_card.exp_year:".$cDecoded->active_card->exp_year._EOL; 
$Debug.="active_card.fingerprint:".$cDecoded->active_card->fingerprint._EOL; 
$Debug.="active_card.country:".$cDecoded->active_card->country._EOL; 
$Debug.="active_card.name:".$cDecoded->active_card->name._EOL; 
$Debug.="active_card.address_line1:".$cDecoded->active_card->address_line1._EOL; 
$Debug.="active_card.address_line2:".$cDecoded->active_card->address_line2._EOL; 
$Debug.="active_card.address_city:".$cDecoded->active_card->address_city._EOL; 
$Debug.="active_card.address_state:".$cDecoded->active_card->address_state._EOL; 
$Debug.="active_card.address_zip:".$cDecoded->active_card->address_zip._EOL; 
$Debug.="active_card.address_country:".$cDecoded->active_card->address_country._EOL; 
$Debug.="active_card.cvc_check:".$cDecoded->active_card->cvc_check._EOL; 
$Debug.="active_card.address_line1_check:".$cDecoded->active_card->address_line1_check._EOL; 
$Debug.="active_card.address_zip_check:".$cDecoded->active_card->address_zip_check._EOL; 
$Debug.="email:".$cDecoded->email._EOL; 
$Debug.="delinquent:".$cDecoded->delinquent._EOL; 
//$Debug.="subscription:".$cDecoded->subscription._EOL; 
$Debug.="discount:".$cDecoded->discount._EOL; 
$Debug.="account_balance:".$cDecoded->account_balance._EOL; 
$Debug.="unaltered response from Stripe_Customer::create:"._EOL.$customer._EOL. 
    "var dump of response:"._EOL.$custVarDump._EOL. 
    "print_r of json_decode of response:"._EOL.print_r($cDecoded,true)._EOL; 

file_put_contents(_LOGFILE,$Debug,FILE_APPEND); 

Dưới đây là nội dung của tệp gỡ lỗi cho thuộc tính invidual của đối tượng khách hàng được giải mã JSON. Khi được thực hiện, mã đã đăng thông báo.

Chú ý: tài sản không xác định: stdClass :: $ id trong sọc/subscription.php trên đường dây 51

Cũng lưu ý rằng tôi đã phải nhận xét ra dòng thêm 'đăng ký' vào chuỗi debug do gây tử vong lỗi liên quan đến stdClass.

object:customer 
created:1365951909 
id: 
livemode: 
description: 
active_card.object:card 
active_card.last4:4242 
active_card.type:Visa 
active_card.exp_month:7 
active_card.exp_year:2013 
active_card.fingerprint:WTXPLgKDCXyp9xpD 
active_card.country:US 
active_card.name:charlie 
active_card.address_line1: 
active_card.address_line2: 
active_card.address_city: 
active_card.address_state: 
active_card.address_zip: 
active_card.address_country: 
active_card.cvc_check:pass 
active_card.address_line1_check: 
active_card.address_zip_check: 
email: 
delinquent: 
discount: 
account_balance:0 

Đáng chú ý nhất là ID khách hàng. Nó không tồn tại trong phản hồi JSON. Tuy nhiên, như đã thấy trong một số chương trình ví dụ Stripe, nó có thể được truy cập bằng cách sử dụng $ customer-> id. Hơn nữa, đầu ra var_dump cho biết nhiều hơn các thuộc tính có mặt trong một cấu trúc mà tôi không thể hiểu được. Toàn bộ tệp gỡ lỗi là http://www.helioza.com/stripe/debug.txt. Tôi chỉ hiển thị phương thức tạo khách hàng, nhưng tôi đang gặp phải các vấn đề tương tự với hóa đơn và không thể tìm thấy id hóa đơn ở bất kỳ đâu trong các câu trả lời sắp tới của Stripe_Invoice :: all hoặc Stripe_Invoice ::.

Câu hỏi

1) Làm cách nào giá trị được trả về bởi Stripe_Customer :: tạo cả chuỗi và đối tượng cùng một lúc?

2) Tôi có thể tìm tài liệu mô tả các giá trị trả về của phương thức API, bao gồm cách truy cập từng thuộc tính?

Trả lời

6

Mặc dù API của Stripe trả về JSON ở cấp HTTP (nghĩa là thư thực sự được gửi qua dây), thư viện Stripe PHP đã xử lý giải mã phản hồi JSON và biến nó thành đối tượng PHP.

Không cần phải chuyển giá trị trả về từ Stripe_Customer::create đến json_decode - trên thực tế, cho rằng nó đã là đối tượng, tôi không hiểu rõ json_decode cũng đủ để hiểu tại sao điều đó không chỉ gây lỗi.

Trong mọi trường hợp, bạn chỉ nên tương tác trực tiếp với đối tượng khách hàng được trả về, ví dụ: $customer->description hoặc $customer->active_card->cvc_check. Bạn có thể thấy điều này, ví dụ: trong Stripe tutorial.

+0

Cảm ơn Evan. Điều đó giúp với một số câu đố của tôi. Tôi vẫn không hiểu tại sao tôi có thể lặp lại đối tượng và nhận được văn bản hợp lệ. Thông thường, PHP chỉ báo cáo 'đối tượng' và từ chối lặp lại bất cứ điều gì khác. Tôi vẫn đang đấu tranh để tìm ra cấu trúc của câu trả lời. Thử và sai mất một thời gian dài. Nó chắc chắn sẽ hữu ích nếu có một tài liệu của cấu trúc trả về cho mỗi phương thức. – Helioza

+3

Tất cả các thuộc tính của đối tượng được bảo vệ đó là lý do tại sao bạn không nhìn thấy chúng. PHP SDK thực sự triển khai giao diện PHP của 'ArrayAccess' cho phép bạn truy cập dữ liệu cần thiết thông qua' $ response ['some_key'] ', trong đó các khóa là tất cả các tùy chọn được liệt kê tại https://stripe.com/docs/ api? lang = php # phí. Nó khá dễ dàng theo cách đó. –

2

Với sự giúp đỡ của Evan, tôi đã tìm ra câu trả lời hoàn chỉnh cho câu hỏi thứ hai. Như Evan đã nói, điều quan trọng là xử lý cấu trúc được trả về bởi thư viện Stripe PHP như một đối tượng. Các phần tử được tham chiếu theo các quy tắc ngầm định trong cấu trúc JSON của đáp ứng phương thức thô.

Vì tôi gặp sự cố khi đọc JSON phức tạp, đặc biệt khi độ sâu thụt lề tăng lên, tôi đã viết một kịch bản biến mỗi phần tử của cấu trúc JSON thành tham chiếu PHP hoàn chỉnh, như $ obj-> arr [index] -> obj2, và vân vân. Tại www.helioza.com/decoders/explain-json.php bạn có thể dán trong một chuỗi JSON, như các ví dụ trong tham chiếu API Stripe và nhận danh sách đầy đủ mã PHP tham chiếu từng phần tử.

Cập nhật 5/27/2014

Nhìn vào những ý kiến ​​khác nhau có vẻ như với tôi rằng có một số bối cảnh ẩn tại nơi làm việc ở đây. Hầu hết là trên đầu của tôi, do đó, để được rõ ràng về những gì tôi làm và không biết, đây là cách tôi giải thích các tài liệu API Stripe.

Xem ví dụ về cách tạo khách hàng mới, tùy chọn mã PHP. Sau đây là một phần của phản hồi cuộc gọi API.

EXAMPLE RESPONSE 
{ 
    "object": "customer", 
    "created": 1401219085, 
    "id": "cus_474RjipEtz2ff7", 
    "livemode": false, 
    "description": "[email protected]", 
    "email": null, 
    "delinquent": false, 
    "metadata": { 
    }, 
    "subscriptions": { 
    "object": "list", 
    "total_count": 0, 
    "has_more": false, 
    "url": "/v1/customers/cus_474RjipEtz2ff7/subscriptions", 
    "data": [ 

    ] 
    }, 

Theo kinh nghiệm của tôi, mọi phản hồi API web là phản hồi HTTP. Một nơi nào đó các tài liệu Stripe nói nó là POST. Vì vậy, tôi nhìn vào phản ứng ở trên và tôi thấy JSON, tương thích với HTTP. Trang doc không thực sự xác định phản hồi là JSON hoặc bất kỳ thứ gì khác. Nếu đây không phải là JSON, thì hãy xác định nó và cho tôi biết làm thế nào bạn biết điều đó. Gọi nó là StdClass không giúp ích gì vì hướng dẫn sử dụng PHP khá lúng túng về chủ đề đó và không xác định cấu trúc của lớp.

Đây thực sự là bản chất của câu hỏi ban đầu của tôi. Bản chất của phản ứng khi Stripe đã ghi lại nó là gì? Có vẻ như JSON được gửi qua HTTP. Tôi muốn được giáo dục.

Có, tôi nhận được kết quả tôi muốn bằng cách xử lý thư viện Stripe trả về làm đối tượng. Nhưng các giải pháp sách dạy nấu ăn không tiếp tục hiểu biết của bất kỳ ai. Các câu trả lời có giá trị nhất trên SO là giải thích.

+0

Bạn hoàn toàn không nên xem JSON * - SDK PHP của Stripe đảm bảo bạn đang làm việc với các đối tượng PHP 'stdClass', đơn giản và đơn giản. Tôi sẽ đề nghị chấp nhận câu trả lời được đăng bởi @EvanBroder. – Madbreaks

+0

Về cơ bản, tôi đang xem JSON vì đó là những gì có sẵn trong tham chiếu API của Stripe để ghi lại các tham số trả về. Nếu bạn (@Madbreaks) biết về một tài liệu tham khảo tốt hơn, xin vui lòng gửi một liên kết đến nó. – Helioza

+3

@Madbreaks Điều này không đúng. Stripe PHP SDK không sử dụng các đối tượng StdClass, nó có lớp Stripe_Customer riêng của nó. Hãy thử thêm một thuộc tính mới vào đối tượng Stripe_Customer và bạn sẽ gặp phải các lỗi nghiêm trọng, đó không phải là một đối tượng StdClass làm gì. –

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