我有一个uniAPP开发的微信小程序,做的是一个拍证件照抠图的功能,需要用户付费才能下载图片。现在我要和一些机构合作推广,我想单独给这些机构一个二维码,那么,这些机构把二维码推广给他的客户的时候,进入这个小程序,免费就可以实现下载功能。
那么问题来了,如何实现这种功能,从而分辨不同的渠道来的用户呢?这时就需要用到微信小程序的获取不限制的小程序码这个功能了,具体柯参照下面小程序文档
获取不限制的小程序码 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
首先需要解决一个问题,如何生成这种小程序二维码,根据官方给的文档我已经写好了python程序,直接修改参数后就可以生成了,代码如下:
import requests
import time
import json
import osclass WeChatMiniProgram:def __init__(self, appid, secret):self.appid = appidself.secret = secretself.access_token = Noneself.expire_time = 0def get_access_token(self):if self.access_token and time.time() < self.expire_time:return self.access_tokenurl = 'https://api.weixin.qq.com/cgi-bin/token'params = {'grant_type': 'client_credential','appid': self.appid,'secret': self.secret}try:response = requests.get(url, params=params)result = response.json()if 'access_token' in result:self.access_token = result['access_token']self.expire_time = time.time() + result['expires_in'] - 200 # 提前200秒刷新return self.access_tokenelse:print(f"获取access_token失败: {result}")return Noneexcept requests.RequestException as e:print(f"请求失败: {e}")return Nonedef get_unlimited_qrcode(self, scene, page=None, width=430, auto_color=False, line_color=None, is_hyaline=False, env_version='trial'):access_token = self.get_access_token()if not access_token:return Noneurl = f'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={access_token}'data = {'scene': scene,'width': width,'auto_color': auto_color,'is_hyaline': is_hyaline,'env_version': env_version}if page:data['page'] = pageif line_color:data['line_color'] = line_colortry:response = requests.post(url, json=data)if response.headers['Content-Type'] == 'image/jpeg':# 请求成功,返回图片数据return response.contentelse:# 请求失败,返回错误信息error_info = response.json()print(f"生成小程序码失败: {error_info}")return Noneexcept requests.RequestException as e:print(f"请求失败: {e}")return None# 使用示例
if __name__ == '__main__':appid = 'appid' # 替换为你的AppIDsecret = 'app_secert' # 替换为你的AppSecretmini_program = WeChatMiniProgram(appid, secret)# 生成小程序码scene = 'scene1' # 你的场景值#page = 'pages/index/index' # 可选,如果不指定则跳转到首页qr_code = mini_program.get_unlimited_qrcode(scene)if qr_code:# 将小程序码保存为图片文件with open('qrcode.jpg', 'wb') as f:f.write(qr_code)print("小程序码已保存为qrcode.jpg")else:print("生成小程序码失败")
那么再来说一下这个代码具体怎么用,
首先将你自己的微信小程序的Appid和APPSecert更换,
登录到mp.weixin.qq.com这个管理后台的开发管理中获取
然后场景值secene,这个变量设置什么值,小程序中就会获取到什么值
scene = 'scene'
另外还有个参数需要注意一下,当小程序没有上线,还在开发版本的时候,就需要用
def get_unlimited_qrcode(self, scene, page=None, width=430, auto_color=False, line_color=None, is_hyaline=False, env_version='trial'):
env_version='trial'
正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。这个参数不要搞错了,根据具体情况来生成相应的版本小程序二维码。
运行python这个程序,就会生成一个小程序二维码
问题来了,如果用户扫了这个二维码,应该怎么在系统中获取这个scene的值呢?
下面来看如何获取这个值
在uniapp的index.vue首页页面中,这里以vue3为例
onMounted(() => {// 获取 scene 参数const query = uni.getLaunchOptionsSync().query;if (query && query.scene) {sceneParam.value = decodeURIComponent(query.scene);console.log('获取到的 scene 参数:', sceneParam.value);uni.setStorageSync('scene', sceneParam.value); //将获取到的的scene保存到缓存,方便其他页面可以调用} else {console.log('没有获取到 scene 参数');}
});
首页页面加载就获取一下scene这个值,获取到了后就存到缓存,或者把这个值发送到后端,由后端判断相应的业务逻辑,如果这个渠道来的用户免费,那么也可以做相应的判断等等。
比如我开发的这个证件照程序就能判断从哪个渠道扫的二维码进来的用户。
如果想生成其他不同的渠道的二维码,就用这个方法就可以实现,从而统计不同的渠道来的用户,便于后续运营中看哪个推广来的渠道的用户更多