Во время разработки WeChat JS-SDK GetLocation используется для получения координат. Как напрямую применять координаты, полученные WeChat для карты Baidu, отображая следующие эффекты:
Примечание. Красный значок - это положение, преобразованное из WeChat, а синий значок - это положение вокруг него. Во -первых, давайте объясним это из процесса разработки WeChat.
1. Документ разработки WeChat JS-SDK
Во -первых, введите документ справки на официальном веб -сайте: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_cn
Вы можете подробно изучить документ. Чтобы получить информацию о местоположении, следующие шаги разделены на следующие шаги:
Шаг 1: Свяжите доменное имя
Введите официальную учетную запись WeChat, найдите меню «Официальные настройки учетной записи» и введите панель «Настройки функции».
Нажмите «Настройки», чтобы установить соответствующее доменное имя, которое ссылается на JS:
Шаг 2: Цитирование официальной библиотеки классов JS
Представьте следующий файл JS на странице, который должен вызвать интерфейс JS (поддержка https): http://res.wx.qq.com/open/js/jweixin-1.0.0.js.
Страница ссылки на местоположение.
< %@ Page title = "get location" language = "c#" autoeventwireup = "true" masterpagefile = "~/wxcrm/site.master" codefile = "location.aspx.cs" enherits = "dtcms.web.wxcrm.location" %> <SP: content ID "content1" Content1 ". src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> </script> <script type = "text/javascript"> $ ("#mask"). Show (); wx.config ({debug: false, // Открыть режим отладки, если истина, каждый вызов функции JS будет всплыть в Appid: '< %= resultJsdata.getValue ("Appid") %>', // требуется, уникальный идентификатор официального временного лампа: < %= resust '< %= ResultJsData.getValue ("noncestr") %>', // требуется, генерируйте подпись случайной строки: '< %= resultJsdata.getValue ("Signature") %>', // требуется, Signature Jsapilist: [Checkjsapi ',' onmenusharetimeline ',' onmenusharepypepeage ',', 'onmenusharepypeage', 'onmenusharetimeline', 'onmenusharepypeage', 'onmenusharetimeline 'onmenushareqq', 'onmenushareweibo', 'hidemenuitems', 'showmenuitems', 'hideallnonbasemenuitems', 'showallnonbasemenuitems', 'showallnonbasemenuitems', 'showallnonbasemenuitems', 'showallnonbasemenuitems', 'showallnonbasemenuitem «onrecordend», «playvoice», «pausevoice», «stopvoice», «uploadvoice», «downloadvoice», «selectiMage», «previewImage», «uploadImage», «DownloadImage», «getNetWorkType», «openlocation», «getLocation», «hiedOption», «howniNdmenuption», «getlowowoption», «getlowowowo 'scanqrcode', 'selepwxpay', 'openproductspecificview', 'addcard', 'choosecard', 'opencard']}); wx.ready (function () {wx.checkjsapi ({jsapilist: ['getnetworktype', 'previewImage', 'getLocation'], успех: функция (res) {}}); wx.getLocation ({тип: 'wgs84', // deb.ges -координата wgs84. OpenLocation, вы можете пройти в «GCJ02» Точность // aalert (jsonuti.converttoString (res)); View ', // Подробности адреса // Шкала: 28, // Уровень увеличения карты, значение формирования, диапазон от 1 до 28. По умолчанию - максимум // infourl: "location1.aspx? M = Home & C = index & a = getLocation & Latitude ="+Latitude+"& Londitude ="+Longitude // Гиперсвязанность, отображаемая на нижней части места, может быть впрыгните); // Alert (Latitude + "-" + Longitude); Отмена: function (res) {window.location.href = "none.aspx? msg = отвергнуть, чтобы получить географическое место wx.error (function (res) {// Неудача проверки информации о конфигурации выполнит функцию ошибки. Если подпись истекает, проверка не удастся. Для конкретных сообщений об ошибках вы можете открыть режим отладки конфигурации или просмотреть его в возвращенном параметре Res. Подпись может быть обновлена здесь для SPA.}); wx.fail (function (res) {}); </script> </asp: content> <asp: content id = "content2" contentplace holderid = "cphtitle" runat = "server"> Получить местоположение </asp: content> <asp: content id = "content3" contentplace holderid = "cphcontainer" runat = "server"> <br/> <br/> <central style = "diploge geals: werogracy greographic <> <I> </> </> <Br/> <br/> <center =" </div> </center> <div style = "display: none;"> <pan> <img src = "/templates/txwap/images/mask.gif"/> </span> </div> </asp: content>Эффект страницы:
Примечания:
(1) Если настройки мобильного телефона не позволяют WeChat получать информацию о местоположении, приведенная выше информация будет представлена.
(2) Параметры на рисунке выше получают координаты GPS. Если вы используете карту Baidu, вам необходимо сделать определенное преобразование и будет отражено в location1.aspx.
(3) Все страницы, которые требуют JS-SDK, должны сначала вводить информацию о конфигурации, в противном случае они не будут вызваны.
Соответствующее местоположение.aspx.cs реализация:
Использование платежа. набор; } Защищенный строковой временной метки {get; набор; } Защищенная строка noncest {get; набор; } Защищенная строка Signature {get; набор; } public static String wxjsapiparam {get; набор; } public wxjsdata resultjsdata {get; набор; } protected void page_load (отправитель объекта, EventArgs e) {JudgeCode (); var webAuthorize = new WebAuthorizeaction (); Code2tokenresult = webAuthorize.code2token (request ["code"]); if (code2tokenresult.haserror ()) {response.redirect (urls.pageoflocation); Gotononepage («Не удалось получить учетные данные пользователя, пожалуйста, повторно поместите»); возвращаться; } GetUserInforesult = webAuthorize.getUserinfo (code2tokenresult.access_token); if (getuserinforesult.haserror ()) {gotononepage («Не удалось получить пользовательскую информацию, пожалуйста, повторьте»); } var userId = wxOperation.hasbind (getUserInforSult.openid); if (userid.equals (guid.empty)) {response.redirect (urls.oath2url); Gotononepage («пользователь WeChat не связан»); } appid = wxpayconfig.appid; TimeStamp = wxpayapi.generateTimestAmp (); noncestr = wxpayapi.generatenoncestr (); // Следующая реализация будет отражена в 3. Реализация CORE Code var jsapi = new jsapi (это); ResultJsdata = jsapi.getjsdata (); Wxjsapiparam = jsapi.getjsapiparameters (); // Получить H5, чтобы настроить параметры JS API}}}2. Преобразовать координаты WeChat GPS в координаты Baidu
После того, как WeChat успешно получает координаты, страница автоматически перейдет к Location1.aspx, а поток обработки выглядит следующим образом:
WeChat координаты -> преобразовать в координаты карты Baidu -> Получить информацию о местоположении в соответствии с API Baidu Map -> DISPLAY COARDINATES в соответствии с API BAIDU MAP API
<%@ Page Title="Online Check-in" Language="C#" MasterPageFile="~/wxcrm/Site.Master" AutoEventWireup="true" CodeFile="location1.aspx.cs" Inherits="DTcms.Web.wxcrm.location1" %><asp:Content ID="Content1" ContentPlaceHolderID="cphHead" runat="server"> <meta name = "viewport" content = "initial-scale = 1.0, user scalbable = no" /> <style type = "text /css"> #allmap {width: 100%; Высота: 300px; } </style> <script type = "text/javascript" src = "http://api.map.baidu.com/api?v=2.0&ak=dhrlkmr9quo4whmnnsztarta"> </script> <script type = "javascript"> // gps координация var yy = <%= " %>; // долгота, номер плавающей запятой, диапазон составляет 180 ~ -180. var xx = < %= this.Request ["latitude"] %>; // Широта, номер плавающей точки, диапазон 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 medieposition () {var str = "comports ="+yy+","+xx+"& of = 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); } function dealresult (msg) {if (msg.status! = 0) {alert ("Нет правильного результата возврата."); $ ("#mask"). Hide (); возвращаться; } //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+"& of = 1 & to = 5 & ak = dhrlkmr9quo4whmnnsztarta"; $ .ajax ({url: url, успех: function (data, status, xhr) {alert (status); alert (data.status);}, datatype: json}); } var Advanced_post = ''; var AdvancedOptions = ''; var адрес; карта var; функция renderoption (response) {var html = ''; if (response.status) {$ ("#mask"). hide (); var text = "Нет правильного результата возврата!"; оповещение (текст); возвращаться; } 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 = '+address+' & output = html '; var staticimageurl = "http://api.map.baidu.com/staticimage?center="+location.lng+','+location.lat+"& markers ="+location.lng+','+location.lat; html = '<p> Координаты: Latitude:' + location.lat + "Longitude:" + location.lng + '<br />'; html+= 'recision:'+response.result.precise+'<br />'; html += 'валюта:' +response.result.confidence +'<br />'; html+= 'Тип адреса:'+response.result.level+'</p>'; html + = '<p> <img src = "' + staticimageurl + '" /> < /p>'; html + = '<p> Поделитесь этой точкой: <a href = "' + uri + '" target = "_ blank">' + uri + '</a> </p>'; // Установите эту ссылку на кликибель // MAP MAP MAP MAP MAP = NEW BMAP.MAP ("allMAP"); var point = new bmap.point (bxx, byy); var marker = new bmap.marker (point); // Создать карту аннотаций.addoverlay (маркер); // Добавить аннотацию в карту карты.cenerandZoom (точка, 100); var opts = {width: 200, // Информационное окно. var Infowindow = new BMAP.Infowindow (result.formatted_address, opts); // Создать информационное окно Marker.AddeventListener ("click", function () {map.openinfowindow (Infowindow, point); // Открыть информационное окно}); var myicon = new bmap.icon ("http://api.map.baidu.com/img/markers.png", new bmap.size (23, 25), {offset: new bmap.size (10, 25), // указать изображение позиционирования. var pois = result.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}); // Создать аннотацию var name = pois [i] .name; var addr = pois [i] .addr; map.addoverlay (маркер); // Добавить аннотацию в карту addClickHandler (имя, addr, marker); } $ ("#mask"). Hide (); $ ("#btnsign"). Show (); возвращаться; } функция addClickHandler (name, addr, marker) {marker.addeventListener ("click", function (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 = {width: 200, // Информационная ширина Высота: 100, // Информационная высота // Создать информационное окно карты объекта. // Открыть информационное окно} функция 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 (); medieposition ();}); </script></asp:Content><asp:Content ID="Content2" ContentPlaceHolderID="cphTitle" runat="server"> Online check-in</asp:Content><asp:Content ID="Content3" ContentPlaceHolderID="cphContainer" runat="server"> <form id="frmLocation" runat="server"> <div> <div><span>Location information</span></div> <div style = "wadding-left: 0"> <ul style = "height: 300px;"> <div id = "allmap"> </div> </ul> </div> <div style = "wadding-left: 0"> <ul> <div id = "divpo"> </div> </ul> </div> </div> </div> <div style = "marin-top: -50PX; /> </div> <div style = "display: none;"> <pan> <img src = "/templates/txwap/images/mask.gif"/> </span> </div> </form> </asp: content>Эта страница в основном включает в себя открытую платформу Baidu Map, и вам необходимо подать заявку на Baidu Map Ag. В противном случае, вызов JS будет предпринять: приложение не существует, если в АК есть какие -либо ошибки, перепроверьте и попробуйте еще раз.
(1) Технология MAP Baidu 1: Координатный API преобразования
Официальный адрес веб -сайта: http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
Адрес службы API: http://api.map.baidu.com/geoconv/v1/?
В документе есть подробные описания, поэтому я не буду их повторять.
(2) Технология MAP Baidu 2: Получение местоположения на основе координат
Официальный веб-сайт: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
API геокодирования включает в себя функции разрешения адреса и обратного разрешения адреса:
Географическое кодирование: то есть анализ адреса, и информация о широте и долготе байду получает из подробного структурированного адреса улицы. Например, результат анализа адреса «№ 27, Чжунгуанкун Саут -стрит, Хайдианский район, Пекин» - «СПГ: 116,31985, лат: 39,959836». В то же время геокодирование также поддерживает прямое разрешение мест, исторических мест и знаковых зданий и возвращается в широту и долготу Байду. Например, результатом анализа адреса «Baidu Building» является «СПГ: 116.30815, лат: 40.056885». Это обычное требование по поиску POI, и рекомендуется использовать API Place.
Обратное геокодирование: то есть анализ обратного адреса, и информация о структурированном адресе получается из широты и долготы и долготы Baidu. Например, «LAT: 31.325152, LNG: 120.558957» Результатом анализа обратного адреса является «№ 318, Таюан -роуд, район Хукю, город Сучжоу, провинция Цзянсу».
Адрес службы API: http://api.map.baidu.com/geocoder/v2/
Для конкретных параметров, пожалуйста, проверьте официальную документацию.
Пример: http://api.map.baidu.com/geocoder/v2/?ak=applied для ключа и местоположения Baidu = 34.79563,114.23075222912 & Callback = Showlocation и вывод = XML и POIS = 1
Примечания:
(1) Приложение Baidu Developer Key
(2) Система координат карты Baidu отличается от системы координат WeChat
(3) Адрес вызова API и описание параметров
(4) Значение функции обратного вызова API
(5) Понять значение JSON и JSONP
3. WeChat JS-SDK CODE CODE
(1) JSAPI.CS генерирует соответствующие параметры конфигурации JS-SDK
Использование System; с использованием system.globalization; с использованием system.linq; с использованием system.web.security; с использованием system.web.ui; с использованием wxpayapi; kingspace wxjssdk {public class jsapi {/// <summary> /// Сохранить объект страницы, потому что вы хотите использовать объект запроса страницы в методе класса /// <//m. summarary> patch {get Page {get Page {geTepat Page {geTepat Page {geT; набор; } public wxjsdata resultjsdata {get; набор; } /// <summary> /// // </summary> /// <param name = "page"> </param> public jsapi (страница страницы) {this.page = page; } public wxjsdata getjsdata () {var data = new wxjsdata (); data.setValue ("appid", wxpayconfig.appid); // идентификатор публичной учетной записи data.setValue ("timeStamp", wxpayapi.generateTimestamp ()); data.setValue ("noncestr", wxpayapi.generatenoncestr ()); // случайная строка var url = geturl (); data.setValue ("url", url); var jstoken = getJsapiticket (); data.setValue ("jsapi_ticket", jstoken); var signature = makeignature (jstoken, data.getvalue ("noncestr"). toString (), data.getValue ("timeStamp"). toString (), url); data.setValue («подпись», подпись); ResultJsData = data; вернуть данные; } частная строка MakeIgnature (String jsapiticket, String uncestr, 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.hashpasswordforfortoringInconFigFile (Signature, «SHA1»). TOLOWER (); вернуть подпись; } частная строка 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; возвращаться ""; } частная строка getUrl () {string host = page.request.url.host; String path = page.request.path; string QueryString = page.request.url.query; // Это место следует отметить, что полный URL -адрес передается обратно на фон WeChat, когда веб -страница разрешается получить информацию пользователя url = "http: //" + host + path + QueryString; вернуть URL; } public String getJsapiParameters () {log.debug (this.getType (). toString (), "jsapi :: getJsapiparam обрабатывает ..."); String parameters = resultJsdata.tojson (); Log.debug (this.getType (). ToString (), "Get JSAPI:" + параметры); возвратные параметры; }}}(2) jsauthorizeaction.cswechat JS-SDK Function API
используя платеж.wxwebhlper; Использование платежа.wxwebhlper.results; Использование системы; Использование wxpayApi; пространство имен wxjssdk {public class jsauthorizeaction {private static tokenresult token = new tokenResult () {errcode = -1}; Частный статический jsapiticketresult jsapiticket = new jsapiticketresult () {errcode = -1}; public tokenResult getToken () {log.error (this.getType (). toString (), "getToken"); if (! token.isvalid ()) {token = electokenresult (); Log.error (this.getType (). ToString (), token.toString ()); } вернуть токен; } //// <summary> /// // // </summary> /// <return> </return> 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_credential&appid=? var strrtn = webutils.get (url); result = tools.jsonstringtoObj <tohnresult> (strrtn); } catch (Exception ex) {log.error (this.getType (). ToString (), ex.message); result = new TokenResult () {errCode = -1086}; } return Result; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <return> </return> public jsapiticketresult getjsapiticket (string token) {log.error (this.gettype (). tostring (), "getJSapitCeticket:" + getType (). if (! jsapiticket.isvalid ()) {jsapiticket = getjsapiticketresult (token); } вернуть jsapiticket; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <return> </return> public jsapiticketresult getJsapiticketResult (String token) {jsapiticketResult; try {var webutils = new webutils (); var url = string.format ("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token= ° var strrtn = webutils.get (url); result = tools.jsonstringtoObj <jsapiticketresult> (strrtn); } catch (Exception ex) {log.error (this.getType (). ToString (), ex.message); result = new jsapiticketresult () {errcode = -1086}; } return Result; }} public Class jsapiticketResult: returnResult {/// <summary> /// constructor /// </summary> public jsapiticketresult () {creationate = datetime.now; } /// <summary> /// // // </summary> public String Ticket {get; набор; } //// <summary> ///////come_token Interface Timeout Timeout, Unit (Seconds) /// </summary> public int expires_in {get; набор; } //// <summary> /////////// </summary> public DateTime Catenceate {get; набор; } //// <summary> /// Определите, является ли он действительным ///// </summary> /// <return> </return> public bool isvalid () {if (this.errcode! = 0) return false; var nd = dateTime.now - censueTate; возврат Nd. seconds <7200; }} public class tokenResult: returnResult {/// <summary> /// constructor /// </summary> public tokenresult () {createment = dateTime.now; } /// <summary> /// Интерфейс веб -авторизации вызывает учетные данные, примечание. Этот access_token отличается от access_token, поддерживаемого основами /// </summary> public String access_token {get; набор; } /// <summary> //// /// access_token interface treats returets время ожидания, единица (секунд) /// </summary> public int expires_in {get; набор; } //// <summary> /// Время создания //// </summary> public DateTime Catenceate {get; набор; } //// <summary> /// Определите, является ли он действительным ///// </summary> /// <return> </return> public bool isvalid () {if (this.errcode! = 0) return false; var nd = dateTime.now - censueTate; возврат Nd. seconds <7200; }}}(3) Wxjsdata.cs WeChat JS-SDK Class
Использование Litjson; Использование System.collections.generic; Использование System.security.cryptography; Использование System.Text; Использование System.xml; Использование wxpayapi; kingspace wxjssdk {public class wxjsdata {private sorteddictionary <string, object> m_values = new SortedDictionary <string, object> (); / *** Установите значение определенного поля* @param keelfe name* @param value value*/ public void setValue (String Key, значение объекта) {m_values [key] = value; } / *** Получить значение определенного поля на основе имени поля* @param key name* name* @return Значение поля, соответствующего ключу* / public object getValue (string key) {object o = null; m_values.trightvalue (Key, Out O); вернуть O; } / *** Определите, было ли установлено поле* @param Key name* @return return Если клавиша поля была установлена, вернуть true, в противном случае false* / public bool isset (string key) {object o = null; m_values.trightvalue (Key, Out O); if (null! = o) вернуть true; вернуть ложь; } /*** @Convert Dictionary to xml* @return Конвертированная xml String* @Throws WxPayException ** /public String toxml () {// Это не может быть преобразовано в формат xml if (0 == m_values.count) {log.error (this.gettype (0 == m_values.count) {log.error (this.gettype (). Бросьте новое wxpayexception («Данные wxpaydata пусты!»); } string xml = "<xml>"; foreach (keyvaluepair <строка, объект> пара в m_values) {// Значение поля не может быть нулевым, что повлияет на последующий процесс, если (pair.value == null) {log.error (this.gettype (). toString (), «wxpaydata содержит поля со значением null!»); Бросьте новое wxpayexception («wxpaydata содержит поля со значением Null!»); } if (pair.value.getType () == typeof (int) || pair.value.getType () == typeof (decimal)) {xml + = "<" + pare.key + ">" + pair.value.toString () + "</" + pair.key + ">";> "; } else if (pair.value.getType () == typeof (string)) {xml + = "< + pare.key +"> " +" <! [cdata [" + pare.value +"]]> </" + pair.key +"> "; } else // За исключением типов строки и int, вы не можете содержать другие типы данных {log.error (this.getType (). ToString (), "wxpaydata поля Ошибка типа данных!"); Бросьте новое wxpayexception ("wxpaydata поля ошибка типа данных!"); }} xml += "</xml>"; вернуть XML; } / *** @convert xml to wxpaydata -объект и возврат данных внутри объекта* @param string xml для преобразован Log.Error (this.getType (). ToString (), "не законно преобразовать пустую строку XML в wxpaydata!"); Бросьте новое wxpayexception («Не законно преобразовать пустую строку XML в wxpaydata!»); } Xmldocument xmldoc = new xmldocument (); xmldoc.loadxml (xml); Xmlnode xmlnode = xmldoc.firstchild; // Получить корневой узел <xml> xmlnodelist nodes = xmlnode.childnodes; foreach (xmlnode xn в узлах) {xmlelement xe = (xmlelement) xn; m_values [xe.name] = xe.innertext; // Получить пару клавиш пары xml в данные внутри wxpaydata} try {// 2015-06-29 Ошибка заключается в том, что нет подписи if (m_values ["return_code"]! = «Успех») {return m_values; } CheckSign (); // Проверьте подпись, если она не пройдет, он бросит исключение} catch (wxpayexception ex) {бросить новое wxpayexception (ex.message); } вернуть m_values; } / *** @dictionary format, преобразованный в формат параметров URL* @ return URL -строка, эта строка не содержит значения поля знака* / public String tourl () {String buff = ""; foreach (keyvaluepair <string, object> pair in m_values) {if (pair.value == null) {log.error (this.getType (). toString (), "wxpaydata содержит поле со значением нуля!"); Бросьте новое wxpayexception («wxpaydata содержит поле со значением нуля!»); } if (pair.key! = "sign" && pare.value.toString ()! = "") {buff + = pair.key + "=" + pare.value + "&"; }} buff = buff.trim ('&'); вернуть бафф; } / *** @dictionary, форматированное в json* @return json String Data* / public String tojson () {string jsonstr = jsonmapper.tojson (m_values); вернуть jsonstr; } / ** * @Values, отформатированные к результату, который может отображаться на веб -странице (потому что веб -страница не может напрямую выводить строки в формате XML) * / public String toprintStr () {String Str = ""; foreach (keyvaluepair <string, object> pair in m_values) {if (pair.value == null) {log.error (this.getType (). toString (), "wxpaydata содержит поля со значением null!"); Бросьте новое wxpayexception («wxpaydata содержит поля со значением Null!»); } str += string.format ("{0} = {1} <br>", pare.key, pair.value.toString ()); } Log.debug (this.getType (). ToString (), "Печать на веб -странице:" + str); вернуть Str; } /*** @Generate Signature, см. Алгоритм генерации подписи для деталей* @return Signature, поле знака не участвует в подписи* /public String makeign () {// конвертировать формат URL -формат string str = tourl (); // Добавить API после строковой клавиши str + = "& key =" + wxpayconfig.key; // MD5 шифрование var md5 = md5.create (); var bs = md5.computehash (encoding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (байт B в BS) {sb.append (b.tostring ("x2")); } // Все символы преобразуются в верхнюю строку Result = SB.ToString (). Toupper (); результат возврата; } public String makeAppSign () {// преобразовать формат URL -формата string str = tourl (); // Добавить API после строковой клавиши str + = "& key =" + wxpayconfig.keyofapp; // MD5 шифрование var md5 = md5.create (); var bs = md5.computehash (encoding.utf8.getbytes (str)); var sb = new StringBuilder (); foreach (байт B в BS) {sb.append (b.tostring ("x2")); } // Все символы преобразуются в верхнюю строку Result = SB.ToString (). Toupper (); результат возврата; } /**** Проверьте, является ли подпись правильной* вернуть истину правильно, и исключение ошибки* /public bool chectsign () {// Если не установлена подпись, обнаружение пропустить if (! Isset ("sign")) {log.error (this.gettype (). Tostring (), "wxpaydata signature - это не является законной! Бросьте новое wxpayexception («существует подпись wxpaydata, но не является законной!»); } // Если подпись установлена, но подпись пуста, исключение добавляется, если (getValue ("sign") == null || getValue ("sign"). ToString () == "") {log.Error (this.gettype (). Tostring (), "wxpaydata signature существует, но не является законной!"); Бросьте новое wxpayexception («существует подпись wxpaydata, но не является законной!»); } // Получить полученную строку подписи return_sign = getValue ("sign"). ToString (); // Рассчитайте новую подпись локально строки cal_sign = makeign (); if (cal_sign == return_sign) {return true; } Log.Error (this.getType (). ToString (), "wxpaydata -ошибка проверки подписи!"); бросить новое wxpayException («ошибка проверки подписи WXPayData!»); } / ** * @getDictionary * / public sorteddictionary <string, object> getValues () {return m_values; }}}Обратная информация: для соответствующих идей анализа, пожалуйста, обратитесь к официальной оплате официальной учетной записи WeChat SDK, Адрес загрузки: https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1.
Эта статья была составлена в «Краткое описание навыков развития WeChat JavaScript», и все могут учиться и читать.
Я рекомендую учебник по апплетам WeChat, который очень обеспокоен сейчас: редактор «Учебник по разработке программ WeChat Mini» тщательно скомпилировал его для всех, я надеюсь, что вам понравится.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.