程序ajax请求公共组件app-jquery-http.js中url参数部分的项目应用
结合微信登录以及微信支付的案例:= =||| (案例比较奇葩复杂)
简述项目流程:
1.获取用于公众号支付的openid(公众平台):在微信内置浏览器中打开网页链接,刚进入页面就通过微信公众平台获取该微信用户的code,拿到code传给后台,换取用户的openid。
2.微信登录(开放平台):微信登录通过微信开放平台,由于第一步公众平台拿到的code会混淆开放平台的code,导致用户使用微信登录失败,就需要使用该插件将url参数重置。
3.微信支付(公众平台):像后台传输步骤一获取的openid,以及其他参数,完成微信公众号支付。
代码如下:
1.获取用于公众号支付的openid:
$(function() {
function isWeiXin() { //判断是否为微信环境
var ua = window.navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i) == 'micromessenger') {
return true;
} else {
return false;
}
}
if(isWeiXin()) { //只在微信环境中获取openid,普通的浏览器也获取不到啊!
var openid = $.cookie("geekbar_weixinid"); // Jquery-cookie插件用于存储获取到的openid,一开始这里肯定是null。
if(openid != null && openid != '') {
return;
}
var code = $.HTTP.getUrlParam("code"); //获取当前页面链接中的参数code!一开始这里肯定是null。
if(code == undefined || code == null) {
var sendUrl = location.href; //redirect_uri(授权后重定向的回调链接地址):当前页面。
sendUrl = $.HTTP.setUrlParam(sendUrl,"xz","public"); //给当前页面的url添加一个参数xz=public,提示是公众平台,避免与开放平台搞混淆。
//拼接后的地址(例):www.baidu.com?xz=public,对链接本身没有任何影响。
sendUrl =encodeURIComponent(sendUrl); //处理该地址为格式要求的样式,点击查看微信公众平台文档要求。
//var sendUrl = encodeURIComponent(location.href);
var requrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=' +
sendUrl + '&response_type=code&scope=snsapi_base&state=wx#wechat_redirect';
location.href = requrl; //刷新后页面链接后便拼接了公众平台获取的code,同时进入else
return;
} else {
$.ajax({
url: '../common/user/wx/getopenid?code=' + code, //将公众平台code传给后台,获取用于公众号支付的openid
success: function(data) {
$.cookie("geekbar_weixinopenid", data.data, { //成功后将openid(代码中的data.data)存入缓存中去。使用jquery-cookie插件。
expires: 1
});
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
var info = "XMLHttpRequest:" + JSON.stringify(XMLHttpRequest) +
" ;textStatus:" + textStatus + "; errorThrown:" +
JSON.stringify(errorThrown) + "; 【" + opt.url + "】";
alert(info);
if(opt.error != undefined)
opt.error(XMLHttpRequest, textStatus, errorThrown);
else {
console.error("请求错误", "系统发生请求错误,请联系管理员解决。");
}
}
});
}
} else {
console.log("当前环境不是微信环境")
}
});
2.微信登录(开放平台)
$("#wchartLogin").on("click", function() { var sendUrl = location.href; //受到步骤一的影响,页面链接后拼接的是公众平台获取的code,xz参数。即xxxx.jsp?code=publiccode&xz=public&state=wx
sendUrl = $.HTTP.setUrlParam(sendUrl, "xz", "open"); //重置xz参数:xxxx.jsp?code=publiccode&xz=open&sate=wx
sendUrl = $.HTTP.deleteUrlParam(sendUrl, "code"); //删除公众平台code参数:xxxx.jsp?xz=open&state=wx (最为重要,是混淆开放平台code的元凶!)
sendUrl = $.HTTP.deleteUrlParam(sendUrl, "state"); //删除state参数:xxxx.jsp?xz=open
sendUrl = $.HTTP.setUrlParam(sendUrl, "ls", "wx"); //增添ls参数:xxxx.jsp?xz=open&ls=wx (后台设置的,没有此参数不行)
sendUrl = encodeURIComponent(sendUrl); //处理成redirect_uri的标准格式。
requrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=' + sendUrl + '&response_type=code&scope=snsapi_login&state=wx#wechat_redirect';
location.href = requrl; //就可以成功登录了!
return;
});
3.微信支付(公众平台):
<input type="radio" value="WeiXinPub" name="payType" checked="checked">
<script>
$(function(){
$("#payFBtn").on("click",function(){
var payType=$("#payChooseList input[name=payType]:checked").val();
if(payType==undefined||payType==null||payType==''){
alert("请选择支付类型!");
return;
}
pay('{{orderNo}}',payType);
}) })
</script>
function pay(orderNo, payChannel) {
$.HTTP.obj({
url: "../rest/order/pay",
ajaxData: {
orderNo: orderNo,
payChannel: payChannel,
wxOpenId: $.cookie("geekbar_weixinid"), //将获取到的公众平台的openid传给后台。只有有用户openid才能支付。
success_url: encodeURI(location.href)
},
success: function(data) {
if(data) {
switch(payChannel) {
case "AlipayWap":
var pos = JSON.stringify(data);
pingpp.createPayment(pos, function(result, err) {
alert(result);
alert(err.msg);
alert(err.extra);
if(result == "success") {
} else if(result == "cancel") {
}
});
break;
case "WeiXinPub":
var pos = JSON.stringify(data);
pingpp.createPayment(pos, function(result, err) {
/*alert(result);
alert(err.msg);
alert(err.extra);*/
if(result == "success") {
//alert(result);
} else if(result == "fail") {
alert(err.msg);
// charge 不正确或者微信公众账号支付失败时会在此处返回
} else if(result == "cancel") {
// 微信公众账号支付取消支付
result = '您已取消支付';
alert(result);
}
});
break;
}
} else {
alert("支付异常");
}
}
})
}
程序ajax请求公共组件app-jquery-http.js中url参数部分的项目应用的更多相关文章
- 程序ajax请求公共组件-- app-jquery-http.js
$.HTTP = { getUrlParam : function (name) { var reg = new RegExp ("(^|&)" + name + &quo ...
- 程序ajax请求公共组件:app-jquery-http.js
// --------网络操作-------------------- $.HTTP = { getUrlParam : function(name) { var reg = new RegExp(& ...
- jquery或js 获取url参数
<script type="text/javascript"> function getUrlParam(name) { var reg = new RegExp(&q ...
- jquery截取地址栏中url参数的值
<script> /*http://127.0.0.9/index.php?s=/Home/Index/fangguan_shuju&zc=2*/ function getQuer ...
- Ajax请求(二)--JQuery的Ajax请求方法
JQuery库的Ajax请求的几种方法: 1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. 参数含义: url (String ...
- 2.jquery在js中写标准的ajax请求
$(function(){ $.ajax({ url:"http://www.microsoft.com", //请求的url地址 dataType:"json" ...
- 文件上传时jquery.form.js中提示form.submit SCRIPT5: 拒绝访问
利用其它控件触发file的click事件来选择文件后,使用jquery.form.js中的submit方法提交时IE报错:form.submit SCRIPT5: 拒绝访问,其它浏览器正常, < ...
- jquery.fileupload-image-editor.js 中actions.resizeImage
https://github.com/ChuckForkJS/jQuery-File-Upload/blob/master/js/jquery.fileupload-image-editor.js a ...
- 详解Ajax请求(三)——jQuery对Ajax的实现及serialize()函数对于表单域控件参数提交的使用技巧
原生的Ajax对于异步请求的实现并不好用,特别是不同的浏览器对于Ajax的实现并不完全相同,这就意味着你使用原生的Ajax做异步请求要兼顾浏览器的兼容性问题,对于java程序员来讲这是比较头疼的事情, ...
随机推荐
- wpf之数据触发器DataTrigger
wpf, 根据绑定的属性的值的不同(数据分类),界面上显示不同的控件(绑定不同类型的属性),可以使用数据库触发器DataTrigger实现这一功能. 实现的效果如下: 首先建立实体类: 更改通知类: ...
- 【一题多解】 map 二分 hash trie poj 2503
各种方式解这道题!! 利用map 超时了 #include <iostream> #include <string> #include <map> using na ...
- oracle 锁表的处理。
最近系统每天经常锁表,进程杀死后,很快再次锁住这个表. (一)先贴出现场处理死锁的步骤. 另外:有时候通过PL/SQL执行kill session可能仍然无法解锁,此时需要登陆到Oracle服务器将进 ...
- combo扩展:禁止手工改变输入框的值
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- ubuntu 常用命令记录
1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功登陆后,可以进入相应的用户环境. 退出当前shel ...
- javascript语句语义大全(1)
1. <script></script> javascript标签对,所有javascript内容都会写在这个里面 2. var a=0; var a; 变量的声明,上面的是声 ...
- World Finals 1996 Uva 247 (Floyd求闭包)
思路:用Floyd求传递闭包. 附:逗号后的空格没看到,WA了好多次…….还有就是强连通分量也可以做,但是对这个题来说太麻烦,而且不方便输出,. 代码如下: #include<iostream& ...
- POJ 1523 SPF (去掉割点能形成联通块的个数)
思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...
- android touchEvent事件学习
学习网址:http://www.apkbus.com/forum.php?mod=viewthread&tid=44296 1:Android Touch事件传递机制解析 android系统中 ...
- Linux系统编程读书笔记
文件I/O模型 Linux的哲学思想,一切皆文件,这也是Linux文件操作的方便之处.系统调用不会分配缓冲区用以返回信息给调用者.所以必须提前分配大小合适的缓冲区并将缓冲区指针传递给系统调用. 1.o ...