新普金娱乐网址


后来地理,我收获了全世界的祝福

一位交大学子,对高中生的9个忠告(深度好文)

微信JS-SDK坐标地方转换为百度地图坐标地理

  • 二月 09, 2019
  • 地理
  • 没有评论

这几天总是在想“十年”那么些词!

微信JS-SDK开发进度中,使用getLocation获取坐标地点,怎么样将微信获取的坐标直接运用到百度地图中,呈现以下职能:

十年前已经不是1997年了,而是二零零七年。

地理 1

瞬一挥间,十年大约。

证实:灰色图标是从微信转换过来的地点,青色图标是常见地方。首先从微信支付流程讲解。

茫茫宇宙中的大千世界在时间的洪流里如灰尘一般渺小脆弱

1、微信JS-SDK开发文档

首先进入官网的声援文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN

可对文档举行详尽的研读,要收获地方音讯,分以下步骤:

第一步:绑定域名

跻身微信公众号,找到“公众号设置”菜单,进入“效用设置”面板,

地理 2

点击“设置”可安装引用js的相关域名:

地理 3

第二步:引用官方js类库

在急需调用JS接口的页面引入如下JS文件,(援救https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

引用页面是location.aspx,如下:

<%@ Page Title="获取位置" Language="C#" AutoEventWireup="true" MasterPageFile="~/wxcrm/Site.Master" CodeFile="location.aspx.cs" Inherits="DTcms.Web.wxcrm.location" %>

<asp:Content ID="Content1" ContentPlaceHolderID="cphHead" runat="server">
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script type="text/javascript">
        $("#mask").show();
        wx.config({
            debug: false, //开启调试模式,如为true,则弹出每个js函数调用情况
            appId: '<%= ResultJsData.GetValue("appid") %>', //必填,公众号的唯一标识
            timestamp: <%= ResultJsData.GetValue("timestamp") %>, //必填,生成签名的时间戳
            nonceStr: '<%= ResultJsData.GetValue("noncestr") %>', //必填,生成签名的随机串
            signature: '<%= ResultJsData.GetValue("signature") %>', //必填,签名
            jsApiList: [
                'checkJsApi',
                'onMenuShareTimeline',
                'onMenuShareAppMessage',
                'onMenuShareQQ',
                'onMenuShareWeibo',
                'hideMenuItems',
                'showMenuItems',
                'hideAllNonBaseMenuItem',
                'showAllNonBaseMenuItem',
                'translateVoice',
                'startRecord',
                'stopRecord',
                'onRecordEnd',
                'playVoice',
                'pauseVoice',
                'stopVoice',
                'uploadVoice',
                'downloadVoice',
                'chooseImage',
                'previewImage',
                'uploadImage',
                'downloadImage',
                'getNetworkType',
                'openLocation',
                'getLocation',
                'hideOptionMenu',
                'showOptionMenu',
                'closeWindow',
                'scanQRCode',
                'chooseWXPay',
                'openProductSpecificView',
                'addCard',
                'chooseCard',
                'openCard'
            ]
        });
        wx.ready(function(){
            wx.checkJsApi({
                jsApiList: [
                    'getNetworkType',
                    'previewImage',
                    'getLocation'
                ],
                success: function (res) {
                }
            });
            wx.getLocation({
                type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
                success: function (res) {
                    try {
                        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                        var speed = res.speed; // 速度,以米/每秒计
                        var accuracy = res.accuracy; // 位置精度
                        //alert(JsonUti.convertToString(res));
                        //wx.openLocation({
                        //    latitude: res.latitude, // 纬度,浮点数,范围为90 ~ -90
                        //    longitude: res.longitude, // 经度,浮点数,范围为180 ~ -180。
                        //    name: '当前位置', // 位置名
                        //    address: '点击查看', // 地址详情说明
                        //    scale: 28, // 地图缩放级别,整形值,范围从1~28。默认为最大
                        //    infoUrl: "location1.aspx?m=Home&c=Index&a=getlocation&latitude="+latitude+"&longitude="+longitude // 在查看位置界面底部显示的超链接,可点击跳转
                        //});
                        //alert(latitude+"-"+longitude);
                        $("#mask").hide();
                        window.location.href = "location1.aspx?m=Home&c=Index&a=getlocation&latitude=" +
                            latitude +
                            "&longitude=" +
                            longitude +
                            "&=speed" +
                            speed +
                            "&accuracy=" +
                            accuracy;
                    } catch (e) {
                        alert(e.message);
                    }
                },
                cancel: function (res) {
                    window.location.href="none.aspx?msg=拒绝获取地理位置&r=" + Math.random();//拒绝
                },
                fail:function() {
                    alert("未能获取地理位置!首先检查手机是否启用微信定位。");
                }
            });
        });

        wx.error(function(res) {
            // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
        });

        wx.fail(function(res) {
        });
    </script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="cphTitle" runat="server">
    获取位置
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="cphContainer" runat="server">
    <br />
    <br />
    <center style="display: block;">

        <i class="weui_icon_msg weui_icon_info"></i>

        <div class="input_errow" style="width: 60%; height: 60%; text-align: center;">
            正在获取地理位置信息...
        </div>
    </center>

    <div class="mask" style="display: none;">

            <img src="/templates/txwapmask.gif" />

    </div>
</asp:Content>

页面效果:

地理 4地理 5

注意事项:

(1)要是手机安装不容许微信获取地点新闻,则提示以上音信。

(2)上图参数获取的是GPS坐标,如使用百度地图,要做一定转换,将在location1.aspx中反映。

(3)所有需求动用JS-SDK的页面必须先注入配置新闻,否则将无法调用。

对应location.aspx.cs实现:

using Payment.WxWebHlper;
using Payment.WxWebHlper.Actions;
using System;
using System.Globalization;
using WxJsSDK;
using WxPayAPI;

namespace DTcms.Web.wxcrm
{
    public partial class location : PageBase
    {
        protected string appId { get; set; }
        protected string timestamp { get; set; }
        protected string nonceStr { get; set; }
        protected string signature { get; set; }
        public static string WxJsApiParam { get; set; }
        public WxJsData ResultJsData { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            JudgeCode();
            var webAuthorize = new WebAuthorizeAction();
            Code2TokenResult = webAuthorize.Code2Token(Request["code"]);
            if (Code2TokenResult.HasError())
            {
                Response.Redirect(Urls.PageOfLocation);
                GotoNonePage("获取用户凭证失败,请重新获取");
                return;
            }
            GetUserInfoResult = webAuthorize.GetUserInfo(Code2TokenResult.access_token);
            if (GetUserInfoResult.HasError())
            {
                GotoNonePage("获取用户信息失败,请重新获取");
            }
            var userid = wxOperation.HasBind(GetUserInfoResult.openid);
            if (userid.Equals(Guid.Empty))
            {
                Response.Redirect(Urls.Oauth2Url);
                GotoNonePage("微信用户未绑定");
            }

            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、将微信GPS坐标转换为百度坐标

微信获取坐标成功后,页面自动跳转到location1.aspx,处理流程如下:

地理,微信坐标—>转换为百度地图坐标—>依据百度地图API获取地方音讯—>依据百度地图API展现坐标

<%@ Page Title="在线签到" 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-scalable=no" />
    <style type="text/css">
        #allmap { width: 100%; height: 300px; }
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=dhRLKMR9QUO4wHmnnSZTarta"></script>
    <script type="text/javascript">
        //GPS坐标
        var yy = <%= this.Request["longitude"] %>; //经度,浮点数,范围为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&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();
                return;
            }
            //JsonUti.convertToString(msg);
            bxx = msg.result[0].x;
            byy = msg.result[0].y;
            doOptions();
        }

        function getBaiduPosition() {
            var url ="http://api.map.baidu.com/geoconv/v1/?coords="+yy+","+xx+"&from=1&to=5&ak=dhRLKMR9QUO4wHmnnSZTarta";
            $.ajax({
                url: url,
                success: function(data,status,xhr) {
                    alert(status);
                    alert(data.status);
                },
                dataType: json
            });
        }

        var ADVANCED_POST = '';
        var advancedOptions = '';
        var address;
        var map;

        function renderOption(response) {
            var html = '';
            if (response.status ) {
                $("#mask").hide();
                var text = "无正确的返回结果!";
                alert(text);
                return;
            }
            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>坐标:纬度: ' + location.lat + "  经度: " + location.lng+'<br />';
            html += '精度: '+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>'; //将该链接设置成可单击
            // 百度地图API功能
            map = new BMap.Map("allmap");
            var point = new BMap.Point(bxx, byy);
            var marker = new BMap.Marker(point);  // 创建标注
            map.addOverlay(marker);              // 将标注添加到地图中
            map.centerAndZoom(point, 100);
            var opts = {
                width: 200,     // 信息窗口宽度
                height: 100,     // 信息窗口高度
                title: "我的位置", // 信息窗口标题
                enableMessage: true,//设置允许信息窗发送短息
                message: result.formatted_address
            }

            $("#divPo").html("当前位置:" + result.formatted_address);
            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), // 指定定位位置
                imageOffset: new BMap.Size(0, 0 - 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(marker);               // 将标注添加到地图中
                addClickHandler(name,addr,marker);
            }

            $("#mask").hide();
            $("#btnSign").show();
            return;
        }

        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,     // 信息窗口宽度
                height: 100,     // 信息窗口高度
                title: name, // 信息窗口标题
                enableMessage: true,//设置允许信息窗发送短息
                message: 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&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">
    在线签到
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="cphContainer" runat="server">
    <form id="frmLocation" runat="server">
        <div class="box mb50">
            <div class="hd">位置信息</div>
            <div class="bd" style="padding-left: 0">
                <ul class="stipx" style="height: 300px;">
                    <div id="allmap"></div>
                </ul>
            </div>
            <div class="bd" style="padding-left: 0">
                <ul class="stipx">
                    <div id="divPo"></div>
                </ul>
            </div>
        </div>
        <div class="next_btn" style="text-align: center; margin-top: -50px;">
            <input id="btnSign" type="button" value="我要签到" style="cursor: pointer; width: 210px; height: 50px; border-radius: 15px; background-color: #00CD00; border: 0px #FE6714 solid; cursor: pointer; color: white; font-size: 16px;" />
        </div>
        <div class="mask" style="display: none;">

                <img src="/templates/txwapmask.gif" />

        </div>
    </form>
</asp:Content>

本页面主要涉嫌到百度地图开放平台,要申请百度地图ag。否则调用js则提醒:APP不设有,AK有误请重新检查在重试。

(1)百度地图技术一:坐标转换API

官网地址:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition

API服务地方:http://api.map.baidu.com/geoconv/v1/?

地理 6

文档有详尽的证实,不再赘述哦。

(2)百度地图技术二:依照坐标获取地方

官网网址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

地理 7

Geocoding API包涵地点解析和逆地址解析效用:

地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度音讯,例如:“上海市海淀区中关村南马路27号”地址解析的结果是“lng:116.31985,lat:39.959836”。同时,地理编码也支撑名胜古迹、标志性建筑名称直接解析重返百度经纬度,例如:“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885”
,通用的POI检索须求,指出利用Place API。

逆地理编码:即逆地址解析,由百度经纬度信息获取结构化地址新闻,例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“云南省苏州市吴江区塔园路318号”。

API服务地点:http://api.map.baidu.com/geocoder/v2/

现实参数可查阅官方文档。

示例:http://api.map.baidu.com/geocoder/v2/?ak=申请的百度KEY&location=34.79563,114.23075222912&callback=showLocation&output=xml&pois=1

地理 8

注意事项:

(1)百度开发者key申请

(2)百度地图坐标种类与微信的坐标连串差异

(3)api调用地址及参数表达

(4)api回调函数意义

(5)精通json与jsonp的意义,详情查看:http://kb.cnblogs.com/page/139725/

那种系念时间流逝的阶段怎么着时候才能过去,

3、微信JS-SDK要旨代码

(1)JsAPI.cs生成相关JS-SDK配置参数

using System;
using System.Globalization;
using System.Linq;
using System.Web.Security;
using System.Web.UI;
using WxPayAPI;

namespace WxJsSDK
{
    public class JsApi
    {
        /// <summary>
        /// 保存页面对象,因为要在类的方法中使用Page的Request对象
        /// </summary>
        private Page page { get; set; }

        public WxJsData ResultJsData { get; set; }

        /// <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);//公众账号ID
            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 = MakeSignature(jsToken, data.GetValue("noncestr").ToString(), data.GetValue("timestamp").ToString(), url);
            data.SetValue("signature", signature);

            ResultJsData = data;
            return data;
        }

        private string MakeSignature(string jsapiTicket, string noncestr, 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.HashPasswordForStoringInConfigFile(signature, "SHA1").ToLower();
            return signature;
        }

        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())
                return jsAuth.GetJsApiTicket(token.access_token).ticket;
            return "";
        }

        private string GetUrl()
        {
            string host = page.Request.Url.Host;
            string path = page.Request.Path;
            string queryString = page.Request.Url.Query;
            //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url
            string url = "http://" + host + path + queryString;
            return url;
        }

        public string GetJsApiParameters()
        {
            Log.Debug(this.GetType().ToString(), "JsApi ::GetJsApiParam is processing...");

            string parameters = ResultJsData.ToJson();

            Log.Debug(this.GetType().ToString(), "Get JsApi : " + parameters);
            return parameters;
        }
    }
}

