短剧播放器01:插件接入流程,如何跳转到播放器页面获取后台加密数据后播放短剧剧集

主要解决的问题是短剧播放器插件在uniApp中的如何修改、如何注册及如何调用的问题
uniApp前端微短剧项目开源分享
开源地址:git开源下载地址

一、注册播放器页面的onLaunch事件

在App.vue里进行引入注册,只需要注册一次,如果你在其他地方也注册了,会导致将来再进入播放器之后数据重复调用的问题!

<script>
	const playletPlugin = requirePlugin("playlet-plugin");
	const PlayerManager = require("./utils/playerManager.js");
	export default {
		onLaunch: function(options) {
			playletPlugin.onPageLoad(this._onPlayerLoad.bind(this))
		},
		methods:{
			_onPlayerLoad(info) {
				const playerManager = new PlayerManager()
				playerManager._onPlayerLoad(info)
			},
		}
	}
<script/>

二、复制并修改playletPlugin.js文件

因为我们用的是uniApp开发的而不是微信小程序原生开发,所以我们需要将官方提供的demo文件里边的playerManager.js复制到我们项目中,这个文件是整个短剧播放器插件的核心,放到utils中即可

官方示例:

var playletPlugin = requirePlugin("playlet-plugin");
// 点击按钮触发此函数跳转到播放器页面
function navigateToPlayer(obj) {
  // 下面的${dramaId}变量,需要替换成小程序管理后台的媒资管理上传的剧的dramaId
  // 变量${srcAppid}是提审方appid
  // 变量${serialNo}是剧集id
  // 变量${extParam}是分享参数,分享的卡片和二维码会在分享的链接上携带此参数
  const { extParam, dramaId, srcAppid } = obj
  wx.navigateTo({
    url: `plugin-private://wx94a6522b1d640c3b/pages/playlet/playlet?dramaId=${dramaId}&srcAppid=${srcAppid}&extParam=${extParam || ''}`
  })
}
function deepClone(obj) {  
  if (typeof obj !== 'object' || !obj) return obj
  let newObj = obj instanceof Array ? [] : {}  
  for (let key in obj) {    
    if (typeof obj[key] === 'object') {      
      newObj[key] = deepClone(obj[key])    
    } else {
      newObj[key] = obj[key]    
    }
  }
  return newObj
}

const proto = {
  data: { // 可通过this.data访问
    playerId: '',
    arr: [],
    b: null
  },
  _onPlayerLoad(info) {
    console.log('onPlayerLoad info', info, 'data', this.data)
    this.data.playerId = info.playerId
    const pm = playletPlugin.PlayletManager.getPageManager(info.playerId)
    this.pm = pm
    // encryptedData是经过开发者后台加密后(不要在前端加密)的数据,具体实现见下面的加密章节
    this.getEncryptData({serialNo: info.serialNo}).then(res => {
      // encryptedData是后台加密后的数据,具体实现见下面的加密章节
      pm.setCanPlaySerialList({
        data: res.encryptedData,
        freeList: [{ // 1~10集是免费剧,data里面的字段也必须至少设置1~10集可播放
          start_serial_no: 1,
          end_serial_no: 10
        }],
      })
    })
    // 需要解锁的事件
    pm.onCheckIsCanPlay(this.onCheckIsCanPlay)
    this._initShare()
    // 参考文档章节“数据上报”
    pm.onDataReport((obj) => {
      if (obj.event === playletPlugin.REPORT_DATA_EVENTS.VIDEO_PLAY
        || obj.event === playletPlugin.REPORT_DATA_EVENTS.CHANGE_SERIAL
        || obj.event === playletPlugin.REPORT_DATA_EVENTS.VIDEO_PAUSE
      ) {
        console.log('>>>>onDataReport obj', obj)
      }
    })
    // 设置右侧固定运营位置跳转路径
    pm.setActivityInfo({
      url: ''
    })
    // 设置运营区域
    pm.updateOpenArea({
      showLeft: false,
      showRight: false,
      leftsideAreaList: [
        {
          left: 16, // 类似绝对定位的样式
          top: 20,
          width: 72,
          height: 32
        },
      ],
      ext: 'extInfo',
    })
  },
  _initShare() {
    const pm = this.pm
    // 关于分享的处理
    // 开启分享以及withShareTicket
    pm.setDramaFlag({
      share: true,
      withShareTicket: true
    })
    // 获取分享参数,页面栈只有短剧播放器一个页面的时候可获取到此参数
    // 例如从分享卡片进入、从投流广告直接跳转到播放器页面,从二维码直接进入播放器页面等情况
    playletPlugin.getShareParams().then(res => {
      console.log('getLaunch options query res', res)
      // 关于extParam的处理,需要先做decodeURIComponent之后才能得到原值
      const extParam = decodeURIComponent(res.extParam)
      console.log('getLaunch options extParam', extParam)
      // 如果设置了withShareTicket为true,可通过文档的方法获取更多信息
      // https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html
      const enterOptions = wx.getEnterOptionsSync()
      console.log('getLaunch options shareTicket', enterOptions.shareTicket)
    }).catch(err => {
      console.log('getLaunch options query err', err)
    })
    // 设置分享参数
    pm.setExtParam('scene')
  },
  onCheckIsCanPlay(param) {
    // TODO: 碰到不可以解锁的剧集,会触发此事件,这里可以进行扣币解锁逻辑,如果用户无足够的币,可调用下面的this.isCanPlay设置
    console.log('onCheckIsCanPlay param', param)
    var serialNo = param.serialNo
    this.getEncryptData({serialNo: serialNo}).then(res => {
      // encryptedData是后台加密后的数据,具体实现见下面的加密章节
      this.pm.isCanPlay({
        data: res.encryptedData,
        serialNo: serialNo,
      })
    })
  },
  //跳转播放器界面获取加密数据
  getEncryptData(obj) {
    const { serialNo } = obj
    // TODO: 此接口请求后台,返回下面的setCanPlaySerialList接口需要的加密参数
    const { srcAppid, dramaId } = this.pm.getInfo()
    console.log('getEncryptData start', srcAppid, dramaId, serialNo)
    return new Promise((resolve, reject) => {
      // TODO: 开发者后台需要实现此接口,相关的代码node的示例可参考node目录
      wx.request({
        url: '放加密的接口地址',
        data: {
          srcAppid: srcAppid,
          dramaId: dramaId,
          serialNo: serialNo
        },
        success: (res) => {
          console.log('videoPlayer getCanPlayList res', res)
          resolve({
            encryptedData: res.data.encryptedData
          })
        },
        fail: (fail) => {
          reject(fail)
        }
      })
    })
  },

}
function PlayerManager() {
  var newProto = Object.assign({}, proto)
  for (const k in newProto) {
    if (typeof newProto[k] === 'function') {
      this[k] = newProto[k].bind(this)
    } else if (typeof newProto[k] === 'object') {
      if (!newProto[k]) {
        this[k] = newProto[k]
      } else {
        this[k] = deepClone(newProto[k])
      }
    }
  }
}

