纯 js 实现跨域接口调用 jsonp
开发「bufpay.com 个人即时到账收款平台」的时候,支付页面需要 poll轮询 查询订单状态。
bufpay 支付接口如下:
接口地址:https://bufpay.com/api/pay/aid (在后台应用配置页面查看)
调用方法:POST
调用参数:
- name, 必填, 订单销售商品名称
- pay_type, 必填, 支付方式(可选alipay/wechat)
- price, 必填, 订单价格
- order_id, 必填, 订单号
- order_uid, 必填, 订单购买用户(可以为空字符串,但是建议设置为购买用户编号,便于后续对账)
- notify_url, 必填, 支付成功后回调地址
- return_url, 必填, 支付成功后前台跳转地址(可以为空字符串)
- sign, 必填, 将参数按 name + pay_type + price + order_id + order_uid + notify_url + return_url + app secret 顺序拼接后 MD5 注意:使用该接口的建议方法是:在你的产品付款接口后台构造好上面的参数,然后渲染一个自动提交的 form 返回给用户浏览器,
用户浏览器会 post 这些参数到 BufPay,然后就会显示支付页面;
如果 api 后面加 ?format=json 那么返回结果就是 json 格式的,需要开发者自己展示付款二维码。
支付页面设计之初就是在 bufpay.com 域名下面,如果要自己渲染支付页面就指定接口返回的内容为 json。
但是有些开发者是后台直接请求支付页面,然后把支付页面的 html 的内容直接在自己的域名下面渲染给用户,这样,在开发者自己的域名下面,支付页面调用 bufpay.com 的订单查询接口就会出现跨域问题。
Failed to load https://bufpay.com/: Redirect from 'https://bufpay.com/' to 'https://www.bufpay.com/' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://bufpay.com' is therefore not allowed access.
为了避免这种问题,我们需要修改接口支持 jsonp 调用, 在服务端增加:
cb = self.get_argument('callback', None)
if cb:
return self.write('%s(%s)' % (cb, json.dumps({'status': od['status'] if od else 'not_exist'})))
callback 参数判断,如果传了 callback 参数,就把原本为 json 的格式转换成 callback(json) 这样。
然后客户端修改,自己实现 jsonp 请求(如果是jQuery就比较简单):
var $jsonp = (function(){
var that = {};
that.send = function(src, options) {
var callback_name = options.callbackName || 'callback',
on_success = options.onSuccess || function(){},
on_timeout = options.onTimeout || function(){},
timeout = options.timeout || 10; // sec
var timeout_trigger = window.setTimeout(function(){
window[callback_name] = function(){};
on_timeout();
}, timeout * 1000);
window[callback_name] = function(data){
window.clearTimeout(timeout_trigger);
on_success(data);
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = src;
document.getElementsByTagName('head')[0].appendChild(script);
}
return that;
})();
调用的时候就:
$jsonp.send("https://bufpay.com/api/query/{{aoid}}?callback=cb&_=" + new Date().getTime(), {
callbackName: 'cb',
onSuccess: function(ret){
//do something
}
});
这样就解决了跨域问题。
插播广告,BufPay 支付平台,个人支付接口
纯 js 实现跨域接口调用 jsonp的更多相关文章
- js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug
URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ...
- JS实现跨域请求数据--jsonp
* { margin: 0; padding: 0; } input { width: 300px; height: 30px; border: 1px solid lightgray; margin ...
- JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...
- js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)
一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限 ...
- 跨域解决方案之JSONP,通过借助调用百度搜索的API了解跨域案例
跨域解决方案之JSONP 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web ...
- JSONP跨域数据调用
引自:http://kb.cnblogs.com/page/139725/ Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如& ...
- js跨域交互之jsonp - 看完就能让你了解jsonp原理 (原)
跨域? 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 同源策略? 一般来说 a.com 的网页无法直接与 b.com的服务器沟通, 浏览器的同源策略限制从一个源加载的文档或脚本 ...
- js跨域请求(jsonp)
jsonp是跨域请求的手段之一. jsonp的原理: 先来看看下面这段代码 <!DOCTYPE html> <html lang="en"> <hea ...
- 使用JSONP进行跨域Ajax 调用
JSONP 是啥 JSONP 全称是JSON with Padding. 当需要进行跨域Ajax 调用的时候, 需要用到JSONP 协议. 客户端 $.ajax({ url: 'http://xxx' ...
随机推荐
- 小白学习css记录
一.复习 什么是CSS? 层叠样式表 -层叠样式只会被覆盖而不会被替代 CSS的使用方式 style属性---> <h1 style="css属性"></h ...
- 关于Array的操作
使用Array创建数组 // 使用Array 构造函数 var colors = new Array(); // 预先给数组项数量 var colors = new Array(20); // 向Ar ...
- CentOS 7运维管理笔记(12)----GUI配置工具Webmin的安装
早期的Linux系统管理员或是Web管理员在修改服务器配置时使用最多的就是vi编辑器,但是现在越来越多的基于GUI界面的配置工具出现了,毕竟人们还是喜欢以直接的可视化的方式来修改服务器的配置,而不是再 ...
- layui分页
毕业已经两年,期间经历了很多.一个人欢笑与哭泣,在墙角.在路边.在床上.每天搭乘首班车来到公司,每天无数次反省自己,每天每天再问自己为什么活着. 一.下载并引用css和js 地址:点我 <lin ...
- 浅谈App原生开发、混合开发及HTML5开发的优劣
App混合开发(英文名:Hybrid App),是指在开发一款App产品的时候为了提高效率.节省成本即利用了原生的开发技术还应用了HTML5开发技术,是原生和HTML5技术的混合应用.目前App的开发 ...
- jquery事件绑定函数
1.bind 使用语法: jQueryObject.bind( events [, data ], handler ) jQueryObject.bind( events [, data ] [, i ...
- ASP.NET 4.5 MVC 4 无法在Windows2008的IIS7.0上解决方案
环境 : Windows2008 R2 Standard IIS 7.5 VS2012 SQL2005 最近才接触MVC4 自己做了个小实例 准备部署在 win2008 的IIS7.5 ...
- Spring学习之-各注解的含义总结
注解配置 @ComponentScan("spittr.web"):/在加载Spring上下文时,会扫描spittr.web包查找组件 @ComponentScan注解扫描的组件有 ...
- windows 安装redis并注册服务
windows下载地址 https://github.com/MSOpenTech/redis/releases 启动:redis-server redis.windows.conf ...
- 20140322 卡迪夫城VS利物浦,拔出重剑,有惊无险
一.菱形442 起初在客战南安普顿的时候,罗杰斯启用了菱形442阵式,阵容和今天客战卡迪夫城几乎一样,只是格伦·约翰逊打左后卫,弗拉纳甘任职右后卫,目的是为了在客场抵御卢克·肖+拉拉纳.当时库蒂尼奥的 ...