(2)JsAuthorizeAction.cs微信JS-SDK相关API调用函数

using Payment.WxWebHlper;
using Payment.WxWebHlper.Results;
using System;
using 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 = GeTokenResult();
                Log.Error(this.GetType().ToString(), Token.ToString());
            }
            return Token;
        }

        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        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={0}&secret={1}", WxPayConfig.APPID, WxPayConfig.APPSECRET);
                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 GetJsApiTicket(string token)
        {
            Log.Error(this.GetType().ToString(), "GetJsApiTicket传入token:" + token);
            if (!JsApiTicket.IsValid())
            {
                JsApiTicket = GetJsApiTicketResult(token);
            }
            return JsApiTicket;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        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}&type=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>
        /// 构造函数
        /// </summary>
        public JsApiTicketResult()
        {
            CreateDate = DateTime.Now;
        }

        /// <summary>
        ///
        /// </summary>
        public string ticket { get; set; }

        /// <summary>
        /// access_token接口调用凭证超时时间,单位(秒)
        /// </summary>
        public int expires_in { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateDate { get; set; }

        /// <summary>
        /// 判断是否有效
        /// </summary>
        /// <returns></returns>
        public bool IsValid()
        {
            if (this.errcode != 0)
                return false;
            var nd = DateTime.Now - CreateDate;
            return nd.Seconds < 7200;
        }
    }

    public class TokenResult : ReturnResult
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public TokenResult()
        {
            CreateDate = DateTime.Now;
        }

        /// <summary>
        /// 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
        /// </summary>
        public string access_token { get; set; }

        /// <summary>
        /// access_token接口调用凭证超时时间,单位(秒)
        /// </summary>
        public int expires_in { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateDate { get; set; }

        /// <summary>
        /// 判断是否有效
        /// </summary>
        /// <returns></returns>
        public bool IsValid()
        {
            if (this.errcode != 0)
                return false;
            var nd = DateTime.Now - CreateDate;
            return nd.Seconds < 7200;
        }
    }
}

