<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
執行效果
微信公眾號分為服務號、訂閱號、企業號,訂閱號可以個人申請,服務號和企業號要有企業資質才可以。
我們所說的微信公眾號開發指的是訂閱號和服務號。關於訂閱號和伺服器的區別,官方是這樣解釋的
進入微信公眾號註冊頁面https://mp.weixin.qq.com/
點選公眾號右上方的註冊按鈕,進入註冊介面,填寫基本資訊,選擇訂閱號, 完成身份認證, 即可。
個人訂閱號有一些介面是沒有許可權的,也就是說個人訂閱號無法呼叫一些高階的許可權介面,如生成二維條碼、網頁授權、自定義選單、微信支付這樣的介面許可權個人訂閱號是沒有呼叫許可權的, 幸運的是,微信公眾平臺提供了測試公眾賬號,測試公眾號有很多個人訂閱號不具備的許可權, 測試公眾號的註冊地址為:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
用微信掃描頁面中的二維條碼進行登入,登入成功後,就可以看到騰訊分配給我們的測試公眾號的資訊了,如下圖所示, 接下來我們就可以搭建環境,進行開發測試了
測試公眾號的所擁有的介面許可權如下:
開發基於微信公眾號的應用最大的痛苦之處就是偵錯問題,每次實現一個功能後都需要部署到一個公網伺服器進行測試,因為微信使用者每次向公眾號發起請求時,微信伺服器會先接收到使用者的請求,然後再轉發到我們的伺服器上,也就是說,微信伺服器是要和我們的伺服器進行網路互動,所以我們必須保證我們的伺服器外網可以存取到,這種部署到公網伺服器進行測試的做法對於我們開發者來說簡直是噩夢。所以我們要想一個辦法可以做到本地部署,本地偵錯程式碼,而要做到這一點,那麼我們要解決的問題就是將內網的部署伺服器對映到外網,讓微信伺服器可以正常存取到,幸運的是,藉助於第三方軟體Ngrok,我們就可以做得到。Ngrok是一個免費的軟體Ngrok,使用Ngrok後,我們就可以實現內網穿透,也就是說我們可以將內網的伺服器對映到外網給別人存取,這對於我們在本地開發環境中偵錯微信程式碼是以及給使用者演示一些東西非常快速和有幫助的,因為可以直接使用我們自己的內網的電腦作為伺服器。不過需要翻牆存取.常用的內網穿透工具有natapp,ngrok,dingding,關於微信公眾號開發,這三個工具我都使用了,只有natapp可以正常開發。
關於natapp的使用網上很多,我在這裡就不在介紹了。
natapp成功標誌:
可以通過存取http://xt77eg.natappfree.cc存取到我們本機的服務
開發者提交資訊後,微信伺服器將傳送GET請求到填寫的伺服器地址URL上,GET請求攜帶引數如下表所示:
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗。加密/校驗流程如下:
1)將token、timestamp、nonce三個引數進行字典序排序
2)將三個引數字串拼接成一個字串進行sha1加密
3)開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
@Controller @RequestMapping(value = "wx") public class WeiController{ /** * 公眾號appid */ @Value("${wx.appid}") private String appid; /** * 公眾號appSecret */ @Value("${wx.secret}") private String secret; /** * 微信訊息接收和token驗證 * @param request * @param response * @throws IOException */ @GetMapping("/weChatToken") public void weChat(HttpServletRequest request, HttpServletResponse response) { boolean isGet = request.getMethod().toLowerCase().equals("get"); if (isGet) { // 微信加密簽名 String signature = request.getParameter("signature"); // 時間戳 String timestamp = request.getParameter("timestamp"); // 亂數 String nonce = request.getParameter("nonce"); // 隨機字串 String echostr = request.getParameter("echostr"); // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗 if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) { try { PrintWriter print = response.getWriter(); print.write(echostr); print.flush(); } catch (IOException e) { e.printStackTrace(); } } } } }
public class CheckoutUtil { public static String token = "999"; /** * 驗證簽名 * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 將token、timestamp、nonce三個引數進行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 將三個引數字串拼接成一個字串進行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToHex(digest ); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 將sha1加密後的字串可與signature對比,標識該請求來源於微信 return tmpStr != null ? tmpStr.equals(signature) : false; } /** * 十六進位制位元組陣列轉為字串 * @param hash * @return */ private static String byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; }
進入微信測試公眾號管理介面,在介面設定資訊中填入對映的外網地址和程式碼中宣告的token,如下圖所示:
點選提交,會顯示設定成功,如下圖:
到此,我們的公眾號應用已經能夠和微信伺服器正常通訊了,也就是說我們的公眾號已經接入到微信公眾平臺了。
如果使用者在微信使用者端中存取第三方網頁,公眾號可以通過微信網頁授權機制,來獲取使用者基本資訊(openId),進而實現業務邏輯。
關於網頁授權回撥域名的說明:
1、在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的“開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使用者基本資訊”的設定選項中,修改授權回撥域名。請注意,這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協定頭;
2、授權回撥域名設定規範為全域名,比如需要網頁授權的域名為:www.qq.com,設定以後此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進行OAuth2.0鑑權。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com 無法進行OAuth2.0鑑權
3、如果公眾號登入授權給了第三方開發者來進行管理,則不必做任何設定,由第三方代替公眾號實現網頁授權即可
獲取使用者openId步驟:
1、引導使用者進入授權頁面同意授權,獲取code
2、通過code換取openId
程式碼如下:
@Controller @RequestMapping(value = "wx") public class WeiController{ private String appid="微信公眾號的appid"; private String secret="微信公眾號的secret"; /** * 獲取微信使用者code,並重定向獲取使用者openId * @return */ @GetMapping("/getUserCode") public String getUserCode(){ String backUrl = "http://xt77eg.natappfree.cc/wx/getUserOpenId"; String getOpenIdUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+ backUrl+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"; getOpenIdUrl = getOpenIdUrl.replace("APPID",appid); return "redirect:" + getOpenIdUrl; } /** * 獲取使用者openId * @return * @throws IOException */ @GetMapping("/getUserOpenId") @ResponseBody public String getUserOpenId()throws IOException{ //獲取code String code = request.getParameter("code"); //換取使用者openid String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; url=url.replace("APPID", appid).replace("SECRET", secret).replace("CODE", code); JSONObject result = Util.doGetJson(url); JSONObject jSONObject = JSONObject.parseObject(String.valueOf(result)); String openid = jSONObject.getString("openid"); return openid; }
首先要準備一個模板,測試號可自定義模板,但在正式公眾號我們要申請,或者使用別人已經申請過的模板。
pom:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--微信模版訊息推播三方sdk--> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> <version>2.1.8.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency>
Controller:
@Controller @RequestMapping(value = "wx") public class WeiController{ @Resource PushMessageService pushMessageService; /** * 向每個使用者推播訊息 * @return */ @GetMapping("/sendMessage") @ResponseBody public String sendMessage(){ String openId = "使用者openId"; if(!"".equals(openId)){ AlarmParamsDTO dto = new AlarmParamsDTO("申請進度", "國家獎學金", "申請通過", time, "成功"); dto.setOpenId(openId); pushMessageService.pushMessage(dto); } return "success"; }
Service:
@Service @Slf4j public class PushMessageServiceImpl implements PushMessageService{ private String appid="微信公眾號appid"; private String secret="微信公眾號secret"; /** * 給微信公眾號某個使用者推播資訊 * @param alarmParamsDTO */ @Override public void pushMessage(AlarmParamsDTO alarmParamsDTO) { //1,設定 WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage(); wxStorage.setAppId(appid); wxStorage.setSecret(secret); WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(wxStorage); List<WxMpTemplateData> wxMpTemplateData = Arrays.asList( new WxMpTemplateData("first",alarmParamsDTO.getFirst(),"#000000"), new WxMpTemplateData("keyword1",alarmParamsDTO.getKeyword1(),"#000080"), new WxMpTemplateData("keyword2",alarmParamsDTO.getKeyword2(),"#0000FF"), new WxMpTemplateData("keyword3",alarmParamsDTO.getKeyword3(),"#FFD700"), new WxMpTemplateData("remark",alarmParamsDTO.getRemark(),"#00FF00") ); //2,推播訊息 WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() .toUser(alarmParamsDTO.getOpenId()) .templateId("tIDrdFcqFGMsTnc462H49_DbjgXUuIjsqIlQttq7VDE") .data(wxMpTemplateData) .url("http://www.baidu.com") .build(); try { wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage); } catch (Exception e) { System.out.println("推播失敗:" + e.getMessage()); } } }
entity:
@Setter @Getter @NoArgsConstructor @AllArgsConstructor public class AlarmParamsDTO { /** * 推播資訊小標題 */ private String first; /** * 學生姓名 */ private String keyword1; /** * 申請資助型別 */ private String keyword2; /** * 申請狀態 */ private String keyword3; /** * 申請結果 */ private String remark; /** * 使用者微信openId,唯一標識 */ private String openId; public AlarmParamsDTO(String first, String keyword1, String keyword2, String keyword3, String remark) { this.first = first; this.keyword1 = keyword1; this.keyword2 = keyword2; this.keyword3 = keyword3; this.remark = remark; } }
到此這篇關於微信公眾號開發訊息推播功能的文章就介紹到這了,更多相關微信公眾號開發訊息推播內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45