1: ความรู้การรู้หนังสือการชำระเงินแบบ WeChat ก่อน
สิ่งที่จำเป็นต้องมีคือมีบัญชีอย่างเป็นทางการแล้วที่ใช้สำหรับฟังก์ชั่นการชำระเงิน WeChat และจากนั้นเราต้องได้รับบัญชี Appid และบัญชีผู้ค้า WeChat สามารถพบได้ในบัญชีทางการ WeChat และแพลตฟอร์มการชำระเงิน WeChat ตามลำดับ ในความเป็นจริงหลังจากที่คุณสมัครใช้งานฟังก์ชั่นการชำระเงิน WeChat จะส่งอีเมลถึงคุณทางอีเมลได้สำเร็จ ด้วยข้อมูลนี้เราสามารถไปที่หน้าสนับสนุนบริการชำระเงิน weChat: https://pay.weixin.qq.com/service_provider/index.shtml
เปิดหน้านี้และคลิกลิงก์ [เอกสารการพัฒนา] ที่มุมขวาบนเพื่อเข้าสู่หน้าคำอธิบายเอกสาร API ซึ่งดูเหมือนต่อไปนี้
เลือกวงกลมสีแดงเพื่อสแกนรหัสเพื่อชำระซึ่งหมายความว่าเราต้องทำวิธีการเข้าถึง ย้ายเมาส์ไปยังด้านบนและแจ้งให้คุณดูเอกสารการพัฒนา หากคุณไม่ทราบวิธีการดูสิ่งนี้คุณสามารถอาบน้ำและเข้านอน คุณไม่เหมาะสำหรับโปรแกรมเมอร์ ที่อยู่มีดังนี้:
https://pay.weixin.qq.com/wiki/doc/api/native.php?Chapter=6_1 คุณจะเห็นหลังจากเปิดในเบราว์เซอร์ของคุณ
เนื้อหาที่เรามุ่งเน้นและอ่านมีการทำเครื่องหมายด้วยวงรีสีแดงแล้ว ขั้นแรกให้อ่านข้อมูลจำเพาะโปรโตคอลใน [กฎอินเตอร์เฟส] แค่ล้อเล่นถ้าคุณไม่ได้อ่านสิ่งนี้คุณต้องการชำระเงิน WeChat นี่ก็เหมือนกับว่าคุณต้องการรับผู้หญิง คุณต้องรวบรวมข้อมูลพื้นฐานพื้นฐานก่อนและเข้าใจลักษณะของอีกฝ่ายไม่เช่นนั้นคุณจะสื่อสารด้านล่างได้อย่างไร ปรากฎว่ามีเพียงโปรแกรมเมอร์เท่านั้นที่สามารถรับผู้หญิงได้เป็นพนักงานขายที่ดี หลังจากออกจากหัวข้อเราจะดูกรณีและข้อกำหนดใน [การแนะนำฉาก] เพียงแค่ดูโลโก้ของ WeChat Pay นี่คือการวางไว้ในเว็บเพจการชำระเงินรหัส QR ของเราเองซึ่งดูเป็นมืออาชีพมากขึ้น หลังจากนั้นมุ่งเน้นไปที่ [โหมด 2]
ที่นี่เราจะใช้วิธีโหมด 2 เพื่อรับรู้ฟังก์ชั่นการชำระเงินรหัสการสแกนของหน้าพีซี
คำอธิบายอย่างเป็นทางการของโหมด 2 โดย WeChat มีดังนี้: "ระบบแบ็กเอนด์ของผู้ค้าเรียกว่าอินเทอร์เฟซเดี่ยวแบบครบวงจรของ WeChat Pay, ระบบแบ็กเอนด์ WeChat ส่งคืนพารามิเตอร์ลิงค์ code_url ระบบแบ็กเอนด์ของผู้ค้าจะสร้างภาพรหัส QR การชำระเงิน." หากคุณเข้าใจเราต้องโทรหา WeChat ก่อนเพื่อให้อินเทอร์เฟซเดียวแบบครบวงจรและรับข้อมูลสำคัญ code_url (สำหรับสิ่งที่นรกคือ code_url นี้ฉันไม่รู้) จากนั้นเราสร้างรหัส QR ผ่านโปรแกรมของเราเอง ฉันใช้ไลบรารี ZXING ของ Google ที่นี่ จากนั้นเพียงแค่แสดงรหัส QR บนหน้าเว็บพีซีของคุณ ด้วยวิธีนี้ผู้ใช้เทอร์มินัลจะจ่ายโดยการสแกนรหัสและการชำระเงินจะเสร็จสิ้น คุณต้องตื่นเต้นมากที่ได้เห็นสิ่งนี้ คุณพบว่าการชำระเงิน WeChat นั้นง่ายมาก มีอีกสิ่งหนึ่งที่เรายังไม่รู้ ลูกค้ารู้ว่าพวกเขาจ่ายเงินแล้ว แต่ฝั่งเซิร์ฟเวอร์ของเรายังไม่รู้ ด้วย IQ ของนักพัฒนา WeChat พวกเขาได้คิดถึงปัญหานี้มานานแล้ว ดังนั้นเมื่อคุณเรียกอินเทอร์เฟซเดี่ยวแบบรวมจะมีพารามิเตอร์ที่จำเป็นนั่นคือ URL การโทรกลับ นั่นคือถ้าลูกค้าจ่ายสำเร็จ WeChat จะส่งข้อมูลบางอย่างไปยังเซิร์ฟเวอร์ของเราผ่าน URL นี้และจากนั้นเราจึงแยกวิเคราะห์ข้อมูลในพื้นหลังเพื่อให้การดำเนินการของเราเสร็จสมบูรณ์ จากนั้นเราจะรู้ได้ว่าลูกค้าจ่ายเงินผ่าน WeChat หรือไม่ วิธีนี้กระบวนการทั้งหมดสิ้นสุดลงและนี่คือรูปแบบ 2 WeChat ใช้แผนภาพเวลาเพื่อแสดงถึงกระบวนการนี้
มันซับซ้อนในการแสดงออกและดูเหมือนจะยาก เพื่อสรุปสิ่งที่เซิร์ฟเวอร์ของเราควรทำมีดังนี้:
1. ผ่านพารามิเตอร์ที่ถูกต้อง (แน่นอน URL การโทรกลับของเรา) และการตรวจสอบลายเซ็นผ่านอินเทอร์เฟซเดี่ยวแบบรวมและรับข้อมูลที่สอดคล้องกันของ code_url จากข้อมูลการส่งคืน
2. ตามข้อมูล code_url เราสร้างภาพรหัส QR และแสดงบนหน้าเว็บเบราว์เซอร์
3. เพิ่มการประมวลผลตรรกะทางธุรกิจของเราเองใน URL ของการโทรกลับ
การรู้หนังสือสิ้นสุดลงแล้วและในที่สุดคุณก็รู้ว่ากระบวนการใดที่จะจ่ายโดยการสแกนรหัส มาดูการใช้ API ที่เกี่ยวข้องและทำงานได้ดีในการประมวลผลทุกขั้นตอน
สอง: กระบวนการพัฒนา
ก่อนที่จะพัฒนารหัสโปรดเตรียมบางสิ่งก่อน
1. เพิ่มการพึ่งพา Maven ของ ZXING
2. เพิ่มการพึ่งพา maven ของ jdom
3. ดาวน์โหลดโปรแกรมสาธิตเวอร์ชัน Java ที่อยู่ที่อยู่ที่นี่
https://pay.weixin.qq.com/wiki/doc/api/native.php?Chapter=11_1
เราต้องการ md5util.java และ xmlutil.java สองไฟล์
4. เราใช้ httpClient เวอร์ชัน 4.5.1 อย่าลืมเพิ่มการพึ่งพา maven
หลังจากการเตรียมการข้างต้นเสร็จสิ้นการอ่านต่อ:
ก่อนอื่นเราต้องโทรหาอินเทอร์เฟซเดียวของ WeChat เมื่อเราคลิกที่ Unified Single ใน [API List] เราจะเห็นหน้าเช่นนี้:
การรับสถานการณ์จริงของการโทรของฉันเป็นตัวอย่างพารามิเตอร์ต่อไปนี้เป็นสิ่งจำเป็น เพื่อความสะดวกของทุกคนฉันได้เปลี่ยนเป็นวัตถุ Pojo รหัสมีดังนี้:
คลาสสาธารณะ UnifiedOrderDTO ใช้ weixinconstants {สตริงส่วนตัว appid; ตัวสตริงส่วนตัว; สตริงส่วนตัวอุปกรณ์ _info; สตริงส่วนตัว mch_id; สตริงส่วนตัว nonce_str; สตริงส่วนตัวแจ้งเตือน _url; สตริงส่วนตัวเปิด; สตริงส่วนตัว out_trade_no; {this.appid = appid; this.mch_id = wxPaymentAccount; this.device_info = device_info_web; this.notify_url = callback_url; this.trade_type = trade_type_native; getBody () {return body;} โมฆะสาธารณะ setbody (สตริงตัว) {this.body = body;} สตริงสาธารณะ getDevice_Info () {return device_info;} โมฆะสาธารณะ setDevice_info (String Device_info) {this.device_info = device_info; setmch_id (สตริง mch_id) {this.mch_id = mch_id;} สตริงสาธารณะ getNonce_str () {return nonce_str;} โมฆะสาธารณะ setnonce_str (สตริง nonce_str) {this.nonce_str = nonce_str; notify_url) {this.notify_url = notify_url;} สตริงสาธารณะ getOpenid () {return openId;} โมฆะสาธารณะ setopenid (สตริง openId) {this.openid = openId;} public String getout_trade_no () {this.out_trade_no = out_trade_no;} สตริงสาธารณะ getSpbill_create_ip () {return spbill_create_ip;} โมฆะสาธารณะ setspbill_create_ip (string spbill_create_ip) total_fee;} โมฆะสาธารณะ settotal_fee (int total_fee) {this.total_fee = total_fee;} สตริงสาธารณะ gettrade_type () {return trade_type;} void สาธารณะ settrade_type setSign (เครื่องหมายสตริง) {this.sign = sign;} สตริงสาธารณะ getProduct_id () {return product_id;} โมฆะสาธารณะ setProduct_id (สตริง product_id) {this.product_id = product_id; "" + "<vice_info> เว็บ </device_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nonce_str>" + "<notify_url>" this.out_trade_no + "</out_trade_no>" + "<product_id>" + this.product_id + "</product_id>" + "<spbill_create_ip>" + this.spbill_create_ip + "</spbill_create_ip> "</total_fee>" + "<Trade_type>" + this.trade_type + "</trade_type>" + "<mign>" + this.sign + "</sign>" + "</xml>"; กลับไปที่ xml;} "& 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.spbill_create_ip + "& total_fee =" + string.valueof (this.total_fee) + "& trade_type =" + this.trade_type; content = content + "& key =" + weixinconstants.md5_aPi_key; string signature = weixinpay Signature.touppercase ();}}คำอธิบายของตัวแปรสมาชิกแต่ละตัวสามารถพบได้ในคำอธิบายของ [อินเทอร์เฟซเดียวที่รวมกัน]
หลังจากนี้เราจำเป็นต้องกรอกเนื้อหาที่เราตั้งไว้เรียกอินเทอร์เฟซเพื่อรับข้อมูลการส่งคืนรับข้อมูล code_url และสร้างภาพสองมิติตามมันส่งคืนที่อยู่รูปภาพไปยังหน้าเว็บพีซีแล้วจะปรากฏขึ้น ที่นี่เราจะจดบันทึกพิเศษว่าเมื่อเราคลิกที่การชำระเงิน WeChat เราจะเรียกคอนโทรลเลอร์ SpringMVC แบ็กเอนด์ของเราผ่านวิธี AJAX จากนั้นทำการวิเคราะห์อินเทอร์เฟซเดี่ยวแบบครบวงจรของ WeChat ผ่าน HTTPClient ในวิธีการที่สอดคล้องกันของคอนโทรลเลอร์เพื่อรับข้อมูล XML ที่ส่งคืนโดย code_url รหัสที่ใช้ในคอนโทรลเลอร์มีดังนี้:
แผนที่ <string, object> result = new hashmap <string, object> (); UnifiedOrderDto dto = new UnifiedOrderDto (); ถ้า (เงินสด == null || "" .equals (เงินสด)) {result.put ("ข้อผิดพลาด", "เงินสดไม่ได้เป็นศูนย์) TotalFee); dto.setProduct_id (string.valueof (System.currentTimeMillis ())); dto.setbody ("ซ่อม"); dto.setnonce_str (string.valueof (system.nanotime ())); การระบุตัวตน Flag DTO.SetOut_trade_no ("หมายเลขคำสั่งซื้อของคุณ + ข้อมูลคีย์มันถูกส่งกลับหลังจากการเรียกกลับ weChat คุณสามารถตรวจสอบ"); dto.settotal_fee (Totalfee); dto.setspbill_create_ip ("127.0.1"); " + dto.makesign ()); logger.info (" เนื้อหา xml: " + dto.generatexmlcontent ()); ลอง {httpClient httpClient = httpClientBuilder.create (). สร้าง (); httppost post = new httppost (weixinconstants.unifiedOrder_url); post.addheader ("เนื้อหาประเภท", "text/xml; charset = utf-8"); ความเข้มงวด xmlentity = ใหม่ที่เข้มงวด (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 = (แผนที่ <string, string =" ">) xmlutil.doxmlparse (responsexml); logger.info (" response code_url: "resultmap.get (" code_url "); string codeurl = resultmap.get ! "". เท่ากับ (codeurl)) {string imageUrl = generateQrCode (codeUrl); result.put ("qrimage", imageUrl);} post.releaseconnection ();} catch (ยกเว้น e) {e.printstacktrace (); ผลลัพธ์; </string,> </string,> </string, object> </string, object>รหัสที่สร้างรหัส QR มีดังนี้:
สตริงส่วนตัว generateQrCode (สตริง codeurl) {ไฟล์โฟลเดอร์ = ไฟล์ใหม่ (basepath + "qrcode"); ถ้า (! foldler.exists ()) {foldler.mkdirs ();} สตริง f_name = uuidutil.uuid () + ".png"; fio = ใหม่ fileOutputStream (f); multiformatWriter multiformatWriter = new MultiformatWriter (); MAP คำแนะนำ = new HashMap (); Hints.put (ENCODEHINTTYPE.CHARACTION_SET, "UTF-8"); // ตั้งค่าชุดอักขระการเข้ารหัสประเภท bitmatrix bitmatrix = null; bitmatrix = multiformatwriter.encode (codeurl, barcodeformat.qr_code, 300, 300, คำแนะนำ); bufferedimage image = tobufferedimage (bitmatrix); ("qrcode/" + f_name);} catch (Exception e1) {e1.printstacktrace (); return null;}}ในเวลานี้หลังจากสแกนรหัส WeChat QR บนไคลเอนต์เราจะใช้การโทรกลับเพื่อสร้าง URL และส่งคืนข้อมูลให้เรา เราจะดำเนินการประมวลผลของเราเองในวิธีการโทรกลับ เป็นสิ่งสำคัญที่จะต้องทราบที่นี่ว่าอินเทอร์เฟซการโทรกลับของคุณจะต้องดำเนินการผ่านวิธีการโพสต์ HTTP มิฉะนั้นข้อมูล XML จะไม่ได้รับการยอมรับ รหัสสำหรับการประมวลผลการโทรกลับมีดังนี้:
@RequestMapping (value = "/your_callback_url", method = requestMethod.post) @ResponseBodyPublic Void FinishPayment (httpservletRequest Request, httpservletResponse) {ลอง {logger.info ("เริ่มต้น ใหม่ hashmap <string, string = "> (); inputstream inputstream = request.getInputStream (); // อ่านอินพุตสตรีม saxbuilder saxbuilder = new SaxBuilder () เอกสาร = saxbuilder.build; root.getChildren (); iterator it = list.iterator (); ในขณะที่ (it.hasnext ()) {องค์ประกอบ e = (องค์ประกอบ) it.next (); สตริง k = e.getName (); สตริง v = ""; xmlutil.getChildRentext (เด็ก);} resultmap.put (k, v);} // ตรวจสอบลายเซ็น! - - /*สตริง [] keys = resultmap.keyset (). toarray (สตริงใหม่ [0]); array.sort (ปุ่ม); สตริง kvparams = ""; สำหรับ (int i = 0; i <keys.length; i ++) = "" = "" ถ้า (keys [i]. " if (i = "=" 0) = "" kvparams = "" + = "(คีย์ [i]" "=" + resultmap.get (ปุ่ม [i]));} else {kvparams + = ("&" = " Weixinpaymentutil.md5encode (esign, "UTF-8"); = "" ถ้า (! returnCode = "resultmap.get (" return_code ");" outtradeno = "resultmap.get (" out_trade_no ");" Outtradeno); = "" logger.info ("total_fee =" "nfee); =" "กระบวนการประมวลผลธุรกิจ =" "ถ้า (" ประสบความสำเร็จ ".equals (returnCode)) =" "toDo: =" "ของคุณ =" "กระบวนการ =" Response.getWriter (). print (xmlutil.getRetResultxml (resultmap.get ("return_code"), = "" resultmap.get ("return_code"))); (jdomexception = "" e1) = "" e1.printstacktrace (); = ""}อย่าลืมใช้สองคลาสของ Xmlutil และ Md5util ที่ใช้ในการสาธิต WeChat เวอร์ชัน Java อย่างเป็นทางการ รหัสตัวอย่างสามารถพบได้ในหน้าตัวอย่างอย่างเป็นทางการ การพึ่งพา Maven ที่เกี่ยวข้องมีดังนี้:
<Ederency> <sderctId> jdom </groupId> jdom </artifactid> <version> 1.1 </เวอร์ชัน> </การพึ่งพา> <การพึ่งพา> <roupId> com.google.zxing </roupid> Core </artifactId> <cersion> 3.3.0
ในที่สุดฉันควรให้ความสนใจเป็นพิเศษกับลายเซ็น ฉันดาวน์โหลดโปรแกรมตัวอย่าง Java โดยตรงจากเว็บไซต์ WeChat อย่างเป็นทางการเพื่อรับลายเซ็น ฉันขอแนะนำให้คุณทำเช่นเดียวกันเพราะนี่เป็นตัวเลือกที่ดีที่สุดเพื่อให้แน่ใจว่าลายเซ็น MD5 นั้นสอดคล้องกัน สำหรับอัลกอริทึมเฉพาะสำหรับการสร้างลายเซ็นคุณสามารถดูเอกสาร WeChat อย่างเป็นทางการได้ ที่นี่เราขอแนะนำอย่างยิ่งให้คุณต้องอธิบาย API อย่างเป็นทางการ 90% ของปัญหาต่าง ๆ ที่คุณพบในการพัฒนาเป็นเพราะคุณไม่ได้อ่านเอกสารอย่างเป็นทางการ แต่เชื่อใจบล็อกของใครบางคน! นี่คือจุดประสงค์และวัตถุประสงค์ที่แท้จริงของการเขียนบทความนี้ ตามเอกสารอย่างเป็นทางการฉันใช้มันด้วยรหัส Java ของฉัน สแกนรหัส QR บนหน้าเว็บพีซี WeChat และชำระเงินสำหรับการชำระเงินจะบินได้อย่างแน่นอนในเว็บแอปพลิเคชันของคุณ
ด้านบนคือการใช้งาน Java SpringMVC ของพีซีหน้าเว็บการชำระเงินรหัส WeChat QR (เวอร์ชันเต็ม) แนะนำโดยโปรแกรมแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!