(3)WxJsData.cs微信JS-SDK参数类

using LitJson;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
using WxPayAPI;

namespace WxJsSDK
{
    public class WxJsData
    {
        private SortedDictionary<string, object> m_values = new SortedDictionary<string, object>();
        /**
       * 设置某个字段的值
       * @param key 字段名
        * @param value 字段值
       */

        public void SetValue(string key, object value)
        {
            m_values[key] = value;
        }

        /**
        * 根据字段名获取某个字段的值
        * @param key 字段名
         * @return key对应的字段值
        */

        public object GetValue(string key)
        {
            object o = null;
            m_values.TryGetValue(key, out o);
            return o;
        }

        /**
         * 判断某个字段是否已设置
         * @param key 字段名
         * @return 若字段key已被设置,则返回true,否则返回false
         */

        public bool IsSet(string key)
        {
            object o = null;
            m_values.TryGetValue(key, out o);
            if (null != o)
                return true;
            return false;
        }

        /**
        * @将Dictionary转成xml
        * @return 经转换得到的xml串
        * @throws WxPayException
        **/

        public string ToXml()
        {
            //数据为空时不能转化为xml格式
            if (0 == m_values.Count)
            {
                Log.Error(this.GetType().ToString(), "WxPayData数据为空!");
                throw new WxPayException("WxPayData数据为空!");
            }

            string xml = "<xml>";
            foreach (KeyValuePair<string, object> pair in m_values)
            {
                //字段值不能为null,会影响后续流程
                if (pair.Value == null)
                {
                    Log.Error(this.GetType().ToString(), "WxPayData内部含有值为null的字段!");
                    throw new WxPayException("WxPayData内部含有值为null的字段!");
                }

                if (pair.Value.GetType() == typeof(int) || pair.Value.GetType() == typeof(decimal))
                {
                    xml += "<" + pair.Key + ">" + pair.Value.ToString() + "</" + pair.Key + ">";
                }
                else if (pair.Value.GetType() == typeof(string))
                {
                    xml += "<" + pair.Key + ">" + "<![CDATA[" + pair.Value + "]]></" + pair.Key + ">";
                }
                else//除了string和int类型不能含有其他数据类型
                {
                    Log.Error(this.GetType().ToString(), "WxPayData字段数据类型错误!");
                    throw new WxPayException("WxPayData字段数据类型错误!");
                }
            }
            xml += "</xml>";
            return xml;
        }

