Di bagian sebelumnya, kami telah melakukan tampilan halaman pembayaran. Dari kode JSP yang ditampilkan di bagian sebelumnya, kita dapat melihat bahwa ketika pengguna mengklik untuk mengonfirmasi pembayaran, itu akan melompat ke tindakan $ {shop} /pay_gobank.action . Dengan kata lain, setelah mengirimkan, kita harus memproses beberapa logika dalam metode Gobank dalam Payaction (yaitu, logika diagram alur dalam demo Bagian 21), yaitu, dapatkan teks biasa, mengenkripsi teks biasa ke dalam tanda tangan (ciphertext) dan kemudian kunjungi server YIBAO, Yibao terhubung ke bank untuk melengkapi pembayaran.
Namun, mengingat pola desain MVC, kami akan memasukkan logika bisnis di atas ke lapisan layanan untuk diproses, jadi mari kita terapkan logika pembayaran demo di bagian 21.
1. Tulis model untuk merangkum parameter
Pertama -tama, kita perlu menulis model (SendData) untuk menerima parameter yang dikirimkan dari halaman JSP, dan menambahkan parameter lain yang perlu dikirim sendiri. Parameter ini ditentukan dalam dokumen resmi Yibao. Kita dapat secara ketat mengikuti peraturan tentang dokumen:
/ * * Informasi yang dikirim oleh mal ke YIBAO pembayaran dienkapsulasi sebagai entitas * */kelas publik SendData mengimplementasikan serializable {private static final long serialversionuid = -6304103739907145812l; // (*) menunjukkan bidang pribadi yang diperlukan string p0_cmd; // Tipe Bisnis (*), Tetap sebagai: Beli String Pribadi P1_MerID; // Nomor Pedagang (*) Private String P2_order; // Nomor Pesanan Pedagang Private String P3_AMT; // Jumlah Pembayaran Private String P4_CUR; // Currency Trading (*) Private String P5_PID; // Produk Nama Private String P6_PCAT;//Program Private String; p8_url; // alamat untuk pedagang untuk menerima data keberhasilan pembayaran string pribadi p9_saf; // alamat pengiriman pribadi string pa_mp; // informasi ekstensi pedagang pribadi string pd_frpid; // pengkodean saluran pembayaran, yaitu, string private private pr_needResponse; // mekanisme respons // empulAtribut di atas adalah semua parameter yang harus ditransmisikan ke YIBAO. Anda dapat memilih parameter yang Anda butuhkan. Tidak semuanya ditransmisikan. Tergantung pada situasinya, kami biasanya melewatinya kecuali P5, P6, dan P7. Mari kita lihat kode tindakan:
2. Implementasi Payaction
Dalam PayAction, kami terutama merangkum beberapa parameter yang diteruskan di halaman JSP ke dalam model, dan kemudian memanggil metode lapisan layanan untuk menginisialisasi parameter lain, sebagai berikut:
@Controller ("PayAction")@scope ("prototipe") Payaction kelas publik memperluas basa <POMPERTIF> mengimplementasikan ParameterAware {public String gobank () {// 1. Parameter Lengkap: P2 P3 PD PA, Anda perlu mendapatkan FORDER FORDER = (FORDER) SESION.get ("OldForder"); Pengguna pengguna = (user) session.get ("user"); model.setp2_order (forder.getId (). ToString ()); // Nomor Pesanan Pedagang Model.setp3_amt (FORDER.GETTOTAL (). ToString ()); // Jumlah Pembayaran Model.SetPA_MP (user.geteMail () + "," + user.getPhone ()); // Informasi Ekstensi Pedagang // 2. Tambahkan parameter // 3. Mengenkripsi dan mendapatkan tanda tangan // 4. Menyimpan di domain permintaan ke payservice.savedataeRequest (permintaan, model); // 2,3,4 Logika bisnis diserahkan ke lapisan layanan untuk diproses // 5. Lompat ke halaman pembayaran pengembalian "gaji"; }}Selanjutnya, mari kita tulis kode lapisan layanan. Lapisan layanan terutama mengimplementasikan logika 2, 3, dan 4 langkah di atas:
3. Implementasi Lapisan Layanan
Kode spesifiknya adalah sebagai berikut:
// antarmuka payservice Antarmuka publik PayService {// penyimpanan informasi terenkripsi dalam peta abstrak publik requestMap <String, Object> saveDataTorequest (peta <string, objek> permintaan, sendData sendData); // mengenkripsi data yang dikembalikan untuk mendapatkan ciphertext, dan membandingkannya dengan ciphertext yang dikirim kembali (kami akan mengimplementasikannya nanti) public boolean checkbackData (backdata backdata);} // payserviceImpl kelas @service ("payservice") payservice Implement {"payservice") payserviceImpl oMerService {"payservice") payserviceImpl oMerService {"payservice") payserviceMpl Tombol string; @Value ("#{prop.p1_merid}") // akun Mer (bukan nomor pesanan) string pribadi p1_merid; // Alamat pengembalian untuk pembayaran yang berhasil @Value ("#{prop.p8_url}") Private String p8_url; // Tiga atribut di atas adalah semua nilai tetap, saya memasukkannya ke dalam file konfigurasi pay.properties, dan langsung menggunakan annotation spring @Value untuk mendapatkan // lengkapi data SendData, P2 P3 PD PA adalah injeksi front-end, dan tidak perlu mengisinya di sini. Saya telah memperoleh sendData private finishSendData (sendData sendData) {sendData.setp0_cmd ("buy"); sendData.setp1_merid (p1_merid); sendData.setp4_cur ("cny"); sendData.setp5_pid (""); sendData.setp6_pcat (""); sendData.setp7_pdesc (""); sendData.setp8_url (p8_url); sendData.setp9_saf ("0"); sendData.setpr_needResponse ("0"); return sendData; } // Lengkapi penambahan data dan kembalikan plaintext private string yang ditambahkan JoinsEndDataParam (sendData sendData) {// semua data diisi sendData = this.finishsendData (sendData); StringBuffer infoBuffer = new StringBuffer (); infobuffer.append (sendData.getp0_cmd ()); infobuffer.append (sendData.getp1_merid ()); infobuffer.append (sendData.getp2_order ()); infobuffer.append (sendData.getp3_amt ()); infobuffer.append (sendData.getp4_cur ()); infobuffer.append (sendData.getp5_pid ()); infobuffer.append (sendData.getp6_pcat ()); infobuffer.append (sendData.getp7_pdesc ()); infobuffer.append (sendData.getp8_url ()); infobuffer.append (sendData.getp9_saf ()); infobuffer.append (sendData.getpa_mp ()); InfoBuffer.Append (sendData.getpd_frpid ()); infobuffer.append (sendData.getpr_needResponse ()); return infobuffer.tostring (); } // Simpan informasi terenkripsi di peta publik requestMap @Override <String, Object> saveDataToreQuest (peta <string, objek> permintaan, sendData sendData) {// kembalikan string yang akan ditambahkan (mis. Plaintext) string joinparam = joinsendDataParam (sendData); request.put ("p0_cmd", sendData.getp0_cmd ()); request.put ("p1_merid", sendData.getp1_merid ()); request.put ("p2_order", sendData.getp2_order ()); request.put ("p3_amt", sendData.getp3_amt ()); request.put ("p4_cur", sendData.getp4_cur ()); request.put ("p5_pid", sendData.getp5_pid ()); request.put ("p6_pcat", sendData.getp6_pcat ()); request.put ("p7_pdesc", sendData.getp7_pdesc ()); request.put ("p8_url", sendData.getp8_url ()); request.put ("p9_saf", sendData.getp9_saf ()); request.put ("pa_mp", sendData.getpa_mp ()); request.put ("PD_FRPID", sendData.getpd_frpid ()); request.put ("pr_needResponse", sendData.getpr_needResponse ()); request.put ("HMAC", Digestutil.hmacsign (joinparam, key)); // Tambahkan permintaan pengembalian tanda tangan (ciphertext); }}Kita dapat melihat bahwa prinsip implementasi sebenarnya sama dengan servlet dalam demo sebelumnya. Kode di atas menggunakan file dan anotasi Pay.Properties. Mari kita lihat konfigurasi dalam file pay.properties dan bean.xml:
#pay.propertieskey = w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677p1_merid = 10000940764p8_url = https/:////o12.o.o
<!-beans.xml-> <bean id = "prop"> <name properti = "Lokasi"> <rresray> <value> classpath: public.properties </value> <!-之前用到的-> <value> classpath: pay.properties </value> </rangray> </properti> </bean>
Oke, sekarang karena tindakan dan lapisan layanan ditulis, mari kita konfigurasikan file struts.xml lagi:
4. Konfigurasi Struts.xml dan halaman Pay.jsp
<action name = "pay_*" Method = "{1}"> <name hasil = "pay">/user/pay.jsp </hasilnya> </tice>Konfigurasi struts.xml sangat sederhana. Ini terutama melompat ke halaman pengguna/pay.jsp sesuai dengan nilai pengembalian, dan mengirimkan plaintext (parameter) dan ciphertext (tanda tangan) yang ditetapkan di atas ke server yibao:
<vers> <span> Nomor pesanan: </span> <strong> $ {requestscope.p2_order} </strong> <span> [Harap ingat nomor ini sehingga Anda dapat menggunakannya saat melakukan pembayaran dan pertanyaan] </span> </div> <span> Jumlah pembayaran: </span> <strong> ¥ $ {requestscope.p3_amt: </span> <img src = "$ {shop} /files/yibao.jpg"/> </div> <span> <span> bank pembayaran: </span> <img src = "$ {shop}/file/bankimages/$ {pd_frpid} .gif"/</div> </div> action = 'https: //www.yeepay.com/app-merchant-proxy/node' method = 'post' target = "_ blank"> <input type = 'hidden' name = 'p0_cmd' value = '$ {requestScope.p0_cmd}'> <input type = 'hidden' name 'p1 value = '$ {requestscope.p1_merid}'> <input type = 'hidden' name = 'p2_order' value = '$ {requestScope.p2_order}'> <input type = 'hidden' name = 'p2_order' value = '$ {requestScope.p2_order}'> <input 'name =' $ '$' poiding 'p2_am_am_Order'> <input 'name =' $ '$' p2 name = 'p2_order =' $ '$' $ value = '$ {requestscope.p3_amt}'> <input type = 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <input type = 'hidden' name = 'p5_pid' value = '$ {requestscope.p5_pid}'> <input 'name = name = name = name = name = name = name = name = name = name = name = name = name = name = name = name' p5_pid = 'p5' $ ' value = '$ {requestscope.p6_pcat}'> <input type = 'hidden' name = 'p7_pdesc' value = '$ {requestScope.p7_pdesc}'> <input type = 'hidden' name = 'p8_url' value = '$ {requestscope.p8_urll}'> p8_url '<put =' $ {requestscope.p8_urll} '> p8_url =' $ {requestscope.p8_urll} '> p8_url' = '$ {requestscope.p8_urll}'> value = '$ {requestscope.p9_saf}'> <input type = 'hidden' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> <input type = 'hidden' name = 'PD_FRPID' value = '$ {requestscope.pd_frpid}'> "nameed =" name = "name =" name = "name =" neades = "name =" neades = "neades =" neades = "nameed" name = "$" $ "name =" $ "$" value = "$ {requestScope.pr_needResponse}"> <input type = 'hidden' name = 'hmac' value = '$ {requestscope.hmac}'> <Div> <input type = "kirim" value = "pay now"/> </div> </form> </div> </div> Pay.jsp akan mengirimkan semua teks biasa yang ingin kami lewati dan teks sandi yang sesuai ke server YIBAO. Yibao akan mengenkripsi ke dalam teks sandi dengan cara yang sama berdasarkan pada teks -teks biasa ini, dan kemudian mencocokkannya dengan teks sandi yang telah kita kirimkan. Jika hal yang sama berarti bahwa data aman, tidak dirusak selama proses transmisi, dan melompat ke halaman pembayaran secara normal, dan kemudian melakukan pembayaran normal; Jika tidak sama, pembayaran tidak diizinkan, dan halaman prompt yang ramah muncul.
Pada titik ini, saya sudah menjelaskan tentang proses pembayaran online ini. Alasannya sangat sederhana. Tidak lebih dari menambahkan parameter bersama -sama untuk membentuknya, menambahkan kata sandi untuk menghasilkan ciphertext, dan kemudian mengirim parameter dan ciphertext ini ke pihak ketiga. Dia juga menambahkan kata sandi dalam metode enkripsi yang sama dan membandingkannya dengan apa yang saya kirimkan. Adapun cara memanggil antarmuka bank, bukan itu yang harus kita lakukan. Ini adalah tanggung jawab pihak ketiga, termasuk beberapa hal keamanan. Setiap orang dapat fokus pada urusan mereka sendiri: Saya hanya perlu terhubung dengan pihak ketiga dan meneruskan informasi yang berguna kepadanya; Pihak ketiga hanya perlu fokus pada cara terhubung dengan bank yang berbeda, yang membawa kenyamanan besar untuk pengembangan. Karena antarmuka yang terhubung dengan bank yang berbeda pasti berbeda. Jika kita langsung terhubung dengan bank, biayanya terlalu tinggi dan tidak nyaman untuk dipertahankan. Jika bank meningkatkan, saya harus meningkatkannya juga ... dengan pihak ketiga, kita tidak perlu khawatir tentang hal itu. Peningkatan adalah masalah pihak ketiga, dan antarmuka kami dengan pihak ketiga tidak akan berubah ~
Tautan asli: http://blog.csdn.net/eson_15/article/details/51464415
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.