怎么制作自定义二维码,分享免费创意二维码生成器

本人最近在做一个saas模式的产品开发,公众号只有一个,但服务的客户有多种,在各客户下又有各自的用户。现在有这么一个需求,当用户扫描客户提供的公众号二维码时,会出现对应的客户欢迎语,并且显示客户的LOGO界面。前提是每个客户的LOGO是不同的。是不是有点绕?讲明白点,就如你一个公众号,要被多个商家使用,每个商家都有自己的用户群,那用户在扫码关注公众号,进入公众号需要显示每个商家自己的独特LOGO。…

自己近期在做一个saas模式的产品研发,公众号只有一个,但服务项目的客户有多种多样,在各客户下又有不同的用户。现在有这样一个要求,当用户扫描仪客户给予的公众号二维码时,会发生相应的客户欢迎标语,而且表明客户的LOGO页面。前提条件是每一个客户的LOGO是不一样的。是否有点儿绕?讲搞清楚点,就假如你一个公众号,要被好几个商家应用,每一个商家都是有自身的用户群,那用户在扫码关注公众号,进到公众号必须表明每一个商家自身的与众不同LOGO。

正常的的关心公众号二维码照片是可以去公众号开发人员后台管理下载。但这也是统一的二维码,没法区别商家。这个时候,大家就必须自已去形成公众号的关心二维码。这一二维码跟在网上自动生成的作用不一样。终究你扫二维码后,还得跟第三方的腾讯官方联接。

一、JAVA编写形成二维码插口

主要参数微信公众号接口https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542

大家形成一个永久性带字符串数组的二维码,大家只必须传一个商家的ID,就能鉴别用户关心时,是扫了哪一个二维码,进而表明相应的商家LOGO

Controller层

