uni-app 支付宝引入支付宝学生验证插件,组件实例ref获取不到

发布于 1周前 作者 zlyuanteng 来自 Uni-App

uni-app 支付宝引入支付宝学生验证插件,组件实例ref获取不到

操作步骤:

<student-verify
ref="alipayStudentVerifyRef"
shopName=""
shopLink=""
shopLogo=""
onSuccess="verifySuccess"
/>
try{
console.log(this.$refs.alipayStudentVerifyRef);//调用为 undefined
this.$refs.saveRef.verify(); //报错
}catch{
console.log('组件失败')
}

预期结果:

this.$refs.alipayStudentVerifyRef.verify() ==》调用成功

实际结果:

this.$refs.alipayStudentVerifyRef指向外部包裹的plugin-wrapper实例

bug描述:

uniapp支付宝小程序引入支付宝学生验证插件,组件实例ref获取不到,外部包裹了一层plugin-wrapper动态组件,无法获取student-verify插件下的实例方法

项目属性
产品分类 uniapp/小程序/阿里
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 Windows10
HBuilderX类型 Alpha
HBuilderX版本号 3.7.12
第三方开发者工具版本号 3.3.3
基础库版本号 2.8.8
项目创建方式 HBuilderX


34 回复

嘿,看起来我解决了
<template>
<student-verify
:shopName=“verifyInfo.shopName”
:shopLink=“verifyInfo.shopLink”
:shopLogo=“verifyInfo.shopLogo”
@ref=“onStudentVerifyRef”
@success=“onSuccess”
/>
</template> 直接@ref 编译出来后会变成: <plugin-wrapper …>
<student-verify onRef="{{‘onRef’+‘b144d2e6-1’}}" …></student-verify>
</plugin-wrapper> 有个onRef, 然后得自己写个node.js脚本,在编译完成后把这个onRef改成ref, 就能拿到原始实例了。
修改后: <plugin-wrapper …>
<student-verify ref="{{‘onRef’+‘b144d2e6-1’}}" …></student-verify>
</plugin-wrapper>


确实拿到了,非常感谢

请问大牛能留下详细解决的node吗,不知怎么修改编译后文件

回复 到瑞米法:大牛能给个解决示例不

改了,也没有拿到呀,要疯了

解决方案,在vue.config.js 写个webpack插件去处理编译后的代码文件
<student-verify @ref=“onStudentVerifyRef” />

onStudentVerifyRef(ref) {
this.studentVerifyRef = ref;
} 在vue文件中,ref用 @ref 代替,onStudentVerifyRef 用来接受ref对象
vue.config.js
const fs = require(‘fs’);

class MyPlugin {
apply(compiler) {
compiler.hooks.done.tap(‘MyPlugin’, (stats) => {
function studentVoucherCollectionActivity() {
const paths = [
${__dirname}/dist/dev/mp-alipay/pages/student/index.axml, // dev环境编译后的文件路径
${__dirname}/dist/build/mp-alipay/pages/student/index.axml, // build环境编译后的文件路径
];
paths.forEach((path) => {
if (fs.existsSync(path)) {
let content = fs.readFileSync(path).toString();
content = content.replace(‘student-verify onRef=’, ‘student-verify ref=’); // 此处重点,将onRef替换成了小程序的语法
fs.writeFileSync(path, content);
}
});
}
studentVoucherCollectionActivity();
});
}
}

module.exports = {
configureWebpack: {
plugins: [new MyPlugin()],
},
};

大佬,我按上面代码改了,看着代码确实被改到了,但是拿回来的还是不对呀

回复 1***@qq.com: <student-verify @ref=“onStudentVerifyRef” />

onStudentVerifyRef(ref) { this.studentVerifyRef = ref; }

注意这部分

大佬,有没有遇到过,注册的 success 回调不执行的问题?

我也是支付宝的学生验证插件,遇到同样的问题

你好,学生插件ref获取不到实例的问题解决了么,我也遇到了,解决的话,辛苦更新下帖子

遇到同样问题,怎么解决

同问,顶上去

