我有一个使用M3 TypeScript SDK for H5 (M3 Web客户端) 编写的应用程序。该程序在Windows上的Chrome中的M3/H5中运行。它用于处理信用卡支付,并在M3/H5中的iFrame中访问处理器的站点。它使用dispatchEvent将消息传递回M3/H5。托管域和服务域是相同的。
表单、iFrame和dialog是使用TypeScript动态构建的,并在生成时添加相应的CSC头。添加CSC头帧-祖先解决了我在开发过程中遇到的跨域错误问题当直接在M3 BE中运行时。
然而,当我在IOS (Infor操作系统) 中打开M3时,我得到错误 “Blocked a frame with origin [x] from accessing a cross-orgin frame.",即使添加了头。我已经尝试将https://添加到域名、self、localhost和所有相关域。
**代码中CSC帧祖先的示例:**x1c 0d1x
错误:(注意调用的函数和源是同一个域)
当这种情况发生时,当然回叫到M3/H5没有完成。
如果我在IOS外 * 运行同样的代码,直接在M3/H5业务引擎中运行,不会出现错误,dispatchEvent起作用,M3处理交易。
我尝试过设置各种IOS网格设置,但都没有用。我还在Infor上开了一个工单,但他们仍在处理。
测试的网格设置
实际的代码非常简单,但为了清楚起见,我也会提供它。我已经尝试使用postMessage以及将targetOrigin参数设置为''。
function callParentFunction(str) {
if (str && str.length > 0)
{
//Errors indicate a mismatch in domain between the page containing the iframe and this page.
console.log("callParentFunction:" + str);
var event2M3 = new CustomEvent("adn2m3", { detail: str });
event2M3.bubbles = true;
event2M3.initCustomEvent("adn2m3", true, false, { detail: str });
top.ccPaymentDiag.dispatchEvent(event2M3);
}
}
function receiveMessage(event) {
//console.log("receiveMessage");
if (event && event.data) {
console.log("call Event Origin: " + event.origin);
callParentFunction(event.data);
}
}
if (window.addEventListener) {
window.addEventListener("message", receiveMessage, false);
} else if (window.attachEvent) {
window.attachEvent("onmessage", receiveMessage);
}
if (window.location.hash && window.location.hash.length > 1) {
callParentFunction(window.location.hash.substring(1));
}
字符串
在这一点上,我不知道如何进行。任何建议都非常感谢。
谢谢;
比利
1条答案
按热度按时间vlju58qv1#
你需要在一个新窗口中打开它,然后返回结果。
这是唯一的方法,因为这是一个安全问题。框架可以从父页面访问,所以如果你输入密码,父页面可以拦截它。
我们已经使用了类似的方式来登录使用O365。