{"id":137968,"date":"2021-03-24T00:00:00","date_gmt":"2021-03-24T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/blog\/android-in-app-purchases-google-play-billing-library-part-2-2\/"},"modified":"2025-06-26T13:05:11","modified_gmt":"2025-06-26T13:05:11","slug":"android-in-app-purchases-google-play-billing-library-part-2","status":"publish","type":"post","link":"https:\/\/adapty.io\/zh\/blog\/android-in-app-purchases-google-play-billing-library-part-2\/","title":{"rendered":"\u5b89\u5353\u5e94\u7528\u5185\u8d2d\u4e70\uff0c\u7b2c2\u90e8\u5206\uff1a\u4f7f\u7528Google Play Billing Library\u5904\u7406\u8d2d\u4e70"},"content":{"rendered":"

\u5728\u4e0a\u4e00\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u5305\u88c5\u5668\u7c7b\u6765\u4e0eBilling Library\u4e00\u8d77\u5de5\u4f5c\uff1a<\/p>

<\/path><\/path><\/svg><\/span>
import<\/span> <\/span>android.content.Context<\/span><\/span> import<\/span> <\/span>com.android.billingclient.api.*<\/span><\/span> class<\/span> <\/span>BillingClientWrapper<\/span>(<\/span>context<\/span>:<\/span> <\/span>Context<\/span>)<\/span> <\/span>:<\/span> <\/span>PurchasesUpdatedListener<\/span> <\/span>{<\/span><\/span>    <\/span>interface<\/span> <\/span>OnQueryProductsListener<\/span> <\/span>{<\/span><\/span>        <\/span>fun<\/span> <\/span>onSuccess<\/span>(<\/span>products<\/span>:<\/span> <\/span>List<\/span><<\/span>SkuDetails<\/span>><\/span>)<\/span><\/span>        <\/span>fun<\/span> <\/span>onFailure<\/span>(<\/span>error<\/span>:<\/span> <\/span>Error<\/span>)<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>class<\/span> <\/span>Error<\/span>(<\/span>val<\/span> <\/span>responseCode<\/span>:<\/span> <\/span>Int<\/span>,<\/span> <\/span>val<\/span> <\/span>debugMessage<\/span>:<\/span> <\/span>String<\/span>)<\/span><\/span>    <\/span>private<\/span> <\/span>val<\/span> billingClient <\/span>=<\/span> <\/span>BillingClient<\/span><\/span>        <\/span>.<\/span>newBuilder<\/span>(<\/span>context<\/span>)<\/span><\/span>        <\/span>.<\/span>enablePendingPurchases<\/span>()<\/span><\/span>        <\/span>.<\/span>setListener<\/span>(<\/span>this<\/span>)<\/span><\/span>        <\/span>.<\/span>build<\/span>()<\/span><\/span>    <\/span>fun<\/span> <\/span>queryProducts<\/span>(<\/span>listener<\/span>:<\/span> <\/span>OnQueryProductsListener<\/span>)<\/span> <\/span>{<\/span><\/span>        <\/span>val<\/span> skusList <\/span>=<\/span> <\/span>listOf<\/span>(<\/span>"<\/span>premium_sub_month<\/span>"<\/span>,<\/span> <\/span>"<\/span>premium_sub_year<\/span>"<\/span>,<\/span> <\/span>"<\/span>some_inapp<\/span>"<\/span>)<\/span><\/span>        queryProductsForType<\/span>(<\/span><\/span>            skusList<\/span>,<\/span><\/span>            <\/span>BillingClient<\/span>.<\/span>SkuType<\/span>.<\/span>SUBS<\/span><\/span>        <\/span>)<\/span> <\/span>{<\/span> billingResult<\/span>,<\/span> skuDetailsList <\/span>-><\/span><\/span>            <\/span>if<\/span> <\/span>(<\/span>billingResult<\/span>.<\/span>responseCode <\/span>==<\/span> <\/span>BillingClient<\/span>.<\/span>BillingResponseCode<\/span>.<\/span>OK<\/span>)<\/span> <\/span>{<\/span><\/span>                <\/span>val<\/span> products <\/span>=<\/span> skuDetailsList <\/span>?:<\/span> <\/span>mutableListOf<\/span>()<\/span><\/span>                queryProductsForType<\/span>(<\/span><\/span>                    skusList<\/span>,<\/span><\/span>                    <\/span>BillingClient<\/span>.<\/span>SkuType<\/span>.<\/span>INAPP<\/span><\/span>                <\/span>)<\/span> <\/span>{<\/span> billingResult<\/span>,<\/span> skuDetailsList <\/span>-><\/span><\/span>                    <\/span>if<\/span> <\/span>(<\/span>billingResult<\/span>.<\/span>responseCode <\/span>==<\/span> <\/span>BillingClient<\/span>.<\/span>BillingResponseCode<\/span>.<\/span>OK<\/span>)<\/span> <\/span>{<\/span><\/span>                        products<\/span>.<\/span>addAll<\/span>(<\/span>skuDetailsList <\/span>?:<\/span> <\/span>listOf<\/span>())<\/span><\/span>                        listener<\/span>.<\/span>onSuccess<\/span>(<\/span>products<\/span>)<\/span><\/span>                    <\/span>}<\/span> <\/span>else<\/span> <\/span>{<\/span><\/span>                        listener<\/span>.<\/span>onFailure<\/span>(<\/span><\/span>                            <\/span>Error<\/span>(<\/span>billingResult<\/span>.<\/span>responseCode<\/span>,<\/span> billingResult<\/span>.<\/span>debugMessage<\/span>)<\/span><\/span>                        <\/span>)<\/span><\/span>                    <\/span>}<\/span><\/span>                <\/span>}<\/span><\/span>            <\/span>}<\/span> <\/span>else<\/span> <\/span>{<\/span><\/span>                listener<\/span>.<\/span>onFailure<\/span>(<\/span><\/span>                    <\/span>Error<\/span>(<\/span>billingResult<\/span>.<\/span>responseCode<\/span>,<\/span> billingResult<\/span>.<\/span>debugMessage<\/span>)<\/span><\/span>                <\/span>)<\/span><\/span>            <\/span>}<\/span><\/span>        <\/span>}<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>private<\/span> <\/span>fun<\/span> <\/span>queryProductsForType<\/span>(<\/span><\/span>        <\/span>skusList<\/span>:<\/span> <\/span>List<\/span><<\/span>String<\/span>><\/span>,<\/span><\/span>        <\/span>@BillingClient.SkuType<\/span> <\/span>type<\/span>:<\/span> <\/span>String<\/span>,<\/span><\/span>        <\/span>listener<\/span>:<\/span> <\/span>SkuDetailsResponseListener<\/span><\/span>    <\/span>)<\/span> <\/span>{<\/span><\/span>        onConnected <\/span>{<\/span><\/span>            billingClient<\/span>.<\/span>querySkuDetailsAsync<\/span>(<\/span><\/span>                <\/span>SkuDetailsParams<\/span>.<\/span>newBuilder<\/span>().<\/span>setSkusList<\/span>(<\/span>skusList<\/span>).<\/span>setType<\/span>(<\/span>type<\/span>).<\/span>build<\/span>(),<\/span><\/span>                listener<\/span><\/span>            <\/span>)<\/span><\/span>        <\/span>}<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>private<\/span> <\/span>fun<\/span> <\/span>onConnected<\/span>(<\/span>block<\/span>:<\/span> <\/span>()<\/span> <\/span>-><\/span> <\/span>Unit<\/span>)<\/span> <\/span>{<\/span><\/span>        billingClient<\/span>.<\/span>startConnection<\/span>(<\/span>object<\/span> <\/span>:<\/span> <\/span>BillingClientStateListener<\/span> {<\/span><\/span>            override fun onBillingSetupFinished<\/span>(<\/span>billingResult<\/span>:<\/span> <\/span>BillingResult<\/span>)<\/span> {<\/span><\/span>                block<\/span>()<\/span><\/span>            }<\/span><\/span>            override fun onBillingServiceDisconnected<\/span>()<\/span> {<\/span><\/span>                <\/span>\/\/<\/span> <\/span>Try<\/span> to restart the connection on the next request to<\/span><\/span>                <\/span>\/\/<\/span> <\/span>Google<\/span> <\/span>Play<\/span> by calling the startConnection<\/span>()<\/span> method<\/span>.<\/span><\/span>            }<\/span><\/span>        }<\/span>)<\/span><\/span>    <\/span>}<\/span><\/span>    <\/span>override<\/span> <\/span>fun<\/span> <\/span>onPurchasesUpdated<\/span>(<\/span>billingResult<\/span>:<\/span> <\/span>BillingResult<\/span>,<\/span> <\/span>purchaseList<\/span>:<\/span> <\/span>MutableList<\/span><<\/span>Purchase<\/span>><\/span>?<\/span>)<\/span> <\/span>{<\/span><\/span>        <\/span>\/\/ here come callbacks about new purchases<\/span><\/span>    <\/span>}<\/span><\/span> }<\/span><\/span><\/code><\/pre><\/div>    

\u8ba9\u6211\u4eec\u7ee7\u7eed\u5b9e\u73b0\u8d2d\u4e70\u548c\u6539\u8fdb\u6211\u4eec\u7684\u7c7b\u3002<\/p>

\u8bbe\u8ba1\u8ba2\u9605\u5c4f<\/h2>

\u4efb\u4f55\u6709\u5e94\u7528\u5185\u90e8\u8d2d\u4e70\u529f\u80fd\u7684\u5e94\u7528\uff08APP\uff09\u90fd\u6709\u4e00\u4e2a\u4ed8\u8d39\u5899\uff08paywall\uff09\u5c4f\u5e55\u3002Google\u7b56\u7565<\/a>\u5b9a\u4e49\u4e86\u6b64\u7c7b\u5c4f\u4e2d\u5fc5\u987b\u51fa\u73b0\u7684\u6700\u57fa\u672c\u5143\u7d20\u548c\u8bf4\u660e\u6587\u672c\u3002\u603b\u7ed3\u5982\u4e0b\u3002\u5728\u201c\u4ed8\u8d39\u5899\u201d\u5c4f\u5e55\u4e0a\uff0c\u60a8\u5fc5\u987b\u660e\u786e\u8bf4\u660e\u60a8\u7684\u8ba2\u9605\u6761\u4ef6\u3001\u8d39\u7528\u548c\u6301\u7eed\u65f6\u95f4\uff0c\u5e76\u6307\u5b9a\u662f\u5426\u9700\u8981\u8ba2\u9605\u624d\u80fd\u4f7f\u7528\u5e94\u7528\u7a0b\u5e8f\u3002\u60a8\u8fd8\u5fc5\u987b\u907f\u514d\u5f3a\u8feb\u7528\u6237\u6267\u884c\u4efb\u4f55\u989d\u5916\u64cd\u4f5c\u6765\u68c0\u67e5\u6761\u4ef6\u3002 <\/p>

\u8fd9\u91cc\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u4e2a\u7b80\u5316\u7684\u4ed8\u8d39\u5899\u5c4f\u5e55\u4f5c\u4e3a\u4f8b\u5b50\uff1a<\/p>

\"\"
\u5b89\u5353\u793a\u4f8b\u4ed8\u8d39\u5899<\/em><\/figcaption><\/figure><\/div>

\u200d<\/p>

\u6211\u4eec\u5728\u4ed8\u8d39\u5899\u5c4f\u5e55\u4e0a\u6709\u4ee5\u4e0b\u5143\u7d20\uff1a<\/p>