        /**
        * @将xml转为WxPayData对象并返回对象内部的数据
        * @param string 待转换的xml串
        * @return 经转换得到的Dictionary
        * @throws WxPayException
        */

        public SortedDictionary<string, object> FromXml(string xml)
        {
            if (string.IsNullOrEmpty(xml))
            {
                Log.Error(this.GetType().ToString(), "将空的xml串转换为WxPayData不合法!");
                throw new WxPayException("将空的xml串转换为WxPayData不合法!");
            }

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
            XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
            XmlNodeList nodes = xmlNode.ChildNodes;
            foreach (XmlNode xn in nodes)
            {
                XmlElement xe = (XmlElement)xn;
                m_values[xe.Name] = xe.InnerText;//获取xml的键值对到WxPayData内部的数据中
            }

            try
            {
                //2015-06-29 错误是没有签名
                if (m_values["return_code"] != "SUCCESS")
                {
                    return m_values;
                }
                CheckSign();//验证签名,不通过会抛异常
            }
            catch (WxPayException ex)
            {
                throw new WxPayException(ex.Message);
            }

            return 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的字段!");
                    throw new WxPayException("WxPayData内部含有值为null的字段!");
                }

                if (pair.Key != "sign" && pair.Value.ToString() != "")
                {
                    buff += pair.Key + "=" + pair.Value + "&";
                }
            }
            buff = buff.Trim('&');
            return buff;
        }

        /**
        * @Dictionary格式化成Json
         * @return json串数据
        */

        public string ToJson()
        {
            string jsonStr = JsonMapper.ToJson(m_values);
            return jsonStr;
        }

        /**
        * @values格式化成能在Web页面上显示的结果(因为web页面上不能直接输出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的字段!");
                    throw new WxPayException("WxPayData内部含有值为null的字段!");
                }

                str += string.Format("{0}={1}<br>", pair.Key, pair.Value.ToString());
            }
            Log.Debug(this.GetType().ToString(), "Print in Web Page : " + str);
            return str;
        }

        /**
        * @生成签名,详见签名生成算法
        * @return 签名, sign字段不参加签名
        */

        public string MakeSign()
        {
            //转url格式
            string str = ToUrl();
            //在string后加入API KEY
            str += "&key=" + WxPayConfig.KEY;
            //MD5加密
            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"));
            }
            //所有字符转为大写
            string result = sb.ToString().ToUpper();
            return result;
        }

        public string MakeAppSign()
        {
            //转url格式
            string str = ToUrl();
            //在string后加入API KEY
            str += "&key=" + WxPayConfig.KEYofAPP;
            //MD5加密
            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"));
            }
            //所有字符转为大写
            string result = sb.ToString().ToUpper();
            return result;
        }

        /**
        *
        * 检测签名是否正确
        * 正确返回true,错误抛异常
        */

        public bool CheckSign()
        {
            //如果没有设置签名,则跳过检测
            if (!IsSet("sign"))
            {
                Log.Error(this.GetType().ToString(), "WxPayData签名存在但不合法!");
                throw new WxPayException("WxPayData签名存在但不合法!");
            }
            //如果设置了签名但是签名为空,则抛异常
            if (GetValue("sign") == null || GetValue("sign").ToString() == "")
            {
                Log.Error(this.GetType().ToString(), "WxPayData签名存在但不合法!");
                throw new WxPayException("WxPayData签名存在但不合法!");
            }

            //获取接收到的签名
            string return_sign = GetValue("sign").ToString();

            //在本地计算新的签名
            string cal_sign = MakeSign();

            if (cal_sign == return_sign)
            {
                return true;
            }

            Log.Error(this.GetType().ToString(), "WxPayData签名验证错误!");
            throw new WxPayException("WxPayData签名验证错误!");
        }

        /**
        * @获取Dictionary
        */

        public SortedDictionary<string, object> GetValues()
        {
            return m_values;
        }
    }
}

