小程序码之拉新推广需求实现
需求场景
公司产品小程序需要做推广,用户通过小程序生成自己的小程序推广海报(海报内容包含小程序码及一些其他信息),新用户通过扫描他人分享的海报小程序码进入小程序并授权注册,则此用户与推广者绑定为被推光和推广关系。
需求实现
后端为每个用户生成自己的唯一的小程序码,新用户进入小程序通过判断是否是通过他人小程序码推广进入来进行逻辑处理,最终将信息存储到数据库。实现步骤:
- 给每一个用户生成自己唯一的小程序码,其中包含用户唯一识别信息用来区分推广者
- 用户分享小程序时,如果是海报形式则将用户唯一小程序码与海报一起生成;如果用户通过链接分享则在链接携带小程序中封装的那个用户唯一识别参数
- 在用户授权注册环节,增加逻辑处理,如果是通过他人推广进入,则绑定推广者与被推广者关系
代码实现
生成小程序码
小程序码生成方法,请参考官方文档。
从官方文档可见有三种方法:
- createQRCode
- get
- getUnlimited
我们选择第三种,因为通过该接口生成的小程序码,永久有效,数量暂无限制,其他两种都是有数量限制的。
通过查看官方文档接口请求参数知道,我们首先需要获取小程序调用接口凭证,所以我们先来通过代码实现生成小程序接口调用凭证,主要代码实现如下:
/*** 生成微信接口调用凭证*/public static String getAccessToken() {Map<String, String> paramMap = new HashMap<>(16);paramMap.put("grant_type", "client_credential");paramMap.put("appid", ConfigConstants.appId);paramMap.put("secret", ConfigConstants.appSecret);try {// 请求微信接口,获取接口调用凭证JSONObject resultJson = JSONObject.fromObject(HttpClientUtil.doGet("https://api.weixin.qq.com/cgi-bin/token", paramMap));if (resultJson.containsKey("errcode")) {logger.error("获取微信接口认证凭证发生错误,错误原因{}", resultJson.getString("errmsg"));return null;} else {return resultJson.getString("access_token");}} catch (UnsupportedEncodingException e) {logger.error("获取微信接口认证凭证发生错误,错误原因{}", e.getMessage());return null;} catch (Exception e) {logger.error("获取微信接口认证凭证发生错误,错误原因{}", e);return null;}}
生成的微信接口调用凭证有效期是两个小时,这里我们为了避免频繁调用小程序官方接口去生成接口调用凭证,我们将生成的接口调用凭证存入我们Redis中,并创建定时任务每隔一定时间(低于2个小时)去刷新token,简单演示代码如下:
/*** 获取当前token** @return*/@Overridepublic String get() {String token = "";for (int i = 0; i < 3; i++) {Object tokenObj = redisUtil.get(RedisKeyConstants.MP_REQUEST_TOKEN);if (tokenObj != null) {token = String.valueOf(tokenObj);break;}logger.warn("get token try");refresh();ThreadUtil.sleep(20);}return token;}/*** 刷新token*/@Overridepublic String refresh() {logger.info("refresh token begin");String accessToken = WxUtils.getAccessToken();//将token存入Redis并设置有效时间为2个小时redisUtil.set(RedisKeyConstants.MP_REQUEST_TOKEN, accessToken, 7200);logger.info("refresh token end; token: {}", accessToken);return accessToken;}/*** 定时任务刷新微信接口请求凭证accessToken*/@Scheduled(cron = "0 0 0/1 * * ?")public void refreshWXAccessToken() {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String startTime = dateFormat.format(new Date());logger.info("获取微信接口调用凭证,当前时间为:" + startTime);String accessToken;for (int i = 1; i <= tryCount; i++) {try {accessToken = mpTokenService.refresh();if (StrUtil.isNotBlank(accessToken)) {break;}Thread.sleep(1000);} catch (Exception e) {logger.error("第{}次获取微信接口认证凭证发生错误,错误原因{}", i, e);}}}
接下来就是生成小程序码,我们将生成的小程序码文件上传到七牛云文件服务器
/*** 获取小程序码,封装请求参数*/@Override@Transactional(rollbackOn = Exception.class)public BaseResponse generateCode(Long expertId, Map<String, Object> reqParam) {String page = "";if(reqParam != null){page = reqParam.get("page") == null ? "" : (String) reqParam.get("page");}ExpertInfo expertInfo = expertMapper.selectByPrimaryKey(expertId);if (expertInfo == null) {return BaseResponse.bad("用户信息错误!");}String spreadCode = expertInfo.getSpreadCode();if (StrUtil.isNotBlank(spreadCode)) {return BaseResponse.ok(spreadCode);}String reqToken = mpTokenService.get();Map<String, Object> requestParam = new HashMap<>(16);//关键参数,通过用户唯一id区分用户requestParam.put("scene", expertId);//设置小程序码宽度requestParam.put("width", 344);//设置扫码进入主页路径requestParam.put("page", page);//请求获取小程序码方法String codeUrl = createCode(reqToken, requestParam);if (codeUrl == null) {return BaseResponse.bad("生成小程序码失败!");}//将小程序码存入库expertInfo.setSpreadCode(codeUrl);expertMapper.updateByPrimaryKeySelective(expertInfo);return BaseResponse.ok(codeUrl);}/*** 获取小程序码,并上传至七牛云文件服*/private String createCode(String reqToken, Map<String, Object> requestParam) {String param = JSON.toJSONString(requestParam);CloseableHttpClient httpClient = HttpClientBuilder.create().build();//请求地址 固定写法HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + reqToken);httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");//转化参数StringEntity entity;try {entity = new StringEntity(param);entity.setContentType("image/png");httpPost.setEntity(entity);HttpResponse response;response = httpClient.execute(httpPost);InputStream inputStream = response.getEntity().getContent();String spreadCode = uploadService.uploadImgByInputStream(inputStream, "SpreadCode");return spreadCode;} catch (IOException e) {e.printStackTrace();return null;}}
实现推广关系绑定
这里我就不展示代码,简单说一下逻辑。在前端登录的时候,携带我们小程序设置的参数用户唯一id,对于新注册用户我们判断是否携带该参数来进行逻辑处理,如果请求携带该参数,将推广与被推广者关系存入库中。如果我们的拉新奖励需求只要拉人注册就设置奖励我们可以在这登录的时候做相应的逻辑处理来奖励推广者。
小程序码之拉新推广需求实现相关推荐
- dev 命令行参数调用_云开发·云调用生成小程序码
小程序云开发已经支持云调用,开放了很多接口,一直想要的获取小程序码也支持了.这下轻量的小程序也可以有自定义小程序码的功能. 1. 需求 获得一个带参数的小程序码,传播出去以后,用户扫码进入指定页面,根 ...
- 芝麻小程序码基于设计原理提供免费美化小程序码
芝麻小程序码(官网首发美化)基于微信小程序码的设计原理,为小程序的开发.设计.运营人员提供免费的美化小程序码服务,助力小程序的运营推广和产品价值的体现. 先释放几个案列图片出来: 2017年4月份,微 ...
- 使用canvas绘制小程序码
场景:使用小程序文档的API可以获取带参数的二维码和小程序码,但是小程序码中的图片默认都是小程序的头像(红框中的图片).现在我们需要替换里面的图片,然后将小程序码保存成一张图片存入相册. 1.获取带参 ...
- 【小程序码 - 设计篇】菊花绽放
作者:lincolnlin,endyxu,changoran 2017 年四月,微信正式推出了小程序码.小程序码的使命及诞生的过程, 扫码背后藏了什么秘密?小程序码又为何长得像菊花? | 你问鹅答 一 ...
- 微信小程序利用云函数获取小程序码(二维码) 将buffer流转换为图片
最近在做毕设,有一个获取小程序码绘制分享海报的需求,因为需要小程序码的数量较多的业务场景,所以只能采用后端生成返回给前端调用或者云开发调用. 生成小程序码的两种方式 HTTPS调用 需要后端生成返回给 ...
- .NET生成小程序码,并合自定义背景图生成推广小程序二维码
前言: 对于小程序大家可能都非常熟悉了,随着小程序的不断普及越来越多的公司都开始推广使用起来了.今天接到一个需求就是生成小程序码,并且于运营给的推广图片合并在一起做成一张漂亮美观的推广二维码,扫码这种 ...
- vue uniapp 微信小程序 搜索下拉框 模糊搜索
vue uniapp 微信小程序 搜索下拉框 模糊搜索 话不多说 直接贴代码 template <template><view class="index"> ...
- 微信小程序通过云函数生成带参数的小程序码
小程序云开发还是挺强大啊,以前动不动就需要后端攻城狮进行操作,现在没后端啥事了,但是头发却开始紧张了啊!o(╥﹏╥)o 公众平台模式: 在没有用云函数时,只能先在微信公众平台去生成带参数的小程序码,接 ...
- uni-app小程序使用小程序码绑定用户信息合成海报
uni-app小程序使用小程序码绑定用户信息合成海报 需求 uni-app小程序使用小程序码绑定用户信息合成海报,小程序码绑定用户信息,和背景图片生成一张海报并保存到本地. 目标 生成目标图片 并保存 ...
最新文章
- 河南省第二届ACM程序设计大赛解题报告(置换群)
- mysql lib_explode_这简直就是一个“定时炸弹”!记一次 MySQL 的奇葩故障
- Zabbix安装 Grafana安装
- 2021天翼杯 密码官方wp
- OpenMP和MPI的区别
- 10 分钟快速入门海量数据搜索分析引擎 Elasticearch
- 如何用函数初始化结构体
- flink的table/sql api的多种写法汇总
- 【git系列】git命令之撤销回退篇
- 简约的网络字节序处理
- 编程基本功:while/for循环中,如果有switch,注意break是中断的哪一层
- Java并发包一览图
- 海淘也疯狂 跨境电商网站8月监测报告
- 负载均衡设备oracle,高可用的Oracle数据库负载均衡技术--深信服AD系列应用交付平台...
- python中扑克牌类设计_基于Python实现扑克牌面试题
- python openpyxl 操作excel 插入行,列
- 微信小程序校园论坛+后台管理系统|前后分离VUE
- 使用OneNote来构建你自己的知识库
- 如何使用ANSYS workbench导出最清晰的图的步骤
- 69 Three.js 导入Collada(.dae)格式的模型