1: Pengetahuan Literasi Pembayaran WeChat Awal
Prasyaratnya adalah bahwa sudah ada akun resmi yang telah berlaku untuk fungsi pembayaran WeChat, dan kemudian kita perlu mendapatkan akun resmi Account Appid dan WeChat Merchant. Ini dapat ditemukan di akun resmi WeChat dan platform Pedagang Pembayaran WeChat. Bahkan, setelah Anda berhasil mengajukan permohonan fungsi pembayaran, WeChat akan meneruskan surat kepada Anda melalui email. Dengan informasi ini, kami dapat pergi ke halaman Dukungan Layanan Pembayaran WeChat: https://pay.weixin.qq.com/service_provider/index.shtml
Buka halaman ini dan klik tautan [dokumen pengembangan] di sudut kanan atas untuk memasukkan halaman deskripsi dokumen API, yang terlihat seperti berikut ini
Pilih Lingkaran Merah untuk memindai kode yang harus dibayar, yang berarti kita perlu melakukan metode akses. Pindahkan mouse ke atas dan meminta Anda untuk melihat dokumen pengembangan. Jika Anda tidak tahu cara melihat ini, Anda dapat mandi dan pergi tidur. Anda benar -benar tidak cocok untuk seorang programmer. Alamatnya adalah sebagai berikut:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 Anda akan melihat setelah dibuka di browser Anda
Konten yang kami fokuskan dan baca sudah ditandai dengan elips merah. Pertama, baca spesifikasi protokol dalam [aturan antarmuka]. Hanya bercanda, jika Anda tidak membaca ini, Anda ingin melakukan pembayaran weChat. Ini seperti Anda ingin menjemput gadis. Anda harus mengumpulkan beberapa informasi latar belakang dasar terlebih dahulu dan memahami karakteristik pihak lain, jika tidak, bagaimana Anda dapat berkomunikasi di bawah ini. Ternyata hanya programmer yang dapat menjemput anak perempuan adalah penjual yang baik. Setelah keluar dari topik, kita akan melihat kasus dan spesifikasi dalam [Pendahuluan adegan]. Lihat saja logo WeChat Pay. Ini akhirnya meletakkannya di halaman web pembayaran kode QR kami sendiri, yang terlihat lebih profesional. Setelah itu, fokus pada [Mode 2]
Di sini kita akan menggunakan metode mode 2 untuk mewujudkan fungsi pembayaran kode pemindaian halaman PC.
Penjelasan Resmi Mode 2 oleh WeChat adalah sebagai berikut: "Sistem backend pedagang pertama menyebut antarmuka tunggal terpadu dari weChat gaji, sistem backend weChat mengembalikan parameter tautan kode_url, sistem backend pedagang menghasilkan gambar kode qr yang tidak dapat dikembalikan, dan nilai kode 2 adalah klien kode dan notasi. pembayaran." Jika Anda mengerti, pertama -tama kami harus menelepon WeChat untuk menyediakan antarmuka tunggal terpadu dan mendapatkan informasi utama Code_Url (seperti apa code_url ini, saya tidak tahu), dan kemudian kami menghasilkan kode QR melalui program kami sendiri. Saya menggunakan Perpustakaan Zxing Google di sini. Kemudian cukup tampilkan kode QR di halaman web PC Anda. Dengan cara ini, pengguna terminal akan membayar dengan memindai kode dan pembayaran akan selesai. Anda pasti sangat senang melihat ini. Anda menemukan bahwa pembayaran WeChat sangat sederhana. Ada hal lain yang belum kita ketahui. Pelanggan tahu bahwa mereka telah membayar, tetapi sisi server kami belum tahu. Dengan IQ pengembang WeChat, mereka telah memikirkan masalah ini untuk waktu yang lama. Jadi ketika Anda memanggil antarmuka tunggal terpadu, ada parameter yang diperlukan yaitu URL callback. Artinya, jika klien berhasil membayar, WeChat akan mengirimkan beberapa data ke server kami sendiri melalui URL ini, dan kemudian kami menguraikan data di latar belakang untuk menyelesaikan operasi kami sendiri. Hanya dengan begitu kita dapat tahu apakah pelanggan benar -benar membayar melalui WeChat. Dengan cara ini seluruh proses selesai, dan ini adalah Pola 2. WeChat menggunakan diagram waktu untuk mewakili proses ini.
Rumit untuk diekspresikan dan tampaknya sulit. Untuk meringkas, apa yang harus dilakukan server kami adalah sebagai berikut:
1. Lewati parameter yang benar (tentu saja, URL panggilan balik kami) dan verifikasi tanda tangan melalui antarmuka tunggal terpadu, dan dapatkan data yang sesuai dari Code_Url dari data pengembalian.
2. Berdasarkan data Code_URL, kami menghasilkan gambar kode QR dan menampilkannya di halaman web browser.
3. Tambahkan pemrosesan logika bisnis kami sendiri di URL panggilan balik.
Literasi sudah berakhir sekarang, dan Anda akhirnya tahu proses seperti apa yang harus dibayar dengan memindai kode. Mari kita lihat penggunaan API yang relevan dan lakukan pekerjaan yang baik dalam memproses setiap langkah.
Dua: Proses Pengembangan
Sebelum mengembangkan kode, persiapkan beberapa hal terlebih dahulu.
1. Tambahkan ketergantungan Maven Zxing
2. Tambahkan ketergantungan Maven JDom
3. Unduh Program Demo SDK Versi Java, alamatnya ada di sini
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
Kita membutuhkan md5util.java dan xmlutil.java dua file
4. Kami menggunakan httpclient versi 4.5.1, ingat untuk menambahkan dependensi maven
Setelah persiapan di atas selesai, lanjutkan membaca:
Pertama, kita perlu menyebut antarmuka tunggal bersatu WeChat. Ketika kita mengklik single terpadu di [daftar API], kita akan melihat halaman seperti ini:
Mengambil situasi aktual panggilan saya sebagai contoh, parameter berikut diperlukan. Untuk kenyamanan semua orang, saya telah mengubahnya menjadi objek pojo. Kodenya adalah sebagai berikut:
public class UnifiedorderDto implements WeiXinConstants {private String appid;private String body;private String device_info;private String mch_id;private String nonce_str;private String notify_url;private String openId;private String out_trade_no;private String spbill_create_ip;private int total_fee;private String trade_type;private String product_id;private String sign;public UnifiedorderDto() {this.appid = APPID;this.mch_id = WXPAYMENTACCOUNT;this.device_info = DEVICE_INFO_WEB;this.notify_url = CALLBACK_URL;this.trade_type = TRADE_TYPE_NATIVE;}public String getAppid() {return appid;}public void setAppid(String appid) {this.appid = appid;}public String getBody () {return body;} public void setBody (string body) {this.body = body;} public string getDevice_info () {return device_info;} void setDevice_info (string device_info) {this.device_info = device_info;} public getmm (this.device_info = device_info;} public string {this.device_info = device_info;} public string {) {device {device; device_info;} public string {device {device; device; {} public get {this.device_info = device_info;} public string; setMch_id (string mch_id) {this.mch_id = mch_id;} public string getNonce_str () {return nonce_str;} public void setnonce_str (string nonce_str) {this.nonce_str = nonce_str;} public string getNoTify () {this.nonce_str = nonce_str; notify_url) {this.notify_url = notify_url;}public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public String getOut_trade_no() {return out_trade_no;}public void setOut_trade_no(String out_trade_no) {this.out_trade_no = out_trade_no;} string publik getspbill_create_ip () {return spbill_create_ip;} public void setspbill_create_ip (string spbill_create_ip) {this.spbill_create_ip = spbill_create_preate_ip) {this.spbill_create_ip = spbill_create_ip; void setTotal_fee(int total_fee) {this.total_fee = total_fee;}public String getTrade_type() {return trade_type;}public void setTrade_type(String trade_type) {this.trade_type = trade_type;}public String getSign() {return sign;}public void setSign(String sign) {this.sign = tanda;} string publik getProduct_id () {return product_id;} public void setProduct_id (string product_id) {this.product_id = product_id;} public String generateExMlContent () {string xml = "<xml>" + " +" + this.appid + "<//string xml =" <xml> "" + "" + this.Appid + "<///string xml =" <xml> "" + "" + this.Appid + "</// "<device_info> web </device_info>" + "<cch_id>" + this.mch_id + "</cch_id>" + "<nonce_str>" + this.nonce_str + "</sce_str>" + "<todify_url>" + ini. this.out_trade_no + "</ out_trade_no>" + "<product_id>" + this.product_id + "</product_id>" + "<pbill_create_ip>" + this.spbill_create_ip + "</pbill_create_preate>" + " +" + " +" </spbill_create_ip> " +" + " +" + " +" + "</spbill_create>" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" "</t total_fee>" + "<dade_type>" + this.trade_type + "</dade_type>" + "<ditch>" + this.sign + "</dianat>" + "</xml>"; return xml;} public string () {string content = "appid =" + ini. "" "& mch_id =" + this.mch_id + "& nonce_str =" + this.nonce_str + "? ify_url =" + this.notify_url + "& out_trade_no =" + this.out_trade_no + "& product_id =" + this.product_id + "& spbill_crate_crate" & prodate = " + this.product +" this.spbill_create_ip+"&total_fee=" + String.valueOf(this.total_fee) +"&trade_type=" + this.trade_type;content = content + "&key=" + WeiXinConstants.MD5_API_KEY;String signature = WeiXinPaymentUtil.MD5Encode(content, "utf-8");return Signature.touppercase ();}}Penjelasan dari setiap variabel anggota dapat ditemukan dalam deskripsi [Interface tunggal yang terpadu].
Setelah ini, kita perlu mengisi konten yang kita atur, hubungi antarmuka untuk mendapatkan data pengembalian, mendapatkan data Code_URL, dan menghasilkan gambar dua dimensi berdasarkannya, mengembalikan alamat gambar ke halaman web PC, dan kemudian akan ditampilkan. Di sini kita akan membuat catatan khusus bahwa ketika kita mengklik pembayaran WeChat, kita akan menghubungi pengontrol SpringMVC backend kita sendiri melalui metode AJAX, dan kemudian menyelesaikan analisis antarmuka tunggal terpadu WeChat melalui httpclient dalam metode yang sesuai dari pengontrol untuk mendapatkan data XML yang dikembalikan oleh Code_URL, dan kemudian menghasilkan kode QR dan mengembalikannya ke halaman depan. Kode yang diimplementasikan dalam pengontrol adalah sebagai berikut:
Peta <String, Object> hasil = hashmap baru <string, object> (); UnifiedOrderDto dto = new UnifiedOrderDto (); if (tunai == null || "" .Equals (tunai)) {result.put ("kesalahan", "tunai nol"); hasil pengembalian;} int totalfee = 100*integer. TotalFee); dto.setProduct_id (string.ValueOf (System.CurrentTimeMillis ())); dto.setBody ("perbaikan"); dto.setnonce_str (string.valueof (u -u -uget ()); Logininfo LOGININFO = LOGININFOUTIL.GETIME ()); LOVINGIN (LOVININFO LOVININFO = LOGININFOUTIL.GETIM (LOVOREGOLE (LOVININ (LOVININ (LOVININ (LOVININ (LOVININ LOVININ (LOVININ (LOVININ (LOVININ (LOVININ (LOVININ LOVININ (LOVININ (LOVININ))) Bendera identifikasi identitas dto.setout_trade_no ("Nomor pesanan Anda + informasi utama, itu dikirim kembali setelah callback weChat, Anda dapat memverifikasi"); dto.settota_fee (totalfee); dto.setspbill_create_ip ("127.0.0.1"); // generate.setso.setsign ("127.0.0.1"); // generate standto.setsethogn ("127.0.0.1"); // generate standto.setsethoIge ("127.0.0.1"); // Generate.setingto.setset + dto.makesign ()); logger.info ("konten xml:" + dto.generatexmlcontent ()); coba {httpclient httpclient = httpclientbuilder.create (). build (); Httppost post = httpppost baru (weixinconstants.unifiedorder_url); post.addheader ("tipe konten", "teks/xml; charset = utf-8"); stringEntity xmlentity = stringEntity baru (dto.generatexmlContent (), ContentType.text_xml); post.setentity (xmlentity); httpresponse httpresponse = httpclient.execute (post); string responsexml = entityutils.tostring (httpresponse.getentity (), "utf-8"); Code_url contentMap <string, string = ""> resultMap = (peta <string, string = "">) xmlutil.doxmlparse (responsexml); logger.info ("codeurl codeurl = codeurl:" + code_ger ("code_url"); codeurl = codeurl = codeurl = codeLP ("code- codeurl" codeurl "codeurl" codeurl "codeurl" codeurl "codeurl" codeurl "); codeurl"); codeurl "); codeurl"); codeurl "); ! "". Equals (codeUrl)) {string ImageUrl = GenerateQrCode (codeUrl); result.put ("qrimage", imageUrl);} post.releasEconnection ();} catch (pengecualian e) {e.printstacktrace ();} result.put ("success"); Hasil; </string,> </string,> </string, objek> </string, objek>Kode yang menghasilkan kode QR adalah sebagai berikut:
private String generateQrcode(String codeurl) {File folder = new File(basePath + "qrcode");if(!foldler.exists()) {foldler.mkdirs();}String f_name = UUIDUtil.uuid() + ".png";try {File f = new File(basePath + "qrcode", f_name);FileOutputStream fio = FileOutputStream baru (f); multiformatwriter multiformatwriter = multiformatwriter baru (); peta hints = new HashMap (); hints.put (encodehinttype.character_set, "UTF-8"); // Atur karakter set pengkodean jenis bitmatrix bitmatrix = null; bitmatrix = multiformatwriter.encode (codeUrl, Barcodeformat.qr_code, 300, 300, petunjuk qr Image = TobufedImage (BitMatrix); // output qr gambar = output qr ImageOo (bitmatrix); // output qr gambar qr Imageoo (bitmatrix); ("qrcode/" + f_name);} catch (Exception e1) {e1.printstacktrace (); return null;}}Pada saat ini, setelah memindai kode QR WeChat pada klien, kami akan menggunakan panggilan balik untuk membuat URL dan mengembalikan data kepada kami. Kami akan menyelesaikan pemrosesan kami sendiri dalam metode callback. Penting untuk dicatat di sini bahwa antarmuka panggilan balik Anda harus diimplementasikan melalui metode HTTP Post, jika tidak data XML tidak akan diterima. Kode untuk pemrosesan panggilan balik adalah sebagai berikut:
@RequestMapping (value = "/your_callback_url", Method = requestMethod.post) @Responsebodypublic void finishpayment (httpservletRequest request, httpserVleSponse response {try {logger.info ("Mulai ke callback dari werixin response =") {logger. resultMap = new HashMap <string, string = ""> (); inputStream inputStream = request.getInputStream (); // Baca aliran input saxbuilder saxbuilder = new saxbuilder (); dokumen dokumen = elemen saxbuilder.build (inputStream);// get the xm. dari daftar elemen root daftar = root.getchildren (); iterator it = list.iterator (); while (it.hasnext ()) {elemen e = (elemen) it.next (); string k = e.getname (); vorse v = "Daftar anak = e.getChildren (); if (if children.isempty () {E.)) {E.) {E.) {E.) () {E.)) {E.)) Xmlutil.getChildRentext (anak -anak);} resultMap.put (k, v);} // Verifikasi tanda tangan! Lai Lai /*String [] keys = resultMap.keyset (). Toarray (string baru [0]); arrays.sort (tombol); string kvparams = ""; untuk (int i = 0; i <keys.length; i ++) = "" {= "" if (Keys [i] .equals ("Sign") = "" {= "" if (Keys [i] .eAcals ("Sign") = "" {= "" if (Keys [i] .equals ("Sign") = "" {= "" if (Keys [i] .equals ("Sign") = "" {= "" if (Keys [i] .eAcals ("Sign") = "" if (i = "=" 0) = "" kvparams = "" + = "(tombol [i]" "=" + resultMap.get (keys [i]));} else {kvparams + = ("&" = "" Keys [i] = "& key =" + weixinconstants.md5_api_key_key; WeixInpaymentutil.md5Encode (ESIGN, "UTF-8"); = "" if (! Md5esign.equals (resultMap.get ("tanda")) = "" return; = ""}*= "" tutup stream = "" Free Resource = "" inputStream.close (); "" inputstream = "noul =" "noul" "noul; returnCode = "resultMap.get (" return_code ");" outtradeno); = "" logger.info ("total_fee =" "nfee); =" "proses pemrosesan bisnis =" "jika (" sukses ".Equals (returnCode)) =" "TODO: =" "Anda =" "BISNIS =" "Proses =" "Add =" "Here =" "" response.getWriter (). print (xmlutil.getRetResultXml (resultMap.get ("return_code"), = "" resultMap.get ("return_code"))); = "" else = "" resultMap.get ("return_msg"))); = "" "" "" "" "" "ioApe (" IOACE "))); =" "" Catch = "" (JDomException = "" E1) = "" E1.PrintStackTrace (); = ""}Ingatlah untuk menggunakan dua kelas XMLUTIL dan MD5UTIL yang digunakan dalam Demo WeChat versi Java resmi. Kode demo dapat ditemukan di halaman demo resminya. Ketergantungan Maven yang relevan adalah sebagai berikut:
<dependency> <GroupId> jdom </groupid> jdom </artifactid> <version> 1.1 </version> </dependency> <dependency> <groupid> com.google.zxing </groupid> Core </arttifactid> <version> 3.3.0 </versi </dependency>
Akhirnya, saya harus memberi perhatian khusus pada tanda tangan. Saya langsung mengunduh versi Java dari program demo dari situs web resmi WeChat untuk mendapatkan tanda tangan. Saya menyarankan Anda untuk melakukan hal yang sama, karena ini adalah pilihan terbaik untuk memastikan bahwa tanda tangan MD5 konsisten. Untuk algoritma spesifik untuk menghasilkan tanda tangan, Anda dapat melihat dokumen WeChat resmi. Di sini kami sangat menyarankan agar Anda harus menjelaskan API resmi. 90% dari berbagai masalah yang Anda temui dalam pengembangan adalah karena Anda tidak membaca dokumen resmi, tetapi percaya pada blog seseorang! Ini adalah tujuan dan tujuan sebenarnya dari penulisan saya artikel ini. Menurut dokumen resmi, saya menerapkannya dengan kode Java saya. Pindai kode QR di halaman web PC WeChat dan bayar untuk pembayaran pasti akan terbang di aplikasi web Anda.
Di atas adalah implementasi Java SpringMVC dari PC Web Page WeChat QR Code Payment (versi lengkap) yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!