提醒音讯:相关分析思路可参考微信公众号支付法定SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1

地理 9

提拔:承接微信应用开发,有意者QQ联系2339698190

怎么时候才能坦然的接受有关年龄有关成长关于老去,那样虚无的概念。

可能,一辈子本人都做不到坦然面对。

十年往日您在何处呢?你的那十年过的还行吗?

山寺哥说,二〇〇七年4月,他从上海西站下车,拖着行李,带着一个不切实际的梦,满腔热情又郁郁寡欢地赶来东京市,站在广场上,拍了一张新加坡西站的照片,在京都的十年就从这一阵子发端了。

自己问她,那新加坡十年仍可以吗?

她笑着说,十年前所憧憬的活着,就是后天的家常。

我笑了,真好,梦想照进现实了。

十年像是一个丘陵,也像是一个里程碑。

有时,我会站在单位的落地窗前,望着马路上匆匆而过的游子,想着他们的人生会是怎么的?会和自家一样呢?大部分时候都很干燥,偶尔幸福,更加多的时候只是麻木的被生活推着往前走。

到底的时候,也会想,一辈子实在也就几十年,你看十年不都时而即逝,几十年真没那么长,混掉算了。又以为生而为人挺不便于的,那样不器重太罪过了。

接二连三会想人生有无比种可能,一种生活过腻了,那就再换一种活法。想象着温馨冷静地告别自己前面所有的活着,所有的社会关系,消失在那么些熟稔的地方,跟过去告别,开首别样的活着。转念又摇摇头,另一种所谓高级的活法,太不不难了。或许,用装有世俗的正规来绑定自己,才是最简易的活法吧!

