//微信jssdk配置
wx.config({
debug:false,
appId:"",
timestamp:"@Html.Raw(ViewData["timestamp"])",
nonceStr:"@Html.Raw(ViewData["nonceStr"])",
signature:"@Html.Raw(ViewData["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.error(function(res){
//alert("错误:"+res);
//});
wx.checkJsApi({
jsApiList:[
'getLocation',
],
success:function(res){
if(res.checkResult.getLocation==false){
alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');
return;
}
}
});
wx.ready(function(){
wx.getLocation({
type:'wgs84',//默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success:function(res){
varlatitude=res.latitude;//纬度,浮点数,范围为90~-90
varlongitude=res.longitude;//经度,浮点数,范围为180~-180。
varspeed=res.speed;//速度,以米/每秒计
varaccuracy=res.accuracy;//位置精度
//alert(latitude+"。"+longitude);
//获取到经纬度之后,异步去后台加载出来真实的地理位置
$.post("/App/Common/GetLocation",{lat:latitude,lon:longitude},
function(data){
//把返回回来的地理位置显示在页面的控件里面
$("#txt_dw").val(data);
},'html');
},
cancel:function(res){
alert('用户拒绝授权获取地理位置');
}
});
});
}
2.
///
///微信定位
///
///
publicActionResultWX_Location()
{
#region获取定位所需要的参数
//jssdkJS接口安全域名填写,
//access_token来获取jsapi_ticket
stringticket=GetTicket();
vartimeStamp=TenpayUtil.getTimestamp();
varnonceStr=TenpayUtil.getNoncestr();
//设置参数
RequestHandlerpaySignReqHandler=newRequestHandler(System.Web.HttpContext.Current);
//参数顺序。
paySignReqHandler.setParameter("jsapi_ticket",ticket);
paySignReqHandler.setParameter("noncestr",nonceStr);
paySignReqHandler.setParameter("timestamp",timeStamp);
paySignReqHandler.setParameter("url",Request.Url.AbsoluteUri);//Url#号后不要
//LogHelper.WriteInfoLog("noncestr:"+nonceStr+"。jsapi_ticked:"+ticket+"。timestamp:"+timeStamp+"。url:"+Request.Url.AbsoluteUri+"。");
ViewData["signature"]=paySignReqHandler.createSHA1Sign();
//LogHelper.WriteInfoLog("signature:"+paySignReqHandler.createSHA1Sign());
ViewData["timestamp"]=timeStamp;
ViewData["nonceStr"]=nonceStr;
#endregion
returnView();
}
3.获取地理位置方法
#region获取地理位置
publicActionResultGetLocation(stringlat,stringlon)
{
//23.1294。113.3761
LogHelper.WriteInfoLog(lat+"。"+lon);
stringx=string.Empty,y=string.Empty,strReturn=string.Empty;
#region先把微信经纬度(23.12536。113.36684)转换成百度坐标
stringapiurl="http://api.map.baidu.com/geoconv/v1/?coords="+lon+","+lat+"&from=1&to=5&ak=你的百度地图api密钥";
WebRequestrequest=WebRequest.Create(@apiurl);
request.Method="POST";
WebResponseresponse=request.GetResponse();
Streamstream=response.GetResponseStream();
Encodingencode=Encoding.UTF8;
StreamReaderreader=newStreamReader(stream,encode);
stringdetail=reader.ReadToEnd();
varjd=JsonConvert.DeserializeObject(detail);
Listresult=jd.result;
foreach(variteminresult)
{
x=item.x;
y=item.y;
}
#endregion
#region通过得到的百度坐标进行逆地址解析获取到真实的地理位置
apiurl="http://api.map.baidu.com/geocoder/v2/?ak=8aoCgAGfz0r4MantipNitjI0&callback=renderReverse&location="+y+","+x+"&output=json&pois=1";
#region通过传入的参数得到url请求
request=WebRequest.Create(@apiurl);
request.Method="POST";
response=request.GetResponse();
stream=response.GetResponseStream();
encode=Encoding.UTF8;
reader=newStreamReader(stream,encode);
detail=reader.ReadToEnd();
//@"(?is)(?<=)(.∗)(?=)";//(?is)
//stringresults=System.Text.RegularExpressions.Regex.Replace(detail,@"(?is)(?<=)(.∗)(?=)","$2");
stringresults=Regex.Match(detail,@"(?is)(?<=)(.∗)(?=)").Result("$1");
JsonDatajsondta=JsonMapper.ToObject(results);
JsonDatajdItems=jsondta["result"];
//获取结构化地址信息
strReturn=(String)jdItems["formatted_address"];
LogHelper.WriteInfoLog(strReturn);
#endregion
#endregion
returnContent(strReturn);
}
#endregion
涉及到的相关方法以及类:
1.获取ticket
#regionw微信JS-SDK权限签名
publicstringGetTicket()
{
#region通过appid+appsecert获取公众号的access_token(不是用户的access_token)
stringapiurl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+TenpayUtil.appid+"&secret="+TenpayUtil.appsecret;
#region通过传入的参数得到url请求
WebRequestrequest=WebRequest.Create(@apiurl);
request.Method="POST";
WebResponseresponse=request.GetResponse();
Streamstream=response.GetResponseStream();
Encodingencode=Encoding.UTF8;
StreamReaderreader=newStreamReader(stream,encode);
stringdetail=reader.ReadToEnd();
varjd=JsonConvert.DeserializeObject(detail);
Stringaccess_token=(String)jd.access_token;
Session["access_token"]=access_token;
#endregion
#endregion
#region获取ticket
apiurl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi";
request=WebRequest.Create(@apiurl);
response=request.GetResponse();
stream=response.GetResponseStream();
encode=Encoding.UTF8;
reader=newStreamReader(stream,encode);
detail=reader.ReadToEnd();
jd=JsonConvert.DeserializeObject(detail);
Stringticket=jd.ticket;
Session["ticket"]=ticket;
#endregion
returnticket;
}
#endregion
2.TenpayUtil类
///
///TenpayUtil的摘要说明。
///配置文件
///
publicclassTenpayUtil
{
publicstaticstringtenpay="1";
//财付通商户号
publicstaticstringpartner="";/
//财付通密钥
publicstaticstringkey="";
//微信appsecret
publicstaticstringappsecret="";
//微信appid
publicstaticstringappid="";
//paysignkey(非appkey)
publicstaticstringappkey="";
//支付完成后的回调处理页面,*替换成notify_url.asp所在路径
publicstaticstringtenpay_notify="";
publicTenpayUtil()
{
}
publicstaticstringgetNoncestr()
{
Randomrandom=newRandom();
returnMD5Util.GetMD5(random.Next(1000).ToString(),"GBK");
}
publicstaticstringgetTimestamp()
{
TimeSpants=DateTime.UtcNow-newDateTime(1970,1,1,0,0,0,0);
returnConvert.ToInt64(ts.TotalSeconds).ToString();
}
/**对字符串进行URL编码*/
publicstaticstringUrlEncode(stringinstr,stringcharset)
{
//returninstr;
if(instr==null||instr.Trim()=="")
return"";
else
{
stringres;
try
{
res=HttpUtility.UrlEncode(instr,Encoding.GetEncoding(charset));
}
catch(Exceptionex)
{
res=HttpUtility.UrlEncode(instr,Encoding.GetEncoding("GB2312"));
}
returnres;
}
}
/**对字符串进行URL解码*/
publicstaticstringUrlDecode(stringinstr,stringcharset)
{
if(instr==null||instr.Trim()=="")
return"";
else
{
stringres;
try
{
res=HttpUtility.UrlDecode(instr,Encoding.GetEncoding(charset));
}
catch(Exceptionex)
{
res=HttpUtility.UrlDecode(instr,Encoding.GetEncoding("GB2312"));
}
returnres;
}
}
/**取时间戳生成随即数,替换交易单号中的后10位流水号*/
publicstaticUInt32UnixStamp()
{
TimeSpants=DateTime.Now-TimeZone.CurrentTimeZone.ToLocalTime(newDateTime(1970,1,1));
returnConvert.ToUInt32(ts.TotalSeconds);
}
/**取随机数*/
publicstaticstringBuildRandomStr(intlength)
{
Randomrand=newRandom();
intnum=rand.Next();
stringstr=num.ToString();
if(str.Length>length)
{
str=str.Substring(0,length);
}
elseif(str.Length0)
{
str.Insert(0,"0");
n--;
}
}
returnstr;
}
}
3.RequestHandler类
/**
'签名工具类
============================================================================///
'api说明:
'init();
'初始化函数,默认给一些参数赋值。
'setKey(key_)'设置商户密钥
'createMd5Sign(signParams);字典生成Md5签名
'genPackage(packageParams);获取package包
'createSHA1Sign(signParams);创建签名SHA1
'parseXML();输出xml
'getDebugInfo(),获取debug信息
*
*============================================================================
*/
publicclassRequestHandler
{
publicRequestHandler(HttpContexthttpContext)
{
parameters=newHashtable();
this.httpContext=httpContext;
}
/**密钥*/
privatestringkey;
protectedHttpContexthttpContext;
/**请求的参数*/
protectedHashtableparameters;
/**debug信息*/
privatestringdebugInfo;
/**初始化函数*/
publicvirtualvoidinit()
{
}
/**获取debug信息*/
publicStringgetDebugInfo()
{
returndebugInfo;
}
/**获取密钥*/
publicStringgetKey()
{
returnkey;
}
/**设置密钥*/
publicvoidsetKey(stringkey)
{
this.key=key;
}
/**设置参数值*/
publicvoidsetParameter(stringparameter,stringparameterValue)
{
if(parameter!=null&¶meter!="")
{
if(parameters.Contains(parameter))
{
parameters.Remove(parameter);
}
parameters.Add(parameter,parameterValue);
}
}
//获取package带参数的签名包
publicstringgetRequestURL()
{
this.createSign();
StringBuildersb=newStringBuilder();
ArrayListakeys=newArrayList(parameters.Keys);
akeys.Sort();
foreach(stringkinakeys)
{
stringv=(string)parameters[k];
if(null!=v&&"key".CompareTo(k)!=0)
{
sb.Append(k+"="+TenpayUtil.UrlEncode(v,getCharset())+"&");
}
}
//去掉最后一个&
if(sb.Length>0)
{
sb.Remove(sb.Length-1,1);
}
returnsb.ToString();
}
//创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
protectedvirtualvoidcreateSign()
{
StringBuildersb=newStringBuilder();
ArrayListakeys=newArrayList(parameters.Keys);
akeys.Sort();
foreach(stringkinakeys)
{
stringv=(string)parameters[k];
if(null!=v&&"".CompareTo(v)!=0
&&"sign".CompareTo(k)!=0&&"key".CompareTo(k)!=0)
{
sb.Append(k+"="+v+"&");
}
}
sb.Append("key="+this.getKey());
stringsign=MD5Util.GetMD5(sb.ToString(),getCharset()).ToUpper();
this.setParameter("sign",sign);
//debug信息
this.setDebugInfo(sb.ToString()+"=>sign:"+sign);
}
//创建package签名
publicvirtualstringCreateMd5Sign(stringkey,stringvalue)
{
StringBuildersb=newStringBuilder();
ArrayListakeys=newArrayList(parameters.Keys);
akeys.Sort();
foreach(stringkinakeys)
{
stringv=(string)parameters[k];
if(null!=v&&"".CompareTo(v)!=0
&&"sign".CompareTo(k)!=0&&"key".CompareTo(k)!=0)
{
sb.Append(k+"="+v+"&");
}
}
sb.Append(key+"="+value);
stringsign=MD5Util.GetMD5(sb.ToString(),getCharset()).ToUpper();
returnsign;
}
//创建sha1签名
publicstringcreateSHA1Sign()
{
StringBuildersb=newStringBuilder();
ArrayListakeys=newArrayList(parameters.Keys);
akeys.Sort();
foreach(stringkinakeys)
{
stringv=(string)parameters[k];
if(null!=v&&"".CompareTo(v)!=0
&&"sign".CompareTo(k)!=0&&"key".CompareTo(k)!=0)
{
if(sb.Length==0)
{
sb.Append(k+"="+v);
}
else
{
sb.Append("&"+k+"="+v);
}
}
}
stringpaySign=SHA1Util.getSha1(sb.ToString()).ToString().ToLower();
//debug信息
this.setDebugInfo(sb.ToString()+"=>sign:"+paySign);
returnpaySign;
}
publicstringGetBizSign()
{
DictionarybizParameters=newDictionary();
ArrayListakeys=newArrayList(parameters.Keys);
akeys.Sort();
foreach(stringkinakeys)
{
stringv=(string)parameters[k];
if(!string.IsNullOrEmpty(k))
{
bizParameters.Add(k.ToLower(),v);
}
}
if(!bizParameters.Any(p=>p.Key.ToLower()=="appkey"))
bizParameters.Add("appkey",TenpayUtil.appkey);
stringbizString=FormatBizQueryParaMap(bizParameters,false);
returnSHA1Util.Sha1(bizString);
}
publicstringFormatBizQueryParaMap(DictionaryparaMap,boolurlencode)
{
stringbuff="";
try
{
varresult=frompairinparaMaporderbypair.Keyselectpair;
foreach(KeyValuePairpairinresult)
{
if(pair.Key!="")
{
stringkey=pair.Key;
stringval=pair.Value;
if(urlencode)
{
val=System.Web.HttpUtility.UrlEncode(val);
}
buff+=key.ToLower()+"="+val+"&";
}
}
if(buff.Length==0==false)
{
buff=buff.Substring(0,(buff.Length-1)-(0));
}
}
catch(Exceptione)
{
throwe;
//thrownewSDKRuntimeException(e.Message);
}
returnbuff;
}
//输出XML
publicstringparseXML()
{
StringBuildersb=newStringBuilder();
sb.Append("");
intiIsNumber=0;
foreach(stringkinparameters.Keys)
{
stringv=(string)parameters[k];
if(int.TryParse(v,outiIsNumber))
{
sb.Append("<"+k+">"+v+""+k+">");
}
else
{
sb.Append("<"+k+">"+k+">");
}
}
sb.Append("");
returnsb.ToString();
}
/**设置debug信息*/
publicvoidsetDebugInfo(StringdebugInfo)
{
this.debugInfo=debugInfo;
}
publicHashtablegetAllParameters()
{
returnthis.parameters;
}
protectedvirtualstringgetCharset()
{
returnthis.httpContext.Request.ContentEncoding.BodyName;
}
}
4.实体
#region微信sdk
publicpartialclassWX_JSSDK
{
publicstringaccess_token{get;set;}
publicstringticket{get;set;}
}
#endregion
#region百度坐标转换
publicpartialclassBaiDuCoordinates
{
publicstringstatus{get;set;}
publicListresult{get;set;}
}
publicpartialclassbc_result
{
publicstringx{get;set;}
publicstringy{get;set;}
}
#endregion
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。