WeChat JS-SDKの開発中、GetLocationを使用して座標位置を取得します。 WeChatによって得られた座標をBaiduマップに直接適用する方法。次の効果を表示します。
注:赤いアイコンはWeChatから変換された位置であり、青いアイコンはその周りの位置です。まず、WeChat開発プロセスから説明しましょう。
1。WechatJS-SDK開発ドキュメント
まず、公式ウェブサイトのヘルプドキュメントを入力してください:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_cn
ドキュメントを詳細に研究できます。位置情報を取得するために、次の手順が次の手順に分かれています。
ステップ1:ドメイン名をバインドします
WeChatの公式アカウントを入力し、「公式アカウント設定」メニューを見つけて、「関数設定」パネルを入力します。
[設定]をクリックして、JSを参照する関連するドメイン名を設定します。
ステップ2:公式のJSクラスライブラリを引用します
JSインターフェイス(サポートhttps)を呼び出す必要があるページに次のJSファイルを紹介します:http://res.wx.qq.com/open/js/jweixin-1.0.0.js。
参照されたページはlocation.aspxです。
<%@ page title = "get location"言語= "c#" autoeventwireup = "true" masterpagefile = "〜/wxcrm/site.master" codefile = "location.aspx.cs"継承= "dtcms.web.wxcrm.location"%> <asp = "content1" cplaceholdid = "< src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> </script> <script = "text/javascript"> $( "#mask")。show(); wx.config({debug:false、// open debugモード、trueの場合、各js関数呼び出しがappid: '<%= resultjsdata.getvalue( "appid")%>'、//公式アカウントタイムスタンプの一意の識別子:<%= resultjsdata.getvalue( "timestamp") '<%= resultjsdata.getValue( "noncestr")%>'、//必須、署名ランダム文字列の署名を生成します: '<%= resultjsdata.getValue.getValue./ 「onmenushareqq」、「onmenushareweibo」、「hidemenuitems」、「showmenuitems」、「hideallnonbasemenuitems」、「showallnonbasemenuitems」、「showallnonbasemenuitems」、 'showallnonbasemenuitems' '' '' '' '' '' '' '' '' '' showallnonbasemenuitems '、' showallnonbasemenuitems '、 「停止レコード」、「オンレコード」、「PlayVoice」、「Pausevoice」、「stopvoice」、 'uploadvoice'、 'downloadvoice'、 'choiceimage'、 'previewimage'、 'uploadimage'、 'downloadimage'、 'getnetworktype'、 'gettionmenu'、 'getToionmenu'、 'gettotoctionmenu'、 'getnetworktype'、 'getnetworktype'、 'getnetworktype'、 'getnetworktype'、 'CloseWindow'、 'scanqrcode'、 'choosewxpay'、 'openProductspecificview'、 'addcard'、 'choosecard'、 'opencard']}); wx.Ready(function(){wx.Checkjsapi({jsapilist:['getNetworkType'、 'previewimage'、 'getlocation']、成功:function(res){}}); wx.getlocation({type: 'wgs84'、 OpenLocationは、「GCJ02」を渡すことができます(res){var latiture = latitude;精度// aalert(jsonuti.converttostring(res)); view '、//アドレスの詳細//スケール:28、//ズームレベルのマッピング値、1〜28の範囲。デフォルトは最大// infourl: "location1.aspx?m = home&c = index&a = getlocation&latitude ="+latitude+"&lotitude ="+lungitude //表示されるハイパーリンクが表示されます。 // latitude + " - " + $)。キャンセル:function(res){windocy.location.href = "none.aspx?msg = reject + r =" + math.random(); // reject}、FALE:function(){Alert( " wx.error(function(res){//構成情報検証障害はエラー関数を実行します。署名が有効期限が切れると、特定のエラーメッセージの場合、設定のデバッグモードを開くか、返されたresパラメーターで表示できます。 wx.fail(function(res){}); </script> </asp:content> <asp:content id = "content2" contentplaceholderid = "cphtitle" runat = "server"> get incold </asp> <content id = "content3" contentplaceholderid = "cphcontainer" runat = "server"> <br/> <br/> <center estly = <block; </div> </center> <div style = "display:none;"> <span> <img src = "/templates/txwap/mask.gif"/> </span> </div> </asp>ページ効果:
注:
(1)携帯電話の設定でWeChatが位置情報を取得できない場合、上記の情報が求められます。
(2)上記の図のパラメーターは、GPS座標を取得します。 Baiduマップを使用する場合、特定の変換を行う必要があり、location1.aspxに反映されます。
(3)JS-SDKを必要とするすべてのページに、最初に構成情報を注入する必要があります。そうしないと、呼び出されません。
対応するlocation.aspx.cs実装:
支払い.wxwebhlper;を使用します。セット; }保護された文字列タイムスタンプ{get;セット; }保護された文字列noncestr {get;セット; }保護された文字列署名{get;セット; } public static string wxjsapiparam {get;セット; } public wxjsdata resultjsdata {get;セット; }保護されたvoid page_load(object sender、eventargs e){judgecode(); var webauthorize = new WebAuthorizeAction(); code2tokenResult = webauthorize.code2token(request ["code"]); if(code2tokenResult.haserror()){respons.redirect(urls.pageoflocation); gotononePage( "ユーザー資格情報の取得に失敗しました、再get");戻る; } getuserinforesult = webauthorize.getuserinfo(code2tokenResult.access_token); if(getuserinforesult.haserror()){gotononepage( "ユーザー情報の取得に失敗した場合、再get"); } var userid = wxoperation.hasbind(getuserinforesult.openid); if(userid.equals(guid.empty)){respons.redirect(urls.oauth2url); gotononepage( "wechat user not bound"); } appid = wxpayconfig.appid; timestamp = wxpayapi.generatetimestamp(); noncestr = wxpayapi.generatenoncestr(); //次の実装は3に反映されます。コアコード実装var jsapi = new JSapi(this); resultjsdata = jsapi.getjsdata(); wxjsapiparam = jsapi.getjsapiparameters(); // h5を取得してJS APIパラメーターを調整します}}}}2。WeChat GPS座標をBaidu座標に変換します
WeChatが正常に座標を取得した後、ページは自動的にlocation1.aspxにジャンプし、処理フローは次のとおりです。
wechat座標 - > baiduマップ座標に変換 - > baiduマップAPIに従って位置情報を取得 - > Baidu Map APIに従ってディスプレイ座標
<%@ページタイトル= "オンラインチェックイン"言語= "c#" masterpagefile = "〜/wxcrm/site.master" autoeventwireup = "true" codefile = "location1.aspx.cs"継承= "dtcms.web.wxcrm.location1"%> <asp = "contentplaceholdid =" chhea name = "Viewport" content = "Intially-scale = 1.0、user-scalable = 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=dhrlkmr9quo4whmnsztarta"> </script> <script = "text/javascript" //経度、浮動小数点数、範囲は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 changeposition(){var str = "coords ="+yy+"、"+xx+"&from = 1&= 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+"&= 1&= 5&ak = dhrlkmr9quo4whmnnsztarta"; $ .ajax({url:url、success:function(data、status、xhr){alert(status); alert(data.status);}、datatype:json}); } var advanced_post = ''; var AdvancedOptions = ''; varアドレス; var Map;関数renderoption(response){var html = ''; if(respons.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 = '+respons.result.level+'&content = '+address+'&output = html '; var staticimageurl = "http://api.map.baidu.com/staticimage?center="+location.lng+'、'+location.lat+"&markers ="+location.lng+'、'+location.lat.lat; html = '<p>座標:緯度:' + location.lat + "経度:" + location.lng + '<br />'; html+= 'precision:'+respons.result.precise+'<br />'; html += '通貨:' +response.result.confidence +'<br />'; html+= 'アドレスタイプ:'+response.result.level+'</p>'; html + = '<p> <img src = "' + staticimageurl + '" /> < /p>'; html + = '<p>この点を共有:<a href = "' + uri + '"ターゲット= "_ blank">' + uri + '</a> </p>'; //このリンクをClickableに設定しますvar point = new bmap.point(bxx、byy); var marker = new bmap.marker(point); // Annotation Map.AddoverLay(マーカー)を作成します。 //マップマップに注釈を追加します。Centerandzoom(Point、100); var opts = {width:200、//情報ウィンドウ幅の高さ:100、//情報ウィンドウの高さタイトル:「私の位置」、//情報ウィンドウタイトルenablemessage:true、// set window window on set nove nove nove nove nove nove nove nove nove nove nove nove nove nove nove nove nove sent sende sense message:result.formatted_address} $( "#divpo")。 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}); // Annotation var name = pois [i] .nameを作成します。 var addr = pois [i] .addr; map.addoverlay(マーカー); //アノテーションをマップに追加する(名前、addr、マーカー); } $( "#mask")。hide(); $( "#btnsign")。show();戻る; } function 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、//情報ウィンドウの高さタイトル://情報ウィンドウタイトルenablemessage:true、//情報ウィンドウを許可すると短いメッセージメッセージを送信すると、addr} var infowindow = new bmap.infowindow(addr、opts); //情報ウィンドウオブジェクトMap.openinfowindow(infowindow、point)を作成します。 //情報ウィンドウを開きます} function dooptions(){var script = document.createelement( 'script'); script.type = 'text/javascript'; Advanced_Post = "http://api.map.baidu.com/geocoder/v2/?ak=dhrlkmr9quo4whmnnsztartg&callback=renderoption =" + byy + "、" + bxx + "&output = json&pois = 2"; script.src = advanced_post; document.body.AppendChild(スクリプト); }; $(function(){$( "#mask")。show(); $( "#btnsign")。hide(); changeposition();}); </script> </asp:content> <asp:content id = "content2" contentplaceholderid = "cphtitle" runat = "server">オンラインチェックイン</asp:content> <content id = "content3" contentplaceholderid = "cphcontainer" runat = "server"> <form id = "frmlocation" runat "> </<> <> style="padding-left: 0"> <ul style="height: 300px;"> <div id="allmap"></div> </ul> </div> <div style="padding-left: 0"> <ul> <div id="divPo"></div> </ul> </div> </div> </div> <div style="text-align: center; margin-top: -50px;"> <入力ID = "btnsign" type = "button" value = "" style = "cursor:width:210px; height:50px; border-radius:15px; background-color:#00cd00; border:border:0px#fe6714 solid; /> </div> <div style = "display:none;"> <span> <img src = "/txwap/mask.gif"/> </span> </div> </form> </asp:content>このページには主にBaidu Map Open Platformが含まれており、Baidu Map AGを申請する必要があります。それ以外の場合は、JSの呼び出しがプロンプトされます。AKにエラーがある場合、アプリは存在しません。再確認して再試行してください。
(1)Baidu Map Technology 1: Coordinate Conversion API
公式ウェブサイトの住所:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
APIサービスアドレス:http://api.map.baidu.com/geoconv/v1/?
ドキュメントには詳細な説明があるので、繰り返しません。
(2)Baidu Map Technology 2:座標に基づいて場所を取得する
公式ウェブサイト:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
ジオコーディングAPIには、アドレス解像度と逆アドレス解決機能が含まれます。
地理的エンコーディング:つまり、住所分析、およびBaiduの緯度と経度情報は、路上の詳細な構造化されたアドレスから取得されます。たとえば、「No. 27、Zhongguancun South Street、Haidian District、Beijingの結果の結果は「LNG:116.31985、LAT:39.959836」です。同時に、ジオコーディングは、場所、歴史的なサイト、ランドマークの建物の直接的な解決をサポートし、バイドゥの緯度と経度に戻ります。たとえば、「Baidu Building」の住所分析の結果は「LNG:116.30815、LAT:40.056885」です。これは一般的なPOI検索要件であり、Place APIを使用することをお勧めします。
逆ジオコード:つまり、逆のアドレス分析、および構造化されたアドレス情報は、Baidu緯度と経度情報から取得されます。たとえば、「LAT:31.325152、LNG:120.558957」逆住所分析の結果は、「No. 318、Tayuan Road、Huqiu地区、江蘇省江蘇省」です。
APIサービスアドレス:http://api.map.baidu.com/geocoder/v2/
特定のパラメーターについては、公式ドキュメントを確認してください。
例:http://api.map.baidu.com/geocoder/v2/?ak = appliced for baidu key&location = 34.79563,114.230752222912&callback = showlocation&output = xml&pois = 1
注:
(1)Baidu開発者キーアプリケーション
(2)Baiduマップ座標系はWeChat座標系とは異なります
(3)APIコールアドレスとパラメーターの説明
(4)APIコールバック関数の意味
(5)JSONとJSONPの意味を理解する
3。WechatJS-SDKコアコード
(1)JSAPI.CSは、関連するJS-SDK構成パラメーターを生成します
System; System.Globalization; System.linq;を使用してSystem.web.security;を使用してSystem.web.ui; namespace wxjssdkを使用して使用します{/// <summary> //セット; } public wxjsdata resultjsdata {get;セット; } /// <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); // publicアカウントID data.setValue( "Timestamp"、wxpayapi.generatetimestamp()); data.setValue( "noncestr"、wxpayapi.generatenoncestr()); // random string 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( "signature"、signature); resultjsdata = data;データを返す; } private string makeignature(string jsapiticket、string noncestr、string timestamp、string url){string [] arraylist = {"jsapi_ticket =" + jsapiticket、 " + jsapiticket、" + timestamp、 "noncestr =" + noncestr = "url =" + url}; array.sort(arrayList); var signature = string.join( "&"、arrayList); signature = formsauthentication.hashpasswordforstoringinconfigfile(signature、 "sha1")。tolower();署名を返します。 } private string getjsapiticket(){var jsauth = new jsauthorizeAction(); var token = jsauth.getToken(); var nd = datetime.now -token.createdate; log.error(this.getType()。toString()、token.access_token); log.error(this.getType()。toString()、token.isvalid()。toString()); if(token.isvalid())jsauth.getjsapiticket(token.access_token).ticket;を返します。戻る ""; } private string geturl(){string host = page.request.url.host;文字列パス= page.request.path;文字列QueryString = page.request.url.Query; //この場所は、Webページがユーザー情報string url = "http://" + host + path + querystringを取得することを許可したときに、完全なURLがWeChatの背景に戻って渡されたことに注意する必要があります。 return url; } public String getJsapiparameters(){log.debug(this.getType()。toString()、 "jsapi :: getjsapiparamは処理...");文字列パラメーター= resultjsdata.tojson(); log.debug(this.getType()。toString()、 "get jsapi:" + parameters);パラメーターを返します。 }}}(2)jsauthorizeAction.cswechat JS-SDK関連APIコール関数
Payment.wxwebhlperを使用しています。 Payment.wxwebhlper.resultsを使用します。システムの使用。 wxpayapi; namespace wxjssdk {public class jsauthorizeaction {private static tokenResult token = new tokenResult(){errcode = -1}; private static jsapiticketresult jsapiticket = new jsapiticketresult(){errcode = -1}; public tokenResult getToken(){log.Error(this.getType()。toString()、 "gettoken"); if(!token.isvalid()){token = getedresult(); log.error(this.getType()。toString()、token.toString()); }トークンを返します。 } /// <summary> /// // // </summary> /// <returns> </returns> public tokenResult getekenResult(){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= {0}&secret = {1}"、wxpayconfig.appid、wxpayconfig.appsretret); var strrtn = webutils.get(url); result = tools.jsonstringtoobj <TokenResult>(strrtn); } catch(Exception ex){log.Error(this.getType()。toString()、ex.message); result = new tokenResult(){errcode = -1086}; } return result; } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <Returns> </returns> public jsapiticketresult getjsapiticet(string token){log.error(this.gettype()。 if(!jsapiticket.isvalid()){jsapiticket = getjsapiticketresult(token); } jsapiticketを返します。 } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// public jsapiticketresult getjsapiticketresult(string token){jsapiticketresult result; try {var webutils = new webutils(); var url = string.format( "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token= {0} &tpe=jsapi"、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(){recutedate = datetime.now; } /// <summary> /// // // </summary> public stringチケット{get;セット; } /// <summary> //// access_tokenインターフェイスコールクレデンシャルタイムアウト、ユニット(秒)/// </summary> public int expires_in {get;セット; } /// <summary> ///セット; } /// <summary> ///それが有効かどうかを決定する//// </summary> // var nd = datetime.now -createdate; nd.seconds <7200を返します。 }} public class tokenResult:returnResult {/// <summary> /// constructor /// </summary> public tokenResult(){createdate = datetime.now; } /// <summary> /// Web Authorizationインターフェイスは資格情報を呼び出します。注:このaccess_tokenは、基本的にサポートされているAccess_tokenとは異なります/// </summary> public String access_token {get;セット; } /// <summary> //// Access_Tokenインターフェイスコール資格情報タイムアウト時間、Unit(秒)/// </summary> public int expires_in {get;セット; } /// <summary> ///作成時間//// </summary> public dateTime createdate {get;セット; } /// <summary> ///それが有効かどうかを決定する//// </summary> // var nd = datetime.now -createdate; nd.seconds <7200を返します。 }}}(3)WXJSDATA.CS WECHAT JS-SDKパラメータークラス
Litjsonを使用しています。 System.collections.genericを使用しています。 System.security.cryptographyを使用します。 System.textを使用しています。 System.xmlを使用しています。 wxpayapi; namespace wxjssdk {public class wxjsdata {private sorteddictionary <string、object> m_values = new sorteddictionary <string、object>(); / ***特定のフィールドの値を設定* @paramキーフィールド名* @param値フィールド値*/ public void setValue(string key、object value){m_values [key] = value; } / ***フィールド名に基づいて特定のフィールドの値を取得* @paramキーフィールド名* @return keyに対応するフィールド値* / public object getValue(string key){object o = null; m_values.trygetvalue(key、out o); oを返します。 } / ***フィールドが設定されているかどうかを判断* @paramキーフィールド名* @returnフィールドキーが設定されている場合、trueを返します。 m_values.trygetvalue(key、out o); if(null!= o)trueを返します。 falseを返します。 } /*** @convert dictionary to xml* @@return変換されたxml文字列* @throws wxpayexception ** /public string toxml(){// xml形式に変換できません(0 == m_values.count){log.error(this.gettype()。新しいwxpayexception( "wxpaydataデータは空です!"); }文字列xml = "<xml>"; foreach(keyvaluepair <string、object> pair in m_values){//フィールド値はnullになりません。新しいwxpayexception( "wxpaydataには値nullのフィールドが含まれています!"); } if(pair.value.getType()== typeof(int)|| pail.value.getType()== typeof(decimal)){xml + = "<" + pair.key + ">" + pair.value.tostring() + "</" + pair.key + ">"; } else if(pair.value.getType()== typeof(string)){xml + = "<" + pair.key + ">" + "<! } else //文字列とintタイプを除いて、他のデータ型を含めることはできません{log.error(this.getType()。toString()、 "wxpaydataフィールドデータ型エラー!");新しいwxpayexception( "wxpaydataフィールドデータ型エラー!"); }} xml += "</xml>"; XMLを返します。 } / *** @convert XMLにwxpaydataオブジェクトにオブジェクト内のデータを返します* @param string xmlは変換されます* @return dictionary conversion* @throws wxpayexception* / public sortdictionary <string、object> fromxml(string xml){if(string.isnullerempty(xml){{xml){ log.Error(this.getType()。toString()、「空のXML文字列をwxpaydataに変換することは合法ではありません!」);新しいwxpayexception(「空のxml文字列をwxpaydataに変換することは合法ではありません!」); } xmldocument xmldoc = new xmldocument(); xmldoc.loadxml(xml); xmlnode xmlnode = xmldoc.firstchild; // get root node <xml> xmlnodelist nodes = xmlnode.childnodes; foreach(ノードのxmlnode xn){xmlelement xe =(xmlelement)xn; m_values [xe.name] = xe.innertext; // xmlのキー値ペアをwxpaydata内のデータに取得} try {// 2015-06-29エラーは、署名がないということです(m_values ["return_code"]!= "success") } checksign(); //署名を確認します。違反しない場合、例外がスローされます} catch(wxpayexception ex){新しいwxpayexception(ex.message); } m_valuesを返します。 } / *** @dictionary形式がurlパラメーター形式に変換されます* @ return urlフォーマット文字列、この文字列にはsignフィールド値が含まれていません* / public string tourl(){string buff = ""; foreach(keyvaluepair <string、object> pair in m_values){if(pair.value == null){log.Error(this.getType()。toString()、 "wxpaydataにはnull!");新しいwxpayexception( "wxpaydataには、nullの値があるフィールドが含まれています!"); } if(pair.key!= "sign" && pair.value.tostring()!= ""){fuff + = pair.key + "=" + pair.value + "&"; }} buff = buff.trim( '&');返品バフ; } / *** @DictionaryフォーマットJSON* @return json string data* / public string tojson(){string jsonstr = jsonmapper.tojson(m_values); jsonstrを返します。 } / ** * @ValuesがWebページに表示できる結果にフォーマットされています(WebページはXML形式で文字列を直接出力できないため) foreach(keyvaluepair <string、object> m_valuesのペア){if(pair.value == null){log.Error(this.getType()。toString()、 "wxpaydataにはvalue null!");新しいwxpayexception( "wxpaydataには値nullのフィールドが含まれています!"); } str += string.format( "{0} = {1} <br>"、pair.key、pair.value.tostring()); } log.debug(this.getType()。toString()、 "Webページで印刷:" + str); strを返します。 } /*** @generate signature、詳細については署名生成アルゴリズムを参照* @return署名、署名フィールドは署名* /public string makeign(){// url形式のstring str = tourl(); //文字列の後にAPIを追加しますkey str + = "&key =" + wxpayconfig.key; // md5暗号化var md5 = md5.create(); var bs = md5.computehash(encoding.utf8.getBytes(str)); var sb = new StringBuilder(); foreach(bs in bs in bs){sb.append(b.tostring( "x2")); } //すべての文字が大文字に変換されますresult result = sb.toString()。toupper();返品結果; } public string makeappsign(){// urlフォーマット文字列str = tourl(); //文字列の後にAPIを追加しますkey str + = "&key =" + wxpayconfig.keyofapp; // md5暗号化var md5 = md5.create(); var bs = md5.computehash(encoding.utf8.getBytes(str)); var sb = new StringBuilder(); foreach(bs in bs in bs){sb.append(b.tostring( "x2")); } //すべての文字が大文字に変換されますresult result = sb.toString()。toupper();返品結果; } /****署名が正しいかどうかを確認します*正しいものを正しく返し、例外をスローします* /public bool checksign(){//署名が設定されていない場合、(!shiset( "sign")){log.Error(this.getType()。新しいwxpayexceptionを投げる( "wxpaydata署名は存在しますが、合法ではありません!」); } //署名が設定されているが署名が空の場合、例外がスローされます(getValue( "sign")== null || getValue( "sign")。toString( "==" "){log.getType(this.getType()。新しいwxpayexceptionを投げる( "wxpaydata署名は存在しますが、合法ではありません!」); } //受信した署名文字列return_sign = getValue( "sign")。toString()を取得します。 //新しい署名を計算しますlocally string cal_sign = makeign(); if(cal_sign == return_sign){return true; } log.error(this.getType()。toString()、 "wxpaydata署名検証エラー!");新しいwxpayexception( "wxpaydata署名検証エラー!"); } / ** * @getDictionary * / public SortDictionary <string、object> getValues(){return m_values; }}}迅速な情報:関連する分析のアイデアについては、公式のWechat公式アカウント支払いSDKを参照してください。住所をダウンロード:https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1。
この記事は「JavaScript Wechat Development Skillsの要約」にまとめられており、誰もが学習して読むことを歓迎します。
「Wechat Mini Program Development Tutorial」の編集者が皆のために慎重にコンパイルしているWechatアプレットに関するチュートリアルをお勧めします。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。