أثناء تطوير 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.
الصفحة المرجعية هي location.aspx ، على النحو التالي:
<٪@ page title = "get location" language = "c# src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> </script> <script type = "text/javaScript"> $ ("#mask"). show () ؛ wx.config ({debug: false ، // Open Debug Mode ، إذا كان ذلك صحيحًا ، ستظهر كل استدعاء دالة JS Appid: "<٪ = resultjsdata.getValue (" noncestr ") ٪> '، // مطلوب ، قم بإنشاء توقيع سلسلة عشوائية التوقيع:' <٪ = resultjsdata.getValue (" signature ") ٪> '، // مطلوب ، jsapilist: "onmenushareqq '،' onmenushareweibo '،' HideMenuitems '،' showmenuitems '،' Hideallnonbasemenuitems '،' showallnonbasemenuims '،' shartrecordiCoReMs '،' archatercordiCoR" "StopRecord" ، "onRecordend" ، "PlayVoice" ، "Pausevoice" ، "stopVoice" ، "UploadVoice" ، "downloadVoice" ، "choiceImage" ، "PreviewImage" ، "GettOptImage" ، "DishOptImage" ، "CloseWindow" ، "Scanqrcode" ، "ChooSewxPay" ، "OpenProductSpecificView" ، "AddCard" ، "ChooSecard" ، "Opencard"]}) ؛ wx.ready (function () {wx.checkjsapi ({jsapilist: ['getNetworkType' ، 'PreviewImage' ، 'getLocation'] ، النجاح: الدالة (res) {}}) ؛ wx.getlocation ({type: wgs84 '، // default is the gps evalinate of wginates. إلى OpenLocation ، يمكنك النجاح في GCJ02: الدالة (RES) // دقة الموقف // aalert (jsonuti.converttoString (res)) ؛ العنوان: "انقر للعرض" ، // تفاصيل العنوان // المقياس: 28 ، // مستوى تكبير الخريطة ، وقيمة التشكيل ، والمتازين من 1 إلى 28. الافتراضي هو الحد الأقصى // infourl: "location1.aspx؟ m = home & c = index & a = getLocation & latitude ="+latitude+"& lugchitude ="+longitude // the hyperlink displayed in the the bosure of the the in in in in in in in in an. / /تنبيه (خط العرض + " + خط الطول) ؛ } ، الإلغاء: الدالة (res) {window.location.href = "none.aspx؟ msg = refect to the gegographic to the grougle & r =" math.random ؛ wx.error (function (res) {// ، سوف يقوم فشل التحقق من معلومات التكوين بوظيفة خطأ. إذا انتهت صلاحية التوقيع ، فسوف يفشل التحقق. بالنسبة لرسائل خطأ محددة ، يمكنك فتح وضع التصحيح للتكوين ، أو عرضه في المعلمة RES التي تم إرجاعها. يمكن تحديث التوقيع هنا لسبا.}) ؛ wx.fail (function (res) {}) ؛ </script> </asp: content> <asp: content id = "content2" contentPlaceHolderId = "cphtitle" runat = "server" معلومات ... </div> </center> <div style = "display: none ؛"> <span> <img src = "/templates/txwap/images/mask.gif"/> </file> </viv> </asp: content>تأثير الصفحة:
ملحوظات:
(1) إذا كانت إعدادات الهاتف المحمول لا تسمح لـ WeChat بالحصول على معلومات الموقع ، فسيتم مطالب المعلومات أعلاه.
(2) المعلمات في الشكل أعلاه الحصول على إحداثيات GPS. إذا كنت تستخدم خريطة BAIDU ، فأنت بحاجة إلى إجراء تحويل معين وسيتم انعكاسه في الموقع 1.aspx.
(3) يجب حقن جميع الصفحات التي تتطلب JS-SDK بمعلومات التكوين أولاً ، وإلا فلن يتم استدعاؤها.
تنفيذ الموقع المقابل. aspx.cs:
باستخدام payment.wxwebhlper ؛ باستخدام payment.wxwebhlper.actions ؛ باستخدام النظام ؛ باستخدام system.globalization ؛ باستخدام wxjssdk ؛ باستخدام wxpayapi ؛ مساحة الاسم dtcms.web.wxcrm {فئة الجزئية العامة الموقع: pageBase {protected acpid {get ؛ تعيين؛ } timestamp {get ؛ تعيين؛ } سلسلة محمية noncestr {get ؛ تعيين؛ } توقيع السلسلة المحمية {get ؛ تعيين؛ } سلسلة ثابتة عامة wxjsapiparam {get ؛ تعيين؛ } public wxjsdata resultjsdata {get ؛ تعيين؛ } void page_load محمي (مرسل الكائن ، eventArgs e) {JudgeCode () ؛ var webauthorize = new WebAuthorizeAction () ؛ code2TokenResult = WebAuthorize.code2Token (طلب ["رمز"]) ؛ if (code2TokenResult.haserror ()) {response.redirect (urls.pageOflocation) ؛ gotononepage ("فشل في الحصول على بيانات اعتماد المستخدم ، يرجى إعادة الحصول عليها") ؛ يعود؛ } getUserInforesult = webauthorize.getuserInfo (code2TokenResult.access_token) ؛ if (getUserInforesult.haserror ()) {gotonOnePage ("فشل في الحصول على معلومات المستخدم ، يرجى إعادة get") ؛ } var userId = wxoperation.hasbind (getUserInforesult.openId) ؛ if (userId.equals (Guid.Empty)) {response.redirect (urls.oauth2url) ؛ gotononepage ("مستخدم WeChat غير ملزم") ؛ } appid = wxpayconfig.appid ؛ timestamp = wxpayapi.generatetimestamp () ؛ noncestr = wxpayapi.generatenoncester () ؛ // سوف ينعكس التنفيذ التالي في 3. تطبيق الكود الأساسي var jsapi = new JSAPI (هذا) ؛ resultjsdata = jsapi.getjsdata () ؛ wxjsapiparam = jsapi.getjsapiparameters () ؛ // الحصول على H5 لضبط معلمات API JS}}}2. تحويل إحداثيات WeChat GPS إلى إحداثيات Baidu
بعد الحصول على WeChat بنجاح الإحداثيات ، ستقفز الصفحة تلقائيًا إلى الموقع 1.aspx ، وتدفق المعالجة كما يلي:
إحداثيات WeChat -> التحويل إلى إحداثيات Baidu MAP -> الحصول على معلومات الموقع وفقًا لـ BAIDU MAP API -> عرض إحداثيات العرض وفقًا لبيدو خريطة واجهة برمجة تطبيقات
<٪@ page title = "online check-in" language = "c# name = "viewport" content = "scale-scale = 1.0 ، قابلة للتطبيق المستخدم = لا" /> <style type = "text /css"> #allmap {width: 100 ٪ ؛ الارتفاع: 300 بكسل ؛ } </style> <script type = "text/javaScript" src = "http://api.map.baidu.com/api؟v=2.0&ak=dhrlkmr9quo4whmnnnnsztarta"> </script> <script type = "text/javascript" ٪> ؛ // خط الطول ، رقم نقطة العائمة ، النطاق هو 180 ~ -180. var xx = <٪ = this.request ["latitude"] ٪> ؛ // 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 & to = 5" ؛ var url = positionurl + str ؛ $ ("#positionurl"). var script = document.createElement ('script') ؛ script.src = url + '& ak = dhrlkmr9quo4whmnnsztarta & callback = dealresult' ؛ document.getElementSbyTagName ("Head") [0] .AppendChild (script) ؛ } دالة dealResult (msg) {if (msg.status! = 0) {Alert ("لا توجد نتيجة إرجاع صحيحة.") ؛ $ ("#Mask"). Hide () ؛ يعود؛ } //jsonuti.convertToString(MSG) ؛ bxx = msg.result [0] .x ؛ byy = msg.result [0] .y ؛ DOOPTIONS () ؛ } وظيفة getBaiduposition () {var url = "http://api.map.baidu.com/geoconv/v1/؟coords="+yy+"،"+xx+"& from = 1 & to = 5 & ak = dhrlkmr9quo4whmnnsztarta" ؛ $ .ajax ({url: url ، النجاح: الدالة (البيانات ، الحالة ، xhr) {Alert (status) ؛ Alert (data.status) ؛} ، datatype: json}) ؛ } var advanced_post = '' ؛ var AdvancedOptions = '' ؛ عنوان var ؛ خريطة فار الدالة renderOption (استجابة) {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.level+' & content = '+' & outputing = html '؛ var staticimageurl = "http://api.map.baidu.com/staticimage؟center="+location.lng+'،'+location.lat+"& markers ="+location.lng+'،'+location.lat ؛ html = '<p> الإحداثيات: latitude:' + location.lat + "loncitude:" + location.lng + '<br />' ؛ html+= 'precision:'+response.result.precise+'<br />' ؛ html += 'currency:' +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> '؛ // قم بتعيين هذا الرابط إلى Clickable // Baidu MAP API Map = new bmap.map ("allmap") ؛ var point = new bmap.point (bxx ، byy) ؛ var marker = new bmap.marker (point) ؛ // إنشاء Map.Addoverlay (Marker) ؛ // أضف التعليق التوضيحي إلى Map.Centerandzoom (نقطة ، 100) ؛ VAR OPTS = {Width: 200 ، // معلومات نافذة العرض الارتفاع: 100 ، // المعلومات عنوان ارتفاع نافذة العنوان: "My Position" ، // Information Window Title EnableMessage: True ، // set left will information window لإرسال رسالة قصيرة: result.formatted_address} $ ("#divpo"). var infoWindow = new bmap.infowindow (result.formatted_address ، opts) ؛ // إنشاء معلومات كائن نافذة المعلومات. addeventListener ("Click" ، function () {map.openinfowindow (InfoWindow ، point) ؛ // افتح نافذة المعلومات}) ؛ var myicon = new bmap.icon ("http://api.map.baidu.com/img/markers.png" ، bmap.size جديد (23 ، 25) ، {الإزاحة: New Bmap.size (10 ، 25) ، // حدد موقع الموضع: bmap.size (0 ، 0 - 10 * 25) var pois = result.pois ؛ لـ (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 (الاسم ، addr ، marker) {marker.adDeventListener ("Click" ، function (e) {openInfo (name ، addr ، e)}) ؛ } وظيفة openInfo (الاسم ، addr ، e) {var p = e.target ؛ var point = new bmap.point (p.getPosition (). lng ، p.getPosition (). lat) ؛ var opts = {width: 200 ، // معلومات نافذة العرض الارتفاع: 100 ، // المعلومات عنوان ارتفاع نافذة العنوان: // معلومات عنوان نافذة المعلومات enableMessage: // set ، اسمح نافذة المعلومات بإرسال رسالة رسائل قصيرة: addr} var infowindow = new bmap.infowindow (addr ، sotts) ؛ // إنشاء كائن نافذة المعلومات map.openinfowindow (InfoWindow ، point) ؛ // افتح نافذة المعلومات} دالة dooptions () {var script = document.createElement ('script') ؛ script.type = 'text/javaScript' ؛ Advanced_post = "http://api.map.baidu.com/geocoder/v2/؟ak=dhrlkmr9quo4whmnnsztartg&callback=renderoption&location=" + byy + "،" + bxx + "& output = json & pois = 2" ؛ script.src = Advanced_Post ؛ document.body.appendchild (script) ؛ } ؛ $ (function () {$ ("#mask"). show () ؛ $ ("#btnsign"). Hide () ؛ changeposition () ؛}) ؛ </script> </asp: content> <asp: content id = "content2" contentPlaceHolderId = "cphtitle" runat = "server"> check in online </asp: content> <asp: content 3 content3 المعلومات </span> </viv> <div style = "padding-left: 0"> <ul style = "الارتفاع: 300px ؛"> <div id = "allmap"> </viv> </ul> </viv> <div style = "padding-left: 0"> <ul> <div id = "divpo"> </ul> Margin-Top: "expression extrict" /> </div> <div style = "display: none ؛"> <span> <img src = "/templates/txwap/images/mask.gif"/> </span> </viv> </form> </asp: content>تتضمن هذه الصفحة بشكل أساسي منصة Baidu Map Open ، وتحتاج إلى التقدم بطلب للحصول على خريطة Baidu AG. خلاف ذلك ، فإن الاتصال بـ JS سوف يطالب: التطبيق غير موجود ، إذا كان هناك أي خطأ في AK ، يرجى إعادة فحص ومحاولة مرة أخرى.
(1) تقنية خريطة Baidu 1: تنسيق واجهة برمجة تطبيقات التحويل
عنوان الموقع الرسمي:
عنوان خدمة API: http://api.map.baidu.com/geoconv/v1/؟
يحتوي المستند على أوصاف مفصلة ، لذلك لن أكررها.
(2) Baidu Map Technology 2: الحصول على الموقع بناءً على الإحداثيات
الموقع الرسمي: http://lbsyun.baidu.com/index.php؟title=webapi/Guide/Webservice-geocoding
يتضمن واجهة برمجة تطبيقات الترميز الجغرافي دقة العنوان ووظائف حل العنوان العكسي:
الترميز الجغرافي: أي ، تحليل العناوين ، ومعلومات خطوط الطول والطول Baidu يتم الحصول عليها من العنوان المهيكلة المفصل للشارع. على سبيل المثال ، نتيجة تحليل العنوان "رقم 27 ، شارع Zhongguancun ساوث ، منطقة هايديان ، بكين" هي "LNG: 116.31985 ، LAT: 39.959836". في الوقت نفسه ، يدعم الترميز الجغرافي أيضًا حلًا مباشرًا للأماكن والمواقع التاريخية والمباني التاريخية والعودة إلى خطوط الطول والخطوط. على سبيل المثال ، نتيجة تحليل العنوان لـ "Baidu Building" هي "LNG: 116.30815 ، LAT: 40.056885". إنها متطلبات استرجاع POI شائعة ، ويوصى باستخدام API Place.
العكسي الجغرافي: أي تحليل العناوين العكسية ، ومعلومات العنوان المهيكلة يتم الحصول عليها من معلومات خطوط الطول والخطوط. على سبيل المثال ، "LAT: 31.325152 ، LNG: 120.558957" نتيجة تحليل العناوين العكسية هي "رقم 318 ، طريق تايوان ، مقاطعة هوكيو ، مدينة سوتشو ، مقاطعة جيانغسو".
عنوان خدمة API: http://api.map.baidu.com/geocoder/v2/
للحصول على معلمات محددة ، يرجى التحقق من الوثائق الرسمية.
مثال: http://api.map.baidu.com/geocoder/v2/؟ak=appliced لمفتاح Baidu والموقع = 34.79563،114.23075222912 & callback = Showlocation & Output
ملحوظات:
(1) تطبيق مفتاح مطور Baidu
(2) نظام إحداثيات Baidu MAP يختلف عن نظام إحداثيات WeChat
(3) عنوان استدعاء API ووصف المعلمة
(4) معنى وظيفة رد الاتصال API
(5) فهم معنى JSON و JSONP
3. WeChat JS-SDK CORE CODE
(1) JSAPI.CS يولد معلمات تكوين JS-SDK ذات الصلة
باستخدام النظام ؛ باستخدام system.globalization ؛ باستخدام system.linq ؛ system.web.security ؛ باستخدام system.web.ui ؛ باستخدام wxpayapi ؛ مساحة الاسم wxjssdk {public class jsapi {/// <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) ؛ // Data. data.setValue ("noncestr" ، wxpayapi.generatenoncester ()) ؛ // string random var url = geturl () ؛ data.setValue ("url" ، url) ؛ var jStoken = getJSapiticket () ؛ data.setValue ("jsapi_ticket" ، jStoken) ؛ var signature = makeinature (jStoken ، data.getValue ("noncestr"). toString () ، data.getValue ("timestamp"). data.setValue ("التوقيع" ، التوقيع) ؛ resultjsdata = البيانات ؛ إرجاع البيانات ؛ } سلسلة خاصة تجعل (String jsapiticket ، سلسلة noncestr ، timestamp ، url سلسلة) {string [] arraylist = {"jsapi_ticket =" + jSapiticket ، "timestamp =" + timestamp ، noncestr = " + noncestr ،" url = " + url} ؛ Array.Sort (ArrayList) ؛ var signature = string.join ("&" ، arraylist) ؛ signature = formsauthentication.hashPasswordforStoringInconFile (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 (). if (token.isvalid ()) return jsauth.getjsapiticket (token.access_token) .ticket ؛ يعود ""؛ } سلسلة خاصة geturl () {string host = page.request.url.host ؛ مسار السلسلة = page.request.path ؛ String QueryString = page.request.url.query ؛ // تجدر الإشارة إلى أن عنوان URL الكامل قد تم نقله إلى خلفية WeChat عندما تسمح صفحة الويب بالحصول على url url url = "http: //" + مضيف + مسار + QueryString ؛ إرجاع عنوان URL ؛ } السلسلة العامة getjsapiparameters () {log.debug (this.gettype (). معلمات السلسلة = resultjsdata.tojson () ؛ log.debug (this.gettype (). معلمات العودة ؛ }}}(2) JSAuthorizeAction.cswechat JS-SDK وظيفة استدعاء API ذات الصلة
باستخدام payment.wxwebhlper ؛ باستخدام payment.wxwebhlper.results ؛ باستخدام النظام ؛ باستخدام WXPayApi ؛ مساحة الاسم WXJSSDK {الفئة العامة jSauthorizeAction {الرمز المميز الخاص بالثبات الثابتة = new tokenresult () {errcode = -1} ؛ jsapiticketresult jsapiticket static static static = new jsapiticketresult () {errcode = -1} ؛ tokenresult getToken () {log.error (this.gettype (). toString () ، "getToken") ؛ if (! token.isvalid ()) {token = getOkenResult () ؛ log.error (this.gettype (). toString () ، token.toString ()) ؛ } إرجاع الرمز ؛ } /// <summary> /// // // </summary> /// <returns> </roverse> tokenResult GetOkenResult () {var result = new tokenresult () ؛ حاول {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.appscret) ؛ var strrrtn = webutils.get (url) ؛ النتيجة = tools.jsonstringToObj <DokenResult> (STRRTN) ؛ } catch (استثناء ex) {log.error (this.gettype (). toString () ، ex.message) ؛ النتيجة = new tokenresult () {errcode = -1086} ؛ } نتيجة الإرجاع ؛ } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <retters> </rovense> public jsapiticketresult getjsapiticket (string token) {log.error (this.gettype (). if (! jsapiticket.isvalid ()) {jSapiticket = getJSapiticketResult (token) ؛ } إرجاع jsapiticket ؛ } /// <summary> /// // // </summary> /// <param name = "token"> </param> /// <returns> </ropressing> jsapiticketresult getjsapitictult (string sten) {jsapiticketresult. حاول {var webUtils = new WebUtils () ؛ var url = string.format ("https://api.weixin.qq.com/cgi-bin/ticket/getticket؟access_token= {0 )&type=jsapi" ، token) ؛ var strrrtn = webutils.get (url) ؛ النتيجة = tools.jsonstringToObj <JsApiticketResult> (strrtn) ؛ } catch (استثناء ex) {log.error (this.gettype (). toString () ، ex.message) ؛ النتيجة = New JSapiticketResult () {errcode = -1086} ؛ } نتيجة الإرجاع ؛ }} الفئة العامة jsapiticketResult: returnResult {/// <summary> /// constructor /// </summary> public jsapiticketresult () {createate = dateTime.Now ؛ } /// <summary> /// // // </summary> تذكرة السلسلة العامة {get ؛ تعيين؛ } /// <summary> //////SECCH_TOKEN INTERFACE CENTRIVE TINESOUT ، الوحدة (ثانية) /// </summary> public int expires_in {get ؛ تعيين؛ } /// <summary> /// create time //// </summary> DateTime Public CreatedAte {get ؛ تعيين؛ } /// <summary> /// تحديد ما إذا كان صالحًا /// </summary> /// <returns> </returns> bool bool public isValid () {if (this.ercode! = 0) return false ؛ var nd = dateTime.Now - CreatedAte ؛ إرجاع nd.seconds <7200 ؛ }} tokenresult الفئة العامة: returnResult {/// <summary> /// constructor /// </summary> public tokenResult () {createate = dateTime.Now ؛ } ///] تعيين؛ } /// <summary> //// access_token interface convent بيانات اعتماد الوقت ، الوحدة (ثانية) /// </summary> public int Expires_in {get ؛ تعيين؛ } /// <summary> /// create time //// </summary> dateTime public createdate {get ؛ تعيين؛ } /// <summary> /// تحديد ما إذا كان صالحًا /// </summary> /// <returns> </returns> bool bool public isValid () {if (this.ercode! = 0) return false ؛ var nd = dateTime.Now - CreatedAte ؛ إرجاع nd.seconds <7200 ؛ }}}(3) WXJSDATA.CS WeChat JS-SDK Class
باستخدام Litjson ؛ باستخدام system.collections.generic ؛ باستخدام system.security.cryptography ؛ باستخدام system.text ؛ باستخدام system.xml ؛ باستخدام WXPayApi ؛ مساحة الاسم WXJSSDK {الفئة العامة WXJSDATA {private sortedDictionary <string ، Object> m_values = new SortedDictionary <string ، Object> () ؛ / *** قم بتعيين قيمة حقل معين* اسم حقل مفتاح param* قيمة حقل القيمة*/ public void setValue (مفتاح السلسلة ، قيمة الكائن) {m_values [key] = value ؛ } / *** احصل على قيمة حقل معين استنادًا إلى اسم الحقل* اسم حقل مفتاح param* قيمة الحقل المرتبطة بالمفتاح* / الكائن العام getValue (مفتاح السلسلة) {Object o = null ؛ m_values.trygetValue (مفتاح ، Out O) ؛ العودة س ؛ } / *** حدد ما إذا كان قد تم تعيين حقل* اسم حقل مفتاح param* return إذا تم تعيين مفتاح الحقل ، وإرجاع صحيح ، وإلا FALSE* / public bool isset (string key) {object o = null ؛ m_values.trygetValue (مفتاح ، Out O) ؛ إذا (NULL! = O) إرجاع صحيح ؛ العودة كاذبة } /*** @convert dictionary to xml* regurn سلسلة xml المحولة* throws wxpayexception ** /toxml toxml () {// لا يمكن تحويلها إلى تنسيق xml (0 == m_values.count) {log.error (this.gettype (). toString () رمي WXPayException جديد ("بيانات WXPayData فارغة!") ؛ } string xml = "<xml>" ؛ foreach (keyvaluepair <string ، object> في m_values) {// لا يمكن أن تكون قيمة الحقل فارغة ، والتي ستؤثر على العملية اللاحقة إذا (pair.value == null) {log.error (this.gettype (). رمي WXPayException جديد ("WXPayData يحتوي على حقول ذات قيمة فارغة!") ؛ } if (pair.value.gettype () == typeof (int) || pair.value.gettype () == typeof (decimal)) {xml + = "<" + pair.key + ">" + pair.value.toString () + "</" + pair.key + ">" ؛ } آخر 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 وإرجاع البيانات داخل الكائن* string string xml ليتم تحويله* @REGANTARANARY التي تم الحصول عليها عن طريق التحويل* throws wxpayexception* / public sortedDictionary <string> fromxml (string xml) {if (string.iSnult log.error (this.gettype (). رمي WXPayException جديد ("ليس من القانوني تحويل سلسلة XML فارغة إلى WXPayData!") ؛ } xmldocument xmldoc = new xmldocument () ؛ XMLDOC.LOADXML (XML) ؛ xmlnode xmlnode = xmldoc.firstchild ؛ // الحصول على عقدة الجذر <xml> xmlnodelist العقد = xmlnode.childnodes ؛ foreach (xmlnode xn في العقد) {xmlelement xe = (xmlelement) xn ؛ m_values [xe.name] = xe.innertext ؛ // احصل على زوج القيمة المفتاح من xml في البيانات داخل wxpaydata} حاول {// 2015-06-29 الخطأ هو أنه لا يوجد أي توقيع إذا (m_values ["return_code"]! = "النجاح") {return m_values ؛ } checksign () ؛ // تحقق من التوقيع ، إذا لم يمر ، فسوف يلقي استثناءً} catch (wxpayexception ex) {رمي wxpayexception جديد (ex.message) ؛ } return m_values ؛ } / *** تنسيق dictionary الذي تم تحويله إلى تنسيق معلمة url* @ سلسلة تنسيق عنوان URL الإرجاع ، لا تحتوي هذه السلسلة على قيمة حقل الإشارة* / السلسلة العامة Tourl () {String Buff = "" ؛ foreach (keyvaluepair <string ، كائن> في m_values) {if (pair.value == null) {log.error (this.gettype (). رمي WXPayException جديد ("WXPayData يحتوي على حقل ذي قيمة فارغة!") ؛ } if (pair.key! = "sign" && pair.value.toString ()! = "") {buff + = pair.key + "=" + pair.value + "&" ؛ }} buff = buff.trim ('&') ؛ إرجاع برتقالي } / *** dictionary تم تنسيقه إلى JSON* @REGR JSON STRING DATA* / public string tojson () {string jsonstr = jsonmapper.tojson (m_values) ؛ إرجاع jsonstr. } / ** * values تنسيق النتيجة التي يمكن عرضها على صفحة الويب (لأن صفحة الويب لا يمكنها إخراج السلاسل مباشرة بتنسيق XML) * / السلسلة العامة toprintstr () {String str = "" ؛ foreach (keyvaluepair <string ، كائن> في m_values) {if (pair.value == null) {log.error (this.gettype (). رمي WXPayException جديد ("WXPayData يحتوي على حقول ذات قيمة فارغة!") ؛ } str += string.format ("{0} = {1} <br>" ، pair.key ، pair.value.toString ()) ؛ } log.debug (this.gettype (). toString () ، "print in web page:" + str) ؛ إرجاع شارع } /*** @generate توقيع ، راجع خوارزمية توليد التوقيع للحصول على تفاصيل* @توقيع RETURN ، لا يشارك حقل الإشارة في Signature* /Public String Makeins () {// تحويل تنسيق url string str = tourl () ؛ // إضافة API بعد مفتاح السلسلة str + = "& key =" + wxpayconfig.key ؛ // MD5 Encryption var md5 = md5.create () ؛ var bs = md5.computehash (encoding.utf8.getBytes (str)) ؛ var sb = new StringBuilder () ؛ foreach (byte b in bs) {sb.append (b.ToString ("x2")) ؛ } // يتم تحويل جميع الأحرف إلى نتيجة سلسلة كبيرة = sb.toString (). toupper () ؛ نتيجة العودة } السلسلة العامة makeAppSign () {// تحويل تنسيق url string str = tourl () ؛ // إضافة API بعد مفتاح السلسلة str + = "& key =" + wxpayconfig.keyofapp ؛ // MD5 Encryption var md5 = md5.create () ؛ var bs = md5.computehash (encoding.utf8.getBytes (str)) ؛ var sb = new StringBuilder () ؛ foreach (byte b in bs) {sb.append (b.ToString ("x2")) ؛ } // يتم تحويل جميع الأحرف إلى نتيجة سلسلة كبيرة = sb.toString (). toupper () ؛ نتيجة العودة } /**** تحقق مما إذا كان التوقيع صحيحًا* إرجاع TRUE بشكل صحيح ، ورمي خطأ استثناء* /Bublic Bool ChecksIns () {// إذا لم يتم تعيين توقيع ، تخطي الكشف إذا كان (! رمي WXPayException جديد ("توقيع WXPayData موجود ولكنه ليس قانونيًا!") ؛ } // إذا تم تعيين التوقيع ولكن التوقيع فارغ ، يتم طرح استثناء إذا (getValue ("sign") == null || getValue ("sign"). tostring () == "") {log.error (this.gettype (). رمي WXPayException جديد ("توقيع WXPayData موجود ولكنه ليس قانونيًا!") ؛ } // الحصول على سلسلة التوقيع المستلمة return_sign = getValue ("sign"). toString () ؛ // حساب التوقيع الجديد String محليًا cal_sign = makeign () ؛ if (cal_sign == return_sign) {return true ؛ } log.error (this.gettype (). رمي WXPayException جديد ("WXPayData Signature التحقق من خطأ!") ؛ } / ** * 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.
تم تجميع هذه المقالة في "ملخص لمهارات تطوير JavaScript WeChat" ، والجميع مرحب بهم للتعلم والقراءة.
أوصي بتعليمي حول تطبيقات WeChat التي تهتم للغاية الآن: قام محرر "برنامج تطوير برنامج WeChat Mini" بتجميعه بعناية للجميع ، وآمل أن يعجبك ذلك.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.