Saya telah mempelajari pembayaran kode QR Alipay beberapa waktu yang lalu. Saya harus mengatakan bahwa dokumen Alipay benar -benar buruk (setidaknya itu dari Mengbi ketika saya pertama kali membacanya). Contoh -contoh di atas dokumen terlihat sangat berbeda dari contoh dalam demo. Seringkali, contoh -contoh di atas dokumen sangat sederhana, sedangkan kode demo sangat rumit, jadi saya tidak tahu kode mana yang akan digunakan di awal. Kemudian, saya dengan hati -hati melihat kode dalam paket demo dan menemukan bahwa antarmuka contoh dokumen juga dipanggil. Baru saat itu saya menyadari bahwa mereka adalah hal yang sama, tetapi demo hanya membungkus antarmuka dokumen.
Pertama, mengajukan permohonan akun Alipay dari suatu perusahaan. Akun ini memiliki PID, dan Anda perlu menambahkan aplikasi ke akun ini. Setiap aplikasi memiliki appid, dan kunci publik dan pribadi. Kunci publik dan pribadi dapat dihasilkan melalui alat yang disediakan oleh Alipay. Selain itu, pengembang Java perlu menggunakan kunci pribadi dalam format PKCS6. Jika aplikasi perlu menggunakan fungsi pemindaian, perlu untuk menambahkan opsi pembayaran langsung dalam aplikasi, yang membutuhkan penandatanganan kontrak. Setelah menandatangani fungsi pembayaran langsung, itu tidak dapat digunakan secara langsung karena aplikasi harus online sebelum dapat digunakan. Oleh karena itu, Anda dapat menggunakan versi kotak pasir dari aplikasi selama pengembangan. Alipay menyediakan versi kotak pasir dari Gateway, Kunci Publik Alipay, PID dan APPID, yang perlu dimodifikasi selama konfigurasi.
Kode dapat secara langsung menggunakan kode dalam demo, pertama impor API yang disediakan oleh Alipay dalam proyek (perhatikan bahwa itu bukan kode demo), dan kemudian mengimpor kode demo, seperti yang ditunjukkan pada gambar:
File com.alipay.demo.trade.main ini dapat dijalankan secara langsung, tetapi file sumber daya perlu dikonfigurasi:
# Alipay Gateway Nama, PartnerID, dan Appid# Ini adalah gerbang untuk lingkungan Sandbox Open_api_domain = https://openapi.alipaydev.com/gateway.domcloud_api_domain = http:/mcloudmonitor.com/gateway.do# Ini adalah mercuar uidpid untuk the uidpid for the uidbox = 2082 AppidAppid untuk lingkungan kotak pasir Anda secara langsung di sini = 2016082000300485 # RSA Private Key, Kunci Publik, dan Kunci Publik Alipay # Harap Isi Kunci Pribadi Pedagang Anda di sini dan transfer ke Format PKCS8 Private_Key = Miiceqibadanbgkqhkig9w0baqefaascammwggjfageaaogbamkxzrfr+rnvygbs9qz2ce1mcSibreaqan+5pf5+02hyj4hzcntwqhfm91ih 3wypyhpm7xlbgj5ywjtgc4g1lz75r8a+uCyuxp8by1lv/44gi/tiflsgatfq73ocm9imxocrdyz2zcwqi1gv+b3udoy/da5w07grwizfzs6vq 1RAGMBAAECGYEAQHHC4GRBSRCKEINYTK1VHQCJ0YG11LVY85Z3SI0FNY26DVS8R5GFYDZC/MX5F8RNPUUYUHQN+4CQOR3D/C291X1ITOV2NEV Lhejroudknp4oqriqt2w9pz8rzwzp2jcwvrvuf4ztpeimpmorp6sprfx6dlzg29sfi6gzwu6tkcqdp3mim1bhus3yonezgqc69zn0/dgofk EIX0S18QAU1X4I1FEJVTKY4HPDWIHPGYAJM0UFG1LK8MTIUNHPZRCNAKEA1QF6U1AKJM6ZSVDENRXEDTCC75UVJGSYFJHHX9PJYD9VX8NSZV 0Z0U4V0ZG0N0YVHJ5LRO6U5FCFFCFRW1WIXNQJBALMCKZ8SVF/H9N6LIWMSPY6W5Q82KNRLRC7WSCENSPQT0WQL5+SacG98M0XXY5J1HMIOLHXG Ctvyrixowobivqcccqtnanb4uz3q/86r/kukbvd3dirwlfryaho6yxp8oy+je/bv/359+vr3cxzyyldhzor9/tvspwr/y9q4jlem Q1takealbu7+4edzfap7e/fmgykd5dml8h2iaeumrrcpl84ghffk/7psq/40ngkxptgy44nlelhxcrpw5czu6gqdinjoa ==#silakan Isi pedagang Anda public_key di sini = MIGFMA0GCSQGSIBDQEBAQUAAA4GNADCBIQKBGQDCL2AXUFQ572IABPAS9NBNZGKIAUXMQMP/UT3+FTNH8O+B833DU01QHXZVDSB98GD8OATOO15W4 Ceclibyauinzc ++ a/gvlasrst/g8ts1f+obov0yhy0oae30o9zndpypl6hexwm9mqskotyffm91a6mvw2ucno4evosxc0ulatawidaqab#ini adalah kunci publik dari lingkungan kotak pasir alipay_public_key = Migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdighnon7llillketd6bfrj0gqgs2y3mn1wmqmyh9zeywlz5p1zrahbxafcfsqsnfq Omaqzshrvjcqjsaw1jyqrxapdkbmr90dipixmiykxv4gakpyj/6ftfy99Uhpiq0qadd/uszqsefwo0atvp/65zi3eof7tcz32owpwidaqab# Jumlah maksimum kueri dan interval kueri (milidetik) max_query_retry = 5Query_duration = 5000# Jumlah maksimum kehancuran dan interval undoing (MS) secara langsung max_cancel_retry = 3cancel_duration = 2000# Transaksi Penundaan Penjadwalan pertama dan intervasi penjadwalan jadwal (detik) = detik) = Deconds = Deconds = DeckBeats = DoadBeats = DoadBeats = DoadBeate = DoadBeate = DoadBeate = DoadBeate = DoadseReate = Declure = Declure = DoadseREK = 2000
Kemudian jalankan file Main.java. Adapun kode pembayaran untuk kode pemindaian dalam aplikasi kami yang sebenarnya, kami dapat secara langsung menyalin fungsi test_trade_precreate () dalam file Main.java dan membuat fungsi di pengontrol:
@RequestMapping (value = "/pay/alipay", Method = requestMethod.post) Peta publik <string, string> alipay (@RequestParam Jumlah string, @RequestParam int userId) {peta <string, string> peta = hash baru <string, string> (); // (Diperlukan) Nomor pesanan unik dalam sistem pesanan situs web Merchant, dengan hanya 64 karakter, hanya dapat berisi huruf, angka, dan garis bawah. // perlu untuk memastikan bahwa sistem pedagang tidak dapat diulang. Dianjurkan untuk menghasilkannya melalui urutan database, string outtradeno = "xxxxx" + system.currentTimeMillis () + (panjang) (math.random () * 10000000l); // (wajib) Judul pesanan, secara kasar menjelaskan tujuan pembayaran pengguna. Misalnya, "XXX Brand XXX Store membayar secara langsung dan memindai kode untuk mengkonsumsi" Subjek String = "Pay"; // (Diperlukan) Jumlah total pesanan adalah RMB 100 juta, dan tidak dapat melebihi RMB 100 juta // jika [jumlah diskon], [tidak diskon jumlah], dan [jumlah total pesanan] ditransmisikan pada waktu yang sama, kondisi berikut harus dipenuhi: [jumlah total pesanan] = [Jumlah Diskon] + [tidak didiskontokan Jumlah] Total TotalAnt = Jumlah; // (Opsional) Pesanan tidak dapat didiskon jumlah, dan dapat dikonfigurasi dengan platform pedagang untuk mengonfigurasi kegiatan diskon. Jika alkohol tidak berpartisipasi dalam diskon, jumlah yang sesuai akan diisi dalam bidang ini // Jika nilainya tidak ditransmisikan, tetapi [jumlah total pesanan] dan [jumlah diskon] ditransmisikan, nilainya default ke [jumlah total pesanan]-[jumlah diskon] string undiscountableamount = "0"; // ID Akun Alipay Penjual digunakan untuk mendukung pembayaran ke berbagai akun pembayaran di bawah akun kontrak (bayar ke akun alipay yang sesuai dengan penjual) // Jika bidang ini kosong, itu default ke PID pedagang yang ditandatangani dengan alipay, yaitu, PID yang sesuai dengan APPID String Sellerid = "20881022328888883" // Deskripsi pesanan, Anda dapat menggambarkan transaksi atau produk secara terperinci, seperti mengisi "2 pembelian dari 2 item secara total 15,00 yuan" body string = "3 pembelian 3 item secara total 20,00 yuan"; // nomor operator pedagang, tambahkan parameter ini untuk melakukan statistik penjualan untuk operator pedagang operator OperatorID = "test_operator_id"; // (wajib) nomor toko pedagang, melalui nomor toko dan backend pedagang, Anda dapat mengonfigurasi informasi diskon ke toko secara akurat. Untuk detailnya, silakan berkonsultasi dengan Dukungan Teknis Alipay String StoreID = "2088102172329883"; // Parameter Ekspansi Bisnis, saat ini Anda dapat menambahkan nomor penyedia sistem yang ditetapkan oleh Alipay (melalui metode setSySserviceProviderId). Untuk perinciannya, silakan berkonsultasi dengan dukungan teknis Alipay ExtendParams ExtParParams = ExtandParams baru (); extentparams.setsysserviceProviderId ("2088100200300400500"); // Batas waktu pembayaran, didefinisikan sebagai 120 menit string timeoutexpress = timeout; // // Daftar Rincian Produk, Anda perlu mengisi rincian produk pembelian, // Daftar <GoodDetail> GoodsDetaillist = Daftar Array Baru <GoodSdetail> (); // Buat Informasi Produk, Parameter adalah ID Produk (Menggunakan Standar Nasional),), NOWER, NOWER, NOLD NOMONICE), POINTICE, NOMERITICE, NOMOR NEKSITICE (GOOD NOMERICE), NOMONICE, NOMERICE (GOOD NOMERICE), NOMONICE (GOODSDetail), Jika Anda perlu menambahkan kategori produk, silakan merujuk ke GoodsDetail // GoodsDetail Goods1 = GoodsDetail.newinstance ("Goods_ID001", "XXX Small Bread", 1000, 1); // // Tambahkan ke daftar rincian produk setelah membuat produk // GoodsDetAillist.Add (Goods1);///Lanjutkan TOBLE dan LANJUTAN PERTAMA DAN GOODSAILLIST.ADD (Goods1);///Lanjutan TOPON//BOODSDETAILLIST.ADD (Goods1);///Lanjutan TOBLE dan LANJUTAN. Produk yang dibeli oleh pengguna adalah "sikat gigi hitam", dengan harga satuan 5,00 yuan. Saya membeli dua bagian // barang -barang GoodSdetail2 = GoodsDetail.newinstance ("Goods_ID002", "Sikat Gigi XXX", 500, 2); // GoodsDetaillist.Add (Goods2); // Buat kode pemindaian untuk membayar pembangun permintaan, atur parameter permintaan alipaytradeprecreeaterequestbuilder builder = baru alipaytradeprecreeaterequestBuilder () .setsubject (subjek) .settotalamount (totalamount) .setouttradeno (outtradeno) .settradeno. .setsellerId (sellerid) .setbody (body) .setoperatorId (operatorID) .setStoreID (StoreID) .setextendParams (ExtandParams) .SetTimeOutExpress (TimeoutExpress) .setNotifyUrl ("http://xxx.xx.xxx.xxx:8080/baobiao/pay/notify"); // server alipay secara aktif memberi tahu halaman http yang ditentukan di server pedagang. Setel sesuai kebutuhan. Di sini kami menetapkan antarmuka yang kami tulis sendiri. Kami akan memperkenalkannya nanti. // .setgoodsdetaillist (GoodsDetaillist); ALIPAYF2FPRECREATERESULT hasil = tradeservice.tradeprecreate (builder); switch (result.gettradestatus ()) {case Success: log.info ("Alipay pre-ordered berhasil :)"); System.out.println ("Alipay pra-order berhasil :)"); ALIPAYTRADEPREaterSeSponse response = result.getResponse (); // dumppresponse (response); // system.out.println (response.getBody ()); // // // perlu dimodifikasi ke jalur pada mesin // string s.prePath = string. response.getouttradeno ()); // log.info ("filepath:" + filepath); // zxingutils.getqrcodeimge (response.getqrcode (), 256, filepath); // system.out.println (response.getqrcode ()); // Hasilkan pesanan dan masukkan database Baobiaoorder Order = BaobiaoOrder baru (userid, outtradeno, "", double.parsedouble (jumlah), tanggal baru (), 1); BaobiaoorderService.Insertorder (Order); peta.put ("status", "true"); peta.put ("qrcode", response.getQrcode ()); // Kembali ke klien qr code map.put ("outtradeno", outtradeno); peta mengembalikan; Case Gagal: Log.Error ("Alipay Pre-order gagal !!!"); System.out.println ("Alipay Pre-order gagal !!!"); System.out.println (result.getResponse (). GetBody ()); merusak; case tidak diketahui: log.Error ("Pengecualian Sistem, Status Pre-Order Tidak Diketahui !!!"); System.out.println ("Pengecualian Sistem, status pre-order tidak diketahui !!!"); merusak; Default: log.Error ("Status transaksi yang tidak didukung, Transaction Returns Exception !!!"); System.out.println ("Status transaksi yang tidak didukung, Transaction Returns Exception !!!"); merusak; } peta.put ("status", "false"); peta.put ("msg", "sistem memiliki pengecualian, coba lagi nanti!"); peta mengembalikan; }Logikanya adalah bahwa pengguna akan memindai kode di ponselnya untuk membayar alipay, dan kemudian setelah Alipay menerimanya, itu akan mengirim pesan pembayaran yang berhasil kepada kami untuk menetapkan notify_url, seperti yang ditunjukkan di bawah ini:
@RequestMapping (value = "/pay/notify", Method = requestMethod.post) Public String NotifyResult (permintaan httpservletRequest, httpservletResponse response) {log.info ("menerima pemberitahuan asinkron alipay!"); Peta <string, string> params = new HashMap <string, string> (); // Ambil semua parameter untuk memverifikasi enumerasi tanda tangan <string> parameterNames = request.getParameternames (); while (parameterNames.hasmoreElements ()) {string parameterName = parameterNames.NextElement (); params.put (parameterName, request.getParameter (parameterName)); } boolean ditandatangani; coba {Signverified = alipaySignature.rsacheckv1 (params, configs.getalipaypublickey (), "UTF-8"); } catch (alipayapiException e) {e.printstacktrace (); mengembalikan "gagal"; } if (Signverified) {string outtradeno = params.get ("out_trade_no"); log.info (outtradeno + "Pesanan pemberitahuan panggilan balik."); // System.out.println ("Verifikasi tanda tangan berhasil!"); log.info ("Verifikasi tanda tangan berhasil!"); // Jika appID dalam parameter berbeda dari yang diisi appid, itu adalah pemberitahuan pengecualian jika (! Configs.getappid (). Equals (params.get ("app_id")))) {log.warn ("Berbeda dari appid pada saat pembayaran, ini adalah pemberitahuan pengecualian dan harus diabaikan!"); mengembalikan "gagal"; } // Temukan pesanan yang sesuai dengan nomor pesanan dalam database dan bandingkan jumlahnya dengan jumlah dalam database. Jika tidak cocok, itu juga akan memberi tahu pengecualian Baobiaoorder Order = BaobiaoorderService.FindorderbyOuttradeno (Outtradeno); if (order == null) {log.warn (outtradeno + "Periksa pesanan ini tanpa memeriksa!"); mengembalikan "gagal"; } if (order.getamount ()! = double.parsedouble (params.get ("total_amount"))) {log.warn ("Berbeda dari jumlah pada saat pembayaran, ini adalah pemberitahuan pengecualian dan harus diabaikan!"); mengembalikan "gagal"; } if (order.getStatus () == Baobiaoorder.trade_success) mengembalikan "Sukses"; // Jika pesanan telah dibayar dengan sukses, abaikan status string pemberitahuan ini = params.get ("trade_status"); if (status.equals ("wait_buyer_pay")) {// Jika status menunggu pembayaran pengguna jika (order.getStatus ()! = Baobiaoorder.wait_buyer_pay) BaobiaoorderService.modifytradestatus (baobiaoorder.wait_buyerer.modifytradestatus; } lain if (status.equals ("trade_closed")) {// Jika status tidak dibayar waktu tutup transaksi ditutup, atau pembayaran sepenuhnya dikembalikan if (order.getStatus ()! = Baobiaoorder.trade_closed) BaobiaOrderService.modifytradestatus (Baobiaoorder. } lain jika (status.equals ("trade_success") || status.equals ("trade_finished")) {// Jika status dibayar dengan sukses jika (order.getStatus ()! = Baobiaoorder.trade_success) BaobiaOrderService.modifiFy.modifify (Baobiacces. } else {BaobiaoorderService.modifytradestatus (Baobiaoorder.unknown_State, outtradeno); } log.info (outtradeno + "Status pesanan telah dimodifikasi menjadi" + status); } else {// jika tanda tangan verifikasi tidak melewati pengembalian "gagal"; } mengembalikan "kesuksesan"; }Ini mungkin terjadi, tetapi ada lebih sedikit pemberitahuan tentang pembayaran yang berhasil kepada klien, dan ada juga beberapa masalah keamanan.
Akhirnya, mari kita rangkum masalah yang dihadapi dalam proses ini:
1. Kode QR yang dikembalikan oleh Alipay tidak dapat dibuka secara langsung di browser, tetapi harus digunakan untuk mengonversi kode QR untuk menghasilkan kode QR, atau Anda dapat melihatnya melalui situs web CLI.IM.
2. Kode QR yang dihasilkan oleh lingkungan Alipay Sandbox hanya dapat dipindai menggunakan versi Sandbox dari ponsel Alipay. Jika versi normal pemindaian Alipay, kode QR akan berakhir dan kesalahan lainnya akan terjadi.
3. Jika Anda tidak dapat menerima pemberitahuan asinkron yang dikirim oleh Alipay setelah pembayaran, Anda dapat menggunakan tukang pos dan alat lain untuk memeriksa apakah Notify_Url yang Anda isi dapat diakses menggunakan IP publik.
4. Jika Anda menghadapi masalah izin ISV yang tidak mencukupi, itu karena tidak ada penandatanganan kontrak atau aplikasi belum menambahkan fungsi yang sesuai, dan aplikasi tidak dapat digunakan tanpa online. Anda dapat memilih aplikasi kotak pasir selama pengembangan.
5. Saat mendaftarkan versi ponsel Alipay Mobile, Anda dapat menghubungi Layanan Pelanggan untuk meminta akun
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.