ASP.NET集成Paytm JS Checkout火狐浏览器无法打开支付弹窗问题咨询
问题根因
- 核心原因:Paytm SDK引入标签的
type属性配置错误。当前代码中使用的type="application/html"是HTML资源的MIME类型,火狐严格遵循W3C规范,不会将该标签识别为JavaScript资源执行,导致Paytm SDK未正常加载,window.Paytm.CheckoutJS对象的init方法自然不存在。Chrome对这类配置错误有自动兼容逻辑,所以可以正常运行。 - 次要触发原因:部分版本火狐的增强型跟踪保护会拦截Paytm这类跨域第三方支付脚本,或是SDK加载完成后内部对象初始化存在时序差,onload事件触发时
init方法还未挂载完成。
解决方案
- 修复script标签的type属性
把Paytm SDK引入标签的type属性改为text/javascript,或者直接删除该属性即可,HTML5默认script标签类型为JavaScript,无需额外声明。 - 增加SDK初始化兜底检测逻辑
在原有判断基础上增加轮询重试机制,避免SDK内部初始化时序差导致的方法缺失问题。 - 排查浏览器拦截配置
如果修改后仍有问题,点击火狐地址栏左侧的屏蔽图标,关闭对Paytm域名的跟踪拦截即可。
修改后可兼容火狐的完整代码
<div id="paytm-checkoutjs"></div> <!-- 移除错误的type属性,或显式设置为type="text/javascript" --> <script crossorigin="anonymous" src="https://securegw-stage.paytm.in/merchantpgpui/checkoutjs/merchants/demoKey.js" onload="onScriptLoad();"> </script> <script> function initPaytmCheckout() { var config = { "root": "", "flow": "DEFAULT", "data": { "orderId": "", /* 填入实际订单ID */ "token": "", /* 填入实际交易token */ "tokenType": "TXN_TOKEN", "amount": "" /* 填入实际订单金额 */ }, "handler": { "notifyMerchant": function(eventName,data){ console.log("notifyMerchant handler function called"); console.log("eventName => ",eventName); console.log("data => ",data); } } }; // 新增init方法存在性判断,避免调用时报错 if(window.Paytm && window.Paytm.CheckoutJS && typeof window.Paytm.CheckoutJS.init === 'function'){ window.Paytm.CheckoutJS.onLoad(function excecuteAfterCompleteLoad() { window.Paytm.CheckoutJS.init(config).then(function onSuccess() { window.Paytm.CheckoutJS.invoke(); }).catch(function onError(error){ console.log("error => ",error); }); }); return true; } return false; } function onScriptLoad(){ // 先尝试直接初始化 if (initPaytmCheckout()) return; // 初始化失败则轮询重试,最多重试10次,每次间隔200ms let retryCount = 0; const retryTimer = setInterval(() => { retryCount++; if (initPaytmCheckout() || retryCount >= 10) { clearInterval(retryTimer); if (retryCount >= 10) console.error("Paytm SDK加载超时,请检查网络或浏览器拦截配置"); } }, 200); } </script>
内容的提问来源于stack exchange,提问作者Arvind Baweja
相关产品推荐
相关产品推荐