PlayerManager.navigateToPlayer = navigateToPlayer
module.exports = PlayerManager

三、更改getEncryptData

更改说明:我们的业务是SAAS平台,开发一套公司旗下的所有小程序均可用,我们是通过以下参数来去做的数据隔离
dramaId:主体公司ID,这个可以多个
sysOrgCode:微信小程序数据隔离ID,通过这个就可以裂变出多个小程序,最大限度节约成本
总结来说就是支持多主体公司旗下多小程序在同一平台运营并且数据隔离

代码示例:

getEncryptData(obj) {
		const {
			serialNo
		} = obj
		// TODO: 此接口请求后台,返回下面的setCanPlaySerialList接口需要的加密参数
		const {
			srcAppid,
			dramaId,
			codes
		} = this.pm.getInfo()
		console.log('getEncryptData start', srcAppid, dramaId, serialNo)
		return new Promise((resolve, reject) => {
			var codes = ''
			uni.login({
				//调用uni.login获取用户code
				provider: "weixin",
				success(res) {
					console.log(res)
					//到这一步的前提是后端的加密数据都已经准备好了
					uni.request({
						url: MYurl + '/api/wxApi/selectUnlockRegion',
						method: 'GET',
						data: {
							memberId: uni.getStorageSync('id'),//用户id
							dramaId: dramaId,//剧目id
							sysOrgCode: uni.getStorageSync('sysOrgCode'),//小程序
							tenantId: uni.getStorageSync('tenantId'),//主体公司
							code: res.code,//用户code
						},
						success: (res) => {
							resolve({
								encryptedData: res.data.result.encryptData,
								start_serial_no: res.data.result.freeList[0]
									.start_serial_no,
								end_serial_no: res.data.result.freeList[0]
									.end_serial_no
							})
							return
						},
						fail: (fail) => {
							reject(fail)
						}
					})
				}
			})

		})
	},

四、页面进行调用,跳转至播放器自动播放剧集

如下图所示,当我们点击某个剧目的时候需要向后端传递srcAppid小程序ID和dramaId剧目ID之后调用PlayerManager.navigateToPlayer就会自动跳转到播放页面,这里的前提条件是剧目必须是审核通过的或者是获得授权的剧目才可以进入到插件后播放,如果都没有解锁的情况下可能是你的开始和结束可播放的剧集没有设置

在这里插入图片描述
在这里插入图片描述
代码示例:

openVideoDetail(lItems) {
	PlayerManager.navigateToPlayer({
		srcAppid: uni.getStorageSync('srcAppid'),
		dramaId: lItems.dramaId,
		// extParam: encodeURIComponent('a=b&c=d'), // 分享会携带的参数,可自定义
	})
},

体验可查看下方盼盼短剧,如果有不足或疑惑的地方欢迎大家一起讨论!后续将继续更新短剧播放器以及虚拟支付相关问题!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值