ในระหว่างการพัฒนา WeChat JS-SDK จะใช้ GetLocation เพื่อรับตำแหน่งพิกัด วิธีการใช้พิกัดโดยตรงที่ได้รับจาก WeChat กับ Baidu Map โดยแสดงเอฟเฟกต์ต่อไปนี้:
หมายเหตุ: ไอคอนสีแดงคือตำแหน่งที่แปลงจาก WeChat และไอคอนสีน้ำเงินคือตำแหน่งรอบ ๆ ก่อนอื่นให้อธิบายจากกระบวนการพัฒนา WeChat
1. เอกสารการพัฒนา WeChat JS-SDK
ก่อนอื่นให้ป้อนเอกสารช่วยเหลือบนเว็บไซต์อย่างเป็นทางการ: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_cn
คุณสามารถศึกษาเอกสารโดยละเอียด เพื่อให้ได้ข้อมูลตำแหน่งขั้นตอนต่อไปนี้จะแบ่งออกเป็นขั้นตอนต่อไปนี้:
ขั้นตอนที่ 1: ผูกชื่อโดเมน
ป้อนบัญชีอย่างเป็นทางการของ WeChat ค้นหาเมนู "การตั้งค่าบัญชีอย่างเป็นทางการ" และป้อนแผง "การตั้งค่าฟังก์ชั่น"
คลิก "การตั้งค่า" เพื่อตั้งค่าชื่อโดเมนที่เกี่ยวข้องที่อ้างอิง JS:
ขั้นตอนที่ 2: อ้างถึงห้องสมุด JS Class อย่างเป็นทางการ
แนะนำไฟล์ JS ต่อไปนี้บนหน้าเว็บที่ต้องเรียกอินเตอร์เฟส JS (สนับสนุน https): http://res.wx.qq.com/open/js/jweixin-1.0.js
หน้าอ้างอิงคือ location.aspx ดังต่อไปนี้:
< %@ page title = "get location" language = "c#" autoEventWireUp = "true" masterPageFile = "~/wxcrm/site.master" codefile = "location.aspx.cs" สืบทอด = "dtcms.web.wxcrm.location" src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> </script> <script type = "text/javascript"> $ ("#mask"). show (); wx.config ({debug: false, // เปิดโหมดดีบั๊กถ้าเป็นจริงการเรียกใช้ฟังก์ชัน JS แต่ละรายการจะปรากฏขึ้น appid: '< %= resultjsdata.getValue ("appid") %>', // จำเป็นต้องใช้ตัวระบุที่ไม่ซ้ำกัน '< %= resultjsdata.getValue ("noncestr") %>', // จำเป็น, สร้างลายเซ็นสตริงสุ่มลายเซ็น: '< %= resultjsdata.getValue ("ลายเซ็น") %>', //, enmenushelist ' 'OnMenushareqq', 'OnMenushareWeibo', 'Hidemenuitems', 'Showmenuitems', 'HideAllnonBaseMenuitems', 'Showallnonbasemenuitems', 'showallnonbaseMenuitems' 'StopRecord', 'OnRecordend', 'PlayVoice', 'PauseVoice', 'StopVoice', 'UploadVoice', 'DownloadVoice', 'เลือก imeimage', 'previewImage', 'uploadimage', 'hideLocation', 'hideLocation' 'closeWindow', 'scanqrcode', 'choosewxpay', 'OpenProductSpecificView', 'AddCard', 'Choosecard', 'OpenCard']}); wx.ready (function () {wx.checkjsapi ({jsapilist: ['getNetworktype', 'previewImage', 'getLocation'], ความสำเร็จ: ฟังก์ชั่น (res) {}}); wx.getLocation ({type: 'wgs84' OpenLocation คุณสามารถผ่าน 'GCJ02' ความสำเร็จ: ฟังก์ชั่น (res) {ลอง {var latitude = res.latitude; ความแม่นยำ // Aalert (jsonuti.convertToString (res)); // wx.openlocation ({// latitude: res.latitude, // latitude, หมายเลขจุดลอย ดู ', // ที่อยู่รายละเอียด // สเกล: 28, // ระดับการซูมแผนที่, ค่าการสร้าง, ช่วงตั้งแต่ 1 ถึง 28. ค่าเริ่มต้นคือสูงสุด // infourl: "location1.aspx? m = home & c = ดัชนี & a = getLocation & latitude ="+ละติจูด+" // การแจ้งเตือน (Latitude + "-" + ลองจิจูด); }, ยกเลิก: ฟังก์ชั่น (res) {window.location.href = "ไม่มี. aspx? msg = ปฏิเสธที่จะได้รับที่ตั้งทางภูมิศาสตร์ & r =" + math.random (); // ปฏิเสธ}, fail: function () {แจ้งเตือน wx.error (ฟังก์ชั่น (res) {// การกำหนดค่าความล้มเหลวในการตรวจสอบข้อมูลจะเรียกใช้ฟังก์ชันข้อผิดพลาดหากลายเซ็นหมดอายุการตรวจสอบจะล้มเหลวสำหรับข้อความแสดงข้อผิดพลาดเฉพาะคุณสามารถเปิดโหมดการดีบักของการกำหนดค่าหรือดูในพารามิเตอร์ Res ที่ส่งคืน wx.fail (ฟังก์ชั่น (res) {}); </script> </asp: เนื้อหา> <asp: content id = "content2" contentPlaceHolderId = "cphtitle" runat = "เซิร์ฟเวอร์"> รับตำแหน่ง </asp: เนื้อหา> <asp: content id = "content3" contentlaceholderid = "cphcontainer" gehlace ข้อมูล ... </div> </enter> <div style = "display: none;"> <span> <img src = "/templates/txwap/images/mask.gif"/> </span> </div> </asp: เนื้อหา>เอฟเฟกต์หน้า:
หมายเหตุ:
(1) หากการตั้งค่าโทรศัพท์มือถือไม่อนุญาตให้ WeChat ได้รับข้อมูลตำแหน่งข้อมูลข้างต้นจะได้รับแจ้ง
(2) พารามิเตอร์ในรูปด้านบนได้รับพิกัด GPS หากคุณใช้แผนที่ Baidu คุณจะต้องทำการแปลงและจะสะท้อนในตำแหน่ง 1.aspx
(3) หน้าทั้งหมดที่ต้องการ JS-SDK จะต้องถูกฉีดด้วยข้อมูลการกำหนดค่าก่อนมิฉะนั้นจะไม่ถูกเรียก
Location.aspx.cs การใช้งานที่สอดคล้องกัน:
การใช้การชำระเงิน wxwebhlper; การใช้ payment.wxwebhlper.actions; การใช้ระบบ; การใช้ system.globalization; การใช้ wxjssdk; การใช้ wxpayapi; namespace dtcms.web.wxcrm {ตำแหน่งคลาสสาธารณะบางส่วน ชุด; } timestamp สตริงที่ได้รับการป้องกัน {get; ชุด; } สตริงที่ได้รับการป้องกัน noncestr {get; ชุด; } ลายเซ็นสตริงที่ได้รับการป้องกัน {get; ชุด; } สตริงคงที่สาธารณะ wxjsapiparam {get; ชุด; } public wxjsdata resultjsdata {get; ชุด; } void page_load ที่ได้รับการป้องกัน (ผู้ส่งวัตถุ, EventArgs e) {judgeCode (); var webauthorize = new webauthorizeaastic (); code2tokenResult = webauthorize.code2token (คำขอ ["รหัส"]); if (code2tokenresult.haserror ()) {response.redirect (urls.pageoflocation); GotOnOnePage ("ไม่สามารถรับข้อมูลรับรองผู้ใช้ได้โปรดกลับมาอีกครั้ง"); กลับ; } getUserInforesult = webauthorize.getUserInfo (code2tokenresult.access_token); ถ้า (getUserInforesult.haserror ()) {gotoNoNePage ("ไม่สามารถรับข้อมูลผู้ใช้ได้โปรดกลับมาอีกครั้ง"); } var userId = wxOperation.hasBind (getUserInforesult.openid); if (userId.equals (guid.empty)) {response.redirect (urls.oauth2url); GotoNoNePage ("ผู้ใช้ WeChat ไม่ผูกพัน"); } appid = wxPayConfig.Appid; timestamp = wxpayapi.generatetimestamp (); noncestr = wxpayapi.generatenoncestr (); // การใช้งานต่อไปนี้จะสะท้อนให้เห็นใน 3. การใช้งานหลักการใช้งานรหัส var jsapi = new JSAPI (นี้); resultjsdata = jsapi.getjsdata (); wxjsapiparam = jsapi.getjsapiparameters (); // รับ h5 เพื่อปรับพารามิเตอร์ js api}}}}2. แปลงพิกัด WeChat GPS เป็นพิกัด Baidu
หลังจากที่ WeChat ได้รับพิกัดสำเร็จแล้วหน้าจะข้ามไปยังตำแหน่งโดยอัตโนมัติ 1.aspx และโฟลว์การประมวลผลมีดังนี้:
พิกัด WeChat -> แปลงเป็นพิกัดแผนที่ Baidu -> รับข้อมูลตำแหน่งตาม Baidu Map API -> Display Coordinates ตาม Baidu Map API API
< %@ หน้าชื่อ = "การเช็คอินออนไลน์" language = "c#" masterPageFile = "~/wxcrm/site.master" autoEventWireup = "true" codefile = "location1.aspx.cs" สืบทอด = "dtcms.web.wxcrm.location1" %> name = "viewport" content = "initial-scale = 1.0, user-scalable = no" /> <style type = "text /css"> #allmap {width: 100%; ความสูง: 300px; } </style> <script type = "text/javaScript" src = "http://api.map.baidu.com/api?v=2.0&ak=dhrlkmr9quo4whmnnsztarta" coorditions = </script> <script type = "text/javascript" // ลองจิจูดหมายเลขจุดลอยตัวช่วงคือ 180 ~ -180 var xx = < %= this.request ["Latitude"] %>; // ละติจูดหมายเลขจุดลอยตัวช่วงคือ 90 ~ -90 var gpspoint = ใหม่ bmap.point (xx, yy); var bxx = 0.0; var byy = 0.0; / * * http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition */var positionurl = "http://api.map.baidu.com/geoconv/v1/?"; ฟังก์ชั่นการเปลี่ยนแปลงตำแหน่ง () {var str = "coords ="+yy+","+xx+"& จาก = 1 & to = 5"; var url = positionurl + str; $ ("#positionurl"). html (url+"& ak = dhrlkmr9quo4whmnnnsztartg"); var script = document.createElement ('script'); script.src = url + '& ak = dhrlkmr9quo4whmnnsztarta & callback = dealResult'; document.getElementByTagname ("head") [0] .AppendChild (สคริปต์); } function dealResult (msg) {if (msg.status! = 0) {การแจ้งเตือน ("ไม่มีผลการส่งคืนที่ถูกต้อง"); $ ("#mask"). ซ่อน (); กลับ; } //jsonuti.convertToString(MSG); bxx = msg.result [0] .x; byy = msg.result [0] .y; dooptions (); } ฟังก์ชั่น getBaidUposition () {var url = "http://api.map.baidu.com/geoconv/v1/?coords="+yy+","+xx+"& จาก = 1 & to = 5 & ak = dhrlkmr9quo4whmnnsztarta"; $ .ajax ({url: url, ความสำเร็จ: ฟังก์ชั่น (ข้อมูล, สถานะ, xhr) {แจ้งเตือน (สถานะ); แจ้งเตือน (data.status);}, ข้อมูลประเภท: JSON}); } var advanced_post = ''; var advancedOptions = ''; ที่อยู่ var; แผนที่ var; ฟังก์ชั่น renderOption (การตอบสนอง) {var html = ''; if (response.status) {$ ("#mask"). ซ่อน (); var text = "ไม่มีผลตอบแทนที่ถูกต้อง!"; การแจ้งเตือน (ข้อความ); กลับ; } var result = response.result; var location = response.result.location; var uri = 'http://api.map.baidu.com/marker?location='+ location.lat+', '+location.lng+' & title = '+response.result.level+' & content = '+ที่อยู่+' & output = html '; var staticimageUrl = "http://api.map.baidu.com/staticimage?center="+location.lng+','+location.lat+"& markers ="+location.lng+','+location.lat; html = '<p> พิกัด: ละติจูด:' + location.lat + "ลองจิจูด:" + location.lng + '<br />'; html+= 'ความแม่นยำ:'+response.result.pecise+'<br />'; html += 'สกุลเงิน:' +response.result.confidence +'<br />'; html+= 'ประเภทที่อยู่:'+response.result.level+'</p>'; html + = '<p> <img src = "' + staticimageUrl + '" /> </p>'; html + = '<p> แชร์จุดนี้: <a href = "' + uri + '" target = "_ blank">' + uri + '</a> </p>'; // ตั้งค่าลิงค์นี้เป็น clickable // baidu map function map function = new bmap.map ("allmap"); var point = ใหม่ bmap.point (bxx, byy); var marker = ใหม่ bmap.marker (จุด); // สร้างแผนที่คำอธิบายประกอบ Addoverlay (เครื่องหมาย); // เพิ่มคำอธิบายประกอบลงในแผนที่ Centerandzoom (จุด, 100); var opts = {width: 200, // ข้อมูลหน้าต่างความกว้างความสูง: 100, // ข้อมูลความสูงของหน้าต่างข้อมูล: "ตำแหน่งของฉัน", // ชื่อหน้าต่างข้อมูล enableMessage: จริง, // ตั้งค่าอนุญาตให้หน้าต่างข้อมูลส่งข้อความสั้น ๆ : result.formatted_address} $ ("#divpo"). html var infowindow = ใหม่ bmap.infowindow (result.formatted_address, opts); // สร้าง marker Object Object ข้อมูลหน้าต่างข้อมูล AdDeVentListener ("คลิก", function () {map.openinfowindow (infowindow, point); // เปิดหน้าต่างข้อมูล}); var myicon = ใหม่ bmap.icon ("http://api.map.baidu.com/img/markers.png", bmap.size ใหม่ (23, 25), {ออฟเซ็ต: ใหม่ bmap.size (10, 25), // ระบุตำแหน่งตำแหน่ง var pois = result.pois; สำหรับ (var i = 0; i <pois.length; i ++) {var marker = ใหม่ bmap.marker (ใหม่ bmap.point (pois [i] .point.x, pois [i] .y.y), {icon: myicon}); // สร้างคำอธิบายประกอบ var name = pois [i] .name; var addr = pois [i] .addr; map.addoverlay (marker); // เพิ่มคำอธิบายประกอบลงในแผนที่ AddClickHandler (ชื่อ, addr, marker); } $ ("#mask"). ซ่อน (); $ ("#btnsign"). show (); กลับ; } ฟังก์ชั่น addClickHandler (ชื่อ, addr, marker) {marker.addeVentListener ("คลิก", ฟังก์ชั่น (e) {openInfo (ชื่อ, addr, e)}); } ฟังก์ชั่น openInfo (ชื่อ, addr, e) {var p = e.target; var point = ใหม่ bmap.point (p.getPosition (). lng, p.getPosition (). lat); var opts = {width: 200, // ข้อมูลหน้าต่างความกว้างความสูง: 100, // ข้อมูลความสูงของหน้าต่างข้อมูล: ชื่อ, // ชื่อหน้าต่างข้อมูล enableMessage: จริง, // ตั้งค่าอนุญาตให้หน้าต่างข้อมูลส่งข้อความสั้น ๆ : addr} var infowindow = ใหม่ bmap.infowindow (addr, opts); // สร้างแผนที่วัตถุหน้าต่างข้อมูล OPENINFOWINDOW (InfowIndow, Point); // เปิดฟังก์ชั่นหน้าต่างข้อมูล} dooptions () {var script = document.createElement ('script'); script.type = 'text/javascript'; advanced_post = "http://api.map.baidu.com/geocoder/v2/ak=dhrlkmr9quo4whmnnnsztartg&callback=renderoption&location=" + byy + "," + bxx + "& output = json & pois = 2"; script.src = advanced_post; document.body.appendchild (สคริปต์); - $ (function () {$ ("#mask"). show (); $ ("#btnsign"). hide (); ChangePosition ();}); </script> </asp: เนื้อหา> <asp: content id = "content2" contentPlaceHolderId = "cphtitle" runat = "เซิร์ฟเวอร์"> การเช็คอินออนไลน์ </asp: เนื้อหา> <asp: content iD = "content3" contentlaceHolderId = "cphContainer" runat = "เซิร์ฟเวอร์" ข้อมูล </span> </div> <div style = "padding-left: 0"> <ul style = "ความสูง: 300px;"> <div id = "allmap"> </div> </ul> </div> <div style = "padding-left: 0"> <ul> ขอบด้านบน: -50px; "input id =" btnsign "; /> </div> <div style = "display: none;"> <span> <img src = "/txwap/images/mask.gif"/> </span> </div> </form> </asp: เนื้อหา>หน้านี้ส่วนใหญ่เกี่ยวข้องกับแพลตฟอร์มเปิดแผนที่ Baidu และคุณต้องสมัครสำหรับ Baidu Map Ag มิฉะนั้นการเรียก JS จะแจ้งให้ทราบ: แอปไม่มีอยู่หากมีข้อผิดพลาดใด ๆ ใน AK โปรดตรวจสอบอีกครั้งและลองอีกครั้ง
(1) เทคโนโลยีแผนที่ Baidu 1: ประสานงานการแปลง API
ที่อยู่เว็บไซต์อย่างเป็นทางการ: http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
ที่อยู่บริการ API: http://api.map.baidu.com/geoconv/v1/?
เอกสารมีคำอธิบายโดยละเอียดดังนั้นฉันจะไม่ทำซ้ำ
(2) เทคโนโลยีแผนที่ Baidu 2: รับตำแหน่งตามพิกัด
เว็บไซต์อย่างเป็นทางการ: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
Geocoding API รวมถึงความละเอียดที่อยู่และฟังก์ชั่นความละเอียดที่อยู่ผกผัน:
การเข้ารหัสทางภูมิศาสตร์: นั่นคือการวิเคราะห์ที่อยู่และข้อมูลละติจูด Baidu และข้อมูลลองจิจูดนั้นได้มาจากที่อยู่ที่มีโครงสร้างโดยละเอียดของถนน ตัวอย่างเช่นผลการวิเคราะห์ที่อยู่ของ "หมายเลข 27, Zhongguancun South Street, Haidian District, Beijing" คือ "LNG: 116.31985, Lat: 39.959836" ในเวลาเดียวกันการ Geocoding ยังสนับสนุนการแก้ไขสถานที่โดยตรงสถานที่ทางประวัติศาสตร์และอาคารสถานที่สำคัญและกลับไปที่ละติจูดและลองจิจูด Baidu ตัวอย่างเช่นผลลัพธ์ของการวิเคราะห์ที่อยู่ของ "Baidu Building" คือ "LNG: 116.30815, Lat: 40.056885" มันเป็นข้อกำหนดการดึง POI ทั่วไปและขอแนะนำให้ใช้ Place API
ผกผัน Geocoding: นั่นคือการวิเคราะห์ที่อยู่ผกผันและข้อมูลที่อยู่ที่มีโครงสร้างได้มาจากข้อมูลละติจูด Baidu และลองจิจูด ตัวอย่างเช่น "Lat: 31.325152, LNG: 120.558957" ผลการวิเคราะห์ที่อยู่ผกผันคือ "หมายเลข 318, ถนน Tayuan, Huqiu District, Suzhou City, Jiangsu Province"
ที่อยู่บริการ API: http://api.map.baidu.com/geocoder/v2/
สำหรับพารามิเตอร์เฉพาะโปรดตรวจสอบเอกสารอย่างเป็นทางการ
ตัวอย่าง: http://api.map.baidu.com/geocoder/v2/?ak=appliced สำหรับคีย์ baidu & ตำแหน่ง = 34.79563,114.23075222912 & callback = Showlocation & Output = XML & POIS = 1
หมายเหตุ:
(1) แอปพลิเคชันคีย์นักพัฒนา Baidu
(2) ระบบพิกัดแผนที่ Baidu นั้นแตกต่างจากระบบพิกัด WeChat
(3) ที่อยู่การโทร API และคำอธิบายพารามิเตอร์
(4) ความหมายของฟังก์ชั่นการโทรกลับ API
(5) เข้าใจความหมายของ JSON และ JSONP
3. รหัสแกน WeChat JS-SDK
(1) jsapi.cs สร้างพารามิเตอร์การกำหนดค่า JS-SDK ที่เกี่ยวข้อง
การใช้ระบบ; การใช้ System.globalization; การใช้ System.linq; การใช้ System.web.security; การใช้ System.web.ui; การใช้ wxpayapi; namespace wxjssdk {คลาสสาธารณะ jsapi {/// <summary> /// บันทึกวัตถุหน้าของหน้า ชุด; } public wxjsdata resultjsdata {get; ชุด; } /// <summary> /// // </summary> /// <param name = "page"> </param> jsapi สาธารณะ (หน้าหน้า) {this.page = page; } สาธารณะ wxjsdata getjsdata () {var data = ใหม่ wxjsdata (); data.setValue ("appid", wxPayConfig.Appid); // ID บัญชีสาธารณะ data.SetValue ("timestamp", wxpayapi.generatetimestamp ()); data.setValue ("noncestr", wxpayapi.generatenoncestr ()); // สุ่มสตริง var url = getUrl (); data.setValue ("url", url); var jstoken = getJsapiticket (); data.setValue ("JSAPI_TICKET", JSTOKEN); var signature = makeignature (jstoken, data.getValue ("noncestr"). toString (), data.getValue ("timestamp"). toString (), url); data.setValue ("ลายเซ็น", ลายเซ็น); resultjsdata = ข้อมูล; ส่งคืนข้อมูล } สตริงส่วนตัว makeignature (สตริง jsapiticket, สตริง noncestr, สตริง timestamp, url สตริง) {string [] arraylist = {"jsapi_ticket =" + jsapiticket, "timestamp =" + timestamp, "noncestr =" + noncestr, "url =" Array.sort (ArrayList); var signature = string.oin ("&", arraylist); Signature = FormSauthentication.HashPasswordForStoringInFigFile (ลายเซ็น, "sha1"). TOLOWER (); ส่งคืนลายเซ็น; } สตริงส่วนตัว getJsapiticket () {var jsauth = ใหม่ jsauthorizeaction (); var token = jsauth.getToken (); var nd = dateTime.now - token.createDate; log.error (this.getType (). toString (), token.access_token); log.error (this.getType (). toString (), token.isvalid (). toString ()); if (token.isvalid ()) return jsauth.getjsapiticket (token.access_token) .ticket; กลับ ""; } สตริงส่วนตัว getUrl () {สตริงโฮสต์ = page.request.url.host; String Path = page.request.path; String queryString = page.request.url.Query; // สถานที่แห่งนี้ควรสังเกตว่า URL ที่สมบูรณ์ผ่านกลับไปยังพื้นหลัง WeChat เมื่อหน้าเว็บอนุญาตให้รับข้อมูลผู้ใช้สตริง url = "http: //" + โฮสต์ + พา ธ + เส้นทางการสืบค้น; url กลับ; } สตริงสาธารณะ getjsapiparameters () {log.debug (this.getType (). toString (), "jsapi :: getjsapiparam กำลังประมวลผล ... "); พารามิเตอร์สตริง = resultjsdata.tojson (); log.debug (this.getType (). toString (), "รับ jsapi:" + พารามิเตอร์); พารามิเตอร์ส่งคืน; -(2) jsauthorizeaction.cswechat JS-SDK ฟังก์ชั่นการโทร API ที่เกี่ยวข้อง
ใช้การชำระเงิน wxwebhlper; ใช้การชำระเงิน wxwebhlper.results; ใช้ระบบ การใช้ wxpayapi; namespace wxjssdk {คลาสสาธารณะ jsauthorizeaction {tokenresult token ส่วนตัว = tokenResult ใหม่ () {errCode = -1}; jsapiticketresult jsapiticket ส่วนตัว = ใหม่ jsapiticketResult () {errCode = -1}; สาธารณะ tokenresult getToken () {log.error (this.getType (). toString (), "getToken"); if (! token.isvalid ()) {token = getokenResult (); log.error (this.getType (). toString (), token.toString ()); } กลับมาโทเค็น; } /// <summary> /// // // </summary> /// <return> </returs> tokenresult public getokenResult () {var result = new TokenResult (); ลอง {var webUtils = new WebUtils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid= {0}&secret= {1}", wxpayconfig.appid, wxpayconfig.appsecret); var strrtn = webutils.get (url); result = tools.jsonstringtoobj <tokenresult> (strrtn); } catch (exception ex) {log.error (this.getType (). toString (), ex.message); result = new tokenResult () {errCode = -1086}; } ผลตอบแทนผลลัพธ์; } /// <summary> //// // // </summary> /// <param name = "token"> </param> /// <return> </returns> JsapiticketResult GetJSapiticket if (! jsapiticket.isvalid ()) {jsapiticket = getJsapiticketResult (โทเค็น); } return jsapiticket; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <return> </returs> jsapiticketresult getjsapiticketresult ลอง {var webUtils = new WebUtils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/ticket/getTicket?access_token= {0}&type=jsapi", โทเค็น); var strrtn = webutils.get (url); result = tools.jsonstringtoobj <jsapiticketresult> (strrtn); } catch (exception ex) {log.error (this.getType (). toString (), ex.message); result = new JSapiticketResult () {errCode = -1086}; } ผลตอบแทนผลลัพธ์; }} คลาสสาธารณะ JSapiticketResult: returnResult {/// <summary> /// constructor /// </summary> สาธารณะ jsapiticketResult () {compledate = datetime.now; } /// <summary> /// // // </summary> ตั๋วสตริงสาธารณะ {get; ชุด; } /// <summary> //// Access_Token Interface Timeout Credentialing Timeout, UNIT (วินาที) /// </summary> สาธารณะ int expires_in {get; ชุด; } /// <summary> /////เวลาการสร้าง //// </summary> DateTime สาธารณะที่สร้างขึ้น {get; ชุด; } /// <summary> /// ตรวจสอบว่าเป็นไปได้ไหม //////summary> /// <returns> </returns> บูลสาธารณะ isvalid () {ถ้า (this.errcode! = 0) ส่งคืน false; var nd = datetime.now - สร้างขึ้น; ส่งคืน ND.Seconds <7200; }} คลาสสาธารณะ tokenResult: returnResult {/// <summary> /// constructor /// </summary> สาธารณะ tokenResult () {compledate = datetime.now; } /// <summary> /// อินเทอร์เฟซการอนุญาตทางเว็บเรียกข้อมูลรับรองหมายเหตุ: Access_Token นี้แตกต่างจาก Access_Token ที่รองรับโดยพื้นฐาน /// </summary> สตริงสาธารณะ Access_token {get; ชุด; } /// <summary> //// The Access_Token Interface Call Credentials Timeout Timeout, UNIT (วินาที) /// </summary> สาธารณะ int expires_in {get; ชุด; } /// <summary> /// เวลาการสร้าง //// </summary> DateTime สาธารณะที่สร้างขึ้น {get; ชุด; } /// <summary> /// ตรวจสอบว่าเป็นไปได้ไหม //////summary> /// <returns> </returns> บูลสาธารณะ isvalid () {ถ้า (this.errcode! = 0) ส่งคืน false; var nd = datetime.now - สร้างขึ้น; ส่งคืน ND.Seconds <7200; -(3) WXJSDATA.CS WECHAT JS-SDK คลาสพารามิเตอร์
ใช้ Litjson; ใช้ System.collections.generic; ใช้ System.Security.Cryptography; ใช้ System.Text; ใช้ System.xml; การใช้ wxpayapi; namespace wxjssdk {คลาสสาธารณะ wxjsdata {private sortedDictionary <string, object> m_values = new SortedDictionary <String, Object> (); / *** ตั้งค่าของฟิลด์หนึ่ง* @param ชื่อฟิลด์คีย์* @param ค่าฟิลด์ค่า*/ โมฆะสาธารณะ setValue (คีย์สตริงค่าวัตถุ) {m_values [key] = value; } / *** รับค่าของฟิลด์หนึ่งตามชื่อฟิลด์* @param ชื่อฟิลด์ชื่อฟิลด์* @return ค่าฟิลด์ที่สอดคล้องกับคีย์* / วัตถุสาธารณะ getValue (คีย์สตริง) {Object O = null; m_values.trygetValue (คีย์, ออก o); กลับมา; } / *** พิจารณาว่ามีการตั้งค่าฟิลด์* @param ชื่อฟิลด์คีย์* @return return หากมีการตั้งค่าคีย์ฟิลด์แล้วให้กลับมาจริงมิฉะนั้นเท็จ* / public bool isset (คีย์สตริง) {object o = null; m_values.trygetValue (คีย์, ออก o); ถ้า (null! = o) ส่งคืนจริง; กลับเท็จ; } /*** @convert Dictionary ถึง xml* @return สตริง XML ที่แปลงแล้ว* @throws wxpayexception ** /สตริงสาธารณะ toxml () {// มันไม่สามารถแปลงเป็นรูปแบบ xml ได้ถ้า (0 == m_values.count) โยน wxpayexception ใหม่ ("ข้อมูล wxpaydata ว่างเปล่า!"); } string xml = "<xml>"; foreach (keyValuePair <string, object> pair ใน m_values) {// ค่าฟิลด์ไม่สามารถเป็นโมฆะซึ่งจะส่งผลกระทบต่อกระบวนการที่ตามมาถ้า (pair.value == null) {log.error โยน wxPayException ใหม่ ("WXPAYDATA มีฟิลด์ที่มีค่า NULL!"); } if (pair.value.getType () == typeof (int) || pair.value.getType () == typeof (ทศนิยม)) {xml + = "<" + pair.key + ">" + pair.value.toString () + "</" + pair.key + ">" } อื่นถ้า (pair.value.getType () == typeof (string)) {xml + = "<" + pair.key + ">" + "<! [cdata [" + pair.value + "]> </" + pair.key + ">"; } else // ยกเว้นประเภทสตริงและ int คุณไม่สามารถมีประเภทข้อมูลอื่น ๆ {log.error (this.getType (). toString (), "ข้อผิดพลาดประเภทข้อมูลฟิลด์ WxPayData!"); โยน WxPayException ใหม่ ("WXPAYDATA FIELD TYPE TYPE FIELD IRROR!"); }} xml += "</xml>"; กลับ XML; } / *** @convert xml เป็นวัตถุ wxpaydata และส่งคืนข้อมูลภายในวัตถุ* @param string xml ที่จะแปลง* @return พจนานุกรมที่ได้รับจากการแปลง* @throws wxpayexception* / public sorteddictionary <string, object> fromxml (string xml) log.error (this.getType (). toString (), "มันไม่ถูกกฎหมายที่จะแปลงสตริง XML ที่ว่างเปล่าเป็น wxpaydata!"); โยน wxpayexception ใหม่ ("มันไม่ถูกกฎหมายที่จะแปลงสตริง XML ที่ว่างเปล่าเป็น wxpaydata!"); } xmldocument xmldoc = new xmldocument (); xmldoc.loadxml (xml); xmlnode xmlnode = xmldoc.firstchild; // รับรูทโหนด <xml> xmlnodelist nodes = xmlnode.childNodes; foreach (xmlnode xn ในโหนด) {xmlelement xe = (xmlelement) xn; m_values [xe.name] = xe.innertext; // รับคู่ค่าคีย์ของ XML ลงในข้อมูลภายใน wxpaydata} ลอง {// 2015-06-29 ข้อผิดพลาดคือไม่มีลายเซ็นถ้า (m_values ["return_code"]! = "ความสำเร็จ") } checksign (); // ตรวจสอบลายเซ็นหากไม่ผ่านมันจะโยนข้อยกเว้น} catch (wxPayException ex) {โยน wxPayException ใหม่ (เช่น Message); } ส่งคืน m_values; } / *** @dictionary รูปแบบที่แปลงเป็นรูปแบบพารามิเตอร์ URL* @ return url รูปแบบสตริงสตริงนี้ไม่มีค่าฟิลด์ Sign* / Public String tourl () {String buff = ""; foreach (keyValuePair <string, object> จับคู่ใน m_values) {ถ้า (pair.value == null) {log.error (this.getType (). toString (), "wxpaydata มีฟิลด์ที่มีค่าของโมฆะ!"); โยน wxPayException ใหม่ ("WXPAYDATA มีฟิลด์ที่มีค่า NULL!"); } if (pair.key! = "sign" && pair.value.toString ()! = "") {buff + = pair.key + "=" + pair.value + "&"; }} buff = buff.trim ('&'); กลับบัฟ; } / *** @dictionary จัดรูปแบบเป็น json* @return json string data* / สตริงสาธารณะ tojson () {string jsonstr = jsonmapper.tojson (m_values); กลับ jsonstr; } / ** * @Values ที่จัดรูปแบบไปยังผลลัพธ์ที่สามารถแสดงบนหน้าเว็บ (เนื่องจากหน้าเว็บไม่สามารถส่งออกสตริงได้โดยตรงในรูปแบบ XML) * / สตริงสาธารณะ toprintstr () {string str = ""; foreach (keyValuePair <string, object> จับคู่ใน m_values) {ถ้า (pair.value == null) {log.error (this.getType (). toString (), "wxPayData มีฟิลด์ที่มีค่า NULL!"); โยน wxPayException ใหม่ ("WXPAYDATA มีฟิลด์ที่มีค่า NULL!"); } str += string.format ("{0} = {1} <br>", pair.key, pair.value.toString ()); } log.debug (this.getType (). toString (), "พิมพ์ในหน้าเว็บ:" + str); return str; } /*** @Generate Signature ดูอัลกอริทึมการสร้างลายเซ็นสำหรับรายละเอียด* @return Signature ฟิลด์ SIGN ไม่ได้เข้าร่วมในลายเซ็น* /สตริงสาธารณะ makeign () {// แปลง url รูปแบบ str str = tourl (); // เพิ่ม API หลังจากคีย์สตริง str + = "& key =" + wxpayconfig.key; // md5 การเข้ารหัส var md5 = md5.create (); var bs = md5.ComputeHash (encoding.utf8.getBytes (str)); var sb = new StringBuilder (); foreach (byte b ใน bs) {sb.append (B.ToString ("x2")); } // อักขระทั้งหมดจะถูกแปลงเป็น uppercase string result = sb.toString (). toupper (); ผลการกลับมา; } สตริงสาธารณะ makeappsign () {// แปลง url รูปแบบสตริง str = tourl (); // เพิ่ม API หลังจากคีย์สตริง str + = "& key =" + wxpayconfig.keyofapp; // md5 การเข้ารหัส var md5 = md5.create (); var bs = md5.ComputeHash (encoding.utf8.getBytes (str)); var sb = new StringBuilder (); foreach (byte b ใน bs) {sb.append (B.ToString ("x2")); } // อักขระทั้งหมดจะถูกแปลงเป็น uppercase string result = sb.toString (). toupper (); ผลการกลับมา; } /**** ตรวจสอบว่าลายเซ็นนั้นถูกต้อง* ส่งคืนจริงอย่างถูกต้องหรือไม่และข้อผิดพลาดในการโยนข้อยกเว้น* /public bool checksign () {// ถ้าไม่มีการตั้งค่าลายเซ็นให้ข้ามการตรวจจับถ้า (! isset ("sign")) {log.error (this.getType () โยน wxpayexception ใหม่ ("ลายเซ็น WxPayData มีอยู่ แต่ไม่ถูกกฎหมาย!"); } // หากมีการตั้งค่าลายเซ็น แต่ลายเซ็นว่างเปล่าข้อยกเว้นจะถูกโยนลงถ้า (getValue ("sign") == null || getValue ("sign"). toString () == "") {log.error โยน wxpayexception ใหม่ ("ลายเซ็น WxPayData มีอยู่ แต่ไม่ถูกกฎหมาย!"); } // รับสตริงลายเซ็นที่ได้รับ return_sign = getValue ("sign"). toString (); // คำนวณลายเซ็นใหม่ในเครื่องสตริง cal_sign = makeign (); if (cal_sign == return_sign) {return true; } log.error (this.getType (). toString (), "ข้อผิดพลาดการตรวจสอบลายเซ็น WxPayData!"); โยน wxpayexception ใหม่ ("ข้อผิดพลาดการตรวจสอบลายเซ็น WxPayData!"); } / ** * @getDictionary * / Public SortDictionary <String, Object> getValues () {return m_values; -ข้อมูลแจ้ง: สำหรับแนวคิดการวิเคราะห์ที่เกี่ยวข้องโปรดดูการชำระเงินอย่างเป็นทางการของบัญชี WeChat อย่างเป็นทางการ, SDK, ที่อยู่ดาวน์โหลด: https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?Chapter=11_1
บทความนี้ได้รวบรวมไว้ใน "สรุปทักษะการพัฒนา JavaScript WeChat" และทุกคนยินดีที่จะเรียนรู้และอ่าน
ฉันขอแนะนำบทช่วยสอนเกี่ยวกับ WeChat Applets ที่มีความกังวลอย่างมากในขณะนี้: บรรณาธิการของ "การสอนการพัฒนาโปรแกรม WeChat Mini" ได้รวบรวมไว้อย่างระมัดระวังสำหรับทุกคนฉันหวังว่าคุณจะชอบ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น