- 云开发如何对外提供回调 URL
在云开发的使用过程中,有不少的用户会提出自己的疑问,我如何才能在自己的云开发应用中加入一个回调地址? 在实际开发过程中,不少涉及到支付、订单等异步操作的场景,会需要提供一个回调 URL,以确保在用户完成自己的支付过程后,由支付服务器对回调的 URL 发起请求,确认调用成功。因此,不少用户在使用时提出了自己的疑问,应该如何实现这样的功能? 由于目前云开发云函数尚未对外提供 HTTP 调用的能力,因此,我们可以借助腾讯云提供的云函数和 API 网关,来实现类似的功能。 架构介绍 [图片] 在进行调用时开发者所设置的回调地址是一个 API 网关的地址,微信支付等服务的服务器在完成操作以后,会执行 HTTP 请求,请求 API 网关。 API 网关对应的是腾讯云云函数,我们可以在腾讯云云函数中调用云开发的 SDK,或者是云开发的 HTTP API,完成对云开发数据库的操作。 具体实现 依赖 腾讯云账号 小程序的 AppID 和 App Secret 实现 1. 创建云函数 访问 https://console.cloud.tencent.com/ ,使用你的腾讯云账号登陆,在顶部菜单栏中找到「云产品」— 「Serverless」—「云函数」 [图片] 在云函数中,选择「函数服务」,并在函数服务页面点击「新建」 [图片] 创建一个新的云函数,其中函数名称根据你的需要填写 [图片] 运行环境选择 Node.js 8.9,创建方式选择空白函数,完成后点击下一步。 在下一页不需要做修改,直接点击完成。 2. 创建 API 网关调用 在创建完成云函数以后,我们会进入到这样的界面,在这个界面中选择「触发方式」 [图片] 在触发方式页面新增一个触发方式,使用 「API 网关触发」,请求方法选择「ANY」,发布环境选择「发布」,鉴权方法选择「免鉴权」。 [图片] 填写完成后,点击保存,然后你会获得一个地址,这个地址就是你后续的回调地址。 [图片] 你可以将这个地址在浏览器中打开,可以看到这样的数据 [图片] 则说明我们的云函数完成了配置。 3. 编写程序调用 当我们完成了云函数的配置以后,接下来我们可以修改云函数,使其完成我们自己想要的功能。 我们希望云函数可以从外部发来的请求中获取到参数,并借助云开发提供的 API,对云开发数据库中的数据进行更新。则我们可以这样操作 我们在本地新建一个目录,并在其中执行如下命令(需要你提前安装了 N ode.js 环境) [代码]cd 新建文件夹 npm init -y npm install -y got [代码] 然后创建一个文件[代码]index.js[代码],并在其中加入如下代码,并设置其中的 APPID、SECRET、ENV_ID 等字段。 [代码]'use strict'; const got = require('got'); const APPID = ''; // 小程序 APPID const SECRET = ''; // 小程序 Secret const ENV_ID = '' const TOKEN_URL = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${SECRET}` const QUERY_URL = 'https://api.weixin.qq.com/tcb/databasecollectionget?access_token=' exports.main_handler = async (event, context, callback) => { // 1. 提取参数 可以从 URL?id=1&status=2 中提取出 1 和 2 const id = event.queryString.id; const status = event.queryString.status; // 2. 获取 Token,用于后续的调用 let token_resp = await got(TOKEN_URL); let token = JSON.parse(token_resp.body).access_token const url = QUERY_URL + token; // 执行云开发命令 let result = await got(url, { method: 'POST', json: true, headers: { 'content-type': 'applicaiton/json', 'accept-encoding':'gzip' }, body: { "env": ENV_ID } }) return result.body }; [代码] 配置完成后,保存文件。 4. 上传代码 打包完成后,重新访问腾讯云控制台,找到刚刚创建的云函数,进入到「函数代码」中,选择其中的「本地上传文件夹」,选择你刚刚创建的文件夹,等待其自动压缩完成后,点击保存上传。 [图片] 上传完成后,会自动进行部署。 你可以重新访问刚刚生成的 API 网关地址,并在其后加入 id 和 status 参数,比如我的最后的地址是 [代码]https://service-51pn7koc-1251337088.gz.apigw.tencentcs.com/release/myFunction?id=1&status=2[代码] [图片] 访问以后,得到的结果是这样的 [图片] 这样就说明我成功的从云函数中访问了云数据库,并且通过一个无需鉴权的 API 地址获取到了信息。 总结 实际上,借助于 API 网关、云函数以及云开发的 API & SDK,你可以实现非常多的功能,能不能实现,就看你的想象力有没有达到啦。
2019-09-18 - wx.navigateBack(Object object) 返回多层时如何传值?
页面结构: A页面>B页面>C页面>D页面 现在A列表页面通过navigateTo跳转到B页面,同时监听一个事件,随着流程的执行,走到了D页面,提交返回到A页面并返回空值,唤醒A页面的监听,来删除列表中处理过的记录. A页面跳转逻辑: trackView: function (event) { let that = this; var id = event.currentTarget.dataset.id; var index = event.currentTarget.dataset.index; // 跳转到B并监听completionTask事件 wx.navigateTo({ url: "../B/B?id=" + id , events: { completionTask:function(){ that.data.record.dataList.splice(index,1); } } }) }, D页面返回逻辑: // 保存 formSubmit:function(e){ let that = this; const eventChannel = this.getOpenerEventChannel(); // 向上跳转三层回到A页面,并发送completionTask事件 wx.navigateBack({ delta:3, success:function(res){ eventChannel.emit('completionTask',{}); } }) 最后发现A页面并没有监听到completionTask事件. 看官方示例说是:获取被打开页面传送到当前页面的数据. (意思是只能url上写着的页面才能emit传值回来吗?.?) [图片] 问题:那我要返回多层并且想通过事件传值,能做到吗?.?还是只能直接获取到祖先页面的值,直接改?
2020-06-08