[微信开发] - 用户获取推广二维码
?
通過生成帶參二維碼,將用戶的openid獲取的同時做為參數,生成后,另一個用戶掃碼該二維碼,系統可以獲取到新用戶openid的同時,也能標識著是哪個用戶被掃碼了.
?
更多的圖
通過上圖可以看到,當A君關注B君展示的推廣二維碼關注微信平臺后,可以獲取到同樣包含B君的A君的一些信息.
假如要做一個功能,將A君的openid綁定到B君的數據下面,即B君邀請了哪些人可以進行查看,則需要在對應著的B君的用戶數據表的關聯表(如粉絲表)中進行A君的數據記錄,這里可以只記錄openid.
?
這里要注意: 如果A君重復掃B君的推廣二維碼,就會出現重復的數據.
?
?[解決重復關注] 當A君之前未關注,掃碼B君的推廣二維碼時,在EventKey字段含有qrscene_字眼,也就是,當判定該EventKey(新關注者)的字段openid前是否有這個qrscene_
如果有呢,則說明是處于未關注微信平臺時掃碼關注的.繼而再去B的粉絲表中查詢是否有該openid,如果有呢,則說明之前已經通過B君的推廣二維碼進行了關注,則不予給B君
推廣獎勵.反之則給予獎勵.
?
[新用戶的推廣二維碼生成] A君的openid前含有qrscene_,并且B君粉絲表之前沒有過該openid,則進行粉絲表的數據插入,將A君openid插入進去,并給B君獎勵,同時,做為新關注
的A君,此時微信平臺應該彈出A君的推廣二維碼了.
DefaultMessageHandler: @Overridepublic String invoke(ServletInputStream inputStream) throws WeixinException {try {//將輸入流轉換為字符串String xmlMsg = XStreamFactory.inputStream2String(inputStream);if (Configuration.isDebug()) {System.out.println("獲取POST的消息:");System.out.println(xmlMsg);System.out.println("------------------------");/*** 獲取掃碼時的用戶數據,EventKey (包含掃碼登錄和掃碼推廣二維碼)*/try {System.out.println("test");Map<String, String> xmlMap = MapUtil.xmlToMap(xmlMsg);System.out.println("xmlMap.get(\"ToUserName\"):"+xmlMap.get("ToUserName"));if(xmlMap.get("ToUserName")!=null){xmlObj = new ScanQrcodeXml();xmlObj.setToUserName(xmlMap.get("ToUserName"));//wechat Original idxmlObj.setFromUserName(xmlMap.get("FromUserName"));//openid System.out.println(xmlObj.getFromUserName());scanQrcodeXmlLoader.setScanQrcodeXml(xmlObj);if(xmlMap.get("EventKey")!=null && xmlMap.get("EventKey").startsWith("qrscene_")){System.out.println("xmlMap.get(\"EventKey\"):"+xmlMap.get("EventKey"));xmlObj.setEventKey(xmlMap.get("EventKey"));scanQrcodeXmlLoader.setScanQrcodeXml(xmlObj);}}} catch (Exception e) {e.printStackTrace();}}return this.invoke(xmlMsg);} catch (IOException ex) {throw new WeixinException("輸入流轉換錯誤:", ex);}}以上代碼中的獲取FromUserName和EventKey等可以獲取到掃碼登錄時的用戶信息和掃碼關注推廣二維碼的用戶信息及EventKey(內含有openid)
結合"掃碼場景關注事件"將含有qrscene_的EventKey用戶進行推廣二維碼的生成,并對不含有qrscene_的用戶做出"請勿重復掃碼"的友情提示.
DefaultEventMessageHandler: @Overridepublic OutputMessage qrsceneSubscribe(QrsceneSubscribeEventMessage msg) {TextOutputMessage out = new TextOutputMessage();out.setContent("掃碼場景關注事件");//TODO 在這里執行A君的推廣二維碼圖片生成及推送return out;}?
?
?
最終,不要忘記,當用戶未關注時,掃推廣二維碼會收到以上事件,需要的是再去B君的粉絲表查看該用戶之前是否已經通過B君做了掃碼關注.
其實這樣也不妥當,因為你阻止不了他關注了這個,取關,又去關注C君.
所以當用戶第一次關注時,就該把用戶數據記錄到用戶表里,A君掃碼推廣二維碼時,先要去用戶表去查是否有該用戶已經在用戶表中,有的話
則不予B君獎勵,并提示"請勿重復關注",否則將發送推廣二維碼給A君.
?
微信平臺也可以提示: 回復"推廣" 或點擊某個菜單按鈕 可以獲取 推廣二維碼.
?
?
?
現在A君關注B君的推廣二維碼,關注平臺后,也會立即收到一個A自身參數的推廣二維碼:
做了一個工具類封裝:
QrcodeSpreadUtil : package com.baigehuidi.demo.weixin4j.util;import com.baigehuidi.demo.loader.WeixinInsLoader; import com.baigehuidi.demo.weixin4j.WeixinException; import com.baigehuidi.demo.weixin4j.model.message.MediaType; import com.baigehuidi.demo.weixin4j.model.qrcode.Qrcode; import com.baigehuidi.demo.weixin4j.model.qrcode.QrcodeType;import java.awt.image.BufferedImage; import java.io.File; import java.util.Date;/*** TODO 待完善將D:盤符下的圖片(底部海報)改為參數傳入.(涉及到Weixin類) 2018-12-19*/ public class QrcodeSpreadUtil {/*** 該方法將用戶A掃碼用戶B后,關注微信平臺時,可以獲取到一個含有A自身openid參數的推廣二維碼* @param openid 傳入用戶的openid* @return 新的二維碼圖片的MediaId*/public static String getNewQrcodeMediaId(String openid) {Qrcode qrcode = null;String qrcodeUrl = null;String picUrlOnServer = null;String imgMediaId = null;try {//永久二維碼過期時間不會被加入參數qrcode = WeixinInsLoader.getWeixinInstance().qrcode().create(QrcodeType.QR_LIMIT_STR_SCENE, openid, 99);//獲取推廣二維碼圖片URL // qrcodeUrl = WeixinInsLoader.getWeixinInstance().qrcode().showQrcode(qrcode.getTicket());//將二維碼圖片保存//圖片保存地址: 從weixin4j.properties中獲取保存路徑,圖片格式為.jpgpicUrlOnServer = WeixinInsLoader.getWeixinInstance().getWeixinConfig().getQrcodeSaveUrl() + new Date().getTime() + openid + ".jpg";//保存單純的推廣二維碼到服務器路徑 WeixinInsLoader.getWeixinInstance().qrcode().saveQrcode(qrcode.getTicket(), picUrlOnServer);/*** 設置圖片重疊,將二維碼放到推廣海報上.*///頂部二維碼BufferedImage top = ModifyImageUtil.loadImageLocal(picUrlOnServer);//底部海報BufferedImage bottom = ModifyImageUtil.loadImageLocal("D:/img/action-adventure-flight-918648.jpg");//生成帶海報的二維碼,x,y值需要根據前端設定String qrcodeImgUrl = ModifyImageUtil.writeImageLocal(picUrlOnServer, ModifyImageUtil.modifyImageTogether(top, bottom, 220, 220));//上傳至微信服務器素材中心,獲取圖片的mediaId 用戶回復給用戶imgMediaId = WeixinInsLoader.getWeixinInstance().media().upload(MediaType.Image, new File(qrcodeImgUrl));System.err.println("imgMediaId:" + imgMediaId);return imgMediaId;} catch (WeixinException e) {e.printStackTrace();return null;}} }?
上面的海報執行多次也會將用戶頭像附加上去,用戶頭像默認是正方形,可以使用一個工具類將方形圖片轉換成圓形.
/* 之下為新加的方法,將圖片處理為圓形圖片 */public static BufferedImage transferImgForRoundImage(String url){BufferedImage resultImg = null;try {if (StringUtils.isEmpty(url)) {return null;}BufferedImage buffImg1 = ImageIO.read(new File(url));resultImg = new BufferedImage(buffImg1.getWidth(), buffImg1.getHeight(), BufferedImage.TYPE_INT_RGB);Graphics2D g = resultImg.createGraphics();Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, buffImg1.getWidth(), buffImg1.getHeight());//使用setRenderingHint 設置抗鋸齒 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);resultImg = g.getDeviceConfiguration().createCompatibleImage(buffImg1.getWidth(), buffImg1.getHeight(),Transparency.TRANSLUCENT);g = resultImg.createGraphics();// 使用 setRenderingHint 設置抗鋸齒 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g.setClip(shape);g.drawImage(buffImg1, 0, 0, null);g.dispose();}catch(MalformedURLException e){e.printStackTrace();System.err.println("MalformedURLException in ModifyImageUtil.java");}catch(IOException e){e.printStackTrace();System.err.println("IOException in ModifyImageUtil.java");}return resultImg;}?
轉載于:https://www.cnblogs.com/ukzq/p/10139780.html
總結
以上是生活随笔為你收集整理的[微信开发] - 用户获取推广二维码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jmeter之线程组详解
- 下一篇: Kubernetes网络一年发展动态与未