React-native-iap: Pembelian dalam aplikasi iOS gagal saat metode pembayaran ditambahkan langsung saat belum ada metode pembayaran

Dibuat pada 31 Okt 2018  ·  27Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

react-native-iap": "^2.3.17

Platform yang Anda hadapi kesalahan (IOS atau Android atau keduanya?)

iOS

Perilaku yang diharapkan

Pembayaran seharusnya dilakukan hanya ketika finishTransaction dipanggil

Perilaku sebenarnya

Jumlah tersebut terdeteksi setelah metode pembayaran seperti kartu kredit ditambahkan.
Tetapi metode RNIap.buyProductWithoutFinishTransaction(sku) tercapai.

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat Nyata - iPhone 6s

Langkah-langkah untuk mereproduksi perilaku

  • Periksa untuk memastikan akun Apple di perangkat metode pembayaran diatur ke tidak ada atau beberapa rincian pembayaran tidak valid
  • Lakukan pembelian dalam aplikasi melalui aplikasi
  • Pengguna diarahkan ke halaman Pengaturan akun untuk menambahkan metode pembayaran yang valid
  • Metode pembayaran dikenakan biaya tetapi tanda terima transaksi tidak diterima dalam kode yang disebutkan di bawah ini
ComponentDidMount(){
     await RNIap.initConnection();
     await RNIap.consumeAllItems();
     const prod = await RNIap.getProducts(product);

} 

  async componentWillUnmount() {
       RNIap.endConnection()
}