二〇〇七年的圣诞节,我接到的赠礼,堆满了课桌,在校友们羡慕的注目中,我分两批抱回了家。

二零一七年的圣诞节,我陪小孩一起过的,然后自己开车回家。

      那十年间,人情世故我了然越多,却更是不乐意付出真心。

              给爱人发了条微信,”大家认识10年了!“

              她回我,”10年了,谢谢您,还伴随在自我身边!”

            我坐在办公室偷偷抹眼泪!

 

二零零七年,在自身身边有一个人,任凭自己何以窘迫不堪 ,他都视我如宝。

      我曾扬着头告诉她,“I love you don’t because who you are, but
because of who I am when I am with you”

      那时候的自我,多骄傲啊!

      之后的文理分科,理科学霸的她,毅然填了文科,他说想和自家分到一个班。

     
文理分科的考场上,大家都在为分到重点班奋笔疾书,而自己的思路却在发抖,我恐惧和他分到一个班,那一刻我想自己或者早已变心了!

前年,我早就很多年从未见过她,也尚无他任何的新闻,其实他家到我家直线距离不到1000米,失去缘分的人,从此也就不再相见了呢!

那十年间,
在她碰到人生最大变化的时候,他哭着给本人打电话,说自己已经崩溃了,他不敢见任何人,不敢告诉任什么人,他有所的卖力在瞬间倒塌,他说自家是全球唯一不会笑话他落魄的人。那一年,他二十岁,我们专业分手半年。

     
我加入工作的明天,他带我去全市最贵的食堂,祝贺我正式进入社会,成为一名真正意义上的老人。

    他说,那几个世界还可以让他心动的就只有自身了。

    我摇了摇头,笑着告诉她,报应一直都不会缺席,你放心,我会有报应的!

 

