如何在 vue.js 中获取 Forte Hosted Form callback
支付阿杰
结论
Forte Hosted Form 的 callback attribute 通常需要填写全局函数名。Vue methods 中的 oncallback 只存在于当前组件实例上,不会自动挂载到 window,因此 Forte 脚本无法直接找到它。
在 Hosted Form 初始化前,将 Vue 方法注册为全局回调即可:
window.oncallback = this.oncallback;
按钮的 callback 应直接填写函数名字符串,不要使用 Vue 的属性绑定语法。
Vue 2 示例
<button
type="button"
callback="oncallback"
class="forte-checkout-button"
>
Make Payment
</button>
export default {
mounted() {
window.oncallback = this.oncallback;
},
beforeDestroy() {
if (window.oncallback === this.oncallback) {
delete window.oncallback;
}
},
methods: {
oncallback(payload) {
console.log("Forte payment response:", payload);
// 具体字段取决于 Forte 实际返回的数据结构
if (payload && payload.response !== undefined) {
alert("Hello " + payload.response);
}
}
}
};
这里应使用:
callback="oncallback"
不要写成:
:callback="oncallback"
后者是 Vue 属性绑定,可能会把函数转换成不符合 Forte 要求的 attribute 值。
更稳妥地处理响应
根据版本或配置不同,第三方支付脚本传给回调的内容可能是对象,也可能是 JSON 字符串。可以先对数据进行统一解析:
export default {
mounted() {
window.fortePaymentCallback = this.oncallback;
},
beforeDestroy() {
delete window.fortePaymentCallback;
},
methods: {
oncallback(rawPayload) {
let payload = rawPayload;
if (typeof rawPayload === "string") {
try {
payload = JSON.parse(rawPayload);
} catch (error) {
console.warn("Forte callback returned a non-JSON string:", rawPayload);
}
}
console.log("Forte callback payload:", payload);
const response =
payload && typeof payload === "object"
? payload.response
: payload;
alert("Hello " + String(response ?? ""));
// 在这里更新 Vue 状态
// this.paymentResponse = payload;
}
}
};
按钮应与全局回调名保持一致:
<button
type="button"
callback="fortePaymentCallback"
class="forte-checkout-button"
>
Make Payment
</button>
Vue 3 Composition API 示例
<script setup>
import { onBeforeUnmount, onMounted } from "vue";
function oncallback(payload) {
console.log("Forte payment response:", payload);
if (payload?.response !== undefined) {
alert(`Hello ${payload.response}`);
}
}
onMounted(() => {
window.fortePaymentCallback = oncallback;
});
onBeforeUnmount(() => {
delete window.fortePaymentCallback;
});
</script>
<template>
<button
type="button"
callback="fortePaymentCallback"
class="forte-checkout-button"
>
Make Payment
</button>
</template>
注意事项
- 必须在 Forte 脚本读取按钮或打开 Hosted Form 前注册全局回调。
callback中的名称必须与window上的属性名完全一致,包括大小写。- 不要默认响应数据位于
payload.response。先用console.log(payload)检查实际数据结构,再读取交易状态、授权码等字段。 - 页面上有多个支付组件时,应分别使用不同的全局回调名,以免相互覆盖。
- 前端回调可以用来更新页面状态,但不能作为确认支付成功的唯一依据。订单入账应由服务端根据 Forte 的服务端通知或交易查询结果进行验证。
- 如果回调一直没有执行,还需检查 Forte SDK 是否成功加载、按钮所需的 class 和其他 attributes 是否完整,以及浏览器控制台是否报告了脚本错误。
备注:内容仅供参考。
