评论

小代码大作用,云函数openapi

我们几十个小程序的云调用,只用一个云函数,只用到这十行代码。

以下云函数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
        }
      }
    })

最后一次编辑于  2022-06-14  
点赞 2
收藏
评论

2 个评论

  • 国安
    国安
    2023-05-06

    大佬,请问共享环境下统一下单有示例代码吗?

    2023-05-06
    赞同
    回复 5
    • 跨商通
      跨商通
      2023-05-06
      原码照抄啊,举一反三啊,同学。
      2023-05-06
      回复
    • 国安
      国安
      2023-05-06回复跨商通
      不行的,添加opt后提示不匹配。如果不添加opt,返回的payment参数里面appID仍然是环境小程序的appId,模拟器可以拉出支付二维码,但是无法扫码支付,真机上也无法支付
      2023-05-06
      回复
    • 跨商通
      跨商通
      2023-05-06回复国安
      "不匹配":appid和mchid没有绑定;
      2023-05-06
      回复
    • 国安
      国安
      2023-05-06回复跨商通
      绑定了,在自己的环境里是可以成功下单支付的,共享环境里就不行
      2023-05-06
      回复
    • 跨商通
      跨商通
      2023-05-06回复国安
      两个appid都绑定了这个mchid吗?自己的appid和共享小程序的appid?
      2023-05-06
      回复
  • 理想
    理想
    2022-07-31

    这代码在共享环境时,跨资源访问有用。

    比如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'内容安全检查系统繁忙,请重试',
          showCancelfalse,
          title'提醒',
        });
        return 'fail';
      };
      if (msgCheckResult == 40003) {
        console.log('openid:')
        console.log('openid 无效');
        wx.showModal({
          cancelColor'cancelColor',
          cancelText'取消',
          confirmColor'#000000',
          confirmText'知道了',
          content'当前用户ID无效,请重新打开本小程序',
          showCancelfalse,
          title'提醒',
        });
        return 'fail';
      };
      if (msgCheckResult == 40129) {
        wx.showModal({
          cancelColor'cancelColor',
          cancelText'取消',
          confirmColor'#000000',
          confirmText'知道了',
          content'安全检查场景值错误,请联系系统开发人员',
          showCancelfalse,
          title'提醒',
        });
        return 'fail';
      };
      if (msgCheckResult == 43104) {
        wx.showModal({
          cancelColor'cancelColor',
          cancelText'取消',
          confirmColor'#000000',
          confirmText'知道了',
          content'appid与openid不匹配,请联系系统开发人员',
          showCancelfalse,
          title'提醒',
        });
        return 'fail';
      };
      if (msgCheckResult == 61010) {
        wx.showModal({
          cancelColor'cancelColor',
          cancelText'取消',
          confirmColor'#000000',
          confirmText'知道了',
          content'用户未在近两小时访问小程序,请重新打开小程序',
          showCancelfalse,
          title'提醒',
        });
        return 'fail';
      };
      if (msgCheckResult != 0) {
        wx.showModal({
          cancelColor'cancelColor',
          cancelText'取消',
          confirmColor'#000000',
          confirmText'知道了',
          content'提交内容含有违法违规内容,如涉政,涉黄,涉恐等敏感信息,请修改后提交',
          showCancelfalse,
          title'提醒',
        });
        return 'fail';
      };
    };
    
    
    //将自定义函数暴露出来
    //形式为    对外使用的函数名:wxs中定义的函数名
    module.exports = {
      msgCheck2: msgCheck,
    };
    
    2022-07-31
    赞同
    回复 1
    • 跨商通
      跨商通
      2022-09-14
      你的msgCheck代码,当大图片时,真机上是会出问题的。所以才会有我代码里的特殊处理:大图片安检。
      另,openid是在小程序端就传入到body里的,opt里需要openid吗?目测并不需要。
      2022-09-14
      回复
登录 后发表内容