@42withyou
2015-02-28T06:51:20.000000Z
字数 4402
阅读 758
文档
文档地址:https://www.zybuluo.com/42withyou/note/71149
| 版本号 | 内容 | 制定人 | 制定时间 |
|---|---|---|---|
| 1.0 | 根据服务接口需求撰写文档 | 叶科忠 | 2015.2.10 |
在单点登陆系统中,我们通过jsonp的302重定向来实现跨域传递登陆信息。
在购物车里,我们需要解决的问题是应用前台和购物车框架之间需要交流一些信息,而仍然是由于浏览器的同源策略,不允许跨域调用其他页面的对象。
但仍有一些曲折的办法实现跨域消息的传递,跨域 frame 通信相关问题,请先阅读 http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html 了解。
A : 当前应用
B : 购物车
C : 当前应用实现的代理页面
Page A include Page B
Page B include Page C
A和B属于两个域,A和C在同一个域中
A向B通信:通过url hash
B向C通信:通过url hash
B向A通信:先把消息给C,由于A和C属于同一个域下,C可以直接将消息传递给A(使用 url hash 向C中传参数,然后在C中获取参数并调用parent.parent调用A中的函数即可)
js文件均提供 .min.js 版本
// cydf_cart_client.js// 捐款车用户端文件,提供CydfCartClient变量及以下接口var CydfCartClient = function() {return {// 加载并初始化购物车,请在用户登陆后再调用,未登陆状态下捐款车不会显示,而是持续刷新直到获取到单点登陆信息或已登陆。/*参数:cart_agent_page_url 由您实现的代理页面,实现方法请参照下文cart_user_style_file_url (可选)捐款车外部自定义样式文件地址,即捐款车位置,大小,弹窗样式cart_frame_user_style_file_url (可选)捐款车frame内部自定义样式文件地址如果您提供了这两个样式自定义文件参数,购物车将加载您提供的样式文件,而不加载购物车原始样式文件*/init: function(cart_agent_page_url, cart_user_style_file_url, cart_frame_user_style_file_url) {},// 下面三个接口用于不刷新页面,来提示用户和通知购物车框架内容有变// 在您不使用ajax来提交商品信息时,无需使用到这些接口。// 告知捐款车内容有变化,捐款车会重新加载,与dialog接口配合使用change: function() {},// 通过ajax请求在应用后台通过CartApi接口将商品信息提交到购物车后,调用此方法弹出成功加载到购物车的提示窗口,并需调用change接口来刷新购物车dialog: function() {},// 关闭弹窗,弹窗上有关闭按钮调用此方法,您无需自己调用dialogClose: function() {}}}();// 使用方法if (user_login == true) {CydfCartClient.init();}
您无需关注该文件的细节,但需实现代理页面,非常简单,您只需实现一个页面,输出以下内容:
如:http://jlxd.cydf.org.cn/cart_agent
<html><head><title>捐赠车代理</title><script src='http://cart.cydf.org.cn/styles/js/cydf_cart_agent.js'></script></head><body></body></html>
class CartApi {static protected $_accessUser = 'xszz'; // 应用接入时提供static protected $_accessKey = 'xxxxxxxxxxx'; // 应用接入时提供static protected $_geteway = 'http://cart.cydf.org.cn/';static public function get($api, $data = NULL) {}// 为了简化设计,通常您只需使用这个接口调用 api 即可!// 虽然提供了RESTful的四个语义接口,但实际上他们都干的一样的事...static public function post($api, $data = NULL) {}static public function put($api, $data = NULL) {}static public function delete($api, $data = NULL) {}}/* 返回值array(status => 状态status_message => 状态信息data => 数据)*/
/*接口名:save功能:提交捐款商品信息参数:$data = array(project_id => 公益项目idproject_item_id => 公益产品类型id (可选?这个是每个项目都有的吧,如果没有就不用传了)item_money => 商品金额project_desc => 产品描述(希望工程1+1等)source_desc => 意愿(用户留言) (可选)source_web => 来源网站域名(例如:http://jlxd.cydf.org.cn)source_detail_url => 详情url(例如 http://jlxd.cydf.org.cn/donate/detail/1546)source_url => 来源的url(例如:http://jlxd.cydf.org.cn/project/4946)source_desc => 来源描述(例如:激励行动-“海洋天堂”——关爱自闭症儿童公益行动)user_id => 用户idsource_img_uri => 来源图片地址 (可选,没有会很难看哦~!)source_detail_data => serialize(array( 详细列表数据,如学生资助的学生列表,记得序列化哦 (可选)keys => 列表列标题datas => 列表列数据)));返回值:data['cart_item_id'] = 捐款车商品id*/// 使用方法示例$cart_item_data = array();$cart_item_data['project_id'] = $param['ProjectID'];$cart_item_data['item_money'] = $param['DonMoney'];$cart_item_data['project_desc'] = "激励行动";$cart_item_data['source_desc'] = $param['ProductDesc'];$cart_item_data['source_web'] = Utility::GetCurrentWebRoot();$cart_item_data['source_detail_url'] = $_SERVER['HTTP_REFERER'];$cart_item_data['source_url'] = Utility::GetCurrentWebRoot() . '/project/' . $project_id;$cart_item_data['user_id'] = $this->login_user['UserGUID'];$cart_item_data['source_img_uri'] = Utility::GetCurrentWebRoot() . '/styles/css/images/bg_img/logo.jpg';$source_detail_data['keys'] = array('ID', '姓名', '学校', '性别', '民族', 'xxx', '还有什么');$source_detail_data['datas'] = array(array(50,"科忠", "其他合作项目", "7d0c0d04-60a8-4923-8fb6-5e6e253f9c81", "111", "上海家化公益基金", "B1405000001"),array(100 , "双虎", "其他合作项目", "7d0c0d04-60a8-4923-8fb6-5e6e253f9c81", "sdf", "上海家化公益基金", "B1405000001"),array(200 , "侯哥", "其他合作项目", "7d0c0d04-60a8-4923-8fb6-5e6e253f9c81", "asdf", "上海家化公益基金", "B1405000001"),array("0", "哈哈", "其他合作项目", "7d0c0d04-60a8-4923-8fb6-5e6e253f9c81", "asdf", "上海家化公益基金", "B1405000001"),);$cart_item_data['source_detail_data'] = serialize($source_detail_data);$result = CartApi::post('save', $cart_item_data);