Durante el desarrollo de WeChat JS-SDK, GetLocation se usa para obtener posiciones de coordenadas. Cómo aplicar directamente las coordenadas obtenidas por WeChat a Baidu Map, mostrando los siguientes efectos:
Nota: El icono rojo es la posición convertida de WeChat, y el icono azul es la posición a su alrededor. Primero, expliquemos desde el proceso de desarrollo de WeChat.
1. Documento de desarrollo de WeChat JS-SDK
Primero, ingrese el documento de ayuda en el sitio web oficial: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_cn
Puede estudiar el documento en detalle. Para obtener información de ubicación, los siguientes pasos se dividen en los siguientes pasos:
Paso 1: unir el nombre de dominio
Ingrese la cuenta oficial de WeChat, busque el menú "Configuración de cuenta oficial" e ingrese el panel "Configuración de funciones".
Haga clic en "Configuración" para establecer el nombre de dominio relevante que hace referencia js:
Paso 2: citando la biblioteca de clase JS oficial
Presente el siguiente archivo JS en la página que necesita llamar a la interfaz JS (soporte https): http://res.wx.qq.com/open/js/jweixin-1.0.0.js.
La página referenciada es ubicación.aspx, como sigue:
< %@ Page title = "get ubicación" lenguaje = "c#" autoeventwireUp = "true" masterPageFile = "~/wxcrm/Site.master" codeFile = "ubicación.aspx.cs" inherits = "dtcms.web.wxcrm.location" %> <ASP: Content Id = "Content1" ContentLoPlaceD = "CPHhead" Runat "Runat" Runat "Runat" Script "Survor" 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, // Abrir modo de depuración, si es verdadero, cada llamada de función JS aparecerá appid: '< %= resultJsData.getValue ("Appid") %>', // requerido, el identificador único de la cuenta oficial de la cuenta: < %= resultJsData.getValue ("Timestamp") %>, //, Genere la firma de TimeStamps: Generación de la firma de la firma: Genere la campaña Noncats. '<%= 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', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'getNetworkType', 'openLocation', 'getLocation', 'hideOptionMenu', 'showOptionMenu', 'closeWindow', 'scanQRCode', 'ChooseWxPay', 'OpenProductSpecificView', 'AddCard', 'ChoosCard', 'OpenCard']}); wx.ready (function () {wx.checkjsapi ({jsapilist: ['getNetworkType', 'PreviewImage', 'getLocation'], éxito: function (res) {}}); wx.getLocation ({type: 'wgs84', // El valor predeterminado es el coordenado gps de wgs84. OpenLocation, puede pasar en 'GCJ02' Success: Function (Res) {try {var latitude = res.latitude; // precisión de posición // aalert (jsonuti.convertToString (res)); Dirección: 'Haga clic para ver', // Detalles de la dirección // Escala: 28, // Mapa de nivel de zoom, modelado valor, varía de 1 a 28. El valor predeterminado es máximo // infourl: "ubicación1.aspx? M = home & c = index & a = getLocation & Latitude ="+Latitude+"& Longitud // alerta (latitude + "-" + longitud); function (res) {window.location.href = "none.aspx? wx.error (function (res) {// La falla de verificación de información de configuración ejecutará una función de error. Si la firma expira, la verificación fallará. Para mensajes de error específicos, puede abrir el modo de depuración de configuración o verla en el parámetro RES devuelto. La firma se puede actualizar aquí para SPA.}); wx.fail (function (res) {}); </script> </asp: content> <asp: content id = "content2" contentlaceLoTerId = "cphtitle" runat = "servidor"> Obtener la ubicación </asp: content> <asp: content id = "content3" contentplaceLoTerId = "cphcontainer" runat = "servidor"> <br/> <br/> <syle style = "ubicación: block;"> <i> <iv> <iv> i> <iv> <iv> <iv> <iv> <iv> <iv> <iv> <iv> <iv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hiv> <hin getting <hiv> <hin getting <nintin Información ... </div> </center> <div style = "Display: None;"> <span> <img src = "/Templates/txwap/images/mask.gif"/> </span> </div> </asp: content>Efecto de la página:
Notas:
(1) Si la configuración del teléfono móvil no permite que WeChat obtenga información de ubicación, se solicitará la información anterior.
(2) Los parámetros en la figura anterior obtienen las coordenadas GPS. Si usa el mapa Baidu, debe hacer una determinada conversión y se reflejará en la ubicación1.aspx.
(3) Todas las páginas que requieren JS-SDK deben inyectarse primero con la información de configuración, de lo contrario, no se las llamarán.
Implementación de ubicación.px.cs correspondiente:
Usar pagos.wxwebhlper; usar pagos.wxwebhlper.actions; usar sistema; usar System.Globalization; Uso de wxjssdk; usando wxpayapi; namespace dtcms.web.wxcrm {ubicación de clase parcial pública: pagase {appid de cadena protegida {get; colocar; } String Timestamp de cadena protegida {get; colocar; } Cadena protegida sin cocos {get; colocar; } firma de cadena protegida {get; colocar; } cadena estática pública wxjsapiparam {get; colocar; } public wxjsdata resultJsData {get; colocar; } protegido void page_load (remitente de objeto, EventArgs e) {Judgecode (); var webAuthorize = new WebAuthorizeaction (); Code2TokenResult = webAuthorize.code2Token (request ["Code"]); if (code2TokenResult.hasError ()) {Response.Redirect (urls.pageoflocation); GotononePage ("No se pudo obtener credenciales de usuario, vuelva a realizar"); devolver; } GetUserInforSult = webAuthorize.getUserInfo (Code2TokenResult.Access_Token); if (getUserInforSult.hasErRor ()) {gotononePage ("No se pudo obtener información del usuario, vuelva a realizar"); } var userId = wxoperation.hasbind (getUserInforSult.openId); if (userId.equals (guía.empty)) {Response.Redirect (urls.oauth2url); GotononePage ("usuarios de weChat no vinculados"); } appid = wxpayconfig.appid; timestamp = wxpayapi.generateTimestamp (); Non -CESTR = WXPAYAPI.GENERATENCESTR (); // La siguiente implementación se reflejará en 3. La implementación del código central var jsapi = new JSAPI (esto); Resultadojsdata = jsapi.getJsData (); Wxjsapiparam = jsapi.getjsapiparameters (); // Obtener H5 para ajustar los parámetros de JS API}}}2. Convertir coordenadas GPS de WeChat en coordenadas de Baidu
Después de que WeChat obtiene coordenadas con éxito, la página saltará automáticamente a la ubicación1.aspx, y el flujo de procesamiento es el siguiente:
Coordenadas de WeChat -> Convertir a las coordenadas del mapa de Baidu -> Obtener información de ubicación de acuerdo con la API de mapas de Baidu -> COORDINAS DE MOSTRADA Según la API del mapa de Baidu
<%@ 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 = "inicial-escala = 1.0, user-scalable = no" /> <style type = "text /css"> #AllMap {width: 100%; Altura: 300px; } </style> <script type = "text/javascript" src = "http://api.map.baidu.com/api?v=2.0&ak=dhrlkmr9quo4whmnnsztarta"> </script> <script type = "text/javaScript"> // gps coordinate var yyy = < %= this.request [""]]]] // Longitud, número de punto flotante, el rango es 180 ~ -180. var xx = < %= this.request ["latitud"] %>; // Latitud, número de punto flotante, el rango es 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 posicionurl = "http://api.map.baidu.com/geoconv/v1/?"; función ChangePosition () {var str = "coords ="+yy+","+xx+"& from = 1 & to = 5"; var url = posicionUrl + str; $ ("#posicionurl"). html (url+"& ak = dhrlkmr9quo4whmnnsztartg"); var script = document.createElement ('script'); script.src = url + '& ak = dhrlkmr9quo4whmnnsztarta & callback = trutResult'; document.getElementsByTagName ("Head") [0] .AppendChild (script); } function trureResult (msg) {if (msg.status! = 0) {alert ("sin resultado de retorno correcto"); $ ("#máscara"). Hide (); devolver; } //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+"& from = 1 & to = 5 & ak = dhrlkmr9quo4whmnsztarta"; $ .AJAX ({url: url, éxito: function (data, status, xhr) {alert (status); alert (data.status);}, DataType: json}); } var advanced_post = ''; var advancedOptions = ''; dirección var; mapa var; función renderOption (respuesta) {var html = ''; if (respuesta.status) {$ ("#máscara"). Hide (); var text = "¡Sin resultado de retorno correcto!"; alerta (texto); devolver; } var resultado = respuesta.result; var ubicación = respuesta.result.location; var uri = 'http://api.map.baidu.com/marker?location='+ ubicación.lat+', '+ubicación.lng+' & title = '+respuesta.result.level+' & content = '+direcciones+' & salidas = html '; var staticImageUrl = "http://api.map.baidu.com/staticimage?center="+ubicación.lng+','+ubicación.lat+"& marcadores ="+ubicación.lng+','+ubicación.lat; html = '<p> coordenadas: latitud:' + ubicación.lat + "longitud:" + ubicación.lng + '<r />'; html+= 'precision:'+respuesta.result.precise+'<r />'; html += 'moneda:' +respuesta.result.confidence +'<r />'; html+= 'Tipo de dirección:'+respuesta.result.level+'</p>'; html + = '<p> <img src = "' + staticImageUrl + '" /> </p>'; html + = '<p> Comparte este punto: <a href = "' + uri + '" target = "_ en blanco">' + uri + '</a> </p>'; // Establecer este enlace en Clickable // Baidu MAP API Función MAP = new BMap.map ("Allmap"); Var Point = new BMap.Point (bxx, byy); var Marker = new BMap.Marker (punto); // crear anotación map.addoverlay (marcador); // Agregar anotación al mapa map.centerandzoom (punto, 100); Var opts = {ancho: 200, // Información de la ventana de la ventana Altura: 100, // Título de la altura de la ventana de información: "Mi posición", // Título de la ventana de información EnableMessage: true, // Establecer Permitir la ventana de información para enviar mensajes cortos Mensaje: resultado var infowindow = new BMap.infowindow (result.formatted_address, opts); // Crear la ventana de información Objeto Marker.AdDeventListener ("Click", function () {map.openinfowindow (infowindow, punto); // Abrir la ventana de información}); var myicon = new BMap.icon ("http://api.map.baidu.com/img/markers.png", new bmap.size (23, 25), {offset: new bmap.size (10, 25), // Especifique la posición de posición ImageFoffset: new BMap.size (0 - 10 * 25) ///t set Official}); var pois = resultado.pois; for (var i = 0; i <pois.length; i ++) {var marcador = new BMap.Marker (new BMap.Point (pois [i] .Point.x, pois [i] .point.y), {icon: myicon}); // Crear anotación var name = pois [i] .name; var addr = pois [i] .addr; map.addoverlay (marcador); // Agregar anotación al mapa addClickHandler (nombre, addr, marcador); } $ ("#máscara"). Hide (); $ ("#btnsign"). show (); devolver; } function addClickHandler (name, addr, marcador) {marcador.adDeventListener ("hacer clic", función (e) {openInfo (name, addr, e)}); } function openInfo (name, addr, e) {var p = e.target; Var Point = new BMap.Point (p.getPosition (). lng, p.getPosition (). Lat); Var opts = {ancho: 200, // Información de la ventana de la ventana Altura: 100, // Título de la altura de la ventana de información: Nombre, // Título de la ventana de información EnableMessage: True, // Establecer Permitir que la ventana de información envíe mensajes cortos Mensaje: ADDR} var infowindow = new bmap.infowindow (addr, opts); // Crear el objeto de la ventana de información map.openinfowindow (infowindow, punto); // Abra la ventana de información} función 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 () {$ ("#máscara"). show (); $ ("#btnsign"). hide (); ChangePosition ();}); </script> </asp: content> <asp: content id = "Content2" ContentPlaceLoTerId = "cphtitle" runat = "servidor"> check-in en línea </asp: content> <asp: content id = "Content3" Content PlaceLoTerId = "CphContainer" Runat = "Server"> <Form Id = "Frmlocation" Runat = "Servidor" <VIV> <DIV> <VIV> <VIV> <VIV> <VIV> Información </span> </iv> <div style = "Padding-left: 0"> <ul style = "Height: 300px;"> <div id = "Allmap"> </div> </ul> </div> <div style = "Leding-Left: 0"> <ul> <Div Id = "DivPo"> <//ul> </iv> </iv> </div> <DivId <DivItly: ALEDILLE; Margin-top: -50px; "> <inpun oye /> </div> <div style = "Display: None;"> <span> <img src = "/Templates/txwap/images/mask.gif"/> </span> </div> </form> </asp: content>Esta página involucra principalmente la plataforma abierta de mapas de Baidu, y debe solicitar el mapa de Baidu AG. De lo contrario, llamar a JS solicitará: la aplicación no existe, si hay algún error en AK, vuelva a verificar e intente nuevamente.
(1) Baidu Map Technology 1: Coordinar la API de conversión
Dirección oficial del sitio web: http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
Dirección de servicio API: http://api.map.baidu.com/geoconv/v1/?
El documento tiene descripciones detalladas, por lo que no las repetiré.
(2) Baidu Map Technology 2: Obtener ubicación basada en coordenadas
Sitio web oficial: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
La API de geocodificación incluye la resolución de direcciones y las funciones de resolución de dirección inversa:
Codificación geográfica: es decir, el análisis de direcciones, y la información de latitud y longitud de Baidu se obtiene de la dirección estructurada detallada de la calle. Por ejemplo, el resultado del análisis de la dirección de "No. 27, Zhongguancun South Street, Distrito de Haidian, Beijing" es "LNG: 116.31985, LAT: 39.959836". Al mismo tiempo, la geocodificación también apoya la resolución directa de lugares, sitios históricos y edificios históricos y regresa a la latitud y la longitud de Baidu. Por ejemplo, el resultado del análisis de la dirección del "edificio Baidu" es "LNG: 116.30815, LAT: 40.056885". Es un requisito de recuperación de POI común, y se recomienda utilizar la API de lugar.
Geocodificación inversa: es decir, el análisis de direcciones inversas y la información de dirección estructurada se obtiene de la información de latitud y longitud de Baidu. Por ejemplo, "Lat: 31.325152, LNG: 120.558957" El resultado del análisis de dirección inverso es "No. 318, Tayuan Road, distrito de Huqiu, ciudad de Suzhou, provincia de Jiangsu".
Dirección de servicio API: http://api.map.baidu.com/geocoder/v2/
Para parámetros específicos, verifique la documentación oficial.
Ejemplo: http://api.map.baidu.com/geocoder/v2/?ak=appliced para la tecla y ubicación de Baidu = 34.79563,114.23075222912 & llamado = showLocation & output = xml & pois = 1 1
Notas:
(1) Aplicación clave del desarrollador de Baidu
(2) El sistema de coordenadas de mapas de Baidu es diferente del sistema de coordenadas WeChat
(3) Dirección de llamada de API y descripción del parámetro
(4) El significado de la función de devolución de llamada API
(5) Comprender el significado de JSON y JSONP
3. Código central de WeChat JS-SDK
(1) JSAPI.CS genera parámetros de configuración JS-SDK relevantes
usando System; usando System.Globalization; usando System.Linq; usando System.Web.Security; Uso de System.Web.UI; Uso de wxpayapi; Namespace wxjssdk {public class jsapi {//// <summary> /// Guardar el objeto de página porque desea usar el objeto de solicitud de la página en el método de la clase /// </</sumario> Página privada {obtener {obtener; colocar; } public wxjsdata resultJsData {get; colocar; } /// <summary> /// // </summary> /// <param name = "página"> </param> public jsapi (página de página) {this.page = página; } public wxjsData getJSData () {var data = new wxjsData (); data.setValue ("Appid", wxpayconfig.appid); // data de identificación de cuenta pública.setValue ("Timestamp", wxpayapi.generateTimestamp ()); data.setValue ("Non -Cestr", wxpayapi.generatenoncestr ()); // cadena aleatoria var url = getUrl (); data.setValue ("url", url); var jstoken = getJsapiticket (); data.setValue ("jsapi_ticket", jstoken); var firature = makesignature (jstoken, data.getValue ("non -cocests"). toString (), data.getValue ("timestamp"). toString (), url); data.setValue ("firma", firma); Resultadojsdata = data; devolver datos; } private String Makeignature (String JSApITicket, String Non -Cestr, String TimeStamp, String Url) {String [] ArrayList = {"JSAPI_Ticket =" + JSAPITICKET, "timestamp =" + timestamp, "noncestr =" + noncestr, "url =" + url}; Array.sort (ArrayList); var firma = string.Join ("&", ArrayList); firma = formSauthentication.hashpasswordforStoringInconFigFile (firma, "Sha1"). TOLOWER (); firma de devolución; } cadena privada 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; devolver ""; } private String getUrl () {String host = page.request.url.host; string ruta = page.request.path; cadena QueryString = Page.Request.url.Query; // Este lugar debe tenerse en cuenta que la URL completa se remonta a los antecedentes de WeChat cuando la página web autoriza para obtener información de información del usuario url = "http: //" + host + ruta + QueryString; URL de retorno; } public String getJsapiparameters () {log.debug (this.gettype (). toString (), "jsapi :: getJsapiparam está procesando ..."); parámetros de cadena = resultJsData.ToJson (); Log.debug (this.gettype (). ToString (), "Get JSAPI:" + Parámetros); Parámetros de retorno; }}}(2) JSAuthorizeaction.CSWECHAT JS-SDK RELACIÓN Función de llamadas de API
usar pagos.wxwebhlper; usar pagos.wxwebhlper.results; usando el sistema; usando wxpayapi; espacio de nombres wxjssdk {public class jSauthorizeAction {private static tokenResult token = new tokenResult () {errcode = -1}; JSAPITICKETRESULTA PRIVADO JSAPITICKETT = 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> /// <surns> </devuelve> public tokenResult getokenResult () {var result = new tokenResult (); intente {var webUtils = new WebUtils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid= ]&secret= =1}", wxpayconfig.appid, wxpayconfig.appsecret); var strrtn = webutils.get (url); result = Tools.jSonstringToOBJ <TokenResult> (strrtn); } catch (excepción ex) {log.error (this.gettype (). toString (), ex.message); resultado = new TokenResult () {errcode = -1086}; } resultado de retorno; } //// <summary> /// // </summary> /// <param name = "token"> </param> /// <<surnesurs> </surnens> public jsapiticketResult getJsapiticket (string token) {log.error (this.gettype (). toString (), "getJsapiticket pasó token:" + token); " if (! jsapiticket.isValid ()) {jsapiticket = getJsapiticketResult (token); } return jsapiticket; } /// <summary> /// // </summary> /// <param name = "token"> </param> /// <surns> </return> public jsapiticketResult getJsapiticketResult (string token) {jsapiticketresult dulte; intente {var webUtils = new WebUtils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token= =0htype=jsapi", token); var strrtn = webutils.get (url); resultado = herramientas } catch (excepción ex) {log.error (this.gettype (). toString (), ex.message); resultado = new JSApiTicketResult () {errcode = -1086}; } resultado de retorno; }} clase pública jsapiticketResult: returnResult {/// <summary> /// constructor /// </summary> public jsapiticketResult () {creatate = dateTime.now; } /// <summary> /// // </summary> public String Ticket {get; colocar; } /// <summary> //// Access_token Tiempo de espera de credencial de llamada, unidad (segundos) /// </summary> public int expires_in {get; colocar; } /// <summary> //// Creation Time //// </summary> public dateTime Creatate {get; colocar; } /// <summary> /// Determine si es válido //// </sumario> /// <<churns> </return> public bool isValid () {if (this.errcode! = 0) return false; var nd = dateTime.now - creatateate; regresar nd.seconds <7200; }} public class tokenResult: returnResult {/// <summary> /// constructor /// </summary> public tokenResult () {creatate = dateTime.now; } /// <summary> /// La interfaz de autorización web llama a las credenciales, Nota: este access_token es diferente del access_token compatible con los conceptos básicos /// </summary> public string access_token {get; colocar; } /// <summary> //// El tiempo de tiempo de espera de credenciales de llamadas de interfaz access_token, unidad (segundos) /// </summary> public int expires_in {get; colocar; } /// <summary> /// Time de creación //// </summary> public dateTime Creatate {get; colocar; } /// <summary> /// Determine si es válido //// </sumario> /// <<churns> </return> public bool isValid () {if (this.errcode! = 0) return false; var nd = dateTime.now - creatateate; regresar nd.seconds <7200; }}}(3) WXJSDATA.CS WeChat JS-SDK Class de parámetros
usando litjson; usando System.Collections.Generic; usando System.Security.cryptography; usando System.Text; usando System.xml; Usando wxpayapi; espacio de nombres wxjssdk {public class wxjsdata {private sortedDictionary <string, object> m_values = new SortedDictionary <String, Object> (); / *** Establezca el valor de cierto campo* @param Nombre del campo de la tecla* @param Valor Valor de campo*/ public void setValue (clave de cadena, valor de objeto) {m_values [key] = valor; } / *** Obtenga el valor de un cierto campo basado en el nombre del campo* @param Nombre del campo de la tecla* @return Valor de campo correspondiente a la clave* / Public Object getValue (tecla de cadena) {objeto o = null; m_values.trygetValue (clave, out o); regreso o; } / *** Determine si se ha establecido un campo* @param Nombre del campo de la tecla* @return return si la tecla de campo se ha establecido, return true, de lo contrario falso* / public bool isset (tecla de cadena) {objeto o = null; m_values.trygetValue (clave, out o); if (null! = o) return verdadero; devolver falso; } /*** @Convert Dictionary a xml* @return la cadena XML convertida* @throws wxpayexception ** /public string toxml () {// no se puede convertir en formato xml if (0 == m_values.count) {log.error (this.getType (). tirar nueva wxpayexception ("¡Los datos de WXPayData están vacíos!"); } string xml = "<xml>"; foreach (keyValuePair <String, Object> Par en m_values) {// El valor de campo no puede ser nulo, lo que afectará el proceso posterior if (par.value == null) {log.error (this.gettype (). toString (), "wxpayData contiene campos con valor nulo!");; tirar nueva wxpayexception ("WxpayData contiene campos con valor nulo!"); } if (par.value.gettype () == typeof (int) || par.value.gettype () == tipof (decimal)) {xml + = "<" + par.key + ">" + par.value.ToString () + "</" + par.key + ">"; } else if (par.value.gettype () == typeof (string)) {xml + = "<" + par.key + ">" + "<! [cdata [" + par.value + "]]> </" + par.key + ">"; } más // Excepto los tipos de cadena e int, no puede contener otros tipos de datos {log.error (this.gettype (). toString (), "WXPAYDATA Tipo de datos de campo!"); tirar nueva wxpayexception ("¡Error de datos de datos de campo WXPAYDATA!"); }} xml += "</xml>"; return 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 (), "¡No es legal convertir una cadena XML vacía a wxpaydata!"); Tire nuevo wxpayexception ("¡No es legal convertir una cadena XML vacía a wxpaydata!"); } XmlDocument xmlDoc = new xmlDocument (); xmldoc.loadxml (xml); Xmlnode xmlnode = xmldoc.firstchild; // Obtener nodo raíz <xml> xmlnodelist nodos = xmlnode.childnodes; foreach (xmlnode xn en nodos) {xmlelement xe = (xmlelement) xn; m_values [xe.name] = xe.inntext; // Obtenga el par de valores clave de XML en los datos dentro de wxpaydata} try {// 2015-06-29 El error es que no hay firma si (m_values ["return_code"]! = "éxito") {return m_Values; } CheckSign (); // Verifique la firma, si no pasa, lanzará una excepción} Catch (wxpayException ex) {tire nueva wxpayexception (ex.message); } return m_Values; } / *** @Dictionary Format convertido en formato de parámetro URL* @ cadena de formato de url return, esta cadena no contiene el valor de campo de signo* / public string tourl () {string buff = ""; foreach (keyValuePair <string, objeto> par en m_values) {if (par.value == null) {log.error (this.gettype (). toString (), "wxpaydata contiene un campo con un valor de nulo!"); Lanzar nueva wxPayException ("WxpayData contiene un campo con un valor de nulo!"); } if (par.key! = "firmar" && par.value.ToString ()! = "") {buff + = par.key + "=" + par.value + "&"; }} buff = buff.trim ('&'); Buff de retorno; } / *** @Dictionary formateado a json* @return json data de cadena* / public string tOjson () {string jSonstr = jsonmapper.tojson (m_values); regresar jsonstr; } / ** * @Values formateado al resultado que se puede mostrar en la página web (porque la página web no puede emitir directamente las cadenas en formato XML) * / public String toprintStstr () {String str = ""; foreach (keyValuePair <string, objeto> par en m_values) {if (par.value == null) {log.error (this.gettype (). toString (), "wxpaydata contiene campos con valor nulo!"); tirar nueva wxpayexception ("WxpayData contiene campos con valor nulo!"); } str += string.format ("{0} = {1} <br>", par.key, par.value.toString ()); } Log.debug (this.gettype (). ToString (), "Imprimir en la página web:" + str); regresar str; } /*** @Generate Signature, consulte el algoritmo de generación de firmas para obtener detalles* @return firma, el campo de signo no participa en la firma* /cadena public shiceign () {// Convertir URL Format String Str = Tourl (); // Agregar API después de la tecla de cadena str + = "& key =" + wxpayconfig.key; // cifrado MD5 var md5 = md5.create (); var bs = md5.computehash (coding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (byte b en bs) {sb.append (B.ToString ("x2")); } // Todos los caracteres se convierten en string upcase resultado = sb.ToString (). ToUpper (); resultado de retorno; } public String MakeAppSign () {// Convertir URL Format String Str = Tourl (); // Agregar API después de la tecla de cadena str + = "& key =" + wxpayconfig.keyofapp; // cifrado MD5 var md5 = md5.create (); var bs = md5.computehash (coding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (byte b en bs) {sb.append (B.ToString ("x2")); } // Todos los caracteres se convierten en string upcase resultado = sb.ToString (). ToUpper (); resultado de retorno; } /**** Compruebe si la firma es correcta* returación verdadera correctamente, y una excepción de lanzamiento de error* /public bool checkSign () {// Si no se establece la firma, omita la detección if (! ISSET ("Sign")) {log.error (this.gettype (). ToString (), "WXPayData Firmature pero no es legal"); ");"); ");"); ");"); ");"); ");"); ");"); ");"); ");"); ");"); ");"); "); Lanza la nueva WXPayException ("¡Existe la firma WXPayData pero no es legal!"); } // Si la firma está configurada pero la firma está vacía, se lanza una excepción si (getValue ("signo") == null || getValue ("firmar"). ToString () == "") {log.error (this.gettype (). ToString (), "La firma wxpaydata! Lanza la nueva WXPayException ("¡Existe la firma WXPayData pero no es legal!"); } // Obtenga la cadena de firma recibida return_sign = getValue ("signo"). ToString (); // Calcule la nueva firma localmente Cadena cal_sign = asquero (); if (cal_sign == return_sign) {return true; } Log.error (this.gettype (). ToString (), "WXPAYDATA ERROR DE VERIFICACIÓN DE FIRMA!"); tirar nueva wxpayexception ("WXPAYDATA ERROR DE VERIFICACIÓN DE FIRMA!"); } / ** * @getDictionary * / public SortedDictionary <String, Object> getValues () {return m_values; }}}Información rápida: Para ideas de análisis relevantes, consulte el SDK de pago oficial de la cuenta oficial de WeChat, descargue la dirección: https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1.
Este artículo se ha compilado en "Resumen de las habilidades de desarrollo de JavaScript WeChat", y todos son bienvenidos a aprender y leer.
Recomiendo un tutorial sobre los applets de WeChat que están muy preocupados ahora: el editor de "WeChat Mini Program Development Tutorial" lo ha compilado cuidadosamente para todos, espero que les guste.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.