2007年,伯公还在,姥爷姥姥也都还陪着本人,汶川大地震也还未曾爆发,很多生命都在大力着。那时的本身根本就不晓得与世长辞表示怎么样,只是一味的以为可怕,什么人家有丧事,我都可能避之不及。

二零一七年,外祖父身故9年,姥爷长逝8年,姥姥驾鹤归西2年,汶川中外震9周年,很三人命都决定消失了很久很久。面对眼花缭乱的丧葬风俗,我一度平静接受,甚至会奇怪。

            有人消逝就有人新生。

那十年间,表弟三哥相继成家,家里多了“好好”和“每天”这三个纯情的新生命。

          “春季花会开“多么热火朝天的一句话,美好的事情也总是会来到!

 

二〇〇七年,我接近哪个地方都没去过,记念中连省都没出过。小时候,爸妈工作很忙,也不爱旅行,我肉体不佳总是晕车。那时候,中央电视台有档节目,叫《正大综艺》,每趟播出,我总会搬着小凳子坐在电视机前,憧憬着外面繁华似锦的社会风气,

2017年,我的足迹踏遍了巨大的地点,我精通自己还会继续下去。

这十年间,我去了不少地点,而且不少时候都是一个人,我欢跃和投机相处,那种痛感很理想一点都不孤独。大多数的人只是用“手”和“嘴”在旅行,但真正的远足应当是用眼睛和大脑。以前,我也是像一个游人一样,上车拍照,下车睡觉,赶行程,逛景点,买东西,朋友圈固定,晒照片。不明了从如曾几何时候起,我会在陌生的都会,看摄像,逛街买衣物,咖啡店看书,认识新情人,和本地人聊天,看看她们的商场气息,像当地人一样生活,哪怕唯有短短几天。有时候走了很远的路,看到青山绿水大门的那一刻,突然不想进了,转头离开也不会以为遗憾,我明日已经完全不会有“来都来了”那样的思索格局了。

Dickens说:“旅行其实并不是那么好玩,但人群是幽默的,唯有人在里头,故事才能有板有眼。”

自己喜欢旅行中认识的恋人,我接连会莫名的以为她们很纯粹,可能我遇到的都是有趣的老实人吗,也可能是因为,旅行不分包柴米油盐家长里短的生活气息,也不包罗勾心斗角的办公气息,每个人都洋溢好奇又巧遇。

人人说,生活不和颜悦色的时候,旅行会是一剂良药,会痊愈所有的难过。它赋予了旅行太高深的意思,所以我从不信那句话,960万平方公里的中华,我走了大多数,可是具有的伤口都未见治愈,所谓的诗和远处,不过是一剂吗啡,去外人家门口寻信仰,寻不到的。

但是,我仍旧喜欢多出来走走,哪怕是做一个博闻强记的赤子也挺好!毕竟自己也是深切热爱着地工学那门科学,就算做不到“上知天文”但间接在忙乎“下知地理”!

十年来,很多政工都变了,但仔细想来,又没怎么变。

我的身高依旧172公分,体重也如故55千克,仍然不希罕戴首饰没有纹身,泪点很低看电影会哭,做了坏事会自责,不太会讲场合话,想有马甲线却无意间训练……….

谢谢2007-2017
那十年里,所有现身在我生命里的人!哪怕你只是个过客,匆匆而来又急疾速忙离去,或者十年了您都还在,我都很感激!谢谢你成自己的十年分之一!

二零零七年 我还在长大!

二零一七年,我早已起来衰老!

早已执剑的少年们,近来是否也混迹在市场之间!

去年了,新的十年开端了!

                                                                 

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图