vue.config.js这个文件也是用上面给的代码 ,我在支付宝编译器上看代码是被改到了的,但是await this.studentVerifyRef.verify();这里还是报错的

vue页面注意@ref=“onStudentVerifyRef” <student-verify @ref=“onStudentVerifyRef” shopName=“xxx小程序” shopLink=“xxx” shopLogo=“xxx” onSuccess=“onSuccess”></student-verify> js页面 onStudentVerifyRef(ref) { this.studentVerifyRef = ref; } 编译后的页面中插件上onRef改成ref

回复 到瑞米法: 插件上onRef已经该成ref 还是不行

回复 1***@163.com: 真机预览呢?

回复 到瑞米法: 换个方式 已解决

回复 1***@163.com: 怎么解决的能说一下吗

回复 1***@163.com: 改完之后还是拿不到verify方法

回复 到瑞米法: 改完之后还是拿不到verify方法

回复 7***@qq.com: await this.studentVerifyRef.detail.args[0].verify()

学生验证插件是做什么的啊,有没有网址学习一下

楼上大佬说的对
1:ref改为@ref
2:增加vue.config.js代码
3:重点是, await this.studentVerifyRef.detail.args[0].verify(),这样才能调起来弹窗

V3 版本的这方法行不通了

弹窗还是不出来

<refund @ref=“handleRef”
orderId=""
oid=""
@Complete=“onComplete”
></refund> 不能放其它组件里面。。。 我放在 mescroll-body 里面试了半天不行。。。

图中路径和组件名字记得替换

我也是用 支付宝 极速退款组件遇到这个问题,但是我配置之后编译没生效,能指导一下吗

初步已解决,请查看https://ask.dcloud.net.cn/question/191413

在uni-app中集成支付宝学生验证插件时,如果组件实例的ref获取不到,通常是由于组件的生命周期问题或引用方式不正确导致的。以下是一个示例代码,展示如何在uni-app中正确引入支付宝学生验证插件,并通过ref获取组件实例。

1. 安装支付宝学生验证插件

首先,确保你已经在支付宝开放平台上申请并获得了学生验证插件的权限,然后在uni-app项目中引入该插件。

2. 配置manifest.json

manifest.json中配置支付宝特有的插件信息:

{
  "mp-alipay": {
    "appid": "YOUR_APP_ID",
    "setting": {
      "urlCheck": false
    },
    "plugins": {
      "StudentAuth": {
        "version": "1.0.0", // 插件版本号
        "provider": "com.alipay.studentauth" // 插件提供者
      }
    }
  }
}

3. 编写页面代码

在你的页面中,使用支付宝提供的组件,并通过ref引用它:

<template>
  <view>
    <alipay-student-auth ref="studentAuth" @success="handleSuccess" @fail="handleFail"></alipay-student-auth>
    <button @click="startAuth">开始学生验证</button>
  </view>
</template>

<script>
export default {
  methods: {
    startAuth() {
      // 通过ref获取组件实例,并调用其方法
      this.$refs.studentAuth.startAuth();
    },
    handleSuccess(res) {
      console.log('验证成功', res);
    },
    handleFail(err) {
      console.error('验证失败', err);
    }
  }
}
</script>

<style scoped>
/* 样式代码 */
</style>

4. 确保组件正确加载

  • 确保alipay-student-auth组件是支付宝提供的合法组件,并且已经在支付宝开放平台上配置正确。
  • 检查this.$refs.studentAuth是否为undefined,如果是,则可能是组件尚未加载完成。可以通过nextTicksetTimeout等方法确保组件已渲染完成后再调用其方法。

5. 调试与测试

  • 在支付宝开发者工具中运行你的uni-app项目,查看控制台是否有错误信息。
  • 确保你的支付宝开发者账号具有调用学生验证插件的权限。

通过上述步骤,你应该能够在uni-app中成功引入支付宝学生验证插件,并通过ref获取组件实例。如果仍然遇到问题,请检查支付宝开放平台的文档,确保所有配置和代码都符合规范。

回到顶部