微信小程序腾讯有数埋点

1、接入准备

1-1、SDK

  • 在接入文档SDK的位置可以下载相应的SDK,版本过低的话有数的测试小助手可能会打会
  • 被打回.png

1-2、引用SDK初始化

// app.js

const sr = require('./ad/ad-sdk/sr-sdk-wxapp').init({
  //腾讯有数:您在腾讯有数的token,以 bi 开头,【数据接入】-【接入工具】-【密钥管理】处获取token    
  token: '测试token'
  //微信小程序appID,以 wx 开头
  appid: '微信小程序appID',
  /**
  * 如果使用了小程序插件,需要设置为 true
  */
  usePlugin: false,
  /**
   * 开启打印调试信息, 默认 false
   */
  debug: true,
  /**
   * 建议开启-开启自动代理 Page, 默认 false
   * sdk 负责上报页面的 browse 、leave、share 等事件
   * 可以使用 sr.page 代替 Page(sr.page(options))
   * 元素事件跟踪,需要配合 autoTrack: true
   */
  proxyPage: true,
  /**
   * 建议开启-开启组件自动代理, 默认 false
   * sdk 负责上报页面的 browse 、leave、share 等事件
   */
  proxyComponent: true,
  // 建议开启-是否开启页面分享链路自动跟踪
  openSdkShareDepth: true,
  // 建议开启-元素事件跟踪,自动上报元素事件,入tap、change、longpress、confirm
  autoTrack: false,
  //建议开启-自动化获取openId,授权过的小程序可自动化获取openId
  openAutoTrackOpenId: true,
})

App({
  sr,
  onShow(options) {
    this.setAdUserInfo()
  },
  async setAdUserInfo(){
    var userId = getStorage('userId')? getStorage('userId') :"给一个默认userId"
    var oepnId =  getStorage('openId')? getStorage("openId") : await doGetOpenIdRequest()
    if(!oepnId){
      oepnId = '给一个默认openId'
    }
  
    sr.setUser({
      open_id:oepnId+"",                      
      app_id: wx.getAccountInfoSync().miniProgram.appId,
      user_id: userId+""
    })
    sr.setChan({
      chan_wxapp_scene: wx.getLaunchOptionsSync().scene,
      chan_id: wx.getLaunchOptionsSync().referrerInfo.appId,
    })
  },
})

1-3、关于openId

  • 在登录页获取到openId和userId,再进行一个有数基础信息的设置 Ad.setCommonProperty();。Ad是引入的一个方法类,见2-1

2、使用

2-1、有数公共方法类ad-util.js

//广告管理类
//import sr from '../app.js' 
const app = getApp()

const {
    getStorage,
}= require("../utils/wxutil")
function Ad() {
}



/**
 * 卡券领取
 */
Ad.getCoupon = function(option){
    console.log("获取优惠券")
    let body = {
        coupon:option
    }   
    app.sr.track('get_coupon',body)
}

/**
 * 卡券触发
 * @param {*} option 
 */
Ad.exposeCoupon = function(opstion){
    let body = {
        coupon:opstion
    }
    console.log("body", body);
    app.sr.track('trigger_coupon',body)
}
/**
 * 优惠券核销
 * @param {*} opstion 
 */
Ad.consumeCoupon = function(opstion){
    let body = {
        action_type : opstion.action_type,
        coupon:{
            coupon_id:opstion.coupon_id+"",
            coupon_name:opstion.coupon_name
        }
    }
    app.sr.track('consume_coupon',body)
}

/**
 * 页面分享
 */
Ad.pageShare = function(opstion){
    let body = {
        from_type:opstion.from_type,
        share_title:opstion.share_title
    }
    app.sr.track('page_share_app_message', body)

}

/**
 * 搜索事件
 * @param {*} key 
 */
Ad.search = function(key){
    Ad.setCommonProperty()
    app.sr.track('search', {
        "keyword": key,
    })
}

/**
 * 设置基础信息
 * @param {} param 
 */
Ad.setCommonProperty =  function () {
    var userId =  getStorage('userId')? getStorage('userId') :"默认userId"
    var openId =  getStorage('openId');
    if(!openId ){
        openId = '默认openId'
    }
    app.sr.setUser({
        open_id: openId,
        app_id: wx.getAccountInfoSync().miniProgram.appId,
        user_id: userId+"",
    })
    app.sr.setChan({
        chan_wxapp_scene: wx.getLaunchOptionsSync().scene,
        chan_id: wx.getLaunchOptionsSync().referrerInfo.appId,
    })
}



/**
 * 客服咨询
 * @param {}} option 
 */
