Uniapp?實現(xiàn)全民分銷功能原理解析
前言
前段時間在掘金 app 多了一個推廣中心,分享課程鏈接,若有其他用戶從你分享的鏈接購買,你就可以獲得一筆傭金,我們稱類似的功能叫全民分銷,全民分銷在互聯(lián)網推廣中很常見,比如騰訊云、阿里云等都有,只不過叫法不一樣、騰訊云叫 SCP,阿里云叫推廣云大使。筆者也通過類似的活動,也獲得過一些收益,由于全民分銷功能使用門檻較低、傳播速度快、對于平臺商家和用戶都是零成本的,成了互聯(lián)網中熱門的推廣功能,本篇介紹下全民分銷功能實現(xiàn)原理。

流程圖

推廣者(也就是老用戶)生成唯一的推廣鏈接或者二維碼,新用戶點擊推廣者鏈接記錄推廣者 ID,用戶下單生成推廣記錄流水,當然還有另外一種方式,拉新獲得獎勵,比如拉新 3 人獲得代金券等
表結構
比如有一張用戶表
interface User {
_id: string
// 名稱
name: string
// 頭像
avatar: string
// weixin 唯一ID
openid: string
// 創(chuàng)建時間
createTime: number
// 積分
integral: number
}一張記錄表
interface Record {
_id: string
// 獲得積分描述
name: string
// 發(fā)放模式 1 已發(fā)放 0 未發(fā)放
mode: number
// 關聯(lián)用戶表
userId: string
// 創(chuàng)建時間
createTime: number
// 獲得積分
integral: number
}積分用來描述用戶收益,或者可以用積分來兌換獎勵,這部分可以根據(jù)不同的活動有不同的實現(xiàn)方式。以上數(shù)據(jù)字段是簡易版設計,實際可以根據(jù)活動情況增加字段。
分享的 3 種方式
復制鏈接
在 web app 中一般會使用復制鏈接的功能 在現(xiàn)代瀏覽器(chrome 66+,edge 79+ )中只需要 1 行代碼就可以實現(xiàn)復制和粘貼
const copy = (text) => navigator.clipboard.writeText('Hello world!')粘貼
const text = navigator.clipboard.readText()
如果需要兼容老的瀏覽器可以使用 clipboard.js
轉發(fā)
在小程序中會有轉發(fā)和分享的按鈕, 只需要在函數(shù)生命周期中加入 2 個函數(shù)就可以了。
onShareAppMessage() {
// 轉發(fā)
return {
title: this.detail.title + ' | 前端面試題庫',
path: '/pages/index/detail?id=' + this.detail._id + '&userId=' + this.vuex_user ? this.vuex_user._id : '',
}
},
onShareTimeline() {
// 分享到朋友圈
return {
title: this.detail.title + ' | 前端面試題庫',
path: '/pages/index/detail?id=' + this.detail._id + '&userId=' + this.vuex_user ? this.vuex_user._id : '',
}
}上述代碼是我的面試刷題小程序代碼 detail._id 是題目 id,this.vuex_user._id 是當前用戶的 id,這樣,每一道題目分享出去都會帶上當前用戶的 id。
生成帶參數(shù)的二維碼
在小程序中可以使用 wxacode.getUnlimited 接口獲取小程序碼,適用于需要的碼數(shù)量極多的業(yè)務場景。通過該接口生成的小程序碼,永久有效,數(shù)量暫無限制。
首先需要獲得 access_token,這個是接口調用憑證
//封裝獲取 access_token 的方法, 1分鐘1w次
async function getAccessToken(appId, appSecret) {
const res = await uniCloud.httpclient.request(
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`,
{
dataType: 'json',
}
)
return res.data.access_token
}接下來就可以調用微信提供的接口,生成唯一的小程序碼
async function getMpCode(scene, page, access_token) {
const res = await uniCloud.httpclient.request(
`https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${access_token}`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: {
scene,
page,
},
}
)
return res.data
}參數(shù)說明
- env_version:要打開的小程序版本。正式版為 release,體驗版為 trial,開發(fā)版為 develop
- page: 頁面 page,例如 pages/index/index,根路徑前不要填加 /,不能攜帶參數(shù)(參數(shù)請放在 scene 字段里),如果不填寫這個字段,默認跳主頁面
- scene:二維碼唯一參數(shù), 最大 32 個可見字符,只支持數(shù)字,大小寫英文以及部分特殊字符:
!#$&'()*+,/:;=?@-._~,其它字符請自行編碼為合法字符(因不支持%,中文無法使用 urlencode 處理,請使用其他編碼方式)
返回值
- Buffer 返回的圖片 Buffer
云函數(shù)生成小程序碼
exports.main = async (event, context) => {
const appId = '你的 appId'
const appSecret = '你的 appSecrets'
const { page, scene } = event
const access_token = await getAccessToken(appId, appSecret)
const res = await getMpCode(scene, page, access_token)
return res
}小程序端生成 canvas 海報
uniCloud.callFunction({
name: 'getmpcode',
data: {
scene,
},
success: (res) => {
const imagepath = `${wx.env.USER_DATA_PATH}/mpcode.png`
const fs = uni.getFileSystemManager()
fs.writeFileSync(
imagepath,
uni.arrayBufferToBase64(res.result.data),
'base64'
)
canvasdrawImage(imagepath)
},
})我們在頁面上加一個生成朋友圈海報的按鈕,當點擊這個按鈕觸發(fā)云函數(shù),生成小程序碼,然后生成一個 ${wx.env.USER_DATA_PATH}/mpcode.png 臨時文件路徑,將接口返回的數(shù)據(jù)通過 uni.arrayBufferToBase64 轉成 base64,最后將 base64 寫入臨時文件,此時本地就有了帶參數(shù)的二維碼。
接下來將二維碼繪制在 canvas 上就可以了
<template>
<view>
<canvas canvas-id="myCanvas" style="width:100vw;height:100vw;"></canvas>
</view>
</template>function canvasDrawImage(imagepath){
const context = uni.createCanvasContext('myCanvas');
context.drawImage(imagepath,470,530,100,100);
context.draw();
}此時我們可以在頁面上看到一個小程序碼,drawImage 參數(shù)接收一個本地圖片路徑,在 470,530 的坐標,繪制一個 100,100 的小程序二維碼
var img = new Image();
img.onload = function() {
context.drawImage(img, 0, 0);
};
img.src = 'https://example.com/files/backdround.png';為了讓海報更加好看,我們可以設計一張背景,先在 canvas 上繪制背景,文字等,然后再繪制小程序碼。
下載生成的 canvas 海報
methods: {
saveImage() {
uni.showLoading({
title: '加載中...',
mask: true,
})
uni.canvasToTempFilePath({
//將canvas保存到一個臨時文件
canvasId: 'myCanvas', //畫布id
success: (res) => {
const fs = uni.getFileSystemManager()
fs.saveFile({
tempFilePath: res.tempFilePath, // 傳入一個本地臨時文件路徑
success: (res) => {
this.posterImage = res.savedFilePath
this.saveImageToPhotosAlbum()
},
fail: (err) => {
console.log(err)
},
})
uni.hideLoading()
},
})
},
saveImageToPhotosAlbum() {
uni.saveImageToPhotosAlbum({
filePath: this.posterImage,
success: () => {
this.$emit('close-overlay')
uni.showToast({
title: '保存圖片成功',
duration: 2000,
})
},
fail(err) {
const { errMsg } = err
if (errMsg === 'saveImageToPhotosAlbum:fail auth deny') {
uni.showModal({
title: '保存失敗',
content: '請授權保存圖片到“相冊”的權限',
success: (result) => {
const { confirm } = result
if (confirm) {
uni.openSetting({})
}
},
})
}
},
})
},
}在頁面上加一個下載海報按鈕,點擊就調用 saveImage 函數(shù), 這樣就可以將 canvas 海報保存到本地相冊了。
注意 雖然是 canvas 下載圖,但是需要在微信小程序后臺: 開發(fā)平臺->服務器域名->uploadFile 合法域名要添加上 example.com 否則沒辦法下載成功圖片。
插入記錄表
從 url 獲得推廣者的 id, 我們需要在用戶注冊或者下單的時候,推廣者獲得收益和積分等記錄存入一張收益記錄表, 這樣就可以根據(jù)記錄或者獲得查詢收益。代碼比較簡單,這里就不貼了。
小結
本文記錄了小程序端全民分銷的實現(xiàn)方式,包含前后端的邏輯和思路,總體比較簡單,唯一難的就是使用 canvas 繪制海報,若要繪制一張好看的 canvas 海報,可能會花費你不少時間,但是我們可以使用現(xiàn)成的插件,直接在 Dcloud 插件市場搜索關鍵詞“海報”,里面有各種已經封裝好的插件,這里我推薦使用 海報畫板,支持 xml 和 json 等方式配置,使用比較簡單。
到此這篇關于Uniapp 實現(xiàn)全民分銷功能原理解析的文章就介紹到這了,更多相關Uniapp 全民分銷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ie中js創(chuàng)建checkbox默認選中問題探討
js創(chuàng)建checkbox默認選中在某些特殊情況下還是比較實用的,下面有個不錯的示例,大家可以參考下2013-10-10

