Durante o desenvolvimento do WeChat JS-SDK, o GetLocation é usado para obter posições de coordenadas. Como aplicar diretamente as coordenadas obtidas pelo WeChat ao mapa do Baidu, exibindo os seguintes efeitos:
Nota: O ícone vermelho é a posição convertida do WeChat, e o ícone azul é a posição ao seu redor. Primeiro, vamos explicar do processo de desenvolvimento do WeChat.
1. Documento de desenvolvimento WeChat JS-SDK
Primeiro, digite o documento de ajuda no site oficial: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_cn
Você pode estudar o documento em detalhes. Para obter informações de localização, as etapas a seguir são divididas nas etapas a seguir:
Etapa 1: vincule o nome de domínio
Digite a conta oficial do WeChat, encontre o menu "Configurações da conta oficial" e digite o painel "Configurações da função".
Clique em "Configurações" para definir o nome de domínio relevante que faz referência a JS:
Etapa 2: citando a biblioteca oficial da classe JS
Apresente o seguinte arquivo JS na página que precisa chamar a interface JS (suporte https): http://res.wx.qq.com/open/js/jweixin-1.0.0.js.
A página referenciada é location.aspx, como segue:
< %@ Página title = "get location" idioma = "c#" autoeventwireup = "true" masterpagefile = "~/wxcrm/site.master" codefile = "location.aspx.cs" herits = "dtcms.web.wxcrm.location" %> <a asp: iD = " src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> </script> <script type = "text/javascript"> $ ("#Mask"). show (); wx.config ({Debug: false, // Abra o modo de depuração, se verdadeiro, cada chamada da função JS aparecerá appid: '< %= resultjsdata.getValue ("Appid") %>', // requer, o identificador exclusivo do timestamp oficial da conta: < %= resultadojsdata.getvalue ("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', 'ShowallnonBaseNeNeNuitems,' Sofrecrecr, 'TranslateVoice', 'ShowallnonBaseNuitems' ',' TranslateVoice ' 'onRecordEnd', 'playVoice', 'pauseVoice', 'stopVoice', 'uploadVoice', 'downloadVoice', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'getNetworkType', 'openLocation', 'getLocation', 'hideOptionMenu', 'showOptionMenu', 'closeWindow', 'scanqrcode', 'escolhawxpay', 'OpenProductSpecificView', 'addcard', 'Choosecard', 'OpenCard']}); wx.ready (function () {wx.checkjsapi ({jsapilist: ['getNetworkType', 'visualizeImage', 'getLocation'], sucesso: function (res) {}}}); wx.getLocation ({type: 'wgs84', // o default é Diretamente para o OpenLocation, você pode passar por 'GCJ02' Sucesso: Function (res) {Try {var Latitude = Res.latitude; // precisão de posição // aalert (jsonuti.convertostring (res)); 'Clique para visualizar', // Detalhes do endereço // Escala: 28, // O nível de zoom do mapa, o valor da modelagem, varia de 1 a 28. O padrão é o máximo // infourl: "location1.aspx? M = home & c = Índice & a = GetLocation & Latitude ="+Latitude+"e Longitude"+Longitude // O hiperLink Displayd ATHOTHERO OM // alerta (latitude + "-" longitude); Cancelar: function (res) {window.location.href = "None.aspx? msg = rejeitar para obter a localização geográfica & r =" + math.random (); // rejeitar}, falha: function () {alert ("Falha ao obter a localização geográfica! Primeiro, verifique se o telefone está habilitado para o wechat.); wx.error (function (res) {// A falha de verificação de informações de configuração executará uma função de erro. Se a assinatura expirar, a verificação falhará. Para mensagens de erro específicas, você poderá abrir o modo de depuração de configuração ou visualizá -lo no parâmetro de referência. A assinatura pode ser atualizada aqui para spa.}); wx.fail (function (res) {}); </script> </asp: content> <asp: content id = "content2" contentplaceholderid = "cphtitle" runat = "server"> obtenha o local </asp: content> <asp: content id = "content3" contentplaceholderId = "cphContainer" runat = "servidor"> <br/> <r> <r/> <blousholderId = "cphcontainer" runat = "servidor"> <br/> <br/> <brace) Informação ... </div> </fenter> <div style = "Display: Nenhum;"> <pan> <img src = "/modaplates/txwap/imagaEfeito da página:
Notas:
(1) Se as configurações do telefone celular não permitirem que o WeChat obtenha informações de localização, as informações acima serão solicitadas.
(2) Os parâmetros na figura acima obtêm as coordenadas do GPS. Se você usar o mapa do Baidu, precisará fazer uma determinada conversão e será refletida no local1.aspx.
(3) Todas as páginas que exigem JS-SDK devem ser injetadas com informações de configuração primeiro, caso contrário, elas não serão chamadas.
Localização correspondente.aspx.cs Implementação:
usando o pagamento.wxwebhlper; usando o pagamento.wxwebhlper.actions; usando o sistema; usando o sistema.globalização; usando wxjssdk; usando wxpayapi; namespace dtcms.web.wxcrm {public parcial Location: PageBase {protegida stringpid {get; get; definir; } string protegida Timestamp {get; definir; } string protegida não -cest {get; definir; } assinatura da string protegida {get; definir; } public static string wxjsapiparam {get; definir; } public wxjsdata resultadojsdata {get; definir; } void protegido Page_load (remetente do objeto, EventArgs e) {JudgeCode (); var webAuthorize = new webAuthorizeation (); Code2TokenResult = webauthorize.code2Token (request ["code"]); if (code2TokenResult.haserror ()) {Response.redirect (urls.pageOflocation); GoTonOnePage ("Falha ao obter credenciais do usuário, por favor re-obtenha"); retornar; } GetUserInforesult = webauthorize.getUserinfo (code2TokenResult.access_token); if (getUserinforesult.haserror ()) {gotononePage ("Falha ao obter informações do usuário, por favor, re-obtenha"); } var userID = wxoperation.hasbind (getUserinforesult.openid); if (userID.equals (guid.empty)) {Response.redirect (urls.oauth2url); GoTonOnePage ("Usuário WeChat não vinculado"); } appid = wxpayconfig.appid; Timestamp = wxpayapi.generatetimestamp (); noncestr = wxpayapi.generateNoCest (); // A implementação a seguir será refletida em 3. A implementação do código principal var jsapi = new jsapi (this); Resultadojsdata = jsapi.getjsdata (); Wxjsapiparam = jsapi.getjsapiparameters (); // Obtenha o H5 para ajustar os parâmetros da API JS}}}2. Converta as coordenadas do WeChat GPS em coordenadas do Baidu
Depois que o WeChat obtém com sucesso as coordenadas, a página pulará automaticamente para o local1.aspx, e o fluxo de processamento é o seguinte:
Coordenadas do WeChat -> Converter para coordenadas do mapa do Baidu -> Obtenha informações de localização de acordo com a API do mapa do Baidu -> Exibir coordenadas de acordo com o Baidu Map API
< %@ Página title = "online check-in" idioma = "c#" masterpagefile = "~//wxcrm/site.master" autoeventwireup = "true" codefile = "location1.aspx.cs" Inhherits = "dtcms.web.wxcrm.location1" " %> <sphEnts" " name = "viewPort" content = "Scala inicial = 1,0, 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 type = "text/javascript">/y)/y) ["script =" text/javascript ">/y) [" script = "text/javascript">/y)/y) ["script =" text/javascript ">/y) [" script = "text/javascript">/y)/y) ["script =" text/javascript ">/y) [" script = "text/javascript">/y) ["script =" text/javascript ">/y) [" script) %>; // longitude, número de ponto flutuante, o intervalo é de 180 ~ -180. var xx = < %= this.request ["latitude"] %>; // Latitude, número do ponto flutuante, o intervalo é 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/?"; função alteração de alteração () {var str = "coords ="+yy+","+xx+"& de = 1 & a = 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); } função reatResult (msg) {if (msg.status! = 0) {alert ("sem resultado de retorno correto."); $ ("#máscara"). hide (); retornar; } //Jsonuti.convertstring(msg); bxx = msg.result [0] .x; byy = msg.result [0] .y; dooptions (); } função getBaidUposition () {var url = "http://api.map.baidu.com/geoconv/v1/?coords="+yy+","+xx+"& de = 1 & para = 5 & ak = dhrlkmr9quo4whmnnsztarta"; $ .ajax ({url: url, sucesso: function (dados, status, xhr) {alert (status); alert (data.status);}, datatype: json}); } var Advanced_Post = ''; var AdvancedOptions = ''; endereço var; var mapa; Função renderOption (resposta) {var html = ''; if (Response.status) {$ ("#Mask"). hide (); var text = "Nenhum resultado de retorno correto!"; alerta (texto); retornar; } var resultado = 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 = '+Endereço+' e saída = html '; var staticImageurl = "http://api.map.baidu.com/staticimage?center="+location.lng+','+location.lat+"& markers ="+location.lng+','+location.lat; html = '<p> coordenadas: latitude:' + location.lat + "longitude:" + location.lng + '<r />'; html+= 'Precision:'+Response.result.precise+'<r />'; html += 'moeda:' +resposta.result.confidence +'<r />'; html+= 'Tipo de endereço:'+resposta.result.level+'</p>'; html + = '<p> <img src = "' + staticImageurl + '" /> </p>'; html + = '<p> Compartilhe este ponto: <a href = "' ' + uri +'" alvo = "_ blank"> ' + uri +' </a> </p> '; // Defina este link para cliques // mapa de função mapa Baidu = novo bmap.map ("allmap"); var point = new bmap.point (bxx, byy); var marker = new bmap.marker (ponto); // Crie mapa de anotação.addoverlay (marcador); // Adicione anotação ao mapa mapa.cerendZoom (Point, 100); var opts = {largura: 200, // Altura da largura da janela de informações: 100, // Janela de informação Título da altura: "Minha posição", // Título da janela Informações EnableMessage: true, // Definir a janela de informações para enviar mensagens curtas Mensagem: Result.Formatted_address} $ ("#divpo"). var infowindow = new bmap.infowindow (resultado.formatted_address, opts); // Crie a janela de informações Marker.adDeventListener ("Click", function () {map.openinfowindow (infowindow, ponto); // Abra a janela de informações}); var myicon = new bmap.icon ("http://api.map.baidu.com/img/markers.png", new bmap.size (23, 25), {Offset: new Bmap.size (10, 25), // especificando a posição de posicionamento. var pois = resultado.pois; for (var i = 0; i <pois.length; i ++) {var marker = new Bmap.marker (new Bmap.Point (Pois [i] .point.x, Pois [i] .point.y), {icon: myicon}); // Crie anotação var nome = Pois [i] .Name; var addr = Pois [i] .addr; map.addoverlay (marcador); // Adicionar anotação ao mapa AddClickHandler (nome, addr, marcador); } $ ("#máscara"). hide (); $ ("#BTNSign"). Show (); retornar; } função addClickHandler (nome, addr, marcador) {marker.addeventListener ("clique", function (e) {openInfo (nome, addr, e)}); } função openInfo (nome, addr, e) {var p = e.target; var point = new bmap.point (P.GetPosition (). LNG, P.GetPosition (). Lat); var opts = {largura: 200, // Altura da largura da janela de informação: 100, // Janela de informação Título da altura: Nome, // Título da janela Informações EnableMessage: true, // Definir Permita que a janela de informações envie mensagens curtas Mensagem: addr} var infowindow = new Bmap.infowIndow (addr, opts); // Crie o mapa do objeto da janela de informações.openinfowindow (infowindow, ponto); // Abra a janela de informações} função DoOptions () {var script = document.createElement ('script'); script.type = 'text/javascript'; Advanced_Post = "http://api.map.baidu.com/geocoder/v2/?ak=dhrlkmr9quo4whmnnsztartg&callback=reNeRoPtion&location=" + byy + "," + bxx + "e saída = json & pois = 2"; script.src = Advanced_Post; document.body.appendChild (script); }; $ (function () {$ ("#Mask"). show (); $ ("#btnsign"). hide (); changeposition ();}); </script> </asp: content> <asp: content id = "content2" contentplaceholderid = "cphtitle" runat = "server"> check-in online </asp: content> <asp: content id = "content3" contentplaceholdderid = "cphContainer" runat = "servidor" <form> <form3 "frmllocll =" run "runat =" servider "> <form3" frmllocll = "run" runat = "server"> <form3 "frmllocling =" run "> Information </span> </div> <div style = "preenchimento-left: 0"> <ul style = "altura: 300px;"> <div id = "allmap"> </div> </ul> </div> <Div Style = "Padding-LEFT: 0"> <ul> <div Id = "DivPo"> </</lul> </lumft: margin-top: -50px; /> </div> <div style = "Display: None;"> <pan> <img src = "/modsates/txwap/imagens/mask.gif"/> </span> </div> </form> </asp: content>Esta página envolve principalmente a plataforma aberta do mapa do Baidu e você precisa se inscrever para o Baidu Map AG. Caso contrário, chamando o JS solicitará: o aplicativo não existe, se houver algum erro no AK, por favor, verifique novamente e tente novamente.
(1) Tecnologia do mapa Baidu 1: API de conversão de coordenadas
Endereço oficial do site: http://lbsyun.baidu.com/index.php?title=webapi/guide/changePosition
Endereço de serviço da API: http://api.map.baidu.com/geoconv/v1/?
O documento tem descrições detalhadas, então não as repetirei.
(2) Tecnologia do mapa Baidu 2: Obtenha localização com base em coordenadas
Site oficial: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservie-geocoding
A API de geocodificação inclui resolução de endereços e funções de resolução de endereço inverso:
A codificação geográfica: isto é, análise de endereços e informações de latitude e longitude Baidu são obtidas no endereço estruturado detalhado da rua. Por exemplo, o resultado da análise de endereço "No. 27, ZhongGugancun South Street, Distrito Haidiano, Pequim" é "LNG: 116.31985, Lat: 39.959836". Ao mesmo tempo, o geocodificação também suporta resolução direta de lugares, locais históricos e edifícios marcantes e retornam à latitude e longitude do Baidu. Por exemplo, o resultado da análise de endereço do "Baidu Building" é "LNG: 116.30815, Lat: 40.056885". É um requisito comum de recuperação de POI e é recomendável usar a API de local.
Geocodificação inversa: isto é, a análise de endereço inverso e as informações de endereço estruturado são obtidas a partir de informações de latitude e longitude do Baidu. Por exemplo, "Lat: 31.325152, GNL: 120.558957" O resultado da análise de endereço inverso é "nº 318, Tayuan Road, distrito de Huqiu, cidade de Suzhou, província de Jiangsu".
Endereço de serviço da API: http://api.map.baidu.com/geocoder/v2/
Para parâmetros específicos, verifique a documentação oficial.
Exemplo: http://api.map.baidu.com/geocoder/v2/?ak=Applicado para o Baidu Key & Location = 34.79563,114.23075222912 & callback = ShowLocation & Output = XML & Pois = 1
Notas:
(1) Aplicação -chave do desenvolvedor do Baidu
(2) O sistema de coordenadas do mapa do Baidu é diferente do sistema de coordenadas do WeChat
(3) Endereço de chamada da API e descrição do parâmetro
(4) O significado da função de retorno de chamada da API
(5) Entenda o significado de JSON e JSONP
3. Código central WeChat JS-SDK
(1) JSAPI.CS gera parâmetros de configuração JS-SDK relevantes
Usando o sistema; usando o System.Globalization; usando o System.Linq; usando o System.Web.Security; Usando o System.Web.ui; Usando wxpayapi; namespace wxjssdk {public class JSAPI {/// <Summary> /// Salvar o objeto Página porque deseja usar o objeto de Page {/////siction wxjssdk {public class JSAPI {/// <Summary> /// Salvar o objeto Página porque você deseja usar o objeto de Page {/////tely> /// salvar o objeto de Page/////////////tugas> // // // // // // // // // // // // // // // // ////ugras definir; } public wxjsdata resultadojsdata {get; definir; } /// <summary> /// // </summary> /// <param name = "Page"> </param> public jsapi (página página) {this.page = Page; } public wxjsdata getjsdata () {var data = new wxjsdata (); data.setValue ("Appid", wxpayconfig.appid); // ID da conta pública data.setValue ("Timestamp", wxpayapi.generateTimestamp ()); data.setValue ("Non -Cest", wxpayapi.generateNoCest ()); // String aleatória var url = geturl (); data.setValue ("URL", URL); var jstoken = getjsapiticket (); data.setValue ("jsapi_ticket", jstoken); var assinatura = MakeSignature (Jstoken, data.getValue ("não -cest"). ToString (), data.getValue ("Timestamp"). ToString (), URL); data.setValue ("assinatura", assinatura); Resultadojsdata = dados; retornar dados; } String privada MakeAngature (String jsapiticket, string não -cest, string timestamp, string url) {string [] ArrayList = {"jsapi_ticket =" + jsapiticket, "timestamp =" + timestamp, "noncestro =" + não -cestro, "url =" + url}; Array.sort (ArrayList); var assinatura = string.join ("&", ArrayList); assinatura = formSauthentication.hashpasswordforstoringinconfigfile (assinatura, "sha1"). tolower (); assinatura de retorno; } private string getjsapiticket () {var jsauth = novo 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 ()) retorna jsauth.getjsapiticket (token.access_token) .Ticket; retornar ""; } private string geturl () {string host = Page.request.url.host; String Path = Page.Request.Path; String querystring = page.request.url.query; // Este local deve ser observado que o URL completo passou de volta para o plano de fundo do WeChat quando a página da web autorizar para obter informações do usuário String url = "http: //" + host + caminho + consulsão; Retornar URL; } public string getjsapiparameters () {log.debug (this.gettype (). tostring (), "jsapi :: getjsapiparam está processando ..."); parâmetros de string = resultadojsdata.tojson (); Log.debug (this.getType (). ToString (), "Get JSAPI:" + Parâmetros); retornar parâmetros; }}}(2) JSAuthorizeation.Cswechat JS-SDK Função de chamada da API relacionada
usando o pagamento.wxwebhlper; usando o pagamento.wxwebhlper.results; usando o sistema; usando wxpayapi; namespace wxjssdk {public class Jsauthorizeation {private static tokenResult token = new tokenResult () {errcode = -1}; private estático jsapiticketResult jsapiticket = novo jsapiticketResult () {errcode = -1}; TokenResult público GetToken () {Log.error (this.getType (). ToString (), "GetToken"); if (! token.isvalid ()) {token = getokenResult (); Log.error (this.getType (). ToString (), token.toString ()); } retornar token; } /// <summary> /// // // </summary> /// <lorpns> </returns> public tokenResult getokenResult () {var resultado = new TokenResult (); tente {var webutils = new webutils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0a }&secret={1}", wxpayconfig.appid, wxpayconfig.secrecret); var strrtn = webutils.get (url); resultado = ferramentas.jSonstringToOBJ <TokenResult> (strrtn); } catch (Exceção ex) {log.error (this.gettype (). tostring (), ex.message); resultado = novo tokenResult () {errcode = -1086}; } resultado de retorno; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <lorpTs> </returns> public jsapiticketResult getjsapiticket (string token) {log.error (this.gettypete (). if (! } retornar jsapiticket; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <lorpTs> </returns> public jsapiticketResult getjsapiticketResult (string token) {jsapiticketResult resultado; tente {var webutils = new webutils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0a }&type=jsapi", token); var strrtn = webutils.get (url); resultado = ferramentas.jSonstringToOBJ <JSAPITICKETRESULT> (STRRTN); } catch (Exceção ex) {log.error (this.gettype (). tostring (), ex.message); resultado = novo jsapiticketResult () {errcode = -1086}; } resultado de retorno; }} classe pública jsapiticketResult: returnResult {/// <summary> /// construtor /// </summary> public jsapiticketResult () {CreateDate = dateTime.now; } /// <summary> /// // // </summary> ticket string public {get; definir; } /// <summary> //// Access_Token Interface Chamada de tempo limite de credencial, unidade (segundos) /// </summary> public int expires_in {get; definir; } /// <summary> //// Time de criação //// </summary> public DateTime CreatedEtE {get; definir; } /// <summary> /// Determine se é válido //// </summary> /// <returns> </returns> public bool isValid () {if (this.errcode! = 0) return false; var nd = DateTime.now - CreatedEtE; Retornar Nd.Segunds <7200; }} classe pública tokenResult: returnResult {/// <summary> /// construtor /// </summary> public tokenResult () {CreateDate = dateTime.now; } /// <summary> /// A interface de autorização da Web chama as credenciais, note: este access_token é diferente do access_token suportado pelo básico /// </summary> public string access_token {get; definir; } /// <summary> //// ACENTO ACCEST_TOKEN CREASE CREDENCIALS Tempo de tempo limite, unidade (segundos) /// </summary> public int expires_in {get; definir; } /// <summary> /// Time de criação //// </summary> public DateTime CreatedEtE {get; definir; } /// <summary> /// Determine se é válido //// </summary> /// <returns> </returns> public bool isValid () {if (this.errcode! = 0) return false; var nd = DateTime.now - CreatedEtE; Retornar Nd.Segunds <7200; }}}(3) WXJSDATA.CS WECHAT JS-SDK Classe
usando Litjson; usando system.collections.generic; usando o System.Security.Criptografia; usando System.Text; usando System.xml; usando wxpayapi; namespace wxjssdk {public class wxjsdata {private classedDictionary <string, object> m_values = new stordDictionary <string, object> (); / *** Defina o valor de um determinado campo* Nome do campo da chave @param* @param Valor Valor do campo*/ public void SetValue (tecla String, valor do objeto) {m_values [key] = value; } / *** Obtenha o valor de um determinado campo com base no nome do campo* Nome do campo da chave @param* @return Campo Valor correspondente à chave* / public Object getValue (tecla String) {objeto o = null; m_values.TryGetValue (chave, out O); retornar o; } / *** Determine se um campo foi definido* @Param Key Nome do campo* @return retornar Se a chave do campo foi definida, retorne true, caso contrário, false* / public bool isset (chave de string) {objeto o = null; m_values.TryGetValue (chave, out O); if (null! = O) retornar TRUE; retornar falso; } /*** @Convert Dictionary para xml* @return O XML String convertido* @Throws wxPayException ** /public String toxml () {// não pode ser convertido em formato xml se (0 == m_values.count) {Log.error (this.gettype (). lançar novos wxpayException ("os dados wxpaydata estão vazios!"); } string xml = "<xml>"; foreach (keyvaluepair <string, objeto> par em m_values) {// O valor do campo não pode ser nulo, o que afetará o processo subsequente se (par.value == null) {log.error (this.getType (). tostring (), "wxpaydata contém campos com valor com null!"); lançar a nova wxpayException ("wxpaydata contém campos com valor nulo!"); } if (par.value.getType () == typeof (int) || par.value.getType () == typeof (decimal)) {xml + = "<" + par.key + ">" + par.value.tostring () + "</" + par.key + ">"; } else if (par.value.getType () == typeof (string)) {xml + = "<" + par.key + ">" + "<! [cdata [" + par.value + "]> </" + par.key + ">"; } else // Exceto para tipos de string e int, você não pode conter outros tipos de dados {log.error (this.gettype (). tostring (), "wxpaydata data de dados de campo erro!"); lançar a nova wxpayException ("WXPAYDATA CAMPO DATA TIPO ERRO!"); }} xml += "</xml>"; retornar xml; } / *** @Converver XML para o objeto WXPAYDATA e retorne dados dentro do objeto* @param string xml a ser convertido* @return dicionário obtido por conversão* @throws wxpayexception* / public classledtiony <String, object> fromxml (string xml) {se (string.isnullorMent Log.error (this.getType (). ToString (), "não é legal converter uma string XML vazia em wxpaydata!"); lançar uma nova WXPayException ("Não é legal converter uma string XML vazia em wxpaydata!"); } Xmldocument xmldoc = new xmldocument (); xmldoc.loadxml (xml); XmlNode xmlNode = xmldoc.firstChild; // Obter nó raiz <xml> xmlnodelist nós = xmlnode.childnodes; foreach (xmlnode xn em nós) {xmlelement xe = (xmlelement) xn; m_values [xe.name] = xe.innerText; // Obtenha o par de xml do valor da chave nos dados dentro do wxpaydata} tente {// 2015-06-29 O erro é que não há assinatura se (m_values ["return_code"]! } CheckSign (); // Verifique a assinatura, se não passar, ele lançará uma exceção} Catch (wxPayException ex) {lança nova wxpayException (ex.Message); } retornar m_values; } / *** Formato @Dictionary convertido em formato de parâmetro de URL* @ Return URL Format String, essa sequência não contém o valor do campo de sinal* / public String Tourl () {String buff = ""; foreach (keyvaluepair <string, objeto> par em m_values) {if (par.value == null) {log.error (this.gettype (). tostring (), "wxpaydata contém um campo com um valor de null!"); lançar uma nova wxpayException ("wxpaydata contém um campo com um valor de nulo!"); } if (par.Key! }} buff = buff.trim ('&'); retornar o buff; } / *** @dictionary formatado para json* @return json string data* / public string tojson () {string jSonstr = jsonmapper.tojson (m_values); retornar JSonstr; } / ** * @Values formatados para o resultado que pode ser exibido na página da web (porque a página da web não pode emitir strings diretamente em formato XML) * / public String toprintstr () {String str = ""; foreach (keyvaluepair <string, objeto> par em m_values) {if (par.value == null) {log.error (this.gettype (). tostring (), "wxpaydata contém campos com valor nulo!"); lançar a nova wxpayException ("wxpaydata contém campos com valor nulo!"); } str += string.format ("{0} = {1} <br>", par.key, par.value.toString ()); } Log.debug (this.getType (). Tostring (), "IMPRIMENTO NA PÁGINA da web:" + str); retornar str; } /*** @Gearate Signature, consulte o algoritmo de geração de assinatura para obter detalhes* @return Signature, o campo de sinal não participa da assinatura* /public string makeign () {// Converter URL formato string str = tourl (); // Adicione API após a chave da string str + = "& key =" + wxpayconfig.key; // criptografia md5 var md5 = md5.create (); var bs = md5.computehash (coding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (byte b em bs) {sb.append (b.toString ("x2")); } // Todos os caracteres são convertidos para o resultado da string superior = sb.toString (). Toupper (); resultado de retorno; } public string makeAppSign () {// Converta o formato de url string str = tourl (); // Adicione a API após a chave da string str + = "& key =" + wxpayconfig.keyofapp; // criptografia md5 var md5 = md5.create (); var bs = md5.computehash (coding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (byte b em bs) {sb.append (b.toString ("x2")); } // Todos os caracteres são convertidos para o resultado da string superior = sb.toString (). Toupper (); resultado de retorno; } /**** Verifique se a assinatura está correta* retorna verdadeira corretamente, e uma exceção de arremesso de erro* /public bool checkSign () {// Se nenhuma assinatura estiver definida, ignore a detecção se (! ISSET ("Sign")) {Log.error (this.gettype () tostring (), "wxpayData; lançar uma nova wxpayexception ("A assinatura do WXPAYDATA existe, mas não é legal!"); } // Se a assinatura estiver definida, mas a assinatura está vazia, uma exceção é lançada se (getValue ("signo") == null || getValue ("sinal"). Tostring () == "") {log.error (thisgettype (). lançar uma nova wxpayexception ("A assinatura do WXPAYDATA existe, mas não é legal!"); } // Obtenha a string de assinatura recebida return_sign = getValue ("sinal"). ToString (); // Calcule a nova assinatura localmente string cal_sign = makeign (); if (cal_sign == return_sign) {return true; } Log.error (this.getType (). ToString (), "Erro de verificação de assinatura wxpaydata!"); lançar nova WXPayException ("Erro de verificação de assinatura WXPAYDATA!"); } / ** * @getDictionary * / public classDDictionary <string, object> getValues () {return m_values; }}}Informações imediatas: Para obter idéias de análise relevante, consulte o pagamento oficial da conta oficial do WeChat SDK, Endereço de download: https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1.
Este artigo foi compilado em "Resumo das Habilidades de Desenvolvimento do Javascript WeChat", e todos são bem -vindos para aprender e ler.
Eu recomendo um tutorial sobre os applets WeChat que estão altamente preocupados agora: o editor do "WeChat Mini Program Development Tutorial" o compilou cuidadosamente para todos, espero que gostem.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.