buyProduct(sku){
await RNIap.clearTransaction();

RNIap.buyProductWithoutFinishTransaction(sku)
.then(purchase => {
  // not reached
 if(calltoserverisSuccess){
    RNIap.finishTransaction();
 }
})
.catch(error => {
 // code enters catch case if ever
}}
📱 iOS 🙏 help wanted

Komentar yang paling membantu

Saya pikir kita perlu menghubungi apple untuk ini dan ini terlihat sangat buruk karena ada kasus pengujian berbeda yang tidak dapat direproduksi di lingkungan sandbox . Bagi mereka yang ingin memahami masalahnya, saya telah merekam layarnya dan Anda dapat melihat klipnya di sini . @anandwahed Bisakah Anda juga menghubungi apple untuk ini? Karena saya tahu mereka tidak terlalu mendukung jadi lebih baik jika lebih banyak orang yang berhubungan dengan mereka. Mari berkumpul untuk menyelesaikan masalah ini.

Semua 27 komentar

Maaf untuk mengatakan ini tetapi kode Anda tampaknya memiliki banyak kesalahan sintaksis. Silakan lihat proyek contoh kami di repo kami dan bandingkan dengan kode Anda terlebih dahulu.

@doobool
Terima kasih atas balasannya, kode yang diposting di sini hanya sebagai contoh, ini tidak persis yang digunakan dalam aplikasi sebenarnya.
saya akan mencoba menjelaskan apa masalahnya

  1. componentDidMount

    • koneksi masuk dimulai dengan menelepon RNIap.initConnection();

    • kemudian produk diambil dan disimpan dalam status dengan menelepon RNIap.getProducts(product)

  1. ketika pengguna mengklik tombol beli

    • RNIap.clearTransaction(); dipanggil hanya untuk memastikan tidak ada transaksi yang tertunda.
    • RNIap.buyProductWithoutFinishTransaction(sku) dipanggil dalam kasus sukses panggilan ke server aplikasi dipicu jika server memberikan kasus sukses benar maka RNIap.finishTransaction(); dipanggil untuk menyelesaikan pembayaran.
  2. componentWillUnmount ()

    • RNIap.endConnection() untuk mengakhiri koneksi.

Proses ini berfungsi dengan baik jika pengguna sudah menambahkan metode pembayaran. Ketika pengguna tidak memiliki metode pembayaran yang ditambahkan, diperlukan penambahan halaman metode pembayaran dan jumlah yang ditagih sebelum mencapai RNIap.finishTransaction();

Terima kasih atas detailnya. Masalah Anda terlihat jelas sekarang. cc @JAV_banget

@JJJ

@ zohaibahmed-22 Apakah kasus uji kotak pasir ini?

@JJMoon Tidak, ini kasus lingkungan nyata.

Saya memahami kesalahan ini terjadi ketika pengguna dalam keadaan keluar, atau tidak ada info kartu kredit.
Jika metode berfungsi dengan baik, penyebab kesalahan ini ada di tempat lain.
Kita perlu menyiapkan tindakan ini, yang meninggalkan aplikasi, viewDidDisappear, dll.
Dalam mode sandbox, gejala ini terjadi dengan cara yang agak berbeda.
Saat saya membuat akun kotak pasir baru, dan pembelian pertama tidak berhasil.
Pada saat kedua, perangkat masuk status, dan berfungsi dengan baik.
Saya tidak punya petunjuk untuk kesalahan ini.

@dooboolab dan @JJMoon juga saya rasa saya menemukan masalah saat membaca kode iOS kami. Dalam metode updatedTransactions ketika kita menerima pesan kegagalan di SKPaymentTransactionStateDeferred atau SKPaymentTransactionStateFailed kita tidak seharusnya finishTransaction .

Karena dalam banyak kasus, hasil SKPaymentTransactionStateFailed diikuti oleh SKPaymentTransactionStatePurchased seperti yang disebutkan di utas 6431 di atas. Saya tidak yakin tentang kode Objective-C jadi silakan periksa dan konfirmasi jika kami menghapus transaksi jika gagal.

@anandwahed Saya setuju dengan Anda. Ini adalah kesalahanku. Maaf untuk itu.
Saya akan memeriksa utas Apple dan menangani masalah ini.

@anandwahed Saya kira itu cara yang benar untuk finish transaction ketika gagal. Silakan lihat utas ini. https://stackoverflow.com/questions/11008636/inapp-purchase-skpaymentqueue-finish-transaction-doesnt-work
Jika gagal, tidak akan ada tanda terima, jadi Anda tidak menerapkan pembelian produk. Dan penyelesaian transaksi tidak selalu berarti 'membeli'.
Sementara itu, saya akan menyelidiki utas 6431.

Saya baru saja membaca utas 6431 (https://forums.developer.apple.com/thread/6431#14562)
Garis bawah. Masalah tidak terpecahkan sejak 2015. Wow ..
Ada dua cara berbeda untuk menangani efek 'aliran kit penyimpanan' ini.

  1. Jangan tampilkan peringatan pengguna apa pun.
  2. Tunjukkan hasilnya.

Dan saya belajar dua hal.
A. Kita harus finishTransaction ketika gagal. (Saya kira dengan atau tanpa pilihan, selalu)
B. Aliran Storekit membuat gagal dan sukses dengan penerimaan keduanya. (itu buruk)

Saya menyarankan Anda semua untuk membaca utas ini, dan kembali ke masalah ini.

Saya kira, cara mana yang Anda pilih (1 atau 2), itu sendiri.
Kami mungkin perlu dihubungi kembali untuk respon kegagalan.

@JJMoon apakah itu berarti kita tidak boleh menggunakan buyProductWithoutFinishTransaction?

@ maxs15 Saya tidak bermaksud begitu. Maaf sudah membingungkan.
Aliran StoreKit dapat terjadi pada pembelian apa pun. Ini masalah iOS, bukan modul ini.
Untuk saat ini, saya juga tidak punya petunjuk. Hal ini terjadi di aplikasi iOS asli mana pun. Baik?
Kami akan menggali lebih banyak di waktu luang kami.

Hari ini, saya mencoba men-debug masalah ini karena saya telah menimbulkan masalah ini. Pembayaran finishTransanction dan selesai tetapi tidak mendapatkan callback ketika payMethod telah berubah. Saya telah mencoba men-debug menulis beberapa console.log tetapi saya tidak dapat menguji penagihan sebenarnya di lingkungan dev . Adakah yang bisa menyarankan saya cara men-debug proses ini sehingga saya dapat debug ini untuk real purchase ? Haruskah saya menggunakan ini dalam mode sandbox ? Ini berfungsi dengan sempurna di kotak pasir jadi saya tidak tahu cara men-debug ini. Ini sangat enggan.

Mari kita kumpulkan beberapa ide karena menurut saya ini sangat penting untuk diperbaiki.

Saya selalu mendapatkan kesalahan ini saat mencoba melakukan pembelian dengan pengguna bukan kotak pasir.

@hyochan Jika Anda menghubungkan server nyata (milik Anda), apakah Anda dalam mode debug atau mode rilis tidak masalah. Saya kira Anda memiliki 2 opsi.

  1. Anda berjalan di perangkat nyata dalam mode debug di Xcode. Gunakan log konsol JS.
  2. Anda berjalan di perangkat nyata dalam mode rilis di Xcode. Gunakan NSLog dalam kode objektif-c.
    Kedua metode tersebut seharusnya berhasil.

@JJMoon Ya, saya sudah mengetahuinya tapi tetap saja saya tidak bisa melakukan pengujian pembelian langsung di ios. Apakah stackoverflow ini benar? Lalu bagaimana cara mengatasi masalah ini? Kami harus menguji pembelian langsung.

Siapapun yang menghadapi masalah ini, saya yakin mereka semua, tolong beri kami gambaran tentang bagaimana menghadapi masalah ini. in-app purchase fail when payment method added live seperti yang dijelaskan dalam judul terbitan. Bagaimana saya bisa men-debug ini? @anandwahed Apakah Anda pernah menghubungi apple tentang masalah ini?

@hyochan Tidak, kami tidak menghubungi dukungan Apple.

Saya pikir kita perlu menghubungi apple untuk ini dan ini terlihat sangat buruk karena ada kasus pengujian berbeda yang tidak dapat direproduksi di lingkungan sandbox . Bagi mereka yang ingin memahami masalahnya, saya telah merekam layarnya dan Anda dapat melihat klipnya di sini . @anandwahed Bisakah Anda juga menghubungi apple untuk ini? Karena saya tahu mereka tidak terlalu mendukung jadi lebih baik jika lebih banyak orang yang berhubungan dengan mereka. Mari berkumpul untuk menyelesaikan masalah ini.

Hari ini kami menerima jawaban dari Apple. Mungkin ada panggilan balik kembali setelah failure . Kami sedang mengerjakan solusi solusi di # 348 tetapi saya khawatir ini bisa sangat buruk.

Saya telah melepaskan ke 2.4.0-beta1 , mencoba mencari solusi untuk masalah ini. PR # 348 telah ditambahkan ke versi ini dan Anda juga dapat melihat readme dari fitur ini . Perhatikan bahwa ini sedang dalam pengujian.

Saya telah mengujinya dalam pembelian langsung dan sepertinya berfungsi. Namun, perlu diingat bahwa Anda sebaiknya hanya menambahkan listener jika ada kegagalan atau mungkin diduplikasi dengan hasil yang berhasil.

Teman-teman, terima kasih telah menginvestasikan waktu untuk masalah ini! 🙏

Saya pikir dokumentasi saat ini perlu lebih jelas tentang penggunaan addAdditionalSuccessPurchaseListenerIOS . Itu adalah sesuatu yang saya coba atasi di # 414.

Tapi saya juga berpikir ini menyisakan ruang dari perbaikan ke API. Apakah kalian terbuka untuk membahas perubahan dalam API yang dapat mengakomodasi dengan lebih baik apa yang disebut 'aliran kit penyimpanan'? Sesuatu mungkin menggunakan RxJS, misalnya:

const observable = RNIap.buyProduct('com.example.coins100')
                        .subscribe(
                            purchase => console.log(purchase), // successful payment
                            err => console.log(err) // err.code and err.message are available
                        )

Atau sesuatu yang berbeda yang menyembunyikan langganan tambahan untuk iOS dengan lebih baik?

@Edgpaez Itu bagus, tapi itu akan mengubah perilaku pembelian yang dilakukan di android . Saya harap saya dapat menyelidiki version 3 dari modul ini di 2019 .

hai @hyochan , AFAICT, kami tidak perlu mengubah perilaku internal paket, hanya antarmuka yang berhubungan dengan publik. Kita dapat mempertahankan metode buyItemByType dalam menyelesaikan index.js .

misalnya, kami memiliki ini di index.js:

export const buyProduct = (sku) => Platform.select({
  android: () => Observable.of(RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_IAP, sku, null, 0)), // returns an observable that emits when the RNIapModule.buyItemByType promise resolves
  ios: ... // ios would do the same but taking into account the usage of addAdditionalSuccessPurchaseListenerIOS
})();

Tujuan saya bukanlah penerapan khusus ini, tetapi untuk menyembunyikan detail khusus untuk 'aliran kit penyimpanan'.
Apakah menurut Anda ini ide yang bagus?
Apakah Anda tertarik dengan PR?

@EditBekasi Saya mengerti detailnya sekarang. Namun, saya merasa menambahkan RxJS agak terlalu banyak untuk menerapkan feature karena saya pikir ini dapat ditutup tanpanya.

Juga, saya merasa di bawah ini akan menjadi sesuatu yang berbeda.

RNIap.buyProduct('com.example.coins100')
                        .subscribe(
                            purchase => console.log(purchase), // successful payment
                            err => console.log(err) // err.code and err.message are available
                        )

Jika Anda menelepon buyProduct untuk dua item seperti di bawah ini,

RNIap.buyProduct('com.example.coins100');
RNIap.buyProduct('com.example.coins200');

Kami tidak dapat menjamin mana yang akan selesai lebih dulu jadi saya pikir kami harus menangani ini dalam bahasa asli ke sendEvent hingga JS .

Saya merasa implementasi harus terlihat seperti ini

RNIap.buyProduct('com.example.coins100');
RNIap.buyProduct('com.example.coins200');

// receiving events
const subs =  RNIap.purchaseUpdateListener(purchase => {
  ...
});

Tolong beri tahu saya jika ada sesuatu yang saya lewatkan.

Mari kita tangani diskustin lebih lanjut di # 423

Apakah halaman ini membantu?
0 / 5 - 0 peringkat