Pendant le développement de WeChat JS-SDK, GetLocation est utilisée pour obtenir des positions de coordonnées. Comment appliquer directement les coordonnées obtenues par WeChat à la carte Baidu, affichant les effets suivants:
Remarque: L'icône rouge est la position convertie à partir de WeChat, et l'icône bleue est la position qui l'entoure. Tout d'abord, expliquons-le du processus de développement de WeChat.
1. Document de développement JS-SDK WeChat
Tout d'abord, entrez le document d'aide sur le site officiel: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_cn
Vous pouvez étudier le document en détail. Pour obtenir des informations de localisation, les étapes suivantes sont divisées en étapes suivantes:
Étape 1: lier le nom de domaine
Entrez le compte officiel WeChat, recherchez le menu "Paramètres officiels" et entrez le panneau "Paramètres de fonction".
Cliquez sur "Paramètres" pour définir le nom de domaine pertinent qui fait référence à JS:
Étape 2: citant la bibliothèque officielle de la classe JS
Présentez le fichier JS suivant sur la page qui doit appeler l'interface JS (prendre en charge https): http://res.wx.qq.com/open/js/jweixin-1.0.0.js.
La page référencée est location.aspx, comme suit:
<% @ Page Title = "Get Location" Language = "C #" AutoEventWireup = "True" MasterPageFile = "~ / Wxcrm / Site.master" CodeFile = "Location.aspx.cs" Hérite = "DTCMS.web.wxcrm.Location"%> <asp: Content ID = "Content1" ContentPlaceHolderid = "Cphhead" Runat = "Server"> <Script "Spirtud src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> </ script> <script type = "text / javascript"> $ ("# mask"). show (); wx.config ({debug: false, // Ouvrir le mode de débogage, si true, chaque appel de fonction js apparaîtra appid: '<% = resultjsdata.getValue ("appid")%>', // requis, l'identifiant unique du compte officiel timestamp: <% = resultjsdata.getValue noncaMestr ")%>, // requis, généré le time de time de temps:")%>, //, Général '<%= ResultJsData.GetValue("noncestr") %>', //Required, generate the signature random string signature: '<%= ResultJsData.GetValue("signature") %>', //Required, signature jsApiList: [ 'checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', `` Onmenushareqq '', 'Onmenushareweibo', `` Hidememenutems '', `` ShowMenuems '', `` HideallnonBasmemeniuitems '', `` ShowallNonBasmeMitumems ' `` Onrecordend '', `` playvoice ', `` Pausevoice' ', `` stopvoice', `` uploadvoice ',' downloadVoice ',' ChooseMage ',' Awewimage ',' uploloadimage ',', ',' hideoption ',' getNetWorkType ',', ',', hideoptionmmenu '', showlocation ", ', hideoptionmenu' «scanqrcode», «Choosewxpay», «openProductSpecificView», «addcard», «choosecard», «opencard»]}); wx.ready (function () {wx.checkjsapi ({jsapilist: ['getNetWorkType', 'Aperçu', 'getLocation'], Success: function (res) {}}); wx.getLocation ({Type: 'wgs84', // La valeur par défaut est utilisée dire directement de wgs84. À OpenLocation, vous pouvez passer dans «GCJ02» Succès: Res) {Try {var Latitude = Res.Latitude; // Poscure de position // aalert (jsonuti.converttostring (res)); Adresse: 'Cliquez sur Afficher', // Détails de l'adresse // Échelle: 28, // MAP NIVEAU ZOOM, Façon de mise en forme, variez de 1 à 28. // alerte (latitude + "-" + longitude); $ ("# mask"). Mide (); }, annuler: function (res) {window.location.href = "Aucun.aspx? msg = rejeter pour obtenir l'emplacement géographique & r =" + math.random (); WX.Error (fonction (res) {// Config Information La défaillance de la vérification exécutera une fonction d'erreur. Si la signature expire, la vérification échouera. Pour des messages d'erreur spécifiques, vous pouvez ouvrir le mode de débogage de configuration ou le visualiser dans le paramètre RES renvoyé. La signature peut être mise à jour ici pour Spa.}); wx.fail (fonction (res) {}); </ script> </ asp: contenu> <asp: contenu id = "contenu2" contentPlaceHolderid = "cphtitle" runat = "server"> Obtenez l'emplacement </ asp: contenu> <asp: contenu id = "content3" contentHolderid = "cphcontainer" runat = "server"> <r / br / br / centryle = "affiche: bloc; Informations ... </ div> </ centr> <div style = "affiche: aucune;"> <span> <img src = "/ templates / txwap / images / mask.gif" /> </span> </div> </ asp: contenu>Effet de la page:
Notes:
(1) Si les paramètres du téléphone mobile ne permettent pas à WeChat d'obtenir des informations de localisation, les informations ci-dessus seront invitées.
(2) Les paramètres de la figure ci-dessus obtiennent les coordonnées GPS. Si vous utilisez la carte Baidu, vous devez effectuer une certaine conversion et vous serez reflété dans l'emplacement1.aspx.
(3) Toutes les pages qui nécessitent JS-SDK doivent d'abord être injectées avec des informations de configuration, sinon elles ne seront pas appelées.
Implémentation de location.aspx.cs correspondante:
Utilisation de paiement.wxwebhlper; Utilisation de Payt.WxWebhlper.Action; Utilisation du système; Utilisation du System.Globalisation; Utilisation de Wxjssdk; Utilisation de Wxpayapi; Namespace DTCMS.web.wxcrm {public partiel de classe partielle: PageBase {String Protected String appid {get; ensemble; } Timestamp de chaîne protégée {get; ensemble; } String protégé noncestr {get; ensemble; } Signature de chaîne protégée {get; ensemble; } chaîne statique publique wxjsapiparam {get; ensemble; } public wxjsdata resultjsdata {get; ensemble; } protégée void page_load (expéditeur d'objet, eventArgs e) {jugecode (); var webAuthorize = new webAuthorizEAction (); Code2TokenResult = webAuthorize.code2Token (demande ["code"]); if (code2TokenResult.haserror ()) {réponse.redirect (urls.pageoflocation); GotOnOnePage ("Impossible d'obtenir des informations d'identification de l'utilisateur, veuillez recueillir"); retour; } GetUserRoresult = webAuthorize.getUserInfo (code2TokenResult.access_token); if (getUserRoresult.haserror ()) {gotOnOnePage ("Impossible d'obtenir des informations d'utilisateur, veuillez recueillir"); } var userId = wxoperation.hasbind (getUserRoresult.OpenID); if (userId.equals (Guid.Empty)) {réponse.redirect (url.oauth2url); GotOnOnePage ("utilisateur WeChat non lié"); } appid = wxpayconfig.appid; Timestamp = wxpayapi.generateTimeStamp (); noncestr = wxpayapi.generaTenonCestr (); // L'implémentation suivante sera reflétée dans 3. L'implémentation de code de base var jsapi = new JSAPI (this); Résultatjsdata = jsapi.getjsdata (); Wxjsapiparam = jsapi.getjsapiparameters (); // obtenez H5 pour régler les paramètres de l'API JS}}}2. Convertir les coordonnées GPS de WeChat en coordonnées Baidu
Après que WeChat ait réussi à obtenir des coordonnées, la page passera automatiquement à l'emplacement1.aspx, et le flux de traitement est le suivant:
Coordonnées WeChat -> Convertir en coordonnées de la carte Baidu -> Obtenir les informations de localisation selon l'API de la carte Baidu -> COORDINATION AFFICHER Selon l'API de la carte Baidu
<% @ Page Title = "En ligne vérification" Language = "C #" MasterPageFile = "~ / WXCRM / SITEE.Master" AutoEventWireup = "True" CodeFile = "Location1.aspx.cs" Hérites = "DTCMS.WEB.WXCRM.LOCATION1"%> <ASP: CONTENU ID = "Content1" ContentPlace Holderdid = "CPHHead" Runat = "Server"> <META1 " name = "Viewport" content = "initial-scale = 1.0, user-scalable = no" /> <style type = "text / css"> #allmap {width: 100%; hauteur: 300px; } </ style> <script type = "text / javascript" src = "http://api.map.baidu.com/api?v=2.0&ak=dhrlkmr9quo4whmnnsztarta"> </ script> <script type = "text / javascrip"> // gps coordated var yy = <% = this.reque ["Long"> // gps coordate // Longitude, numéro de point flottant, la plage est de 180 ~ -180. var xx = <% = this.request ["latitude"]%>; // latitude, numéro de point flottant, la plage est de 90 ~ -90 var gpspoint = new 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/?"; function changePosition () {var str = "coords =" + yy + "," + xx + "& from = 1 & to = 5"; var url = positionUrl + str; $ ("# positionUrl"). html (url + "& ak = dhrlkmr9quo4whmnnsztartg"); var script = document.createElement ('script'); script.src = url + '& ak = dhrlkmr9quo4whmnnsztarta & callback = dealResult'; document.getElementsByTagName ("Head") [0] .APPEndChild (script); } fonction dealResult (msg) {if (msg.status! = 0) {alert ("Aucun résultat de retour correct."); $ ("# mask"). hide (); retour; } //Jsonuti.convertToString(msg); bxx = msg.result [0] .x; byy = msg.result [0] .y; dooPtions (); } fonction getBaidUpose () {var url = "http://api.map.baidu.com/geoconv/v1/?coords=" + yy + "," + xx + "& from = 1 & to = 5 & ak = dhrlkmr9quo4whmnnsztarta"; $ .ajax ({url: url, succès: fonction (data, status, xhr) {alert (status); alert (data.status);}, dataType: json}); } var avanced_post = ''; var AdvancedOptions = ''; Adresse var; var map; fonction rendeRORTION (réponse) {var html = ''; if (réponse.status) {$ ("# mask"). hide (); var text = "Aucun résultat de retour correct!"; alerte (texte); retour; } var result = réponse.result; var emplacement = réponse.result.location; var uri = 'http://api.map.baidu.com/marker?location='+ location.lat +', '+ location.lng +' & title = '+ réponse.result.level +' & contenu = '+ adresse +' & output = html '; var statimageUrl = "http://api.map.baidu.com/statimage?center=" + location.lng + ',' + location.lat + "& markers =" + location.lng + ',' + location.lat; html = '<p> Coordonnées: latitude:' + location.lat + "longitude:" + location.lng + '<br />'; html + = 'précision:' + réponse.result.precise + '<r />'; html + = 'devise:' + réponse.result.confidence + '<br />'; html + = 'Type d'adresse:' + réponse.result.level + '</p>'; html + = '<p> <img src = "' + statimageurl + '" /> </p>'; html + = '<p> Partagez ce point: <a href = "' + uri + '" target = "_ blanc">' + uri + '</a> </p>'; // Définissez ce lien sur Clickable // Baidu Map API Fonction Map = new Bmap.map ("AllMap"); var point = new BMAP.point (bxx, byy); var marqueur = new bmap.marker (point); // Créer Annotation Map.AdDoverlay (Marker); // Ajouter une annotation à la carte map.CenterandZoom (point, 100); var opts = {width: 200, // Fenêtre d'information Largeur hauteur: 100, // Fenêtre d'information Titre de la fenêtre: "ma position", // Titre de la fenêtre d'information EnableMEMSage: true, // set Autoriser la fenêtre d'information pour envoyer des messages courts: result.formatted_address} $ ("# divpo"). var infowindow = new BMAP.infowIndow (result.formatted_address, opts); // Créer un objet de fenêtre d'informations marqueur.addeventListener ("cliquez", fonction () {map.openinfowIndow (infowindow, point); // ouvrir la fenêtre d'information}); var myicon = new bmap.icon ("http://api.map.baidu.com/img/markers.png", new Bmap.Size (23, 25), {Offset: new Bmap.Size (10, 25), // Spécifiez la position de positionnement ImageOffSet: new Bmap.Size (0, 0 - 10 * 25) // Set Image Offset}); var pois = result.pois; for (var i = 0; i <pois.length; i ++) {var karker = new Bmap.marker (new Bmap.point (pois [i] .point.x, pois [i] .point.y), {icon: myicon}); // Créer annotation var name = pois [i] .name; var addr = pois [i] .addr; map.AdDoverlay (marqueur); // Ajouter une annotation à la carte addClickHandler (nom, addr, marqueur); } $ ("# mask"). hide (); $ ("# btnsign"). show (); retour; } fonction addClickHandler (name, addr, marqueur) {marker.addeventListener ("cliquez", fonction (e) {openInfo (name, addr, e)}); } fonction openInfo (name, addr, e) {var p = e.target; var Point = new Bmap.point (p.getPosition (). lng, p.getPosition (). Lat); var opts = {width: 200, // Fenêtre d'information Largeur Hauteur: 100, // Fenêtre d'information Titre: Nom, // Titre de la fenêtre d'information EnableMEMessage: true, // set Autoriser la fenêtre d'information pour envoyer des messages courts: addr} var infowindow = new BMAP.InfowInDow (addr, opts); // Créer la fenêtre d'informations MAP MAP.OpenInFowIndow (Infowindow, Point); // Ouvrez la fenêtre d'information} fonction 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 = 2"; script.src = Advanced_Post; document.body.appendChild (script); }; $ (function () {$ ("# mask"). show (); $ ("# btnsign"). hide (); changePosition ();}); </ script> </ asp: contenu> <asp: contenu id = "contenu2" contentPlaceHolderid = "cphtitle" runat = "server"> vérification en ligne </ asp: contenu> <asp: contenu id = "content3" contenantPlaceHolderid = "cphcontainer" runat = "server"> <form id = "frmLocation" runat = "server"> <plown> <pander> Informations </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"> </v> </ul> </v> </v> </v Div> </ Div> </ Div> </vrign; Margin-top: -50px; "> ID ID =" BTNSIGN " /> </ div> <div style = "Affichage: Aucun;"> <span> <img src = "/ templates / txwap / images / mask.gif" /> </span> </div> </ form> </ asp: contenu>Cette page implique principalement la plate-forme ouverte Baidu Map, et vous devez postuler pour Baidu Map AG. Sinon, appeler JS invite: l'application n'existe pas, s'il y a une erreur dans AK, veuillez revérifier et réessayer.
(1) Baidu Map Technology 1: coordonnée API de conversion
Adresse officielle du site Web: http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
Adresse du service API: http://api.map.baidu.com/geoconv/v1/?
Le document a des descriptions détaillées, donc je ne les répéterai pas.
(2) Baidu Map Technology 2: Obtenir l'emplacement en fonction des coordonnées
Site officiel: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
L'API de géocodage comprend la résolution d'adresse et les fonctions de résolution d'adresse inverse:
Encodage géographique: c'est-à-dire l'analyse d'adresse et les informations de latitude et de longitude de baidu sont obtenues à partir de l'adresse structurée détaillée de la rue. Par exemple, le résultat de l'analyse de l'adresse de "No. 27, Zhongguancun South Street, Haidian District, Pékin" est "LNG: 116.31985, LAT: 39.959836". Dans le même temps, le géocodage soutient également la résolution directe des lieux, des sites historiques et des bâtiments historiques et retour à la latitude et à la longitude de Baidu. Par exemple, le résultat de l'analyse d'adresse de "Baidu Building" est "LNG: 116.30815, LAT: 40.056885". Il s'agit d'une exigence de récupération de POI courante, et il est recommandé d'utiliser l'API PLACE.
Géocodage inverse: c'est-à-dire l'analyse d'adresse inverse et les informations d'adresse structurées sont obtenues à partir d'informations de latitude et de longitude Baidu. Par exemple, "Lat: 31.325152, GNL: 120.558957" Le résultat de l'analyse d'adresse inverse est "No. 318, Tayuan Road, Huqiu District, Suzhou City, Province de Jiangsu".
Adresse du service API: http://api.map.baidu.com/geocoder/v2/
Pour des paramètres spécifiques, veuillez consulter la documentation officielle.
Exemple: http://api.map.baidu.com/geocoder/v2/?ak=APLICED pour Baidu Key & Location = 34.79563,114.23075222912 & callback = showLocation & output = xml & pois = 1
Notes:
(1) Application de clé de développeur Baidu
(2) le système de coordonnées de la carte Baidu est différent du système de coordonnées WeChat
(3) Adresse d'appel API et description des paramètres
(4) la signification de la fonction de rappel de l'API
(5) Comprendre la signification de JSON et JSONP
3. Code de base WeChat JS-SDK
(1) JSAPI.CS génère des paramètres de configuration JS-SDK pertinents
Utilisation du système; utilisant System.Globalization; Utilisation de System.Linq; Utilisation de System.Web.Security; Utilisation de System.Web.UI; Utilisation de Wxpayapi; Espace de noms wxjssdk {public classe JSAPI {/// <summary> /// Enregistrer l'objet Page parce que vous souhaitez utiliser l'objet de demande de la page dans la méthode de la classe /// </ </ </numary> Page privée {Get; Get; ensemble; } public wxjsdata resultjsdata {get; ensemble; } /// <summary> /// // </summary> /// <param name = "Page"> </ param> public jsapi (page page) {this.page = page; } public wxjsdata getjsdata () {var data = new wxjsdata (); data.setValue ("appid", wxpayconfig.appid); // id de compte public data.setValue ("horodat", wxpayapi.generateTimeStamp ()); data.setValue ("noncestr", wxpayapi.generaTenonCestr ()); // String aléatoire var url = getUrl (); data.setValue ("URL", URL); var jStoken = getJsapiticket (); data.setValue ("JSAPI_TICKET", jStoken); var signature = Makeignature (jStoken, data.getValue ("nonCest"). ToString (), data.getValue ("horodat"). toString (), url); data.setValue ("signature", signature); ResultJsdata = data; retourner les données; } private String MakeSignature (String jSapiticket, String nonCestr, 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.hashPasswordForStorininConfigfile (Signature, "Sha1"). Tolower (); signature de retour; } chaîne privée 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; retour ""; } private String getUrl () {String host = page.request.url.host; String path = page.request.path; String QueryString = page.request.url.Query; // Cet endroit doit être noté que l'URL complète remonte à l'arrière-plan WeChat lorsque la page Web autorise à obtenir une chaîne d'informations utilisateur url = "http: //" + host + path + querystring; URL de retour; } public String getjsapiparameters () {log.debug (this.getType (). toString (), "jsapi :: getjsapiparam est le traitement ..."); paramètres de chaîne = resultjsdata.tojson (); Log.debug (this.getType (). ToString (), "Get JSAPI:" + Paramètres); paramètres de retour; }}}(2) JSAuthorizEATION
Utilisation de PAYS.WXWEBHLPER; Utilisation de Payt.wxWebhlper.Results; Utilisation du système; Utilisation de wxpayapi; Espace de noms wxjssdk {public class jsAuthorizEAction {TokenResult Static privé Token = new tokenResult () {errCode = -1}; JSAPITICKETRESULT JSAPITICTS PRIVATE JSAPITICKET = NOUVEAU 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> /// <retourne> </ returns> public tokenResult getokenResult () {var result = new tokenResult (); try {var webutils = new WebUtils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=Client_Credent&appid= {0 }&secret={1}", wxpayconfig.appid, wxpayconfig.appcret); var strrtn = webutils.get (url); result = outils.jSontringToOBj <TokenResult> (strrtn); } catch (exception ex) {log.error (this.getType (). toString (), ex.Message); result = new tokenResult () {errCode = -1086}; } Retour Résultat; } /// <summary> /// // // </summary> /// <param name = "token"> </amor> /// <retourne> </ returns> public jsapiticketResult getjsapiticket (String token) {Log.errror (this.getType (). if (! jsapiticket.isvalid ()) {jsapiticket = getjsapiticketResult (token); } return jSapiticket; } /// <summary> /// // // </summary> /// <param name = "token"> </ param> /// <retourne> </ returns> public jsapiticketResult Result; try {var webutils = new WebUtils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/ticket/getTicket?access_token={0 }&type=jsapi", token); var strrtn = webutils.get (url); result = outils.jSontringtoOBj <jsapiticketResult> (strrtn); } catch (exception ex) {log.error (this.getType (). toString (), ex.Message); result = new JSAPITICKETRESULT () {errCode = -1086}; } Retour Résultat; }} classe publique jSapiticketResult: returnResult {/// <summary> /// constructor /// </ résumé> public jsapiticketResult () {CreateDate = dateTime.Now; } /// <summary> /// // // </summary> billet de chaîne publique {get; ensemble; } /// <summary> //// Access_token Call d'appel d'identification Timeout, unité (secondes) /// </summary> public int expires_in {get; ensemble; } /// <summary> //// Temps de création //// </summary> public DateTime CreateDate {get; ensemble; } /// <summary> /// Déterminez s'il est valide //// </summary> /// <retourne> </ returns> public bool isvalid () {if (this.errcode! = 0) return false; var nd = dateTime.now - CreateDate; retour nd.seconds <7200; }} classe publique TokenResult: returnResult {/// <summary> /// constructor /// </ résumé> public tokenResult () {CreateDate = DateTime.Now; } /// <summary> /// L'interface d'autorisation Web appelle les informations d'identification, Remarque: Cet Access_token est différent de l'accès_token pris en charge par les bases /// </summary> public String Access_token {get; ensemble; } /// <summary> //// Le temps d'appel d'appel d'interface Access_Token Timeout, unité (secondes) /// </summary> public int expires_in {get; ensemble; } /// <summary> /// Temps de création //// </summary> public DateTime CreateDate {get; ensemble; } /// <summary> /// Déterminez s'il est valide //// </summary> /// <retourne> </ returns> public bool isvalid () {if (this.errcode! = 0) return false; var nd = dateTime.now - CreateDate; retour nd.seconds <7200; }}}(3) WXJSDATA.CS WECHAT JS-SDK Classe de paramètres
Utilisation de Litjson; Utilisation de System.Collections. GENENERIER; Utilisation de System.Security.Cryptographie; Utilisation de System.Text; Utilisation de System.xml; Utilisation de wxpayapi; namespace wxjssdk {public class wxjsdata {private triddictionary <string, object> m_values = new triddictionary <string, object> (); / ** * Définissez la valeur d'un certain champ * @Param Key Nom du champ * @param valeur de champ Valeur * / public void setValue (String key, objet Value) {m_values [key] = value; } / ** * Obtenez la valeur d'un certain champ basé sur le nom de champ * @param Nom du champ de clé * @return Valeur de champ correspondant à la clé * / objet public getValue (String Key) {objet o = null; m_values.tryGetValue (clé, out o); retour o; } / ** * Déterminez si un champ a été défini * @param Nom du champ de clé * @return return Si la touche de champ a été définie, renvoie true, sinon false * / public bool isset (string key) {object o = null; m_values.tryGetValue (clé, out o); if (null! = o) return true; retourne false; } / ** * @Convert Dictionary en xml * @return la chaîne XML convertie * @throws wxpayException ** / public String toxml () {// il ne peut pas être converti au format xml if (0 == m_values.Count) {log.error (this.getType (). Jetez une nouvelle WXPayException ("Les données WXPayData sont vides!"); } string xml = "<xml>"; foreach (keyvaluepair <string, objet> paire dans m_values) {// La valeur du champ ne peut pas être nul, ce qui affectera le processus ultérieur if (pair.value == null) {log.Error (this.getType (). toString (), "wxpayData contient des champs avec valeur null!"); lancer un nouveau wxpayException ("wxpaydata contient des champs avec une valeur null!"); } if (pair.value.getType () == typeof (int) || pair.value.getType () == typeof (decimal)) {xml + = "<" + pair.key + ">" + pair.value.tostring () + "</" + pair.key + ">"; } else if (pair.value.getType () == typeof (string)) {xml + = "<" + pair.key + ">" + "<! [cdata [" + pair.value + "]]> </" + paire.key + ">"; } else // Sauf pour les types de chaînes et int, vous ne pouvez pas contenir d'autres types de données {log.Error (this.getType (). toString (), "WxpayData Field Data Type Error!"); Jetez une nouvelle erreur WXPayException ("WxpayData Field Data Type Error!"); }} xml + = "</ xml>"; retour xml; } / ** * @convert xml à l'objet wxpaydata et renvoyez des données dans l'objet * @param string xml à converti * @return dictionary obtenu par conversion * @throws wxpayException * / public tridDictionary <String, objet> fromxml (string xml) {if (string.isnulllorempty (xml) { Log.Error (this.getType (). ToString (), "Il n'est pas légal de convertir une chaîne XML vide en wxpaydata!"); Jetez une nouvelle WXPayException ("Il n'est pas légal de convertir une chaîne XML vide en wxpaydata!"); } XmlDocument xmldoc = new XMLDocument (); xmlDoc.loadxml (xml); Xmlnode xmlnode = xmldoc.firstchild; // Obtenez le nœud racine <xml> xmlNodeList nœuds = xmlnode.childnodes; foreach (xmlnode xn dans les nœuds) {xmlelement xe = (xmlelement) xn; m_values [xe.name] = xe.InnerText; // Obtenez la paire de valeurs de clé de XML dans les données à l'intérieur de WxpayData} essayez {// 2015-06-29 L'erreur est qu'il n'y a pas de signature if (m_values ["return_code"]! = "Success") {return m_Values; } Checkssign (); // Vérifiez la signature, s'il ne passe pas, il lancera une exception} catch (wxpayException ex) {lancera new wxpayException (ex.Message); } retour m_values; } / ** * @Dictionary Format converti au format de paramètre URL * @ RETOUR URL Format String, cette chaîne ne contient pas la valeur de champ de signe * / public String tourl () {String buff = ""; foreach (keyvaluepair <string, objet> paire dans m_values) {if (pair.value == null) {log.Error (this.getType (). toString (), "wxpayData contient un champ avec une valeur de null!"); Jetez un nouveau wxpayException ("WxpayData contient un champ avec une valeur de null!"); } if (pair.key! = "Sign" && pair.value.toString ()! = "") {buff + = pair.key + "=" + pair.value + "&"; }} buff = buff.trim ('&'); Buff de retour; } / ** * @Dictionary Formaté vers JSON * @return JSON String Data * / public String TOJSON () {String jSontr = jsonMapper.tojson (m_values); retourner jsonstr; } / ** * @values formaté au résultat qui peut être affiché sur la page Web (car la page Web ne peut pas sortir directement les chaînes au format XML) * / public String toprintstr () {String str = ""; foreach (keyValuepair <string, objet> paire dans m_values) {if (pair.value == null) {log.Error (this.getType (). toString (), "wxpayData contient des champs avec une valeur null!"); lancer un nouveau wxpayException ("wxpaydata contient des champs avec une valeur null!"); } str + = string.format ("{0} = {1} <br>", pair.key, pair.value.toString ()); } Log.debug (this.getType (). ToString (), "Imprimer en page Web:" + str); retour STR; } / ** * @generate Signature, voir l'algorithme de génération de signature pour plus de détails * @return Signature, le champ de signe ne participe pas à la signature * / public wakingign () {// convertir la chaîne de format URL str = tourl (); // Ajouter une API après la chaîne Key str + = "& key =" + wxpayconfig.key; // Encryption MD5 var md5 = md5.create (); var bs = md5.computehash (encoding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (octet b dans bs) {sb.append (b.toString ("x2")); } // Tous les caractères sont convertis en une chaîne en maîtrise en majuscule = sb.toString (). Toupper (); Résultat de retour; } public String makeAppSign () {// convertir la chaîne de format URL str = tourl (); // Ajouter une API après la clé de chaîne str + = "& key =" + wxpayconfig.keyofApp; // Encryption MD5 var md5 = md5.create (); var bs = md5.computehash (encoding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (octet b dans bs) {sb.append (b.toString ("x2")); } // Tous les caractères sont convertis en une chaîne en maîtrise en majuscule = sb.toString (). Toupper (); Résultat de retour; } / ** * * Vérifiez si la signature est correcte * Renvoie true correctement, et une erreur de lancement d'erreur * / public bool vérificSign () {// Si aucune signature n'est définie, sautez la détection if (! Isset ("Sign")) {Log.Error (this.getType (). TOSTRING (), "wxpayData Signature exists mais n'est pas légal!"); Jetez une nouvelle WxpayException ("La signature WXPayData existe mais n'est pas légale!"); } // Si la signature est définie mais que la signature est vide, une exception est lancée si (getValue ("Sign") == null || getValue ("Sign"). ToString () == "") {Log.Error (this.getType (). ToString (), "WxpayData Signature exists mais n'est pas légal!"); Jetez une nouvelle WxpayException ("La signature WXPayData existe mais n'est pas légale!"); } // Obtenez la chaîne de signature reçue return_sign = getValue ("signe"). ToString (); // Calculez la nouvelle signature locale string cal_sign = wakingign (); if (cal_sign == return_sign) {return true; } Log.Error (this.getType (). ToString (), "Erreur de vérification de la signature WxpayData!"); Jetez une nouvelle WXPayException ("WXPAYDATA Signature Verification Error!"); } / ** * @getDictionary * / public triddictionary <String, object> getValues () {return m_values; }}}Informations rapides: Pour les idées d'analyse pertinentes, veuillez vous référer au SDK officiel de paiement officiel du compte officiel, adresse de téléchargement: https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1.
Cet article a été compilé dans "Résumé des compétences de développement de JavaScript WeChat", et tout le monde est le bienvenu pour apprendre et lire.
Je recommande un tutoriel sur les applets WeChat qui sont très préoccupés maintenant: l'éditeur du "tutoriel de développement de programme WeChat Mini" l'a soigneusement compilé pour tout le monde, j'espère que vous l'aimez.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.