Selama pengembangan WeChat JS-SDK, getLocation digunakan untuk mendapatkan posisi koordinat. Cara menerapkan koordinat yang diperoleh secara langsung oleh peta WeChat ke Baidu, menampilkan efek berikut:
Catatan: Ikon merah adalah posisi yang dikonversi dari WeChat, dan ikon biru adalah posisi di sekitarnya. Pertama, mari kita jelaskan dari proses pengembangan WeChat.
1. Dokumen Pengembangan WeChat JS-SDK
Pertama, masukkan dokumen bantuan di situs web resmi: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=Zh_cn
Anda dapat mempelajari dokumen secara rinci. Untuk mendapatkan informasi lokasi, langkah -langkah berikut dibagi menjadi langkah -langkah berikut:
Langkah 1: Bind nama domain
Masukkan akun resmi WeChat, temukan menu "Pengaturan Akun Resmi", dan masukkan panel "Pengaturan Fungsi".
Klik "Pengaturan" untuk mengatur nama domain yang relevan yang merujuk JS:
Langkah 2: Mengutip Perpustakaan Kelas JS Resmi
Perkenalkan file JS berikut pada halaman yang perlu memanggil antarmuka JS (dukungan https): http://res.wx.qq.com/open/js/jweixin-1.0.0.js.
Halaman yang direferensikan adalah Location.aspx, sebagai berikut:
<%@ Page Title="Get Location" Language="C#" AutoEventWireup="true" MasterPageFile="~/wxcrm/Site.Master" CodeFile="location.aspx.cs" Inherits="DTcms.Web.wxcrm.location" %><asp:Content ID="Content1" ContentPlaceHolderID="cphHead" runat="server"> <script src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> </script> <script type = "text/javascript"> $ ("#mask"). show (); wx.config({ debug: false, //Open debug mode, if true, each js function call will pop up appId: '<%= ResultJsData.GetValue("appid") %>', //Required, the unique identifier of the official account timestamp: <%= ResultJsData.GetValue("timestamp") %>, //Required, generate the signature timestamp nonceStr: '< %= Resultjsdata.getValue ("noncestr") %>', // Diperlukan, menghasilkan tanda tangan string acak tanda tangan: '< %= resultjsdata.getValue ("Signature") %>', // Diperlukan, tanda tangan jsapelist: ['checkjsapi', 'OnMenushareReTeReTeTiLeTeTeateTelist' OnMeneReReTeMining ',' OnMenushareReReTeReRETEARETETETETEIRET 'ONMENURINE', 'OnMENURINETEARETEARETEARETETETETEIRET' 'onMenushareqq', 'onMenushareweibo', 'hidemenuitems', 'showMenuitems', 'hideallnonbaseMenuitems', 'showallnonbaseMenuitems', 'showallnonbasemenuitems', 'showallnonbaseMenuitems', 'translapricord', 'showallnonBaseMenuitems', 'soallnonbaseUctems', 'showallnonbaseMenuitems', ',', 'sountallnecord', 'showallnonBaseMenuitems', '', 'showallnonbaseRevice', 'showallnonBaseMenuitems', '', 'showallnonBaseProice', 'showallnonbaseMenuitems', ' 'onRecordEnd', 'playVoice', 'pauseVoice', 'stopVoice', 'uploadVoice', 'downloadVoice', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'getNetworkType', 'openLocation', 'getLocation', 'hideOptionMenu', 'showOptionMenu', 'CloseWindow', 'scanqrcode', 'choosewxpay', 'OpenProductSpecificView', 'addCard', 'chooseCard', 'opencard']}); wx.ready (function () {wx.checkjsapi ({jsapilist: ['getNetworkType', 'previewImage', 'getLocation'], Success: function (res) {}}); wx.getlocation ({type: 'wgs84', // default adalah GPS TOSION ({type: 'wgs84', // Default adalah GPS adalah GPS To Openlocation Anda dapat lulus dalam 'GCJ02': Function (res) {coba {var latitude = res.latitude; akurasi // aalert (jsonuti.convertToString (res)); // wx.openlocation ({// latitude: res.latitude, // latitude, angka floating, kisaran adalah 90 ~ -90 // longitude: res.longitude, // longitude, nomor floating point, rentang adalah 180 ~ ~ ~ ~ ~ Lihat ', // Alamat Detail // Skala: 28, // Level zoom peta, nilai membentuk, berkisar dari 1 hingga 28. Standarnya adalah maksimum // infourl: "location1.aspx? m = home & c = index & a = getlocation & latitude ="+latitude+& longitude = "+longitude // hyperlink yang ditampilkan di bagian bawah) LATITUDE+& Longitude ="+Longitude // Hyperlink yang ditampilkan di bagian bawah di bagian bawah TAMPILAN KECUALI+& Longitude = "+Longitude // Hyperlink yang ditampilkan di bagian bawah di bagian bawah Tampilan Klik Klik ke Klik ke Bawah Klik ke Bawah Klik ke Bawah Klik ke Bawah) ke bawah TAMPILAN DARI DARI DARI DARI DARI KECIPLEK ="+HYPERLINK DIGIN DI BARAT DI DARI DI BUMBOK+" / ; wx.error (function (res) {// Kegagalan verifikasi informasi konfigurasi akan menjalankan fungsi kesalahan. Jika tanda tangan berakhir, verifikasi akan gagal. Untuk pesan kesalahan tertentu, Anda dapat membuka mode debug konfigurasi, atau melihatnya di parameter res yang dikembalikan. Tanda tangan dapat diperbarui di sini untuk SPA.}); wx.fail (function (res) {}); </script> </scan: konten> <asp: content id = "content2" contentplaceHolderId = "cphtitle" runat = "server"> Dapatkan lokasi </sp: konten> <asp: content id = "content3" contentplaceIderid = "cphcontainer" runat = "server"> <bR/br/<br/<br/<center = "ii> <i server" <i server "> <bR/br/<br/<br/> <II> <II> II; II> II; II; II> <I server" <BR/BR/BR/BR/PENGGUNA = "II> II> II> II; II> II" server "<BR/BR/BR/<BR/<Center =" II; Informasi ... </div> </penter> <div style = "Display: none;"> <span> <img src = "/templat/txwap/gambar/mask.gif"/> </span> </div> </sp: content>Efek halaman:
Catatan:
(1) Jika pengaturan ponsel tidak mengizinkan WeChat untuk mendapatkan informasi lokasi, informasi di atas akan diminta.
(2) Parameter pada gambar di atas mendapatkan koordinat GPS. Jika Anda menggunakan peta baidu, Anda perlu melakukan konversi tertentu dan akan tercermin di lokasi1.aspx.
(3) Semua halaman yang membutuhkan JS-SDK harus disuntikkan dengan informasi konfigurasi terlebih dahulu, jika tidak mereka tidak akan dipanggil.
Lokasi yang sesuai. Implementasi:
menggunakan pembayaran.wxwebhlper; menggunakan pembayaran.wxwebhlper.actions; menggunakan sistem; menggunakan System.globalization; menggunakan wxjssdk; menggunakan wxpayapi; namespace dtcms.web.wxcrm {Public Partial Class Lokasi: PageBase {string yang dilindungi {get; mengatur; } timestamp string yang dilindungi {get; mengatur; } string yang dilindungi noncestr {get; mengatur; } Tanda Tangan String Protected {get; mengatur; } public static string wxjsapiparam {get; mengatur; } public wxjsdata resultjsdata {get; mengatur; } void page_load yang dilindungi (pengirim objek, EventArgs e) {judgecode (); var WebAuthorize = WebAuthorizeAction baru (); Code2tokenResult = WebAuthorize.code2Token (permintaan ["kode"]); if (code2tokenResult.haserror ()) {response.redirect (urls.pageoflocation); Gotononepage ("Gagal mendapatkan kredensial pengguna, silakan kembali"); kembali; } GetUserInforesult = webauthorize.getUserInfo (code2tokenResult.access_token); if (getUserInforesult.haserror ()) {gotononePage ("Gagal mendapatkan informasi pengguna, silakan get"); } var userid = wxOperation.hasbind (getUserinForesult.openid); if (userid.equals (guid.empty)) {response.redirect (urls.oauth2url); Gotononepage ("pengguna weChat tidak terikat"); } appid = wxpayconfig.appid; timestamp = wxpayapi.generateTimestamp (); noncestr = wxpayapi.generatenoncestr (); // Implementasi berikut akan tercermin dalam 3. Implementasi Kode Inti var JSAPI = JSAPI baru (ini); Resultjsdata = jsapi.getjsdata (); Wxjsapiparam = jsapi.getjsapiparameters (); // Dapatkan H5 untuk menyetel parameter JS API}}}2. Konversi Koordinat GPS WeChat ke Koordinat Baidu
Setelah WeChat berhasil mendapatkan koordinat, halaman akan secara otomatis melompat ke lokasi1.aspx, dan aliran pemrosesan adalah sebagai berikut:
Koordinat WeChat -> Konversi ke Koordinat Peta Baidu -> Dapatkan Informasi Lokasi Menurut Baidu Map API -> Koordinat Tampilan Menurut Baidu Map API
<%@ Page Title="Online Check-in" Language="C#" MasterPageFile="~/wxcrm/Site.Master" AutoEventWireup="true" CodeFile="location1.aspx.cs" Inherits="DTcms.Web.wxcrm.location1" %><asp:Content ID="Content1" ContentPlaceHolderID="cphHead" runat="server"> <meta name = "viewport" content = "skala awal = 1.0, skala pengguna = tidak" /> <style type = "text /css"> #allmap {width: 100%; Tinggi: 300px; } </style> <script type = "text/javascript" src = "http://api.map.baidu.com/api?v=2.0&ak=dhrlkmr9quo4whmnnnnsztarta"> </script> <skrip = "teks/teks/javascript"> // gps "> </script> <script =" teks/javascript "> // gps"> </script> <skrip = "teks/javascript">//gps. " // Longitude, nomor titik mengambang, kisaran adalah 180 ~ -180. var xx = < %= this.Request ["latitude"] %>; // latitude, nomor titik mengambang, rentang adalah 90 ~ -90 var gpspoint = bmap.point baru (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/?"; function changeposition () {var str = "coords ="+yy+","+xx+"& from = 1 & to = 5"; var url = positionUrl + str; $ ("#PositionUrl"). html (url+"& ak = dhrlkmr9quo4whmnnsztartg"); var skrip = document.createElement ('Script'); script.src = url + '& ak = dhrlkmr9quo4whmnnsztarta & callback = dealResult'; document.getElementsbyTagname ("head") [0] .AppendChild (skrip); } function dealResult (msg) {if (msg.status! = 0) {alert ("Tidak ada hasil pengembalian yang benar."); $ ("#mask"). Hide (); kembali; } //Jsonuti.convertToString(msg); bxx = msg.result [0] .x; byy = msg.result [0] .y; dooptions (); } function getBaiduposition () {var url = "http://api.map.baidu.com/geoconv/v1/?coords="+yy+","+xx+"& dari = 1 & to = 5 & ak = dhrlkmr9quo4whmnnnsztarta"; $ .AJAX ({url: url, Success: function (data, status, xhr) {alert (status); alert (data.status);}, DataType: json}); } var canggih_post = ''; var canggih = ''; alamat var; peta var; function renderOption (respons) {var html = ''; if (response.status) {$ ("#mask"). hide (); var text = "Tidak ada hasil pengembalian yang benar!"; waspada (teks); kembali; } 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 = '+alamat+' & output = html '; var staticImageUrl = "http://api.map.baidu.com/staticimage?center="+location.lng+','+location.lat+"& markers ="+location.lng+','+location.lat; html = '<p> Koordinat: latitude:' + location.lat + "longitude:" + location.lng + '<br />'; html+= 'precision:'+response.result.precise+'<br />'; html += 'mata uang:' +response.result.confidence +'<br />'; html+= 'tipe alamat:'+response.result.level+'</p>'; html + = '<p> <img src = "' + staticImageUrl + '" /> </p>'; html + = '<p> Bagikan poin ini: <a href = "' + uri + '" target = "_ blank">' + uri + '</a> </p>'; // atur tautan ini ke klikable // peta peta baidu peta API = bmap.map baru ("allmap"); var point = bmap.point baru (bxx, byy); var marker = bmap.marker baru (point); // Buat anotasi peta.addoverlay (penanda); // Tambahkan anotasi ke peta peta.CenterandZoom (titik, 100); var opts = {width: 200, // informasi jendela informasi: 100, // judul jendela informasi: "posisi saya", // judul jendela informasi enablemessage: true, // atur jendela informasi untuk mengirim pesan pesan pendek: result.formatted_address} $ ("#divpo"). html ("Lokasi saat ini:" + fasil. var infowindow = bmap.infowindow baru (result.formatted_address, opts); // Buat Informasi Jendela Marker Obyek.AddeventListener ("klik", function () {map.openInfowindow (InfoWindow, point); // buka jendela informasi}); var myicon = bmap.icon baru ("http://api.map.baidu.com/img/markers.png", bmap.size baru (23, 25), {offset: bmap.size baru (10, 25),//Tentukan posisi posisi Imageoffset: BMAP.SIZE baru (0, 0), 0 - 0 - 0 - 0 - 2) Image Positioning ImageOffset: BMAP.SIZE baru (0, 0), 0 - 0 - 0 - 0 - 2) Image Positioning ImageOffset: BMAP.SIZE BARU (0, 0), 0 - 0 - 0 - 0 - 0 - 2) Image Positioning ImageOffset: BMAP.SIZE baru (0, 0) var pois = result.pois; untuk (var i = 0; i <pois.length; i ++) {var marker = bmap.marker baru (bmap.poap baru (pois [i] .point.x, pois [i] .point.y), {ikon: myicon}); // Buat anotasi var name = pois [i] .name; var addr = pois [i] .addr; peta.addoverlay (penanda); // Tambahkan anotasi ke peta addClickHandler (name, addr, marker); } $ ("#mask"). Hide (); $ ("#btnsign"). show (); kembali; } fungsi addClickHandler (name, addr, marker) {marker.addeventListener ("klik", function (e) {openInfo (name, addr, e)}); } function openInfo (name, addr, e) {var p = e.target; var point = bmap.point baru (p.getPosition (). lng, p.getPosition (). lat); var opts = {width: 200, // Informasi Jendela Tinggi Lebar: 100, // Judul Jendela Informasi Judul: Nama, // Judul Judul Judul Informasi Enablemessage: True, // Setel Biarkan Jendela Informasi untuk Mengirim Pesan Singkat Pesan: Addr} var InfoWindow = baru bmap.infowindow (addr, opts); // Buat peta objek jendela informasi.openInfowindow (InfoWindow, point); // buka jendela informasi} function dooptions () {var Script = document.createElement ('Script'); script.type = 'Text/JavaScript'; Advanced_post = "http://api.map.baidu.com/geocoder/v2/?ak=dhrlkmr9quo4whmnnsztartg&callback=renderOption&location=" + byy + "," + bxx + "& output = json & pois & pois & 2"; Script.src = Advanced_Post; document.body.appendChild (skrip); }; $ (function () {$ ("#mask"). show (); $ ("#btnsign"). hide (); changeposition ();}); </script> </scan: konten> <asp: content id = "content2" contentplaceHolderId = "cphtitle" runat = "server"> check-in online </sp: content> <asp: content id = "content3" contentplaceIderId = "cphcontainer" runat = "server"> <Form id = "fRMLOCING =" CPHCONTAINER "Server" server "> <Form id =" FRMLOCERID = "CPHCONTAINER" Server "> Server"> <Form ID = "FRMLOCERID =" Server " information</span></div> <div style="padding-left: 0"> <ul style="height: 300px;"> <div id="allmap"></div> </ul> </div> <div style="padding-left: 0"> <ul> <div id="divPo"></div> </ul> </div> </div> </div> <div style="text-align: center; margin-top: -50px; "> <input id =" btnsign "type =" tombol "value =" Saya ingin memeriksa "style =" Pointer: Width: 210px; /> </div> <div style = "Display: none;"> <span> <img src = "/templat/txwap/gambar/mask.gif"/> </span> </div> </form> </asp: content>Halaman ini terutama melibatkan Baidu Map Open Platform, dan Anda harus mendaftar untuk Baidu Map AG. Kalau tidak, menelepon JS akan meminta: aplikasi tidak ada, jika ada kesalahan di AK, silakan periksa kembali dan coba lagi.
(1) Teknologi Peta Baidu 1: Koordinat Konversi API
Alamat situs web resmi: http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
Alamat Layanan API: http://api.map.baidu.com/geoconv/v1/?
Dokumen tersebut memiliki deskripsi terperinci, jadi saya tidak akan mengulanginya.
(2) Teknologi peta Baidu 2: Dapatkan lokasi berdasarkan koordinat
Situs web resmi: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
API geocoding mencakup resolusi alamat dan fungsi resolusi alamat terbalik:
Pengkodean geografis: yaitu, analisis alamat, dan informasi Baidu Latitude dan Longitude diperoleh dari alamat jalan terstruktur terperinci. Misalnya, hasil analisis alamat "No. 27, Zhongguancun South Street, Haidian District, Beijing" adalah "LNG: 116.31985, LAT: 39.959836". Pada saat yang sama, geocoding juga mendukung penyelesaian langsung tempat, situs bersejarah, dan bangunan tengara dan kembali ke Baidu Latitude and Longitude. Misalnya, hasil analisis alamat "bangunan baidu" adalah "LNG: 116.30815, LAT: 40.056885". Ini adalah persyaratan pengambilan POI yang umum, dan disarankan untuk menggunakan API Place.
Inverse Geocoding: yaitu, analisis alamat terbalik, dan informasi alamat terstruktur diperoleh dari Baidu Latitude and Longitude Information. Misalnya, "Lat: 31.325152, LNG: 120.558957" Hasil analisis alamat terbalik adalah "No. 318, Tayuan Road, Distrik Huqiu, Kota Suzhou, Provinsi Jiangsu".
Alamat Layanan API: http://api.map.baidu.com/geocoder/v2/
Untuk parameter tertentu, silakan periksa dokumentasi resmi.
Contoh: http://api.map.baidu.com/geocoder/v2/?ak=appliced for Baidu Key & Location = 34.79563.114.23075222912 & Callback = Showlocation & Output = XML & POIS = 1
Catatan:
(1) Aplikasi Kunci Pengembang Baidu
(2) Sistem koordinat peta baidu berbeda dari sistem koordinat weChat
(3) Alamat panggilan API dan deskripsi parameter
(4) arti fungsi panggilan balik API
(5) Memahami arti JSON dan JSONP
3. Kode inti WeChat JS-SDK
(1) JSAPI.CS menghasilkan parameter konfigurasi JS-SDK yang relevan
menggunakan System; menggunakan System.globalization; menggunakan System.linq; menggunakan System.web.security; menggunakan System.web.ui; menggunakan wxpayapi; namespace wxjssdk {kelas publik jsapi {/// <rummary> // save page objek karena Anda ingin menggunakan objek permintaan halaman dalam metode kelas ini; mengatur; } public wxjsdata resultjsdata {get; mengatur; } /// <summary> /// // </summary> /// <param name = "page"> </param> jsapi publik (halaman halaman) {this.page = halaman; } public wxjsdata getjsdata () {var data = wxjsdata baru (); data.setValue ("appId", wxpayconfig.appid); // data ID akun publik.setValue ("timestamp", wxpayapi.generateTimestamp ()); data.setValue ("noncestr", wxpayapi.generatenoncestr ()); // string acak 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 ("tanda tangan", tanda tangan); Resultjsdata = data; pengembalian data; } Private String MakeIgnature (String JSAPITICKET, String NONCEST, STRING TIMESTAMP, STRING URL) {String [] arrayList = {"jsapi_ticket =" + jsapiticket, "timestamp =" + timestamp, "noncestr =" + noncestr, "url =" + url}; Array.sort (arraylist); var Signature = String.join ("&", ArrayList); Signature = FormsAuthentication.HashPasswordForStoringInfigFile (Signature, "Sha1"). Tolower (); Return Signature; } string private getjsapiticket () {var jsAuth = new 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 ()) mengembalikan jsauth.getjsapiticket (token.access_token) .ticket; kembali ""; } private string getUrl () {string host = page.request.url.host; string path = page.Request.path; String queryString = page.Request.url.query; // Tempat ini harus dicatat bahwa URL lengkap diteruskan kembali ke latar belakang WeChat ketika halaman web mengotorisasi untuk mendapatkan informasi pengguna string URL = "http: //" + host + path + queryString; URL pengembalian; } public String getjsapiparameters () {log.debug (this.getType (). toString (), "jsapi :: getjsapiparam sedang memproses ..."); string parameter = resultjsdata.toJson (); Log.debug (this.getType (). Tostring (), "dapatkan jsapi:" + parameter); Parameter pengembalian; }}}(2) jsauthorizeAction.csweChat JS-SDK Fungsi panggilan API Terkait
menggunakan pembayaran.wxwebhlper; menggunakan pembayaran.wxwebhlper.Results; menggunakan sistem; menggunakan wxpayapi; namespace wxjssdk {kelas publik jsauthorizeAction {private static tokenResult token = new tokenResult () {errcode = -1}; private static jsapiticketresult jsapiticket = new jsapiticketResult () {errcode = -1}; Public TokenResult gettoken () {log.error (this.getType (). tostring (), "gettoken"); if (! Token.isValid ()) {token = getokenResult (); Log.Error (this.getType (). ToString (), Token.ToString ()); } return token; } /// <summary> /// // // </summary> /// <returns> </returns> tokenResult publik getokenResult () {var result = new tokenResult (); coba {var webutils = webutils baru (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=kid=kid=kid&Secret= {1}", wxpayconfig.appid, wxpayfig.appsecret); var strrtn = webutils.get (url); result = tools.jsonstringToObj <okenResult> (strrtn); } catch (exception ex) {log.error (this.getType (). tostring (), ex.message); hasil = TokenResult baru () {errcode = -1086}; } hasil pengembalian; } /// <summary> /// // // </summary> /// <param name = "token"> </param> // <returns> </eturns> public jsapiticketResult getjsapiticket (string token) {log.error (this.getType (). Tostring (), "getjs; if (! jsapiticket.isvalid ()) {jsapiticket = getjsapiticketResult (token); } return jsapiticket; } /// <summary> /// // // </summary> /// <param name = "token"> </param> // <returns> </eturns> jsapiticketResult publik getjsapiticketresult (string token) {hasil jsapiticketRresult; coba {var webutils = webutils baru (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=keahh.0}&type=jsapi", token); 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}; } hasil pengembalian; }} kelas publik jsapiticketResult: returnResult {/// <summary> /// constructor /// </summary> public jsapiticketResult () {createTate = dateTime.now; } /// <summary> /// // // </summary> Tiket string publik {get; mengatur; } /// <summary> //// access_token Antarmuka kredensial panggilan kredensial, unit (detik) /// </summary> int int expires_in {get; mengatur; } /// <summary> //// waktu penciptaan //// </summary> public datetime dibuat {get; mengatur; } /// <summary> /// Tentukan apakah itu valid //// </summary> /// <returns> </eturns> public bool isValid () {if (this.errcode! = 0) return false; var nd = datetime.now - createTate; Return nd.seconds <7200; }} Public Class TokenResult: ReturnResult {/// <summary> /// constructor /// </summary> TokenResult publik () {createTate = dateTime.now; } /// <summary> /// Antarmuka otorisasi web memanggil kredensial, Catatan: Access_Token ini berbeda dari Access_Token yang didukung oleh dasar -dasar /// </summary> string publik Access_Token {get; mengatur; } /// <summary> //// Access_Token Interface Call Credentials Time, Unit (detik) /// </summary> int int expires_in {get; mengatur; } /// <summary> /// waktu pembuatan //// </summary> datetime publik dibuat {get; mengatur; } /// <summary> /// Tentukan apakah itu valid //// </summary> /// <returns> </eturns> public bool isValid () {if (this.errcode! = 0) return false; var nd = datetime.now - createTate; Return nd.seconds <7200; }}}(3) wxjsdata.cs kelas parameter wechat js-sdk
menggunakan litjson; menggunakan system.collections.generic; menggunakan system.security.cryptography; menggunakan System.Text; menggunakan System.xml; menggunakan wxpayapi; namespace wxjssdk {kelas publik wxjsdata {private sortedDictionary <string, object> m_values = new sortedDictionary <string, object> (); / *** Atur nilai bidang tertentu* @param nama bidang kunci* @param nilai bidang bidang*/ public void setValue (tombol string, nilai objek) {m_values [key] = nilai; } / *** Dapatkan nilai bidang tertentu berdasarkan nama bidang* @param nama bidang Kunci* @return nilai bidang yang sesuai dengan kunci* / objek publik getValue (tombol string) {objek o = null; m_values.trygetValue (kunci, keluar o); kembali o; } / *** Tentukan apakah suatu bidang telah ditetapkan* @param nama bidang kunci* @return kembali jika tombol bidang telah ditetapkan, return true, sebaliknya false* / public bool isset (tombol string) {objek o = null; m_values.trygetValue (kunci, keluar o); if (null! = o) return true; mengembalikan false; } /*** @convert Dictionary ke xml* @return string xml yang dikonversi* @throws wxpayException ** /public string toxml () {// tidak dapat dikonversi ke format xml jika (0 == m_values.count) {log.error (this.getType (). Lempar WXPayException baru ("Data WXPayData kosong!"); } string xml = "<xml>"; foreach (keyvaluePair <string, objek> berpasangan dalam m_values) {// Nilai bidang tidak bisa nol, yang akan mempengaruhi proses selanjutnya jika (pair.Value == null) {log.Error (this.getType (). ToString (), "WXPayData berisi fields dengan nilai null!") Lempar WXPayException baru ("WXPayData berisi bidang dengan nilai null!"); } if (pair.value.getType () == typeof (int) || pair.value.getType () == typeof (desimal)) {xml + = "<" + pair.key + ">" + pair.value.tostring () + "</" + pair.key + ">"; } else if (pair.value.getType () == typeof (string)) {xml + = "<" + pair.key + ">" + "<! [cdata [" + pair.Value + "]]> </" + pair.key + ">"; } else // kecuali untuk tipe string dan int, Anda tidak dapat berisi tipe data lain {log.error (this.getType (). ToString (), "WXPayData Tipe Data Tipe Data!"); Lempar WXPayException baru ("Kesalahan tipe data bidang WXPayData!"); }} xml += "</xml>"; mengembalikan xml; } /** * @Convert xml to WxPayData object and return data inside the object* @param string xml to be converted* @return Dictionary obtained by conversion * @throws WxPayException */ public SortedDictionary<string, object> FromXml(string xml) { if (string.IsNullOrEmpty(xml)) { Log.Error (this.getType (). ToString (), "Tidak legal untuk mengonversi string XML kosong menjadi wxpaydata!"); Lempar WXPayException baru ("Tidak legal untuk mengonversi string XML kosong ke wxpaydata!"); } Xmldocument xmldoc = new xmldocument (); xmldoc.loadxml (xml); Xmlnode xmlnode = xmldoc.firstchild; // Dapatkan node root <xml> node xmlnodelist = xmlnode.childnodes; foreach (xmlnode xn di node) {xmlelement xe = (xmlelement) xn; m_values [xe.name] = xe.innerText; // Dapatkan nilai kunci pasangan xml ke dalam data di dalam wxpaydata} coba {// 2015-06-29 kesalahannya adalah tidak ada tanda tangan jika (m_values ["return_code"]! = "Success") {return M_VALUES ["return_code"]! } CheckSign (); // Verifikasi tanda tangan, jika tidak lewat, itu akan melempar pengecualian} catch (wxpayException ex) {lempar wxpayException baru (ex.message); } return m_values; } / *** @Dictionary Format yang dikonversi ke format parameter URL* @ return format URL String, string ini tidak berisi nilai bidang tanda* / public string tourl () {string buff = ""; foreach (keyvaluePair <string, objek> berpasangan di m_values) {if (pair.value == null) {log.error (this.getType (). tostring (), "wxpaydata berisi bidang dengan nilai null!"); Lempar WXPayException baru ("WXPayData berisi bidang dengan nilai null!"); } if (pair.key! = "tanda" && pair.value.toString ()! = "") {buff + = pair.key + "=" + pair.Value + "&"; }} buff = buff.trim ('&'); Buff kembali; } / *** @dictionary diformat ke json* @return json string data* / public string toJson () {string jsonstr = jsonmapper.toJson (m_values); mengembalikan jsonstr; } / ** * @values diformat ke hasil yang dapat ditampilkan di halaman web (karena halaman web tidak dapat secara langsung menghasilkan string dalam format XML) * / public string topRintStr () {string str = ""; foreach (keyvaluePair <string, objek> berpasangan di m_values) {if (pair.value == null) {log.error (this.getType (). ToString (), "WXPayData berisi bidang dengan nilai null!"); Lempar WXPayException baru ("WXPayData berisi bidang dengan nilai null!"); } str += string.Format ("{0} = {1} <br>", pair.key, pair.value.toString ()); } Log.debug (this.getType (). ToString (), "cetak di halaman web:" + str); mengembalikan str; } /*** @Generate Signature, lihat Algoritma Generasi Tanda Tangan untuk detail* @Return Signature, bidang tanda tidak berpartisipasi dalam tanda tangan* /public string madeIch () {// Convert URL format string str = tourl (); // Tambahkan API setelah string tombol str + = "& key =" + wxpayconfig.key; // enkripsi md5 var md5 = md5.create (); var bs = md5.computeHash (encoding.utf8.getbytes (str)); var sb = stringBuilder baru (); foreach (byte b in bs) {sb.append (b.tostring ("x2")); } // Semua karakter dikonversi ke hasil string huruf besar = sb.toString (). ToUpper (); hasil pengembalian; } public String makeAppSign () {// Convert URL format string str = tourl (); // Tambahkan API setelah string tombol str + = "& key =" + wxpayconfig.keyofapp; // enkripsi md5 var md5 = md5.create (); var bs = md5.computeHash (encoding.utf8.getbytes (str)); var sb = stringBuilder baru (); foreach (byte b in bs) {sb.append (b.tostring ("x2")); } // Semua karakter dikonversi ke hasil string huruf besar = sb.toString (). ToUpper (); hasil pengembalian; } /**** Periksa apakah tanda tangannya benar* mengembalikan true dengan benar, dan kesalahan melempar pengecualian* /public bool checkSign () {// Jika tidak ada tanda tangan yang ditetapkan, lewati deteksi jika (! Isset ("tanda")) {log.error (this.getType (). Tidak ada! " Lempar WXPayException baru ("Tanda tangan WXPayData ada tetapi tidak legal!"); } // Jika tanda tangan ditetapkan tetapi tanda tangannya kosong, pengecualian dilemparkan jika (getValue ("tanda") == null || getValue ("tanda"). Tostring () == "") {log.Error (this.gettype (). ToString (), "wxpaydata tanda tangan (). Lempar WXPayException baru ("Tanda tangan WXPayData ada tetapi tidak legal!"); } // Dapatkan string tanda tangan yang diterima return_sign = getValue ("tanda"). ToString (); // Hitung tanda tangan baru string lokal cal_sign = makeign (); if (cal_sign == return_sign) {return true; } Log.Error (this.getType (). ToString (), "WXPayData tanda tangan verifikasi verifikasi!"); Lempar WXPayException baru ("Kesalahan verifikasi tanda tangan WXPayData!"); } / ** * @getDictionary * / public sortedDictionary <String, Object> getValues () {return m_values; }}}Informasi Prompt: Untuk ide analisis yang relevan, silakan merujuk ke pembayaran resmi WeChat Resmi SDK, Alamat Unduh: https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1.
Artikel ini telah dikompilasi menjadi "Ringkasan Keterampilan Pengembangan JavaScript WeChat", dan semua orang dipersilakan untuk belajar dan membaca.
Saya merekomendasikan tutorial tentang applet WeChat yang sangat prihatin sekarang: editor "Tutorial Pengembangan Program Mini WeChat" telah dengan hati -hati menyusunnya untuk semua orang, saya harap Anda menyukainya.
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.