Ad.startConsult = function(){
    Ad.setCommonProperty()
    app.sr.track('start_consult',{
        "action_type": "consult_online",
    })
}
/**
 * 
 * 商品浏览
 * @param {*} option (以满足十条)
 */
Ad.browseGoodsDetailPage = function(option){

    option = {
        sku:{
            sku_id: option.sku_id+"", 
            sku_name:option.sku_name+"",
        },
        spu:{
            spu_id : option.spu_id+"",
            spu_name : option.spu_name+"",
        }
    }
    app.sr.track('browse_sku_page', option)
}

/**
 * 
 * 商品曝光
 * @param {*} option (以满足十条)
 */
Ad.exposeGoodsCard = function(option){
    option = {
        sku:{
            sku_id: option.sku_id+"", 
            sku_name:option.sku_name,
        },
        spu:{
            spu_id : option.spu_id+"",
            spu_name : option.spu_name,
        }
    }
    app.sr.track('expose_sku_component', option)
}

/**
 * 
 * 商品卡触发
 * @param {*} option (以满足十条)
 */
Ad.clickGoodsCard = function(option){
    option = {
        sku:{
            sku_id: option.sku_id+"", 
            sku_name:option.sku_name,
        },
        spu:{
            spu_id : option.spu_id+"",
            spu_name : option.spu_name,
        }
    }
    app.sr.track('trigger_sku_component', option)
}



/**
 * 订单行为
 * @param {*} option 
 */
Ad.customOrder = function(option){
    option = {
        order: {
            order_id: option.order_id,
            order_time: option.order_time,
            order_status: option.order_status,
        },
        sub_orders: [ {
            sub_order_id: option.sub_order_id,
            order_amt: option.order_amt,
            pay_amt: option.pay_amt
        }]
    }
    app.sr.track('custom_order', option)
}

module.exports = {
    Ad: Ad,
}

2-2、行为接入

  • 在有数的官方接入数据文档中,接入指引都较为详细
  • image.png
  • 在有相应行为时调用方法进行埋点(以支付为例)
const { Ad } = require("../../ad/ad-util.js")

this.customOrder(e.detail, "pay"); // 点击支付就要上报
this.customOrder(e.detail, "cancel_pay"); // 取消支付
this.customOrder(e.detail, "cancel_give_order"); // 取消订单成功
this.customOrder(e.detail, "payed");  // 支付成功
 /**
   * 有数埋点订单行为
   * @param {*} e
   * @param {*} order_status
   */
  customOrder: function (e, order_status) {
    let orderInfo = {
      order_id: e.orderSn,
      order_time: e.createTime,
      order_status: order_status,
      sub_order_id: e.orderSn,
      order_amt: e.totalPrice,
      pay_amt: e.realPrice,
    };
    Ad.customOrder(orderInfo);
  },

  /**
   * 有数埋点 优惠券核销
   * @param {*} action_type 
   */
  consumeCoupon:function(action_type){
    if(this.data.selectCouponItem){
      let { selectCouponItem:{ couponId, couponName } } = this.data
      let opstion ={
        coupon_id: couponId,
        coupon_name: couponName,
        action_type: action_type
      }
      Ad.consumeCoupon(opstion)
    }
  },
整个流程状态变更.png
  • 商品卡浏览部分使用 IntersectionObserver 对象实例进行曝光上报
  /**
   * 商品卡曝光
   */
  exposeGoodsCard(){
    this._observer = this.createIntersectionObserver({
      thresholds: [0.5],
      observeAll: true
    })
    this._observer.relativeToViewport({ bottom: 0 })
      .observe('.goods-card', (res) => {
        var opstion = {
          sku_id: res.dataset.item.skuId,
          sku_name: `${res.dataset.item.goodsName}${res.dataset.item.skuName}`,
          spu_id: res.dataset.item.goodsIdStr,
          spu_name: res.dataset.item.goodsName,
        }
        Ad.exposeGoodsCard(opstion)
      })
  },

3、数据查看及有数测试报告回馈

3-1、数据查看

  • 在第一测试阶段每个行为数据需达到十条才能送测
  • 之后可以在有数数据管理平台看到相应的日志
  • 数据页面.png

3-2、测试不通过打回报告

  • 这个部分需要在TAPD中查看,不通过的话继续进行埋点修改


    行为列表.png
  • 不通过原因.png
  • 关于申请,送测等部分均是由产品进行。开发者进行数据接入,需要注意的是上报的数据应该前后端需要统一,协商好相应的数据上报

4、更新

  • 有数更换了初始化配置,使用autoProxy进行总集成(替换proxyPage、proxyComponent、openSdkShareDepth)等等。并且通过授权可以自动获取openId和unionId。可将sr.setUser的一系列操作去除。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容