以下云函数openapi的代码极简,但是作用很多,包括:
(代码直接复制可用)
1、支持所有云调用;是所有哦。
2、支持大图片安全检查
3、支持环境共享的云调用。
云函数代码如下:
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const opt = {}
exports.main = async event => {
const wxc = cloud.getWXContext()
opt.appid = wxc.FROM_APPID || wxc.APPID//获取环境或共享环境的访问端小程序appid
if (event.action == 'security.imgSecCheck') return await imgSecCheck(event)//大图片安全检查
if (event.action == 'xxx') return await xxx(event)//其他特殊处理
return await cloud.openapi(opt)[event.action](event.body || {})
}
async function imgSecCheck(event) {
let res = await cloud.downloadFile({
fileID: event.fileID,
})
return await cloud.openapi(opt).security.imgSecCheck({
media: {
contentType: "image/png",
value: res.fileContent
}
})
}
小程序端的调用代码示例:
1、获取小程序码
app.cloud.callFunction({
//app.cloud是小程序当前环境的cloud,在app.js中初始化,可能是wx.cloud,也可能是共享环境的cloud
name: 'openapi',
data: {
action: 'wxacode.getUnlimited',
body: {
scene,
width: 280
},
}
})
2、发送订阅消息
app.cloud.callFunction({
name: 'openapi',
data: {
action: 'subscribeMessage.send',
body: {
"touser": openid,
"page": 'pages/index/index?orderId=' + order._id,
data,
"templateId": tid,
"miniprogramState": 'trial'
}
}
})
3、获取小程序直播房间列表
app.cloud.callFunction({
name: 'openapi',
data: {
action: 'liveBroadcast.getLiveInfo',
body: {
start: 0,
limit: 100
}
}
})
大佬,请问共享环境下统一下单有示例代码吗?
opt.appid = wxc.FROM_APPID || wxc.APPID//获取环境或共享环境的访问端小程序appid
cloud.cloudPay(opt).unifiedOrder()
这代码在共享环境时,跨资源访问有用。
比如A小程序云开发资源共享给B小程序用,B要用A的云函数返回:手机号,内容安全,小程序码等,下面是我测试的内容安全,分享一下:
1.我多加了这个,因为内容安全要传入openid,FROM_OPENID 是来源方的 openid
opt.openid = wxc.FROM_OPENID || wxc.OPENID // 这是在楼主代码上我加的部分
2.注意云调用的内容安全官方示例代码没有(opt) ,我们得加,如:cloud.openapi(opt).security.msgSecCheck
云函数代码:
// 我的云函数名字 actionMyselftCloudFun const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const opt = {}; exports.main = async event => { const wxc = cloud.getWXContext(); opt.appid = wxc.FROM_APPID || wxc.APPID; //获取环境或共享环境的访问端小程序appid opt.openid = wxc.FROM_OPENID || wxc.OPENID // 这是在楼主代码上我加的部分 if (event.action == 'security.imgSecCheck') return await imgSecCheck(event); //大图片安全检查 // if (event.action == 'xxx') return await xxx(event); //其他特殊处理 if (event.action == 'msgCheck') return await msgCheck(event);// 内容安全 return await cloud.openapi(opt)[event.action](event.body || {}); } async function imgSecCheck(event) { let res = await cloud.downloadFile({ fileID: event.fileID, }) return await cloud.openapi(opt).security.imgSecCheck({ media: { contentType: "image/png", value: res.fileContent } }) } // 内容安全 async function msgCheck(event) { try { // 注意 cloud.openapi(opt),默认写法没有括号这里 // 需要传入 openid, const res = await cloud.openapi(opt).security.msgSecCheck({ "openid": opt.openid, //用户的openid(用户需在近两小时访问过小程序) "scene": 1, //场景枚举值(1 资料;2 评论;3 论坛;4 社交日志) "version": 2, //版本2.0统一叫2 "content": event.checkContent, //需要检查的内容 }); //返回到客户端,//0成功,-1系统繁忙;40003 openid 无效;40129 场景值错误;43104 appid与openid不匹配;61010 用户访问记录超时(用户未在近两小时访问小程序) return res; } catch (err) { if (err.errCode == -604102) { return { "errMsg": "openapi.security.msgSceChek:ok", "errCode": 0 }; } return err; }; }
小程序端代码
// 以下小程序代码,主要参考一下共享环境部分写法,其它参考意义不大,我也比较菜,写的不好 // 以下代码不是页面js 是放外部,所以函数名写法有点不一样 // 名字是 useCloudFunToGetMsgCheck.js // 页面引用 大概这样 // 引入内容安全 // import {msgCheck2} from '../../utils/useCloudFunToGetMsgCheck'; //共享环境 import { resourceAppid, resourceEnv } from '../config/appConfig'; // 声明新的 cloud 实例 let c1 = new wx.cloud.Cloud({ // 资源方 AppID resourceAppid: resourceAppid, // 资源方环境 ID resourceEnv: resourceEnv, }) /** * 内容安全 */ async function msgCheck(checkContent) { // 共享环境 // 跨账号调用,必须等待 init 完成 // init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则 await c1.init(); let msgCheckResult = await c1.callFunction({ // let msgCheckResult = await wx.cloud.callFunction({ name: 'actionMyselftCloudFun',//云函数名字 data: { action: 'msgCheck', checkContent: checkContent,// 要验证的内容 }, }); msgCheckResult = msgCheckResult.result.errCode; //0成功,-1系统繁忙;40003 openid 无效;40129 场景值错误;43104 appid与openid不匹配;61010 用户访问记录超时(用户未在近两小时访问小程序) if (msgCheckResult == 0) { return 'OK'; }; if (msgCheckResult == -1) { wx.showModal({ cancelColor: 'cancelColor', cancelText: '取消', confirmColor: '#000000', confirmText: '知道了', content: '内容安全检查系统繁忙,请重试', showCancel: false, title: '提醒', }); return 'fail'; }; if (msgCheckResult == 40003) { console.log('openid:') console.log('openid 无效'); wx.showModal({ cancelColor: 'cancelColor', cancelText: '取消', confirmColor: '#000000', confirmText: '知道了', content: '当前用户ID无效,请重新打开本小程序', showCancel: false, title: '提醒', }); return 'fail'; }; if (msgCheckResult == 40129) { wx.showModal({ cancelColor: 'cancelColor', cancelText: '取消', confirmColor: '#000000', confirmText: '知道了', content: '安全检查场景值错误,请联系系统开发人员', showCancel: false, title: '提醒', }); return 'fail'; }; if (msgCheckResult == 43104) { wx.showModal({ cancelColor: 'cancelColor', cancelText: '取消', confirmColor: '#000000', confirmText: '知道了', content: 'appid与openid不匹配,请联系系统开发人员', showCancel: false, title: '提醒', }); return 'fail'; }; if (msgCheckResult == 61010) { wx.showModal({ cancelColor: 'cancelColor', cancelText: '取消', confirmColor: '#000000', confirmText: '知道了', content: '用户未在近两小时访问小程序,请重新打开小程序', showCancel: false, title: '提醒', }); return 'fail'; }; if (msgCheckResult != 0) { wx.showModal({ cancelColor: 'cancelColor', cancelText: '取消', confirmColor: '#000000', confirmText: '知道了', content: '提交内容含有违法违规内容,如涉政,涉黄,涉恐等敏感信息,请修改后提交', showCancel: false, title: '提醒', }); return 'fail'; }; }; //将自定义函数暴露出来 //形式为 对外使用的函数名:wxs中定义的函数名 module.exports = { msgCheck2: msgCheck, };
另,openid是在小程序端就传入到body里的,opt里需要openid吗?目测并不需要。