Hướng dẫn chức năng thanh toán trong laravel
Laravel Cashier cung cấp một interface dễ hiểu, rõ ràng cho các dịch vụ thanh toán subscription trực tuyến như Stripe's. Nó gần như đã xử lý tất cả các đoạn code mà bạn đang sợ viết mà có liên quan đến các phần thanh toán subscription. Ngoài quản lý subscription cơ bản, Cashier cũng có thể xử lý cả các phiếu giảm giá, chuyển đổi subscription, đăng ký "nhiều" subscription, thời hạn hủy bỏ và thậm chí là tạo các file hóa đơn PDF. Show
Cập nhật CashierKhi nâng cấp lên phiên bản mới của Cashier, điều quan trọng là bạn phải xem kỹ hướng dẫn nâng cấp. {note} Để tránh các thay đổi nghiêm trọng, Cashier sẽ sử dụng một phiên bản API Stripe cố định. Cashier 12 sẽ sử dụng phiên bản API Stripe
Cài đặtĐầu tiên, thêm package Cashier cho Stripe với Composer:
{note} Để đảm bảo Cashier xử lý đúng tất cả các event của Stripe, hãy nhớ . Database MigrationsService provider của Cashier sẽ đăng ký thư mục migration database của chính nó, vì vậy hãy nhớ migration cơ sở dữ liệu của bạn sau khi cài đặt package. Việc migration Cashier sẽ thêm một số cột vào bảng
14 của bạn cũng như tạo một bảng
15 mới để chứa tất cả các đăng ký của khách hàng của bạn:
Nếu bạn cần ghi đè các migration đi kèm với package Cashier, bạn có thể export chúng bằng lệnh Artisan
16:
Nếu bạn muốn ngăn việc migration của Cashier chạy, bạn có thể sử dụng phương thức
17 được Cashier cung cấp. Thông thường, phương thức này nên được gọi trong phương thức
18 trong
19 của bạn:
{note} Stripe khuyến cáo rằng bất kỳ cột nào được sử dụng để lưu trữ Stripe identifier phải phân biệt giữa chữ hoa và chữ thường. Do đó, bạn nên đảm bảo collation cho cột Cấu hìnhBillable ModelTrước khi sử dụng Cashier, hãy thêm trait
22 vào định nghĩa model của bạn. Trait này sẽ cung cấp các phương thức khác nhau cho phép bạn thực hiện các tác vụ thanh toán phổ biến, chẳng hạn như tạo subscription, áp dụng phiếu giảm giá hoặc cập nhật thông tin phương thức thanh toán:
Cashier sẽ giả định rằng billable model của bạn sẽ là class
23 đi kèm với Laravel. Nếu bạn muốn thay đổi điều này, bạn có thể chỉ định một model khác trong file
24 của bạn:
{note} Nếu bạn đang sử dụng model khác, khác với model
API KeysTiếp theo, bạn nên cấu hình key của Stripe trong file
24 của bạn. Bạn có thể lấy khóa API Stripe của bạn từ bảng điều khiển của Stripe.
Cấu hình loại tiềnĐơn vị tiền mặc định của Cashier là Đô la Mỹ (USD). Bạn có thể thay đổi loại tiền mặc định này bằng cách set biến môi trường
27:
Ngoài việc cấu hình đơn vị tiền tệ của Cashier, bạn cũng có thể chỉ định ngôn ngữ được sử dụng khi định dạng tiền tệ để hiển thị trong hóa đơn. Cashier sử dụng class
28 của PHP để set ngôn ngữ tiền tệ:
{note} Để sử dụng các ngôn ngữ khác, khác với ngôn ngữ LoggingCashier cho phép bạn chỉ định channel log sẽ được sử dụng khi ghi log tất cả các exception liên quan đến Stripe. Bạn có thể chỉ định channel log này bằng cách sử dụng biến môi trường
31:
CustomersLấy CustomersBạn có thể lấy ra một khách hàng bằng ID Stripe của họ thông qua phương thức
32. Điều này sẽ trả về một instance của Billable model:
0 Tạo CustomersĐôi khi, bạn có thể muốn tạo một Stripe customer mà không cần phải đăng ký. Bạn có thể thực hiện việc này bằng phương thức
33:
1 Khi customer đã được tạo trong Stripe, bạn có thể bắt đầu subscription. Bạn cũng có thể sử dụng mảng tùy chọn
34 để truyền vào bất kỳ tham số bổ sung nào mà được hỗ trợ bởi API Stripe:
2 Bạn có thể sử dụng phương thức
35 nếu bạn muốn trả về một đối tượng customer nếu billable đã là một customer trong Stripe:
3 Phương thức
36 có thể được sử dụng nếu bạn muốn trả về một đối tượng customer nhưng không chắc liệu billable đã là customer trong Stripe hay chưa. Phương thức này sẽ tạo ra một customer mới trong Stripe nếu customer đó chưa tồn tại:
4 Cập nhật CustomersĐôi khi, bạn có thể muốn cập nhật trực tiếp thông tin cho customer của Stripe. Bạn có thể thực hiện việc này bằng phương pháp
37:
5 Cổng thanh toánStripe cung cấp một cách dễ dàng để thiết lập một cổng thanh toán để customer của bạn có thể quản lý subscription, phương thức thanh toán và xem lại lịch sử thanh toán của họ. Bạn có thể chuyển hướng người dùng của bạn đến cổng thanh toán bằng phương pháp
38 từ một controller hoặc một route:
6 Mặc định, khi người dùng kết thúc việc quản lý subscription của họ, họ có thể muốn quay lại route
39 của ứng dụng của bạn. Bạn có thể cung cấp URL tùy biến mà người dùng sẽ được quay lại bằng cách truyền URL làm tham số cho phương thức
38:
7 Nếu bạn chỉ muốn tạo URL cho cổng thanh toán, bạn có thể sử dụng phương thức
41:
8 Phương thức thanh toánLưu phương thức thanh toánĐể tạo một subscription hoặc thực hiện tính phí "một lần" với Stripe, bạn sẽ cần lưu phương thức thanh toán và lấy identifier của phương thức đó từ Stripe. Cách tiếp cận được sử dụng theo mục đích khác nhau dựa trên việc bạn sẽ sử dụng phương thức thanh toán này cho việc thanh toán các subscription hay các khoản phí một lần, vì vậy chúng ta sẽ xem xét cả hai ví dụ bên dưới. Phương thức thanh toán cho SubscriptionKhi lưu trữ thẻ tín dụng cho khách hàng để sử dụng trong tương lai, API Setup Intent của Stripe sẽ phải được sử dụng để thu thập thông tin chi tiết về phương thức thanh toán của khách hàng. "Setup Intent" cho biết ý định tính phí phương thức thanh toán của khách hàng. Trait
22 của Cashier có chứa một
43 để dễ dàng tạo một Setup Intent mới. Bạn nên gọi phương thức này từ route hoặc controller sẽ hiển thị form thu thập chi tiết phương thức thanh toán cho khách hàng của bạn:
9 Sau khi bạn đã tạo xong Setup Intent và truyền nó đến view, bạn nên gắn secret của intent đó vào trong element sẽ thu thập phương thức thanh toán. Ví dụ: hãy xem xét form "cập nhật phương thức thanh toán" này:
0 Tiếp theo, thư viện Stripe.js có thể sử dụng element đó để gắn các element Stripe cần thiết vào form và thu thập chi tiết thanh toán của khách hàng một cách an toàn:
1 Tiếp theo, thẻ có thể được xác minh và một "identifier cho phương thức thanh toán" an toàn có thể được lấy ra từ Stripe bằng cách sử dụng phương thức
44 của Stripe:
2 Sau khi thẻ đã được Stripe xác minh, bạn có thể truyền kết quả identifier
45 vào ứng dụng Laravel của bạn, nơi nó có thể được lưu với thông tin khách hàng. Phương thức thanh toán này có thể được hoặc . Bạn cũng có thể sử dụng ngay identifier phương thức thanh toán này để . {tip} Nếu bạn muốn biết thêm thông tin về Setup Intent và cách thu thập chi tiết thanh toán của khách hàng, vui lòng . Phương thức thanh toán cho phíTất nhiên, khi thực hiện một khoản tính phí một lần đối với một phương thức thanh toán của khách hàng, chúng ta sẽ chỉ cần sử dụng một identifier phương thức thanh toán trong một lần duy nhất. Do các giới hạn của Stripe, bạn không thể sử dụng phương thức thanh toán mặc định của khách hàng cho các khoản tính phí một lần. Bạn phải cho phép khách hàng nhập chi tiết phương thức thanh toán của họ bằng thư viện Stripe.js. Ví dụ, hãy xem xét form sau:
3 Tiếp theo, thư viện Stripe.js có thể sử dụng element đó để gắn các element Stripe cần thiết vào form và thu thập chi tiết thanh toán của khách hàng một cách an toàn:
1 Tiếp theo, thẻ có thể được xác minh và một "identifier cho phương thức thanh toán" an toàn có thể được lấy ra từ Stripe bằng cách sử dụng :
5 Nếu thẻ được xác minh thành công, bạn có thể truyền
47 vào ứng dụng Laravel của bạn và xử lý tiếp . Lấy phương thức thanh toánPhương thức
48 trên instance Billable model sẽ trả về một collection các instance
49:
6 Để lấy phương thức thanh toán mặc định, phương thức
50 có thể được sử dụng:
7 Bạn cũng có thể lấy ra một phương thức thanh toán cụ thể thuộc sở hữu của một Billable model bằng cách sử dụng phương thức
51:
8 Xác định người dùng có phương thức thanh toán hay khôngĐể xác định xem một Billable model có phương thức thanh toán mặc định được gắn với tài khoản của họ hay không, hãy sử dụng phương thức
52:
9 Để xác định xem Billable model có ít nhất một phương thức thanh toán được gắn với tài khoản của họ hay không, hãy sử dụng phương thức
53:
0 Cập nhật phương thức thanh toán mặc địnhPhương thức
54 có thể được sử dụng để cập nhật thông tin về phương thức thanh toán mặc định của khách hàng. Phương thức này chấp nhận một identifier phương thức thanh toán của Stripe và sẽ gắn phương thức thanh toán mới làm phương thức thanh toán hóa đơn mặc định:
1 Để đồng bộ thông tin phương thức thanh toán mặc định của bạn với thông tin phương thức thanh toán mặc định của khách hàng trong Stripe, bạn có thể sử dụng phương thức
55:
2 {note} Phương thức thanh toán mặc định của khách hàng chỉ có thể được sử dụng để lập hóa đơn và tạo một subscription mới. Do những hạn chế từ Stripe, nó không thể được sử dụng cho các khoản tính phí một lần. Thêm phương thức thanh toánĐể thêm một phương thức thanh toán mới, bạn có thể gọi phương thức
56 trên một model billable user, và truyền identifier phương thức thanh toán:
3 {tip} Để tìm hiểu cách lấy identifier phương thức thanh toán, vui lòng xem lại . Xoá phương thức thanh toánĐể xóa một phương thức thanh toán, bạn có thể gọi phương thức
57 trên instance
49 mà bạn muốn xóa:
4 Phương thức
59 sẽ xóa tất cả thông tin về phương thức thanh toán cho một Billable model:
5 {note} Nếu người dùng có một subscription đang hoạt động, bạn nên ngăn họ xóa phương thức thanh toán mặc định của họ. SubscriptionsTạo SubscriptionĐể tạo một subscription, trước tiên hãy lấy ra một instance Billable model của bạn, thường là một instance của
23. Khi bạn đã lấy được instance của model, bạn có thể sử dụng phương thức
61 để tạo ra một subscription cho model:
6 Tham số đầu tiên được truyền cho phương thức
61 phải là tên của subscription. Nếu ứng dụng của bạn chỉ cung cấp một loại subscription duy nhất, bạn có thể gọi nó là
63 hoặc
64. Tham số thứ hai là gói cụ thể mà người dùng đang subscription. Giá trị này phải tương ứng với price identifier của gói trong Stripe. Phương thức
65, chấp nhận hoặc đối tượng Stripe
66, sẽ bắt đầu đăng ký subscription cũng như cập nhật cơ sở dữ liệu của bạn với ID của khách hàng và thông tin thanh toán có liên quan khác. {note} Việc truyền trực tiếp identifier phương thức thanh toán vào phương thức subscription
QuantitiesNếu bạn muốn set một số lượng cụ thể các gói khi tạo subscription, bạn có thể sử dụng phương thức
68:
7 Additional DetailsNếu bạn muốn thêm chi tiết khách hàng hoặc subscription, bạn có thể làm bằng cách truyền chúng làm tham số thứ hai và tham số thứ ba cho phương thức
65:
8 Để tìm hiểu thêm về các field được hỗ trợ bởi Stripe, hãy xem và tạo subscription của Stripe. CouponsNếu bạn muốn áp dụng phiếu giảm giá khi tạo subscription, bạn có thể sử dụng phương thức
70:
9 Adding SubscriptionsNếu bạn muốn thêm một subscription cho một khách hàng đã có sẵn phương thức thanh toán mặc định, bạn có thể sử dụng phương thức
71 khi sử dụng phương thức
61:
0 Kiểm tra trạng thái SubscriptionKhi người dùng đã subscription vào application của bạn, bạn có thể dễ dàng kiểm tra trạng thái subscription của họ bằng nhiều phương thức thuận tiện khác nhau. Đầu tiên, phương thức
73 sẽ trả về
74 nếu người dùng đó có active subscription, ngay cả khi subscription hiện tại đang trong thời gian dùng thử:
1 Phương thức
73 cũng là một cách tuyệt vời cho một route middleware, cho phép bạn lọc quyền truy cập vào các route hoặc các controller dựa trên trạng thái subscription của người dùng:
2 Nếu bạn muốn xác định xem người dùng đó có còn trong thời gian dùng thử hay không, bạn có thể sử dụng phương thức
76. Phương thức này có thể hữu ích để hiển thị cảnh báo cho người dùng biết rằng họ vẫn đang trong thời gian dùng thử:
3 Phương thức
77 có thể được sử dụng để xác định xem người dùng có đăng ký gói dịch vụ đã cho hay không dựa vào Price ID của gói đó trong Stripe. Trong ví dụ này, chúng ta sẽ xác định xem subscription
63 của người dùng có đăng ký gói
79 hay không:
4 Bằng cách truyền một mảng cho phương thức
77, bạn có thể xác định xem subscription
63 của người dùng có được đăng ký với gói
79 hay
83 hay không:
5 Phương thức
84 có thể được sử dụng để xác định xem người dùng hiện tại có đang đăng ký và không còn trong thời gian dùng thử hay không:
6 Cancelled Subscription StatusĐể xác định xem người dùng đã từng subscription, nhưng sau đó đã hủy, bạn có thể sử dụng phương thức
85:
7 Bạn cũng có thể xác định xem người dùng đã hủy subscription của họ hay chưa, hay vẫn còn trong "thời gian có hiệu lực" cho đến khi subscription hết hạn. Ví dụ: nếu người dùng hủy subscription vào ngày 5 tháng 3 mà dự kiến ban đầu là sẽ hết hạn vào ngày 10 tháng 3, thì người dùng sẽ ở trong "thời gian có hiệu lực" của họ cho đến ngày 10 tháng 3. Lưu ý rằng phương thức
73 vẫn trả về
74 trong thời gian này:
8 Để xác định xem người dùng đã hủy subscription và không còn trong "thời gian subscription" của họ, bạn có thể sử dụng phương thức
88:
9 Subscription ScopesHầu hết các trạng thái subscription cũng có sẵn dưới dạng query scope giúp cho bạn có thể dễ dàng truy vấn dữ liệu subscription của bạn ở một trạng thái nhất định:
0 Dưới đây là một danh sách đầy đủ các scope có sẵn:
1 Incomplete and Past Due StatusNếu subscription yêu cầu một hành động thanh toán phụ sau khi được tạo, thì subscription sẽ được đánh dấu là
89. Trạng thái của subscription được lưu trong cột
90 trong bảng
91 của Cashier. Tương tự, nếu hành động thanh toán phụ được yêu cầu khi hoán đổi gói, subscription sẽ được đánh dấu là
92. Khi subscription của bạn ở một trong hai trạng thái này, subscription sẽ không được active cho đến khi khách hàng xác nhận thanh toán. Để kiểm tra xem subscription có được thanh toán hay chưa, bạn có thể thực hiện bằng cách sử dụng phương thức
93 trên Billable model hoặc một instance subscription:
2 Khi một subscription có một khoản thanh toán chưa hoàn thành, bạn nên hướng người dùng đến trang xác nhận thanh toán của Cashier, và truyền identifier của
94. Bạn có thể sử dụng phương thức
94 có sẵn trên instance subscription để lấy identifier này:
3 Nếu bạn muốn một subscription vẫn được coi là hoạt động khi nó ở trạng thái
92, bạn có thể sử dụng phương thức
97 do Cashier cung cấp. Thông thường, phương thức này nên được gọi trong phương thức
18 trong
19 của bạn:
4 {note} Khi một subscription ở trạng thái Thay đổi góiSau khi một người dùng đã subscription vào application của bạn, đôi khi họ có thể muốn thay đổi sang gói subscription mới. Để chuyển người dùng sang subscription mới, hãy truyền vào một price identifier của gói mới vào phương thức
01:
5 Nếu người dùng đang trong thời gian dùng thử, thì thời gian dùng thử sẽ được duy trì. Ngoài ra, nếu có "nhiều" subscription tồn tại, thì những subscription đó cũng sẽ vẫn được duy trì. Nếu bạn muốn thay đổi gói và hủy tất cả các gói dùng thử mà người dùng hiện đang sử dụng, bạn có thể sử dụng phương thức
05:
6 Nếu bạn muốn thay đổi gói và lập hóa đơn ngay cho người dùng thay vì đợi đến chu kỳ thanh toán tiếp theo của họ, bạn có thể sử dụng phương pháp
06:
7 ProrationsMặc định, Stripe sẽ tính phí khi hoán đổi giữa các gói. Phương thức
07 có thể được sử dụng để cập nhật subscription mà không bị tính phí:
8 Để biết thêm thông tin về tính phí subscription, hãy tham khảo tài liệu Stripe. {note} Việc thực thi phương thức Subscription số lượng lớnThỉnh thoảng subscription có thể bị ảnh hưởng bởi "số lượng". Ví dụ: application của bạn có thể tính phí $10 mỗi tháng cho mỗi người dùng trên mỗi tài khoản. Để dễ dàng tăng hoặc giảm số lượng subscription của bạn, hãy sử dụng các phương thức
10 hoặc
11:
9 Ngoài ra, bạn cũng có thể set một số lượng cụ thể bằng phương thức
02:
0 Phương thức
07 có thể được sử dụng để cập nhật số lượng của subscription mà không cần chia tỷ lệ phí:
1 Để biết thêm thông tin về số lượng đăng ký, hãy tham khảo tài liệu của Stripe. {note} Xin lưu ý rằng khi làm việc với một subscription nhiều plan, cần có thêm tham số "plan" cho các phương thức quantity ở trên. Một subscription nhiều planMột subscription nhiều plan cho phép bạn chỉ định nhiều gói thanh toán cho một subscription. Ví dụ: hãy tưởng tượng bạn đang xây dựng một ứng dụng "helpdesk" của một customer service có subscription cơ bản là 10 đô la mỗi tháng, nhưng cung cấp thêm gói chat trực tiếp với mức phí bổ sung là 15 đô la mỗi tháng:
2 Bây giờ khách hàng sẽ có hai gói subscription
63. Cả hai gói này sẽ được tính phí vào các khoảng thời gian thanh toán tương ứng với chúng. Bạn cũng có thể sử dụng phương thức
68 để chỉ ra số lượng cụ thể cho từng gói:
3 Hoặc, bạn có thể điều chỉnh thêm gói bổ sung và số lượng của nó bằng phương thức
16:
4 Ngoài ra, bạn có thể thêm gói mới vào một gói subscription hiện có như sau:
5 Ví dụ trên sẽ thêm gói mới và khách hàng sẽ phải thanh toán cho gói đó vào chu kỳ thanh toán tiếp theo của họ. Nếu bạn muốn lập hóa đơn ngay cho khách hàng, bạn có thể sử dụng phương thức
17:
6 Nếu bạn muốn thêm một gói với một số lượng cụ thể, bạn có thể truyền số lượng đó làm tham số thứ hai của phương thức
18 hoặc
17:
7 Bạn có thể xóa các gói khỏi subscription bằng phương thức
20:
8 {note} Bạn không thể xóa gói cuối cùng tồn tại trên một subscription. Thay vào đó, bạn có thể hủy subscription đó. SwappingBạn cũng có thể thay đổi các gói mà được gắn với một subscription nhiều plan. Ví dụ: hãy tưởng tượng bạn đang subscription gói
21 với thêm một tiện ích là
22 và bạn muốn nâng cấp lên gói
23:
9 Khi thực hiện đoạn code ở trên, subscription item với
21 sẽ bị xóa và subscription item mà có
22 sẽ vẫn được giữ nguyên. Ngoài ra, một subscription item mới cho
23 sẽ được tạo ra. Bạn cũng có thể chỉ định thêm các tùy chọn cho subscription item. Ví dụ: bạn có thể cần chỉ định thêm số lượng gói subscription:
0 Nếu bạn muốn thay đổi một gói duy nhất trên một subscription, bạn có thể thực hiện việc này bằng cách sử dụng phương thức
01 trên chính subscription item đó. Phương thức này sẽ rất hữu ích nếu bạn, ví dụ, muốn giữ lại tất cả các dữ liệu hiện có, có trong subscription item.
1 ProrationMặc định, Stripe sẽ tính phí theo tỷ lệ khi thêm hoặc xóa gói ra khỏi một subscription. Nếu bạn muốn thực hiện điều chỉnh một gói mà không cần theo tỷ lệ, bạn nên kết hợp thêm phương thức
07 vào code thay đổi gói của bạn:
2 QuantitiesNếu bạn muốn cập nhật số lượng gói trên các subscription riêng lẻ, bạn có thể thực hiện việc này bằng cách sử dụng và truyền thêm tên của gói đó làm tham số cho phương thức:
3 {note} Khi bạn set nhiều gói trên một subscription, thì các thuộc tính Subscription ItemsKhi một subscription có nhiều gói, nó sẽ có nhiều subscription "items" được lưu trữ trong bảng
35 trong cơ sở dữ liệu của bạn. Bạn có thể truy cập vào những thứ này thông qua quan hệ
33 trên subscription:
4 Bạn cũng có thể lấy ra một gói cụ thể bằng phương thức
37:
5 Thuế của SubscriptionĐể khai báo thuế suất mà người dùng sẽ phải trả cho một subscription, hãy implement phương thức
38 trên model billable của bạn và trả về một mảng có ID thuế suất. Bạn có thể định nghĩa các thuế suất này trong bảng điều khiển Stripe của bạn:
6 Phương thức
38 cho phép bạn áp dụng thuế suất trên từng model, có thể hữu ích cho một người dùng trải dài trên nhiều quốc gia với nhiều loại thuế suất. Nếu bạn đang làm việc với một subscription nhiều gói, bạn có thể định nghĩa các mức thuế suất khác nhau cho từng gói bằng cách implement một phương thức
40 trên billable model của bạn:
7 {note} Phương thức
Syncing Tax RatesKhi thay đổi hard-code ID thuế suất được trả về từ phương thức
38, thì cài đặt thuế có trên bất kỳ subscription hiện có nào cho người dùng vẫn sẽ được giữ nguyên. Nếu bạn muốn cập nhật giá trị thuế cho các subscription hiện có với các giá trị
43 được trả về, bạn nên gọi phương thức
44 trên instance subscription của người dùng:
8 Điều này cũng sẽ đồng bộ tất cả các mức thuế của subscription item, vì vậy hãy đảm là rằng bạn cũng thay đổi đúng trong phương thức
40. Tax ExemptionCashier cũng đưa ra các phương thức để xác định xem khách hàng có được miễn thuế hay không bằng cách gọi API của Stripe. Các phương thức
46,
47, và
48 đã có sẵn trên billable model:
9 Các phương thức này cũng có sẵn trên tất cả các đối tượng
49. Tuy nhiên, khi gọi các phương thức này trên đối tượng
50, thì các phương thức đó sẽ xác định trạng thái miễn trừ tại thời điểm mà tạo hóa đơn. Subscription cố định ngàyMặc định, ngày cố định thanh toán là ngày đã tạo ra subscription hoặc nếu có thời gian dùng thử, thì ngày dùng thử kết thúc sẽ là ngày thanh toán. Nếu bạn muốn sửa ngày cố định thanh toán, bạn có thể sử dụng phương thức
51:
0 Để biết thêm thông tin về cách quản lý chu kỳ thanh toán của subscription, hãy tham khảo tài liệu về chu kỳ thanh toán của Stripe Huỷ SubscriptionĐể hủy một subscription, hãy gọi phương thức
52 trên subscription của người dùng:
1 Khi một subscription bị hủy, Cashier sẽ tự động set cột
53 trong cơ sở dữ liệu của bạn. Cột này được sử dụng để biết xem khi nào phương thức
73 sẽ bắt đầu trả về
55. Ví dụ: nếu khách hàng hủy subscription vào ngày 1 tháng 3, nhưng subscription không thể kết thúc cho đến khi hết ngày 5 tháng 3, thì phương thức
73 vẫn sẽ tiếp tục trả về
74 cho đến ngày 5 tháng 3. Bạn có thể biết những người dùng đã hủy subscription của họ nhưng vẫn đang trong "thời gian subscription có hiệu lực" bằng cách sử dụng phương thức
58:
8 Nếu bạn muốn hủy subscription ngay lập tức, hãy gọi phương thức
59 trên subscription của người dùng:
3 Resume SubscriptionNếu một người dùng đã hủy subscription của họ và bạn muốn resume tiếp subscription đó, hãy sử dụng phương thức
60. Để resume một subscription, người dùng vẫn phải đang trong thời gian subscription có hiệu lực:
4 Nếu người dùng đã hủy subscription nhưng sau đó lại muốn resume tiếp subscription đó trước khi subscription hết hạn, họ sẽ không bị tính tiền ngay lập tức. Thay vào đó, subscription của họ sẽ được kích hoạt lại và họ sẽ thanh toán theo đúng chu kỳ thanh toán ban đầu của họ. Subscription dành cho dùng thửKhai báo trước phương thức thanh toánNếu bạn muốn cung cấp thời gian dùng thử cho khách hàng của bạn trong khi vẫn muốn thu thập thông tin thanh toán của khách hàng, bạn nên sử dụng phương thức
61 khi tạo subscription của bạn:
5 Phương thức này sẽ set ngày kết thúc của thời gian dùng thử vào trong bản ghi subscription trong cơ sở dữ liệu, và sẽ bảo với Stripee là sẽ không tính phí khách hàng cho đến khi hết ngày dùng thử. Khi sử dụng phương thức
61, Cashier sẽ ghi đè lên bất kỳ khoảng thời gian dùng thử nào được cấu hình cho gói trong Stripe. {note} Nếu subscription của khách hàng không bị hủy trước ngày kết thúc dùng thử, họ sẽ bị tính phí ngay khi hết hạn dùng thử, vì vậy bạn nên chắc chắn là đã thông báo cho khách hàng biết về ngày kết thúc dùng thử của họ. Phương thức
63 cho phép bạn cung cấp một instance
64 để chỉ định khi nào thời gian dùng thử kết thúc:
6 Bạn có thể xác định xem người dùng hiện tại có đang trong thời gian dùng thử hay không bằng cách sử dụng phương thức
76 trên instance người dùng hoặc phương thức
76 trên instance subscription. Hai ví dụ dưới đây có kết quả giống hệt nhau:
7 Defining Trial Days In Stripe / CashierBạn có thể chọn định nghĩa số ngày dùng thử nhận được khi đăng ký gói của bạn trong bảng điều khiển Stripe hoặc luôn truyền chúng vào thông qua Cashier. Nếu bạn chọn định nghĩa ngày dùng thử cho gói của bạn trong Stripe, thì bạn nên biết rằng các subscription mới, bao gồm cả subscription mới cho những khách hàng đã có subscription trước đó, sẽ luôn nhận được thời gian dùng thử trừ khi bạn gọi phương thức
67. Khai báo phương thức thanh toán sauNếu bạn muốn cung cấp thời gian dùng thử mà không muốn thu thập thông tin thanh toán của người dùng, bạn có thể set cột
68 trong bản ghi của người dùng thành ngày kết thúc dùng thử mà bạn mong muốn. Điều này thường được thực hiện trong quá trình đăng ký người dùng:
8 {note} Hãy chắc chắn là bạn đã thêm cho cột
Cashier sẽ coi các loại dùng thử như thế này là "dùng thử đại trà", vì nó sẽ không được gắn với bất kỳ thông tin subscription nào. Phương thức
76 trên instance
71 sẽ trả về
74 nếu ngày hiện tại không vượt quá giá trị của ngày
68:
9 Bạn có thể sử dụng phương thức
74 nếu bạn muốn biết người dùng hiện tại có đang trong thời gian dùng thử "đại trà" và chưa tạo bất kỳ thông tin subscription nào hay không:
0 Khi bạn đã sẵn sàng tạo một subscription thực sự cho người dùng, bạn có thể sử dụng phương thức
61 như bình thường:
1 Mở rộng thời gian dùng thửPhương thức
76 cho phép bạn kéo dài thời gian dùng thử của một subscription sau khi nó được tạo:
2 Nếu bản dùng thử đã hết hạn và khách hàng đã được lập hóa đơn cho subscription, bạn vẫn có thể cung cấp cho họ thêm thời gian dùng thử. Thời gian sử dụng trong thời gian dùng thử sẽ được trừ vào hóa đơn tiếp theo của khách hàng. Xử lý Stripe Webhooks{tip} Bạn có thể sử dụng the Stripe CLI để giúp kiểm tra webhook trong quá trình phát triển local. Stripe có thể thông báo cho ứng dụng của bạn về nhiều loại event khác nhau thông qua webhooks. Mặc định, sẽ có một route sẽ trỏ đến controller webhook của Cashier được cấu hình thông qua service provider của Cashier. Controller này sẽ xử lý tất cả các request webhook đến. Mặc định, controller này sẽ tự động xử lý việc hủy subscription khi có quá nhiều lần tính phí không thành công (được định nghĩa trong cài đặt Stripe của bạn), cập nhật khách hàng, xóa khách hàng, cập nhật subscription và thay đổi phương thức thanh toán; tuy nhiên, bạn sẽ sớm khám phá ra là bạn có thể extend controller này để xử lý bất kỳ event webhook nào bạn thích. Để đảm bảo ứng dụng của bạn có thể xử lý Stripe webhook, hãy nhớ cấu hình URL webhook trong bảng điều khiển Stripe. Mặc định, webhook controller của Cashier sẽ lắng nghe trên đường dẫn URL là
77. Danh sách đầy đủ của tất cả các webhook mà bạn nên cấu hình trong bảng điều khiển Stripe sẽ là:
Webhooks & CSRF ProtectionVì các webhook của Stripe cần bỏ qua bước bảo vệ CSRF của Laravel, nên bạn hãy chắc chắn là đã khai báo URI của Stripe là một ngoại lệ trong middleware
83 của bạn hoặc bạn có thể khai báo route này ra khỏi group middleware
84:
3 Định nghĩa xử lý event WebhookCashier sẽ tự động xử lý hủy subscription nếu như các lần trả phí không thành công, nhưng nếu bạn muốn thêm các event webhook mà bạn muốn tự xử lý, thì hãy extend controller Webhook. Tên phương thức của bạn phải tương ứng với quy ước của Cashier, cụ thể là, các phương thức sẽ cần được thêm tiền tố là
85 vào tên của webhook mà bạn muốn xử lý, theo kiểu "camel case". Ví dụ: nếu bạn muốn xử lý webhook
86, thì bạn cần thêm một phương thức
87 vào controller:
4 Tiếp theo, định nghĩa một route đến Cashier controller của bạn trong file
88. Điều này sẽ ghi đè lên route mặc định của Cashier:
5 Cashier sẽ phát ra một event
89 khi nhận được một webhook và một event
90 khi một webhook đã được xử lý bởi Cashier. Cả hai event đều chứa toàn bộ payload của webhook Stripe. Subscription thất bạiĐiều gì sẽ xảy ra nếu thẻ tín dụng của khách hàng hết hạn? Đừng lo lắng - Controller Webhook của Cashier sẽ hủy subscription của khách hàng cho bạn. Các khoản thanh toán không thành công sẽ được tự động kiểm soát và xử lý bởi controller. Controller này sẽ hủy subscription của khách hàng khi Stripe xác định rằng subscription không thành công (thông thường là sau ba lần thanh toán không thành công). Kiểm tra Webhook SignaturesĐể bảo mật webhook của bạn, bạn có thể sử dụng webhook signature của Stripe. Để thuận tiện, Cashier đã tự động thêm một middleware để kiểm tra các request webhook Stripe đến application là hợp lệ. Để bật kiểm tra webhook, hãy đảm bảo rằng biến môi trường
91 được set trong file
24 của bạn. Webhook
93 có thể được lấy ra từ trang tổng quan trong tài khoản Stripe của bạn. PhíTính phí một lần{note} phương thức
Nếu bạn muốn thực hiện một khoản tính phí "một lần" đối với phương thức thanh toán của khách hàng đã subscription, bạn có thể sử dụng phương thức
94 trên một instance billable model. Bạn sẽ cần làm tham số thứ hai cho phương thức:
6 Phương thức
94 chấp nhận một mảng làm tham số thứ ba của nó, cho phép bạn truyền vào bất kỳ tùy chọn nào mà bạn muốn cho việc tạo phí của Stripe. Tham khảo tài liệu của Stripe về các tùy chọn có sẵn cho bạn khi tạo phí:
7 Bạn cũng có thể sử dụng phương thức
94 mà không cần có customer hoặc người dùng:
8 Phương thức
94 sẽ đưa ra một ngoại lệ nếu việc tính phí không thành công. Nếu tính phí thành công, thì một instance của
99 sẽ được trả về từ phương thức:
9 Tính phí với hoá đơnThỉnh thoảng bạn có thể cần phải tạo tính phí một lần nhưng cũng cần tạo cả một hóa đơn cho khoản phí đó để bạn có thể cung cấp hóa đơn PDF đó cho khách hàng của bạn. Phương thức
00 cho phép bạn làm điều đó. Ví dụ: hãy gửi hóa đơn "phí một lần" cho khách hàng của bạn là $5.00:
00 Hóa đơn sẽ được tính ngay lập tức cho phương thức thanh toán mặc định của người dùng. Phương thức
00 cũng chấp nhận một mảng làm tham số thứ ba của nó. Mảng này sẽ chứa các tùy chọn thanh toán cho các hàng được thanh toán. Tham số thứ tư được phương thức chấp nhận cũng là một mảng. Tham số cuối cùng này chấp nhận các tùy chọn thanh toán cho chính hóa đơn đó:
01 {note} Phương thức
Hoàn trảNếu bạn cần hoàn trả một phí đã được thanh toán trong Stripe, bạn có thể sử dụng phương thức
03. Phương thức này chấp nhận một ID của Payment Intent Stripe làm tham số đầu tiên của nó:
02 Hoá đơnLấy hoá đơnBạn có thể dễ dàng lấy ra một mảng các hóa đơn của một model billable bằng cách sử dụng phương thức
04:
03 Bạn có thể sử dụng phương thức
05 để lấy ra một hóa đơn cụ thể:
04 Displaying Invoice InformationKhi liệt kê hóa đơn cho khách hàng, bạn có thể sử dụng các phương thức helper của hóa đơn để hiển thị thông tin hóa đơn. Ví dụ: bạn có thể muốn liệt kê tất cả các hóa đơn có trong một bảng, cho phép người dùng dễ dàng tải xuống bất kỳ cái nào trong số chúng:
05 Tạo hoá đơn PDFTừ trong một route hoặc một controller, sử dụng phương thức
06 để tạo một bản PDF cho hóa đơn để khách hàng có thể tải xuống. Phương thức này sẽ tự động tạo ra một response HTTP để gửi file download tới trình duyệt:
06 Phương thức
06 cũng cho phép một tùy chọn tên file làm tham số thứ ba. Tên file này sẽ tự động được gắn với đuôi là
08 cho bạn:
07 Xử lý lỗi thanh toánThỉnh thoảng, thanh toán cho các subscription hoặc các khoản phí một lần có thể thất bại. Khi điều này xảy ra, Cashier sẽ đưa ra một ngoại lệ là
09 để thông báo cho bạn biết rằng ngoại lệ đã xảy ra. Sau khi xử lý được ngoại lệ này, bạn có hai tùy chọn về cách tiếp tục. Một là, bạn có thể chuyển hướng khách hàng của bạn đến trang xác nhận thanh toán chuyên dụng đi kèm với Cashier. Trang này đã có một route liên kết được đăng ký thông qua service provider của Cashier. Vì vậy, bạn có thể catch ngoại lệ
09 và chuyển hướng người dùng đến trang xác nhận thanh toán:
08 Trong trang xác nhận thanh toán, khách hàng sẽ được yêu cầu nhập lại các thông tin thẻ tín dụng của họ và thực hiện thêm bất kỳ hành động nào theo yêu cầu của Stripe, chẳng hạn như xác nhận "3D Secure". Sau khi xác nhận thanh toán của họ, người dùng sẽ được chuyển hướng đến URL được cung cấp bởi tham số
11 được chỉ định ở trên. Khi chuyển hướng, các biến query string như
12 (kiểu string) và
13 (kiểu integer) sẽ được thêm vào URL. Ngoài ra, bạn cũng có thể cho phép Stripe xử lý xác nhận thanh toán cho bạn. Trong trường hợp này, thay vì chuyển hướng đến trang xác nhận thanh toán, bạn có thể thiết lập email thanh toán tự động của Stripe trong trang tổng quan Stripe của bạn. Tuy nhiên, nếu trường hợp ngoại lệ
09 xảy ra, bạn vẫn nên thông báo cho người dùng biết là họ sẽ nhận được một email kèm theo hướng dẫn xác nhận thanh toán. Các ngoại lệ thanh toán có thể được áp dụng cho các phương thức sau:
94,
00, và
17 trên
22 user. Khi xử lý các subscription, phương thức
65 trên
20, và các phương thức
21 và
06 trên model
31 cũng có thể đưa ra các ngoại lệ. Hiện có hai loại ngoại lệ thanh toán được extend từ
09. Bạn có thể catch những điều này một cách riêng biệt nếu bạn cần để có thể tùy chỉnh trải nghiệm cho người dùng:
Strong Customer AuthenticationNếu doanh nghiệp của bạn có trụ sở tại Châu Âu, bạn sẽ cần tuân thủ các quy định về Strong Customer Authentication (SCA). Các quy định này đã được Liên minh Châu Âu áp dụng vào tháng 9 năm 2019 để ngăn chặn gian lận thanh toán. May mắn thay, Stripe và Cashier đã chuẩn bị sẵn sàng để xây dựng các ứng dụng tuân thủ SCA. {note} Trước khi bắt đầu, hãy xem hướng dẫn của Stripe về PSD2 và SCA cũng như tài liệu về API SCA mới của họ. Payments Requiring Additional ConfirmationCác quy định của SCA thường yêu cầu xác minh thêm để xác nhận và xử lý một khoản thanh toán. Khi điều này xảy ra, Cashier sẽ đưa ra một ngoại lệ
25 để thông báo cho bạn biết rằng cần phải xác minh thêm. Để tìm thấy thêm thông tin về cách xử lý cho các trường hợp ngoại lệ này bạn có thể . Incomplete and Past Due StateKhi một khoản thanh toán yêu cầu xác nhận bổ sung, subscription sẽ vẫn ở trạng thái
89 hoặc
92, là giá trị cột
90. Cashier sẽ tự động kích hoạt subscription của khách hàng qua webhook ngay sau khi xác nhận thanh toán hoàn tất. Để biết thêm thông tin về trạng thái
89 và
92, vui lòng tham khảo . Thông báo thanh toán Off-SessionVì các quy định của SCA yêu cầu khách hàng thỉnh thoảng cần xác minh chi tiết thanh toán của họ ngay cả khi subscription của họ đang hoạt động, nên Cashier có thể gửi thông báo thanh toán cho khách hàng khi yêu cầu xác nhận thanh toán off-session. Ví dụ: điều này có thể xảy ra khi subscription đang được gia hạn. Thông báo thanh toán của Cashier có thể được bật bằng cách set biến môi trường
33 thành một class thông báo. Mặc định, thông báo này sẽ bị tắt. Tất nhiên, Cashier có chứa một class thông báo mà bạn có thể sử dụng cho mục đích này, nhưng bạn có thể tự do thêm class thông báo của bạn nếu muốn:
09 Để đảm bảo rằng thông báo xác nhận thanh toán off-session sẽ được gửi, hãy chắc chắn rằng cho ứng dụng của bạn và webhook
82 được bật trong trang tổng quan Stripe của bạn. Ngoài ra, model
22 của bạn cũng nên sử dụng trait
36 của Laravel. {note} Thông báo sẽ được gửi ngay cả khi khách hàng đang tự thực hiện thanh toán và nhận yêu cầu xác nhận bổ sung. Thật không may, không có cách nào để Stripe biết rằng một khoản thanh toán là được một khách hàng tự thực hiện hay là thông qua "off-session". Tuy nhiên, khách hàng sẽ chỉ nhận được thông báo "Thanh toán thành công" nếu họ truy cập vào trang thanh toán sau khi đã xác nhận thanh toán của mình. Khách hàng sẽ không được phép xác nhận cùng một khoản thanh toán tới hai lần và chịu khoản phí đến lần thứ hai. Stripe SDKNhiều đối tượng của Cashier là các wrapper của các đối tượng Stripe SDK. Nếu bạn muốn tương tác trực tiếp với các đối tượng Stripe, bạn có thể lấy ra chúng bằng phương thức
37:
10 Bạn cũng có thể sử dụng phương thức
38 để cập nhật trực tiếp subscription Stripe:
11 TestingKhi testing một ứng dụng sử dụng Cashier, bạn có thể cần mô phỏng các request HTTP thực tế đối với API của Stripe; tuy nhiên, điều này đòi hỏi bạn phải thực hiện lại một phần hành vi của chính Cashier. Do đó, chúng tôi khuyên bạn nên cho phép các bài test của bạn được chạm vào các API Stripe thực tế. Mặc dù điều này sẽ chậm hơn, nhưng nó sẽ cung cấp thêm niềm tin rằng ứng dụng của bạn đang hoạt động như mong đợi và bất kỳ bài test chậm nào cũng có thể được lưu vào trong một group testing PHPUnit của riêng nó. Khi testing, hãy nhớ rằng bản thân Cashier đã có sẵn một bộ test case tuyệt vời, vì vậy bạn chỉ nên tập trung vào việc test các luồng subscription và thanh toán của ứng dụng của riêng bạn chứ không phải test mọi hành vi cơ bản của Cashier. Để bắt đầu, hãy thêm phiên bản testing của Stripe secret vào file
39 của bạn:
12 Bây giờ, bất cứ khi nào bạn tương tác với Cashier trong khi testing, nó sẽ gửi các request API thực tế đến môi trường testing của Stripe của bạn. Để thuận tiện, bạn nên tạo ra trước các subscription và các gói cho tài khoản testing Stripe của bạn mà sau đó bạn có thể sử dụng các subscription đó hoặc các gói đó trong quá trình testing. {tip} Để test nhiều tình huống thanh toán khác nhau, chẳng hạn như thẻ tín dụng bị từ chối và thất bại, bạn có thể sử dụng số thẻ và token dành cho test được cung cấp bởi Stripe. |