@ApiOperation(value = \"建立公众号二维码\")
@ResponseBody
public Result createQRCode(
@ApiParam(name = \"type\", value = \"种类(1:临时性二维码;2:永久性主要参数为数据的二维码;3:永久性主要参数为字符串数组的二维码)\") @RequestParam() Integer type,
@ApiParam(name = \"validTime\", value = \"临时性二维码的有效时间(秒,最大2592000秒(30天))\") @RequestParam(required = false) Integer validTime,
@ApiParam(name = \"IntParameter\", value = \"数据主要参数\") @RequestParam(required = false) Integer IntParameter,
@ApiParam(name = \"strParameter\", value = \"字符串数组主要参数\") @RequestParam(required = false) String strParameter,
HttpServletRequest request
){
return wechatPushService.createQRCode(type,validTime,IntParameter,strParameter, this.getUserId(request));
}

领域模型层

//获得公众号二维码
private final static String GET_PERPETUAL_QRCODE_URL = \"https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN\";
//获取TICKET相匹配的二维码图
private final static String GET_TICKET_QRCODE_URL = \"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=\";
public Result createQRCode(Integer type, Integer validTime, Integer IntParameter, String strParameter,String userId) {
String accessToken = weChatPushService.getGzhAccessTokenDefaultCfg();//获得公众号Token
String requestUrl = GET_PERPETUAL_QRCODE_URL.replace(\"ACCESS_TOKEN\", accessToken);//更换URL的主要参数
JSONObject json = new JSONObject();
JSONObject actionInfoJson = new JSONObject();
JSONObject sceneJson = new JSONObject();
String fileName = \"/sys/QRCode/\" strParameter \".jpg\";//照片的下载途径
if(type == 3){//形成永久性带字符串数组主要参数的二维码
json.put(\"action_name\",\"QR_LIMIT_STR_SCENE\");//数值
sceneJson.put(\"scene_str\",strParameter);//strParameter是商家ID的主要参数,也是要跟二维码一同形成的主要参数
actionInfoJson.put(\"scene\",sceneJson);
json.put(\"action_info\",actionInfoJson);
//{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"test\"}}} 启用公众号插口的主要参数文件格式,json值
Map<String, Object> map = RequestUtils.json(requestUrl, json);//POST方式启用第三方公众号插口
String ticket = map.containsKey(\"ticket\")?map.get(\"ticket\").toString():\"\";//从回到主要参数中获得二维码ticket值
if(org.apache.commons.lang.StringUtils.isNotEmpty(ticket)){//应用ticket的值再去启用此外一个插口,下载二维码照片
File file1 = new File(filePath \"sys/QRCode/\");//自身要把照片下载的途径
if(!file1.exists()){//分辨文件路径是不是存有,不会有就建立
file1.mkdirs();
}
downloadPicture(GET_TICKET_QRCODE_URL URLEncoder.encode(ticket),filePath fileName);//下载照片
}
}
return ResultUtil.success(fileName);
}
/**
* 获得默认设置公众号浏览动态口令
*/
public String getGzhAccessTokenDefaultCfg() {
if (StringUtils.isEmpty(defaultGzhAppId) || StringUtils.isEmpty(defaultGzhSecret)) {
initialize();//载入环境变量里公众号的值(appId和appSecret),这两个值在公众号里有,公众号的插口大多数必须这两个主要参数去获得Token
}
return getGzhAccessToken(defaultGzhAppId,defaultGzhSecret);
}
// 获取企业公众号access_token
private final static String company_access_token_url = \"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=CORPID&secret=CORPSECRET\";
// 获得开发者平台的access_token、openid等验证信息内容
private final static String GET_TOKEN_URL = \"https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code\";
/**
* 获得手机微信公众号浏览动态口令
* @param appId appId
* @param appSecret appSecret
*/
public String getGzhAccessToken(String appId, String appSecret) {
String accessToken = \"\";
try {
accessToken = redisService.getDataService(\"WX_AccessToken\").getData().toString();//从Redis缓存文件中获得Token,
} catch (Exception e) {
log.error(\"从缓存文件手机微信公众号token不成功\");
}
if (StringUtils.isEmpty(accessToken)) {//假如缓存文件并没有Token,或到期了,将再次去获得一次
String requestUrl = company_access_token_url.replace(\"CORPID\", appId).replace(\"CORPSECRET\", appSecret);//更换主要参数
Map<String, Object> map = RequestUtils.json(requestUrl, null);//POST插口启用第三方接口
// 假如要求取得成功
if (null != map) {
System.out.print(\"###############################\" map.toString());
try {
accessToken = (String) map.get(\"access_token\");
redisService.strAdd(\"WX_AccessToken\", accessToken, 700);// (存到缓存文件中,防止常常去拿token,接近两小时)
} catch (Exception e) {
log.error(\"获得手机微信公众号token不成功,或token储存至缓存文件不成功 ####accessToken\" accessToken);
}
}
}
return accessToken;
}

POST和GET要求java工具,在获得照片时,必须应用GET

import org.springframework.http.MediaType;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;
/**
* 工具类
*/
public class RequestUtils {
@SuppressWarnings(\"unchecked\")
public static Map<String, Object> json(String url, Map<String, Object> params){
String content = null;
if(params != null){
content = JsonUtils.convert(params);
}
String result = post(url, content, MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON);
if(result != null){
return JsonUtils.convert(result, Map.class);
}
return null;
}
public static void main(String[] args) {
String post = post(\"http://www.baidu.com\", \"\", MediaType.APPLICATION_JSON);
System.out.println(post);
}
public static String post(String strURL, String content) {
return post(strURL, content, null);
}
public static String post(String strURL, String content, MediaType mediaType) {
return post(strURL, content, mediaType, mediaType);
}
public static String post(String strURL, String content, MediaType sendMediaType, MediaType receiveMediaType) {
try {
URL url = new URL(strURL);// 建立联接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(content != null);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestMethod(\"POST\"); // 设定要求方法
if(sendMediaType != null) {
connection.setRequestProperty(\"Accept\", receiveMediaType.toString()); // 设定获取数据的文件格式
}
if(sendMediaType != null) {
connection.setRequestProperty(\"Content-Type\", sendMediaType.toString()); // 设定传送数据的文件格式
}
connection.connect();
if(content != null) {
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), \"UTF-8\"); // utf-8编号
out.write(content);
out.flush();
out.close();
}
int code = connection.getResponseCode();
System.out.println(code);
InputStream is = connection.getInputStream();
if (is == null) {
is = connection.getErrorStream();
}
// 载入回应
int length = (int) connection.getContentLength();// 获得长短
if (length != -1) {
byte[] data = new byte[length];
byte[] temp = new byte[1024];
int readLen = 0;
int destPos = 0;
while ((readLen = is.read(temp)) > 0) {
System.arraycopy(temp, 0, data, destPos, readLen);
destPos = readLen;
}
String result = new String(data, \"UTF-8\"); // utf-8编号
return result;
}
} catch (IOException e) {
e.printStackTrace();
}
return null; // 自定错误报告
}
public static String get(String url) {
BufferedReader in = null;
try {
URL realUrl = new URL(url);
// 开启和URL中间的联接
URLConnection connection = realUrl.openConnection();
// 设定通用性的要求特性
connection.setRequestProperty(\"accept\", \"*/*\");
connection.setRequestProperty(\"connection\", \"Keep-Alive\");
connection.setRequestProperty(\"user-agent\", \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)\");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
// 创建真实的联接
connection.connect();
// 界定 BufferedReader键入流来载入URL的回应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return null;
}
}

插口写完后,你能单元测试卷启用一下,形成的二维码就可以扫一下,是否会跳到你相匹配的微信公众号页面。自定二维码已经形成了,但如今跟平常的二维码没差别,由于并没有开启事情。下面,撰写一个能让微信公众号启用你的办法的插口。让微信公众号对你说,有些人关心或取关。

二、事情开启插口

controller层

//微信推送事情 url
@RequestMapping(\"/openwx/getticket\")
public void getTicketMessage(HttpServletRequest request, HttpServletResponse response)
throws Exception {
wechatPushService.getTicketMessage(request,response);

事件开启逻辑性层,看下面编码时,首先看官方网的文本文档,那样更能了解回到主要参数:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

 public String getTicketMessage(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println(\"1.接到微信服务器信息\");
Map<String, String> wxdata=parseXml(request);
if(null != wxdata){
String key = wxdata.get(\"FromUserName\") \"._\"
wxdata.get(\"ToUserName\") \"__\"
wxdata.get(\"MsgId\") \"._\"
wxdata.get(\"CreateTime\");
Result keyRedisResult = redisService.getDataService(key);
System.out.println(keyRedisResult.getStatus());
if(keyRedisResult.getStatus() == 200){//避免群众反复消息推送信息,因此第一次把信息送缓存文件中,假如出现了也不解决
return null;
}
redisService.strAdd(key,\"1\",3600);//不会有得话,放缓存文件里,还记得加一个无效时长,防止一直存有,占有网络资源
String Event = wxdata.get(\"Event\");
System.out.println(\"Event\" Event);
if(Event.equals(\"subscribe\") || Event.equals(\"SCAN\")){//扫码带主要参数的二维码进到的
String EventKey = wxdata.get(\"EventKey\");//获得主要参数
String FromUserName = wxdata.get(\"FromUserName\");//OpenID
if(EventKey.indexOf(\"_\") != -1){//第一次关心
EventKey = EventKey.substring(EventKey.indexOf(\"_\") 1);
}
System.out.println(\"EventKey:\" EventKey);
Map map = (Map)result.getData();
TextMessage textMessage=new TextMessage();
textMessage.setToUserName(wxdata.get(\"FromUserName\")); //这儿的ToUserName 是刚刚接受xml中的FromUserName
textMessage.setFromUserName(wxdata.get(\"ToUserName\")); //这儿的FromUserName 是刚刚接受xml中的ToUserName 这儿一定要留意,不然会出差错
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(\"text\");
textMessage.setContent(\"欢迎你关心\" map.get(\"departmentTopName\") \"电子送达\");
MessageUtil messageUtil = MessageUtil.getInstance();
String xml=messageUtil.textMessageToXml(textMessage);
System.out.println(\"xml:\" xml);
response.setCharacterEncoding(\"UTF-8\");
PrintWriter out = response.getWriter();
out.print(xml);//客户关心时,发一个欢迎标语给客户
out.close();
}
}
return null;
}

三、开启插口写完后,必须去公众号后台去设定你的插口网络服务器,让微信公众号了解你的插口详细地址。

如何生成关注公众号自定义二维码及监听扫码事件
如何生成关注公众号自定义二维码及监听扫码事件

改动配备,服务器ip给你布署的详细地址,务必另一方能连上去,并且必须80端口号(假如80端口被占用,可以应用Nginx做分享),在配备的情况下,微信公众号会试着启用,调用不上你的插口,会立即提示你。

配备完后,点一下运行。这个时候你再去关心你刚刚生成的主要参数二维码,便会有体现了。还记得在事情开启插口中,提升你的业务流程。客户关心或取关时,你需要干什么。

此外,在运行配备后,你就会发现,你的微信公众号自定义菜单不见了,这个时候不要慌。接下来往下看。

如何生成关注公众号自定义二维码及监听扫码事件
如何生成关注公众号自定义二维码及监听扫码事件

运行菜单栏

如何生成关注公众号自定义二维码及监听扫码事件

这个时候微信公众号上的小菜单栏就拥有。但公众号后台自定义菜单或是看不见?那怎么修改菜单栏呢?

非常简单,先把前边打开的服务器的配置给终止了,随后再改你的菜单栏,改动完菜单栏后,你再逐渐网络服务器。到此就完成了生成及事情监听的全过程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月29日 上午10:32
下一篇 2022年5月29日 上午10:32

相关推荐

  • 爆破营销怎么做,它跟裂变营销有什么区别

    爆破营销 第一眼看到爆破肯定都会想到跟爆炸有关的事情,那爆破营销会是什么意思呢? 其实爆破营销很简单的理解就是把营销做成“爆炸式”的。其实爆破营销很简单,就是集中要买、想买的客户在某个确定的时间和地点中,对这些人群进行营销的这样一种模式。 爆破营销,也叫会议营销、活动营销。 “爆破营销”属延展出的营销新理念,集中所有可促进成交的资源,储备大量精准客户进行定点促销。“爆破营销”的概念从2012年上半…

    2022年5月19日
    970
  • 妮维雅洗面奶怎么样(公认最好用又便宜的洗面奶之一)

    我和男友都是比较喜欢这款妮维雅黑瓶洗面奶,使用的时间也比较长了,会经常回购;这款洗面奶特别适合油性肌肤的人使用,不是油性肌肤也可以放心使用的,这款洗面奶可以有效控油达到深层清洁的作用,同时可以进行深层补水,使肌肤重新焕发活力! 包装外壳 本款妮维雅黑瓶洗面奶比较小巧特别方便携带,适合旅行出玩时携带;包装是黑色的外壳,比较深邃神秘,上面绘有很多纹路摸上去质感比较好,给人一种很高级的质感;男友也是喜欢…

    2022年9月27日
    3320
  • 闪迪固态移动硬盘怎么样(无论是外观还是性能都没的话说)

    一直以来,移动硬盘的市场被大容量的HDD占据,凭借着越来越低的成本和技术门槛,各种各样或大或小的品牌都推出了基于HDD的移动硬盘。但是,随着消费者对硬盘速度、数据安全性、硬盘体积要求的不断严苛,传统的HDD移动硬盘已经很难满足这部分有进一步要求的消费者。于是移动固态硬盘横空出世,凭借着更小的体积、更轻的重量和更快的传输速度受到了更多用户的欢迎。 闪迪极速移动固态硬盘也是在这一背景之下推出的产品,不…

    2022年9月19日
    510
  • 抖音直播怎么开通,抖音开通直播方法教程

    抖音直播功能自从上线以来就是就是个个娱乐主播的必争权限。但是抖音直播并不像其他娱乐直播平台一样没有入住条件或者说入住条件很低。抖音直播权限确实想要一定的辛苦付出才能获取。那么抖音怎么申请开通直播呢? 抖音直播申请开通必须要有4000的粉丝基础。小伙伴们是不是感觉这个粉丝量很难达到,其实想要达到这个粉丝量也不难,只要坚持不断的更新优质作品,出一条热门视频涨粉4000还不是易如反掌的事。 开通抖音直播…

    2022年8月15日
    650
  • 机器人电话营销好用吗,使用电话营销机器人的利弊分析

    【业务逻辑】 人工智能技术改造传统行业是这几年最大的风口之一! 人工智能技术是继互联网技术后,对社会影响最深远的技术; 究其原因是因为人工智能技术有非常广泛的应用方向,尤其是图像识别和语音识别技术。 这两项技术结合,就像人有了眼睛、耳朵和嘴巴。让电脑程序看得懂实物、听得懂人话、会说人话。 人工智能 再配合已经比较成熟的软件技术、硬件技术,就可以实现简单的人机交互,和处理一些简单业务。 今天,我要说…

    2022年8月22日
    630
  • 淘宝客怎么用,淘宝客的玩法及注意事项

    设置佣金比例一定要细致,并反复核算成本,这样才能让利益最大化! 我们通过定向计划招来的淘宝客,就像我们的员工一样,只不过他们干出实效以后,才会付给他们工资,所以我们在日常的淘宝工作中,也要好好的沟通和管理他们,做好定时维护! 进入定向计划后,首先我们要起个计划名称,名称要响亮一些,比如高性价比商品,50%佣金等等,然后公开计划,并且把计划改为手动审核。佣金和主推商品的设置方法和通用计划一样。 计划…

    2022年7月11日
    570
  • 如何留住好员工(教你做好4点就可以)

    优秀的员工,对公司的发展至关重要。如今,在职场,出现以非常尴尬的现象:很多人找不到工作,而对企业来说,却招不到优秀的员工。究其原因,是劳动力供给市场和需求市场并不对称。对劳动者来说,好企业是稀缺品;而对企业来说,优秀的员工是稀缺品。 优秀的员工,对公司的发展至关重要。在无法聘足够多的优秀的员工的情况下,留住优秀的员工就显得至关重要。而现在的劳动力场是开放的,每个人都可以轻易地从互联网上获取自己心仪…

    2022年10月21日
    450
  • 家里手机信号不好怎么办(增强手机信号的小方法)

    由于现在手机的功能越来越多,导致许多人都忘记了手机最开始其实是一种通讯设备。对于通讯设备而言,手机信号是一项非常重要的因素。 图片来源于网络 手机信号要是太差,那手机的各种网络功能都会受到影响,手机立马变成砖头了。那如果我们碰到手机信号差的情况,该怎么解决呢?老师傅们建议我们从下面这几个方面入手。 外界因素原因,环境信号不良 图片来源于网络 如果遇到手机信号不好的情况,首先我们应该先搞清楚是什么原…

    2022年5月10日
    1080
  • 什么是文网文,文网文许可证办理流程

    现如今,越来越多的游戏直播玩家凭借其精湛的游戏技术,在一些直播平台将游戏直播进行的有声有色,受很多普通玩家的追捧,王者荣耀,英雄联盟,绝地求生,这些游戏的高端操作让人欲罢不能,备受追捧,法师、刺客、射手等的游戏策略更是数不胜数。 我们也不难发现,网络游戏在人们的生活变得更加重要,现代生生活的各种压力使得很多在游戏中寻求放松,越来越多的游戏开发商发现了游戏的商机,不断有新的游戏被开发出来。游戏的增多…

    2022年7月7日
    670
  • 挣钱的项目有哪些,分享10个不起眼的暴利项目

    2016年注定是不平凡的一年,众多企业倒闭,传统行业受到摧残。人们纷纷选择创业,掀起一股创业潮,那么今年什么最挣钱?有哪些好项目推荐?我给你十个,挣钱去吧。 1.一站式泡芙小店,草根经营一年也能变土豪 泡芙是一种人们常见的烘焙食品,传统烘焙店中的泡芙口味单一,而本项目的泡芙的口味多达几十种,使其脱离了烘焙单品的尴尬局面,使其可以单独开店。而且本项目的技术为特殊的微孔灌注技术,属于市场独创。 2.鱼…

    2022年10月11日
    480

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信