Während der Entwicklung von Wechat JS-SDK wird GetLocation verwendet, um Koordinatenpositionen zu erhalten. So wenden Sie die von WeChat erhaltenen Koordinaten direkt auf die Baidu -Karte an, wobei die folgenden Effekte angezeigt werden:
Hinweis: Das rote Symbol ist die von WeChat konvertierte Position, und das blaue Symbol ist die Position um sie herum. Lassen Sie es uns zunächst aus dem WeChat -Entwicklungsprozess erklären.
1. WeChat JS-SDK-Entwicklungsdokument
Geben Sie zunächst das Hilfedokument auf der offiziellen Website ein: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_cn
Sie können das Dokument ausführlich untersuchen. Um Standortinformationen zu erhalten, sind die folgenden Schritte in die folgenden Schritte unterteilt:
Schritt 1: Binden Sie den Domänennamen
Geben Sie das offizielle Konto des WeChat ein, finden Sie das Menü "Offizielle Kontoeinstellungen" und geben Sie das Panel "Funktionseinstellungen" ein.
Klicken Sie auf "Einstellungen", um den relevanten Domänennamen festzulegen, der sich auf JS bezieht:
Schritt 2: Zitieren der offiziellen JS -Klassenbibliothek
Führen Sie die folgende JS-Datei auf der Seite ein, auf der die JS-Schnittstelle aufgerufen werden muss (Unterstützung https): http://res.wx.qq.com/open/js/jweixin-1.0.0.js.
Die referenzierte Seite lautet wie folgt.
< %@ Page title = "location" sprachung = "c#" AutoEventwireUp = "True" masterpageFile = "~/wxcrm/site src = "http://res.wx.qq.com/open/js/jwexin-1.0.0.js"> </script> <script type = "text/javascript"> $ ("#mask"). show (); wx.config ({debug: false, // Debug -Modus öffnen, wenn wahr, wird jeder JS -Funktionsaufruf von Appid: '< %= resultJSData.getValue ("Appid") %>', // Erforderlich, die eindeutige Kennung des offiziellen Kontostamps: < %= resultjsdata.GetGeTVALUE ("Timestamp"). '<%= ResultJsData.GetValue("noncestr") %>', //Required, generate the signature random string signature: '<%= ResultJsData.GetValue("signature") %>', //Required, signature jsApiList: [ 'checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'hideMenuItems', 'showMenuItems', 'hideAllNonBaseMenuItems', 'showAllNonBaseMenuItems', 'showAllNonBaseMenuItems', 'showAllNonBaseMenuItems', 'translateVoice', 'startRecord', 'stopRecord', "OnRecordend", "PlayVoice", "PauseVoice", "Stopvoice", "UploadVoice", "DownloadVoice", "Summeage", "Previewimage", "Uploadimage", "Downloadimage", "GetNetworkType", "Openlocation", "Getlocation", "HideoptionMenu", "," 'scanQrCode', 'wählenwxpay', 'openProductSpecificView', 'addCard', 'chooseSecard', 'openCard']}); wx.ready (function () {wx.checkjsapi ({jsapilist: ['getNetworkType', 'PreviewImage', 'getLocation'], Erfolg: Funktion (res) {}}); OpenLocation können in 'GCJ02' Erfolg bestehen: // Positionsgenauigkeit // AALERT (jsonuti.ConverttoString (res)); Adresse: 'Klicken, um anzeigen', // Adressdetails // Skala: 28, // Karten -Zoomebene, Formierungswert, Bereich von 1 bis 28. Die Standardeinstellung ist maximal // Infourl: "location1.aspx? m = home & c = Index & a = GetLocation & Latitude ="+Latitude+"& Longitude ="+Long. // alarm (latitude + "-" + longitude); }, abbrechen: function (res) {window.location.href = "none.aspx? WX.Error (Funktion (res) {// Konfigurationsinformationsüberprüfungsfehler führt eine Fehlerfunktion aus. Wenn die Signatur abläuft, kann die Überprüfung fehlschlagen. Für bestimmte Fehlermeldungen können Sie den Debug -Modus der Konfiguration öffnen oder sie im Parameter RES zurückgegeben. Die Signatur kann hier für SPA aktualisiert werden.}); wx.fail (function (res) {}); </script> </ASP: Content> <ASP: Content ID = "content2" contentPlaPleholderId = "CPhtitle" Runat = "Server"> den Speicherort abrufen </Asp: Content> <ASP: Content ID = "content3" ContentSPlacePlaPerID = "CPhContainer" Runat = "Server"> <br/> <br/> <br/> <br/<br/<br/<br/> <center = "). Informationen ... </div> </center> <div style = "display: keine;"> <span> <img src = "/templates/txwap/bilder/mask.gif"/> </span> </div> </Asp: Inhalt>Seiteneffekt:
Anmerkungen:
(1) Wenn die Mobiltelefoneinstellungen WeChat nicht erlauben, Standortinformationen zu erhalten, werden die oben genannten Informationen aufgefordert.
(2) Die Parameter in der obigen Abbildung erhalten die GPS -Koordinaten. Wenn Sie Baidu Map verwenden, müssen Sie eine bestimmte Konvertierung vornehmen und werden in Position1.aspx reflektiert.
(3) Alle Seiten, die JS-SDK erfordern, müssen zuerst Konfigurationsinformationen injiziert werden, da sie sonst nicht aufgerufen werden.
Entsprechende Position.aspx.cs Implementierung:
Verwendung von payment.wxwebhlper; Verwendung von payment.wxwebhlper.actions; Verwendung von System; Verwendung von System.Globalisierung; Verwendung von WXJSSDK; Verwenden von WXPayapi; Namespace dtcms.web.wxcrm {öffentlicher Teil der Klassensposition: PageBase {Protected String appid {get; Satz; } Protected String Timestamp {get; Satz; } Protected String noncestern {get; Satz; } Protected String Signature {get; Satz; } public static String wxjsapiparam {get; Satz; } public wxjsdata resultjsdata {get; Satz; } Protected void page_load (Objektabsender, EventArgs e) {JudgeCode (); var WebAuthorize = new WebAuthorizeAction (); Code2TokenResult = webauthorize.code2Token (request ["code"]); if (code2TokenResult.haserror ()) {response.Rect (urls.pageofLocation); GOTONONEPAGE ("" Benutzeranmeldeinformationen nicht erhalten, bitte erneut "); zurückkehren; } GetUserInforesult = webauthorize.getUserinfo (code2TokenResult.access_token); if (getUserinforesult.hasError ()) {gotononepage ("Nicht zu Benutzerinformationen erhalten, bitte wiederhandeln"); } var userId = wxOperation.hasbind (getUserInforesult.openid); if (userId.equals (Guid.Empty)) {response.redirect (urls.oauth2url); Gotononepage ("WeChat -Benutzer nicht gebunden"); } appid = wxpayconfig.appid; timestamp = wxpayapi.generatetimestamp (); noncestr = wxpayapi.generateNoncestern (); // Die folgende Implementierung wird in 3. Die Kerncode -Implementierung var JSAPI = new JSAPI (this) widerspiegelt; Resultjsdata = jsapi.getJSdata (); WXJSAPIPARAM = JSAPI.getjsapiparameters (); // H5 JS -API -Parameter einstellen}}}2. Die Wechat -GPS -Koordinaten in Baidu -Koordinaten konvertieren
Nachdem WeChat Koordinaten erfolgreich erhalten hat, springt die Seite automatisch zu Ort1.aspx, und der Verarbeitungsfluss lautet wie folgt:
WeChat -Koordinaten -> In Baidu -Kartenkoordinaten konvertieren -> Standortinformationen gemäß Baidu MAP API -> Koordinaten nach Baidu Map API anzeigen
< %@ Page title = "Online-Check-in" Sprache = "C#" MasterPageFile = "~/wxcrm/site name = "Ansichtsport" content = "initial-scale = 1.0, user-scalable = no" /> <style type = "text /csS"> #allmap {width: 100%; Höhe: 300px; } </style> <script type = "text/javaScript" src = "http://api.map.baidu.com/api?v=2.0&ak=dhrlkmr9quo4WHMNNSZTARTA"> </script type = "Text/JavaScript"> // GPSTARTA -VAR YY = ". // Längengrad, schwimmende Punktzahl, Bereich beträgt 180 ~ -180. var xx = < %= this.request ["Breitengrad"] %>; // Breitengrad, schwimmende Punktzahl, Bereich beträgt 90 ~ -90 var gppoint = new BMAP.Point (xx, yy); var bxx = 0,0; var byy = 0,0; / * * http://lbyun.baidu.com/index.php?title=webapi/guide/changeposition */var Positionurl = "http://api.map.baidu.com/geoconv/v1/?"; Funktion ChangePosition () {var str = "cOORCSS ="+yy+","+xx+"& von = 1 & to = 5"; var url = PositionURL + str; $ ("#PositionURL"). var script = document.createelement ('script'); script.src = url + '& ak = dhrlkmr9quo4Whmnnsztarta & callback = DealResult'; document.getElementsByTagName ("head") [0] .AppendChild (Skript); } function DealResult (msg) {if (msg.status! = 0) {alert ("nein korrektes Rückgabeergebnis."); $ ("#mask"). hide (); zurückkehren; } //Jsonuti.convertToString(msg); bxx = msg.result [0] .x; byy = msg.result [0] .y; doptions (); } function getBaidUposition () {var url = "http://api.map.baidu.com/geoconv/v1/?coords="+yy+","+xx+"& from = 1 & to = 5 & ak = dhrlkmr9quo4WhnnsztartAns"; $ .ajax ({url: url, Erfolg: Funktion (Daten, Status, xhr) {alert (Status); alert (Daten.Status);}, DataType: json}); } var Advanced_post = ''; var AdvancedOptions = ''; var Adresse; var map; Funktionsrenderoption (Antwort) {var html = ''; if (response.status) {$ ("#mask"). hide (); var text = "Kein korrektes Rückgabeergebnis!"; Alarm (Text); zurückkehren; } 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 = '+adress+' & output = html '; var staticimageurl = "http://api.map.baidu.com/staticimage?center="+location.lng+','+lat.lat+"& markers ="+location.lng+','+location.lat; html = '<p> Koordinaten: Breitengrad:' + location.lat + "Länge:" + location.lng + '<br />'; html+= 'precision:'+response.result.precise+'<br />'; html += 'Währung:' +response.result.Confidence +'<br />'; html+= 'Adresstyp:'+response.result.level+'</p>'; html + = '<p> <img src = "' + staticimageurl + '" /> < /p>'; html + = '<p> Teilen Sie diesen Punkt teilen: <a href = "' + uri + '" target = "_ leer">' + uri + '</a> </p>'; // Setzen Sie diesen Link auf klickbare // Baidu Map API -Funktion map = new bmap.map ("Allmap"); var point = new BMAP.Point (Bxx, byy); var marker = neuer bmap.marker (Punkt); // Annotation map.adDoverlay (Marker) erstellen; // Annotation zur MAP -Karte hinzufügen var opts = {width: 200, // Informationsfenster Breite: 100, // Informationsfensterhöhe Title: "My Position", // Informationsfenster Titel EnableMessage: true, // set Informationsfenster Erlauben Sie Kurznachrichten Meldung: Ergebnis.Formatted_address} $ ("#Divpo"). var infowindow = new bmap.infowindow (result.formatted_address, opts); // Informationsfensterobjektmarkierung erstellen. var myIcon = new BMap.Icon("http://api.map.baidu.com/img/markers.png", new BMap.Size(23, 25), { offset: new BMap.Size(10, 25), // Specify the positioning position imageOffset: new BMap.Size(0, 0 - 10 * 25) // Set image offset}); var pois = result.pois; für (var i = 0; i <pois.length; i ++) {var marker = new bmap.marker (neuer bmap.point (pois [i] .point.x, pois [i] .point.y), {icon: myicon}); // Annotation erstellen var name = pois [i] .name; var adDr = pois [i] .addr; map.adDoverlay (Marker); // Annotation zur Karte hinzufügen addClickHandler (Name, ADDR, Marker); } $ ("#mask"). hide (); $ ("#BtnSign"). Show (); zurückkehren; } function addClickHandler (Name, addr, marker) {marker.addeventListener ("klicken", Funktion (e) {openInfo (Name, addr, e)}); } Funktion openInfo (Name, adDr, e) {var p = e.target; var point = new BMAP.Point (p.getPosition (). LNG, P.getPosition (). Lat); var opts = {width: 200, // Informationsfenster Breite der Höhe: 100, // Informationsfensterhöhe Title: Name, // Informationsfenster Titel EnableMessage: true, // Setzen Sie das Fenster Informationen zum Senden von Kurznachrichten: addr} var infowindow = new bmap.infowindow (addr, opts); // Erstellen Sie die Informationsfenster -Objekt -Karte. OpenInfowindow (Infowindow, Punkt); // Öffnen Sie das Informationsfenster} function DoOptions () {var script = document.createelement ('script'); script.type = 'text/javaScript'; Advanced_post = "http://api.map.baidu.com/geocoder/v2/?ak=dhrlkmr9quo4Whmnsztartg&callback=renderoption&location=" + byy + "," + bxx + "& output = json & pois = 2"; script.src = Advanced_Post; document.body.appendchild (script); }; $ (function () {$ ("#mask"). show (); $ ("#BtnSign"). hide (); ChangePosition ();}); </script> </ASP: Content> <ASP: Content ID = "content2" contentPlaPleholderId = "CPhtitle" Runat = "Server"> Online-Check-in </ASP: Content> <ASP: Content ID = "content3" ContentSPlaPladerID = "CPhContainer" Runat = "Server"> <Form ID = "Frmlocation" Runat = " Information </span> </div> <div style = "padding-links: 0"> <ul style = "height: 300px;"> <div id = "Allmap"> </div> </ul> </div> <div style = "padding-left: 0"> <ul> <ul> </divpo; Margin-Top: -50px;> <Eingabe-ID = "BTNSIGE". /> </div> <div style = "Anzeige: Keine;"> <span> <img src = "/templates/txwap/bilder/mask.gif"/> </span> </div> </form> </Asp: Inhalt>Diese Seite umfasst hauptsächlich die Baidu Map Open -Plattform, und Sie müssen sich für die Baidu Map AG bewerben. Andernfalls fordert die Aufruf von JS auf: Die App existiert nicht, wenn in AK Fehler vorliegt, prüfen Sie bitte erneut und versuchen Sie es erneut.
(1) Baidu -Kartentechnologie 1: Koordinatenreversion API koordinieren
Offizielle Website -Adresse: http://lbyun.baidu.com/index.php?title=webapi/guide/changePosition
API -Serviceadresse: http://api.map.baidu.com/geoconv/v1/?
Das Dokument enthält detaillierte Beschreibungen, daher werde ich sie nicht wiederholen.
(2) Baidu -Kartentechnologie 2: Erhalten Sie den Standort basierend auf Koordinaten
Offizielle Website: http://lbyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
Die geokodierende API enthält Adressauflösung und inverse Adressauflösung Funktionen:
Geografische Codierung: Das heißt, Adressanalysen sowie die Informationen zur Breite und Länge von Längengraden werden aus der detaillierten strukturierten Adresse der Straße erhalten. Das Ergebnis der Adressanalyse von "Nr. 27, Zhongguancun South Street, Haidian District, Peking" lautet "LNG: 116.31985, LAT: 39,959836". Gleichzeitig unterstützt Geocoding auch eine direkte Lösung von Orten, historischen Stätten und Wahrzeichengebäude und kehrt nach Baidu Breite und Länge zurück. Beispielsweise lautet das Ergebnis der Adressanalyse von "Baidu Building" "LNG: 116.30815, LAT: 40.056885". Es ist eine übliche POI -Abrufanforderung, und es wird empfohlen, die Place -API zu verwenden.
Inverse Geokodierung: Das heißt, inverse Adressanalyse und strukturierte Adressinformationen werden aus den Informationen zum Breitengrad und der Längengradinformationen erhalten. Zum Beispiel "LAT: 31.325152, LNG: 120.558957" Das Ergebnis einer inversen Adressanalyse ist "Nr. 318, Tayuan Road, Distrikt Huqiu, Stadt Suzhou, Provinz Jiangsu".
API -Serviceadresse: http://api.map.baidu.com/geocoder/v2/
Für bestimmte Parameter finden Sie die offiziellen Dokumentation.
Beispiel: http://api.map.baidu.com/geocoder/v2/?ak=Anappliced for Baidu Key & Standort = 34.79563,114.23075222912 & Callback = ShowLocation & Output = XML & pois = 1
Anmerkungen:
(1) Baidu -Entwicklerschlüsselanwendung
(2) Das Baidu -Kartenkoordinatensystem unterscheidet sich vom WeChat -Koordinatensystem
(3) API -Anrufadresse und Parameterbeschreibung
(4) Die Bedeutung der API -Rückruffunktion
(5) Verstehen Sie die Bedeutung von JSON und JSONP
3. Wechat JS-SDK-Kerncode
(1) JSAPI.cs generiert relevante JS-SDK-Konfigurationsparameter
Verwenden von System; system.globalisation; Verwendung von System.LinQ; Verwendung von System.Web.Security; Verwendung von System.web.ui; Verwendung von WxPayapi; Namespace Wxjssdk {öffentliche Klasse JSAPI {/// <summary> /// Save the Page -Objekt, weil Sie das Anforderungsobjekt der Klassenanforderungsobjekte verwenden möchten. Satz; } public wxjsdata resultjsdata {get; Satz; } /// <summary> /// // </summary> /// <param name = "page"> </param> public JSAPI (Seite Seite) {this.page = Seite; } public wxjsdata getJsdata () {var data = new WXJSData (); Data.setValue ("Appid", wxPayConfig.appid); // öffentliche Konto -ID -Daten.SetValue ("Timestamp", WXPayapi.Generatetimestamp ()); Data.SetValue ("Noncester", WXPayapi.GenerateNonCestern ()); // Random String var url = getUrl (); Data.SetValue ("URL", URL); var jStoken = getJsapiticket (); Data.SetValue ("jsapi_ticket", jStoken); var Signature = makesignature (jStoken, data.getValue ("noncestern"). toString (), data.getValue ("timestamp"). toString (), url); Data.SetValue ("Signatur", Signatur); Resultjsdata = Daten; Daten zurückgeben; } private String mayignature (String jsapiticket, String noncest, String Timestamp, String url) {String [] ArrayList = {"jsapi_ticket =" + jsapiticket, "timestamp =" + timestamp, "noncestr =" + noncestern "url =" + url}; Array.sort (ArrayList); var Signature = string.join ("&", ArrayList); Signature = FormsAuthentication.HashPasswordForstoringInFigFile (Signatur, "SHA1"). Tolower (); Rückgabesignatur; } private String 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 ()) return jsauth.getJsapiticket (token.access_token) .Ticket; zurückkehren ""; } private String geturl () {String host = page.request.url.host; String path = page.request.Path; String queryString = page.request.url.query; // Dieser Ort sollte beachtet werden, dass die vollständige URL an den WeChat -Hintergrund zurückgegeben wird, wenn die Webseite autorisiert, Benutzerinformationen zu erhalten String url = "http: //" + Host + Pfad + QueryString; Return URL; } public String getJSapiparameters () {log.debug (this.gettType (). toString (), "jsapi :: getJsapiparam ist verarbeitet ..."); String -Parameter = resultJSData.tojson (); Log.debug (this.gettType (). ToString (), "Get JSAPI:" + Parameter); Rückgabeparameter; }}}(2) JsAuthorizeAction.cswechat JS-SDK-API-Aufruffunktion
mit payment.wxwebhlper; mit payment.wxwebhlper.Results; mit System verwenden; Verwenden von WxPayapi; Namespace WXJSSDK {public class jsauthorizeaction {private statische 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.gettType (). ToString (), token.toString ()); } return token; } /// <summary> /// // // </summary> /// <returns> </returns> public tokenresult getokenResult () {var result = new Tokenresult (); try {var webutils = new Webutils (); var url = string.format ("https://api.wexin.qqq.com/cgi-ner/token?grant_type=client_credential&appid= <E0}&secret=e1}", wxpayconfig.appid, wxPayConfig.appSecret); var strrtn = webutils.get (URL); result = tools.jonstringtoobj <tokenResult> (strrtn); } catch (Ausnahme ex) {log.Error (this.gettype (). toString (), ex.Message); result = new tokenresult () {errcode = -1086}; } Rückgabeergebnis; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <returns> </returns> public jsapitickeTult -GetJSapiticket (String Token) {Log.Error (this.getType). if (! jsapiticket.isvalid ()) {jsapiticket = getJsapitickeTresult (Token); } return jsapiticket; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <returns> </returns> public JsapitickeTult GetJSapitickesult (String Token) {jsapitickeTresult Ergebnis; try {var webutils = new Webutils (); var url = string.format ("https://api.weixin.qqq.com/cgi-ner/ticket/gettticket?access_token= i.0}&type=jsapi", token); var strrtn = webutils.get (URL); result = tools.jonstringtoobj <jsapitickErtesult> (strrtn); } catch (Ausnahme ex) {log.Error (this.gettype (). toString (), ex.Message); result = new JSaPitICKeTresult () {errcode = -1086}; } Rückgabeergebnis; }} public class jsapitickeTresult: returnResult {/// <summary> /// Konstruktor /// </summary> public JsapiticketResult () {createdate = datetime.now; } /// <summary> /// // // </summary> public String Ticket {get; Satz; } /// <summary> //// Access_Token Interface Call Anmeldeinformationen Timeout, Einheit (Sekunden) /// </summary> public int expires_in {get; Satz; } /// <summary> ///// Creation Time /// </summary> public datetime erstellte {get; Satz; } /// <summary> /// Bestimmen Sie, ob es gültig ist //// </summary> /// <returns> </returns> public bool isvalid () {if (this.errcode! = 0) return false; var nd = datetime.now - createdate; return nd. seconds <7200; }} public class tokenresult: returnResult {/// <summary> /// Constructor /// </summary> public tokenresult () {createdate = datetime.now; } /// <summary> /// Die Web -Autorisierungsschnittstelle ruft die Anmeldeinformationen auf, Hinweis: Dieses Access_Token unterscheidet sich von der Access_Token, die von den Grundlagen unterstützt wird /// </summary> public String access_token {get; Satz; } /// <summary> //// Die Timeout -Zeit für Access_Token -Schnittstelle Call Anmeldeinformationen, Einheit (Sekunden) /// </summary> public int expires_in {get; Satz; } /// <summary> /// Erstellungszeit //// </summary> public datetime erstellte {get; Satz; } /// <summary> /// Bestimmen Sie, ob es gültig ist //// </summary> /// <returns> </returns> public bool isvalid () {if (this.errcode! = 0) return false; var nd = datetime.now - createdate; return nd. seconds <7200; }}}(3) WXJSDATA.CS WECHAT JS-SDK-Parameterklasse
mit Litjson; mit System.Collectionss.generic; mit System.security.cryptography; mit System.text; mit System.xml; Verwenden von WXPayAPi; Namespace wxjssdk {public class wxjsdata {private sortEdDictionary <String, Objekt> m_values = new SortEdDictionary <String, Object> (); / *** Setzen Sie den Wert eines bestimmten Feldes* @param Schlüsselfeldname* @param -Wertfeldwert*/ public void setValue (String -Schlüssel, Objektwert) {m_values [Key] = Wert; } / *** Erhalten Sie den Wert eines bestimmten Feldes basierend auf dem Feldname* @Param Schlüsselfeldname* @return Feldwert, der dem Schlüssel entspricht* / public Object getValue (String -Schlüssel) {Objekt o = null; m_values.trygetValue (Schlüssel, out o); Rückkehr O; } / *** Bestimmen Sie, ob ein Feld festgelegt wurde. m_values.trygetValue (Schlüssel, out o); if (null! = o) return true; false zurückgeben; } /*** @Convert Dictionary zu xml* @return Die konvertierte XML -String* @throws wxPayException ** /public String toxml () {// Es kann nicht in XML -Format konvertiert werden, wenn (0 == m_values.count) {log.Eror (thettypePe (). Neue WXPayException werfen ("WXPayData -Daten sind leer!"); } String xml = "<xml>"; foreach (KeyValuePair <String, Objekt> Paar in m_values) {// Der Feldwert kann nicht null sein, was den nachfolgenden Prozess beeinflusst, wenn (value == null) {log.Error (this.gettType (). toString (), "wxPaydata enthält Felder mit Value null!"); Neue WXPayException werfen ("wxpaydata enthält Felder mit Wert null!"); } if (pair.Value.gettType () == typeof (int) || pair.Value.gettType () == Typof (decimal)) {xml + = "<" + pair.key + ">" + pairue.value.tostring () + "</" + pair.key + ">"; } else if (pairue.Value.gettType () == TypeOf (String)) {xml + = "<" + pair.Key + ">" + "<! [cdata [" + pairue.value + "]> </" + pair.key + ">"; } else // mit Ausnahme von String- und Int -Typen können Sie andere Datentypen nicht enthalten. Neue WXPayException ("WXPayData -Feld Datentyp Fehler!") }} xml += "</xml>"; Return XML; } / *** @convert XML zu WXPayData -Objekt und Rückgabedaten im Objekt* @param String XML, um konvertiert zu werden Log.Error (this.gettType (). ToString (), "Es ist nicht legal, eine leere XML -Zeichenfolge in WXPayData zu konvertieren!"); Wirf eine neue WXPayException ("Es ist nicht legal, eine leere XML -Zeichenfolge in WXPayData zu konvertieren!"); } Xmldocument xmldoc = new Xmldocument (); xmldoc.loadxml (xml); Xmlnode xmlnode = xmldoc.firstchild; // Root -Knoten <xml> xmlnodelist nodes = xmlnode.childnodes; foreach (xmlnode xn in Knoten) {xmlelement xe = (xmlelement) xn; m_values [xe.name] = xe.inNertext; // das Schlüsselwertpaar von XML in die Daten in WXPayData} try {// 2015-06-29 Der Fehler ist, dass es keine Signatur gibt, wenn (m_values ["return_code"]! } Checksesign (); // Überprüfen Sie die Signatur, wenn sie nicht passt, wird eine Ausnahme} catch (wxpayexception ex) {neue WXPayException (ex.Message) werfen; } return m_values; } / *** @Dictionary -Format konvertiert in URL -Parameterformat* @ return URL -Format -Zeichenfolge, diese Zeichenfolge enthält nicht den Zeichenfeldwert* / public String tourl () {String buff = ""; foreach (KeyValuePair <String, Objekt> Paar in m_values) {if (pairue.Value == null) {log.Error (this.gettType (). toString (), "wxpayData enthält ein Feld mit einem Wert von Null!"); Neue WXPayException werfen ("WXPayData enthält ein Feld mit einem Wert von NULL!"); } if (pair.Key! = "sign" && pairue.value.toString ()! }} buff = buff.trim ('&'); Buff zurückkehren; } / *** @Dictionary formatiert nach JSON* @Return Json String Data* / public String tojson () {String jSONSON = jsonMapper.tojson (m_values); kehren Sie JSONS zurück; } / ** * @Values formatiert dem Ergebnis, das auf der Webseite angezeigt werden kann (da die Webseite die Zeichenfolgen im XML -Format nicht direkt ausgeben kann) * / public String toprintstr () {string str = ""; foreach (KeyValuePair <String, Objekt> Paar in m_values) {if (pairue.value == null) {log.Error (this.gettType (). toString (), "wxpayData enthält Felder mit Wert null!"); Neue WXPayException werfen ("wxpaydata enthält Felder mit Wert null!"); } str += string.format ("{0} = {1} <br>", pair.Key, pairue.toString ()); } Log.debug (this.gettType (). ToString (), "auf der Webseite drucken:" + str); return str; } /*** @Generate Signature finden Sie im Signaturergenerierungsalgorithmus für Details* @return Signatur, das Zeichenfeld nimmt nicht an der Signatur nimmt // API nach String -Schlüssel hinzufügen Str + = "& key =" + wxpayconfig.Key; // Md5 -Verschlüsselung var md5 = md5.create (); var bs = md5.computehash (coding.utf8.getBytes (str)); var sb = new StringBuilder (); foreach (byte b in bs) {sb.append (b.tostring ("x2")); } // Alle Zeichen werden in Großbuchstaben result = sb.toString () konvertiert. Toupper (); Rückgabeergebnis; } public String makeAppSign () {// URL -Format String str = tourl (); // API nach String -Schlüssel hinzufügen Str + = "& key =" + wxpayconfig.keyofApp; // Md5 -Verschlüsselung var md5 = md5.create (); var bs = md5.computehash (coding.utf8.getBytes (str)); var sb = new StringBuilder (); foreach (byte b in bs) {sb.append (b.tostring ("x2")); } // Alle Zeichen werden in Großbuchstaben result = sb.toString () konvertiert. Toupper (); Rückgabeergebnis; } /**** Überprüfen Sie, ob die Signatur korrekt ist Neue WXPayException werfen ("WxPayData Signature existiert, ist aber nicht legal!"); } // Wenn die Signatur festgelegt ist, aber die Signatur leer ist, wird eine Ausnahme ausgelöst, wenn (GetValue ("Zeichen") == null || getValue ("Zeichen"). ToString () == "") {Log.Error (this.gettype (). ToString (), WxPayData -Signatur, aber es ist nicht legal! "). Neue WXPayException werfen ("WxPayData Signature existiert, ist aber nicht legal!"); } // Erhalten Sie die empfangene Signatur -String return_sign = getValue ("Zeichen"). ToString (); // Berechnen Sie die neue Signatur lokal string cal_sign = meesign (); if (cal_sign == return_sign) {return true; } Log.Error (this.gettType (). ToString (), "WXPayData Signature -Überprüfungsfehler!"); Neue WXPayException werfen ("WXPayData Signature -Überprüfungsfehler!"); } / ** * @getDictionary * / public sortEdDictionary <String, Object> getValues () {return m_values; }}}Schnellinformationen: Für relevante Analyseideen finden Sie in der offiziellen WeChat Official Account Payment SDK.
Dieser Artikel wurde in "Zusammenfassung von JavaScript Wechat Development Skills" zusammengestellt, und jeder kann gerne lernen und lesen.
Ich empfehle ein Tutorial zu Wechat -Applets, die sich jetzt sehr besorgt befinden: Der Herausgeber von "Wechat Mini Program Development Tutorial" hat es sorgfältig für alle zusammengestellt. Ich hoffe, es gefällt Ihnen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.