欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

微信公眾號開發(fā)php微信公眾號開發(fā),開發(fā)什么?備忘。。php微信公眾號開發(fā)教程

2023-11-21    分類: 網(wǎng)站建設

這太令人沮喪和難以理解。也太坑了。

以下是這幾天微信公眾號相關工作的總結。不全面,只是作為初學者的記錄,僅供參考。

一、微信公眾號開發(fā),開發(fā)什么?

公眾號不同于小程序。小程序類似于手機App,是獨立開發(fā)的。微信只提供入口;而公眾號基本在微信框架內(nèi)。微信公眾號本質(zhì)上是用戶的一個聯(lián)系人,但只是一個特殊的聯(lián)系人。通過微信提供的公眾號管理后臺,無需任何編程,即可快速搭建像樣的公眾號,菜單、機器人客服、文章更新一應俱全。

但是小程序開發(fā),如果你想要更多的權力,你需要開發(fā)它。比如機器人客服。通過公眾號管理后臺網(wǎng)站模板,可以定義一些自動回復語句,但畢竟還不夠智能。這時候,我們可以在互聯(lián)網(wǎng)上搭建一個服務器,提供相應的服務。當然,這需要準備好URL和域名。

第二,菜單。點擊公眾號的菜單項后,可以回復一些消息,跳轉到小程序,或者打開網(wǎng)頁。如果打開網(wǎng)頁,如果是未經(jīng)驗證的公眾號,則只能打開公眾號內(nèi)的素材,或當前公眾號已發(fā)表的文章、圖片、視頻等;和經(jīng)過驗證的公眾號,可以直接打開任意網(wǎng)址。這些網(wǎng)頁通常是部署在互聯(lián)網(wǎng)上的所謂微信網(wǎng)頁。他們使用微信JS-SDK,上面有各種微信元素,比如掃描、分享到朋友圈等等。當然,這部分需要開發(fā)。

并向關注者發(fā)送消息。我認為這是微信公眾號大的賣點。比如我關注了某個公眾號,通過這個公眾號的菜單打開相關小程序做事,當事情進展的時候,系統(tǒng)可以通過這個公眾號給我發(fā)消息提醒我目前的工作進展。我認為這是公眾號開發(fā)中最有價值的工作。

當然,也有可以在公眾號上自動發(fā)布文章的程序。不過這種事情也可以在公眾號管理后臺手動完成,無非就是動手。

二、發(fā)展鋪墊

在開發(fā)之前,有必要了解相關規(guī)范。建議同時閱讀開發(fā)文檔的開頭:微信公眾平臺開發(fā)概述

1、公眾號分類

衣著三色,食分五品。所謂微信公眾號分為訂閱號和服務號。個人只能申請訂閱號,企業(yè)可以申請訂閱號和服務號。然后公眾號分為認證和未認證。公眾號的類型,是否經(jīng)過認證,決定了是否可以調(diào)用很多微信服務。沒有認證,基本沒什么玩的。而且很遺憾,個人申請的訂閱號根本無法通過微信認證,直接擋住了門。

如何開發(fā)它?微信還非?!百N心”地提供了測試號機制。不用申請公眾號,我們可以先申請一個測試號,用這個號來測試微信服務接口。測試號所有微信服務接口均可訪問。當然是鵝!和微信網(wǎng)頁一樣,需要在手機上運行才能看到效果,如果使用測試號,有些東西是無法渲染的。比如所謂的微信開放標簽(即微信定義的標簽,類似于HTML)。

訂閱帳號和服務帳號的側重點不同。據(jù)我了解,訂閱號側重于發(fā)布文章,而服務號側重于發(fā)送有針對性的通知。一般來說,服務帳戶比訂閱帳戶更強大。

從表面上看,訂閱號每天可以發(fā)送 1 條消息微信公眾號開發(fā) php,而服務號每月只能發(fā)送 4 條消息,訂閱號更強。問題是,群發(fā)消息有什么用?當我們在網(wǎng)上做事時,我們想要的是對我來說是新聞。只有服務帳號可以發(fā)送此有針對性的通知消息。

在文檔中,這種類型的消息稱為模板消息。為什么叫模板消息?這是因為這種消息是結合模板生成的。就像我們的手機短信一樣。做過手機短信開發(fā)的都知道,手機短信是不能隨便發(fā)的。因為眾所周知的原因,肯定有所謂的模板,就是怕內(nèi)容不合法,內(nèi)容離譜,也就是短信的格式是固定的,而且很多字也是固定的,我們只需要填寫每次我們發(fā)送它時都會包含一些內(nèi)容。此模板必須事先創(chuàng)建并獲得電信運營商的批準。微信消息也使用模板。調(diào)用發(fā)送接口時,需要將模板ID作為參數(shù)傳遞。

目前小程序的模板消息功能已經(jīng)廢棄,取而代之的是所謂的“統(tǒng)一服務消息”,實際上是通過服務號發(fā)送的。也就是說,小程序要給用戶發(fā)送通知,就必須對應一個服務號。

但世界上還有一種叫做訂閱消息的東西。公眾號叫訂閱通知,小程序叫訂閱消息。有兩種類型:一次性和長期。訂閱消息需要用戶主動訂閱。例如,使用麥當勞小程序點餐時,每次付款后,都會詢問您是否接受取餐通知。長期只對部分民生和醫(yī)院公眾賬號開放。這是在申請公共帳戶時給出的。不要冒險微信公眾號開發(fā) php,低估微信折騰人的能力。否則發(fā)送時對方永遠收不到,也可能沒有錯誤信息;

模板消息和訂閱消息有什么區(qū)別?訂閱新聞不僅僅是要求用戶手動訂閱,也沒什么。問題是,這必須用手機來完成。如果我通過 pC 做事并想在手機上接收提醒怎么辦?訂閱新聞已完成。

2、公眾號調(diào)試工具

是微信開發(fā)者工具。請注意,它是開發(fā)人員工具,而不是開發(fā)工具。這個工具確實是小程序的開發(fā)工具;對于公眾號,它只是一個調(diào)試工具,無法通過它輸入任何代碼;它只是微信網(wǎng)頁的調(diào)試工具。此時它只是一個微信瀏覽器。方法是在微信開發(fā)者工具頂部輸入微信網(wǎng)頁地址進行瀏覽調(diào)試,類似普通瀏覽器按F12。

3、查看微信網(wǎng)頁運行結果

公眾號可以通過微信客戶端查看。這里所說的查看結果是指查看微信網(wǎng)頁的運行結果。雖然有“網(wǎng)頁”二字,但這不是一個普通的網(wǎng)頁??梢杂闷胀g覽器訪問,雖然沒有報錯,但是看不到效果。它應該通過微信瀏覽器或微信開發(fā)者工具運行。需要注意的是,手機上沒有微信瀏覽器這個app,是微信暗示的。如何召喚它?你可以把微信網(wǎng)頁的地址發(fā)給微信上的朋友,比如“文件傳輸助手”,然后在聊天記錄里點擊這個網(wǎng)址,就會用微信瀏覽器打開。絕對給力的是微信瀏覽器,QQ瀏覽器不好用。

4、開發(fā)文檔

基于微信進行二次開發(fā),上網(wǎng)查資料基本沒用。最好老老實實閱讀微信官方開發(fā)文檔。

在公眾號管理后臺-設置與開發(fā)-開發(fā)者工具-開發(fā)文檔中打開公眾號開發(fā)文檔。

微信有兩個平臺,小程序叫“微信開發(fā)開放平臺”,公眾號叫“微信開發(fā)公共平臺”。

5、一些術語

1)管理員和操作員

在開發(fā)過程中,不可避免地會訪問微信公眾號管理后臺修改或設置一些設置,但要更改設置,必須掃描二維碼進行身份認證。這很尷尬。申請公眾號的人是管理員,但不一定參與開發(fā)。提醒大老板掃描二維碼會很不方便,甚至是不可能的。您可以將開發(fā)人員添加到操作員列表并自行掃描代碼。運營商分為長期和短期兩種。他們應該是具有足夠權限的長期運營商。

可以在微信公眾號管理后臺-設置與開發(fā)-人事設置中設置。

2)Ip 白名單

在開發(fā)過程中,我們需要訪問微信服務器,比如采集。發(fā)出請求的 Ip 需要在白名單中。這個Ip是指互聯(lián)網(wǎng)Ip。如果我們在創(chuàng)新互聯(lián)內(nèi)部開發(fā),那么這個Ip就是創(chuàng)新互聯(lián)的Ip,用于上網(wǎng)。問題是,這個Ip經(jīng)常變化。不知道有什么好辦法,所以基本上一天換一次白名單。

Ip白名單是供我們在本地調(diào)試微信開發(fā)者工具的。無需手機操作。

3)開發(fā)者微信

官方賬號管理后臺-設置與開發(fā)-web開發(fā)者工具,添加我們開發(fā)者的微信賬號。這是用來開發(fā)微信網(wǎng)頁的。因為微信開發(fā)者工具需要微信登錄。

4)JS接口安全域名

公眾號管理后臺-設置與開發(fā)-公眾號設置-功能設置。

微信網(wǎng)頁開發(fā)也需要它。我們的頁面需要放在這個域名下,才能使用微信的js-sdk。

填寫這個域名時,需要下載一個txt文件放在域名下,微信可以驗證域名的真實性后再保存。但是填完之后,我們在本地開發(fā)的時候,可以修改host文件,把本地ip映射到域名。畢竟是前端的東西。 js-sdk本身需要微信瀏覽器的支持,它無法判斷請求來自哪個Ip,我們傳給它什么都會相信。

5)微信打開標簽

類似于HTML,微信獨有的標簽。比如

跳轉小程序:
跳轉App:
服務號訂閱通知:
音頻播放:

三、微信網(wǎng)頁開發(fā)

1、概覽

微信網(wǎng)頁其實就是網(wǎng)頁,只不過它引用了微信提供的JS庫,可能會使用微信獨有的所謂開放標簽,類似于html。而這個微信網(wǎng)頁似乎是在一個普通的瀏覽器上運行的。雖然不會報錯,但似乎沒有任何作用。只能在微信瀏覽器或微信開發(fā)者工具上運行。

以下是微信網(wǎng)頁(boot下,合并)




    wechat
    
    
    


	
    
掃一掃

2、驗證

微信網(wǎng)頁在運行時,必須先通過微信驗證,然后才能正常使用微信的各種功能。驗證過程是,

1)訪問微信服務器獲取

2)訪問微信服務器

3)使用、隨機字符串、時間戳、當前頁面地址依次組成一個字符串,然后對該字符串進行sha hash運算得到摘要

4)使用摘要訪問微信服務器獲取簽名

5)注冊、時間戳、隨機字符串、簽名、本頁面使用的微信功能、微信打開標簽到微信

在上面的例子中,

    wx.config({
        debug: true,
        appId: /*[[${wc.appId}]]*/'',
        timestamp: /*[[${wc.timestamp}]]*/'',//注意是秒,不是毫秒
        nonceStr: /*[[${wc.nonceStr}]]*/'',//隨機串
        signature: /*[[${wc.signature}]]*/'',//關鍵所在
        jsApiList: ['chooseImage','scanQRCode','updateAppMessageShareData','updateTimelineShareData'],//需要使用的微信js-sdk函數(shù)列表
        openTagList: ['wx-open-subscribe']//開放標簽列表
    });

獲取這個json對象并不容易??梢栽谖⑿殴娞柟芾砗笈_獲取,每個公眾號都有唯一的;時間戳也很容易獲得;隨機字符串由自己決定,比較容易;最麻煩的是這個簽名,我調(diào)試了一天左右,總的意思是非法簽名。

獲取這個json對象的java代碼:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import javax.annotation.postConstruct;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;
@Service
public class WxServiceImpl implements WxService {
    @Override
    public WxConfig getWxConfig(String url) {//url是微信網(wǎng)頁地址
        WxConfig wc = new WxConfig();//這個是自定義的對象,不必深究
        wc.setAppId(AppID);
        wc.setNonceStr(getNonceStr());//隨機串
        wc.setTimestamp((long) (new Date()).getTime() / 1000);//時間戳
        wc.setSignature(getSignature(wc.getNonceStr(), wc.getTimestamp(), url));//簽名
        return wc;
    }
    @postConstruct
    void init() {
    	/*
    		由于從微信服務器獲取token和ticket的函數(shù)有調(diào)用次數(shù)限制(每天<=2000),因此用redis將它們緩存起來
    	*/
        this.jedis = new Jedis(redis的Ip, redis端口號);
    }
    private String getSignature(String nonceStr, long timestamp, String url) {//獲取簽名
        String signature = null;
        String ticket = getTicket();
        if (ticket != null) {
            String string1 = String.format("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s",
                    ticket,
                    nonceStr,
                    timestamp,
                    url);
            signature = getSha1(string1);
        }
        return signature;
    }
	//redis對象
    private Jedis jedis;
	//除了redis緩存,也用靜態(tài)變量保存一份。不過,應用程序重啟它們就消失了,并且不會自動過期
	//而從微信獲取到的token和ticket有效期是7200秒
    private String _ticket = null;
    private String _token = null;
	//鎖。為避免并發(fā),使用鎖機制,不要大家都去獲取token和ticket
    private ReentrantLock lockTok = new ReentrantLock();
    private ReentrantLock lockTik = new ReentrantLock();
    private String getTicket() {
        String ticket = null;
        String key = "ticket";
        ticket = getKey(key, this._ticket);
        if (ticket == null) {
            //鎖定。
            lockTik.lock();
            ticket = getKey(key, this._ticket);//再努力一把
            if (ticket == null) {
                String token = getToken();
                if (token != null) {
                    ticket = callGet(String.format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi",
                            token), "ticket");
                    if (ticket != null) {
                        this._ticket = ticket;
                        setKey(key, ticket);
                    }
                }
            }
            //解鎖
            lockTik.unlock();
        }

return ticket; } private String getToken() { String token = null; String key = "token"; token = getKey(key, this._token); if (token == null) { lockTok.lock(); token = getKey(key, this._token); if (token == null) { token = callGet(String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",AppID,AppSecret), "access_token"); if (token != null) { this._token = token; setKey(key, token); } } lockTok.unlock(); } return token; } final static int EXpIRTED = 7200; private String getKey(String key, String v) { String value = null; try { value = jedis.get(key); } catch (Exception ex) { value = v;//如果無法從redis中讀取則將候補變量值返回。但變量值可能有過期的問題 System.err.println(ex.getMessage()); } return value; } private void setKey(String key, String value) { try { jedis.set(key, value); jedis.expire(key, EXpIRTED); } catch (Exception ex) { System.err.println(ex.getMessage()); } } final static int NONCESTR = 16;//隨機串的長度為16。這個數(shù)值是自己定的 private String getNonceStr() {// 生成隨機字符串noncestr String chars = "AbCDEFGHIJKLMNOpQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; Stringbuffer noncestr = new Stringbuffer(); int limit = chars.length() - 1; for (int i = 0 分享名稱:微信公眾號開發(fā)php微信公眾號開發(fā),開發(fā)什么?備忘。。php微信公眾號開發(fā)教程
瀏覽地址:http://chinadenli.net/news36/295736.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序關鍵詞優(yōu)化、軟件開發(fā)、靜態(tài)網(wǎng)站響應式網(wǎng)站、網(wǎng)站維護

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

欧美日韩视频中文字幕| 熟女少妇一区二区三区蜜桃| 色婷婷人妻av毛片一区二区三区| 老司机精品在线你懂的| 国产午夜精品福利免费不| 亚洲成人黄色一级大片| 欧美日韩亚洲国产av| 精品国模一区二区三区欧美| 真实偷拍一区二区免费视频| 激情中文字幕在线观看| 九九热这里有精品20| 日本黄色高清视频久久| 中文字幕有码视频熟女| 国产精品欧美在线观看| 国产欧洲亚洲日产一区二区| 国产一二三区不卡视频| 亚洲欧美日产综合在线网| 日韩午夜老司机免费视频| 欧美日韩精品一区免费| 美国女大兵激情豪放视频播放| 91亚洲国产成人久久| 激情三级在线观看视频| 国产欧美日韩精品一区二区| 91插插插外国一区二区婷婷| 色哟哟哟在线观看视频| 欧美日韩乱码一区二区三区| 日韩精品日韩激情日韩综合| 精品欧美一区二区三久久| 日本欧美视频在线观看免费 | 亚洲欧美日韩中文字幕二欧美| 色狠狠一区二区三区香蕉蜜桃| 黄色av尤物白丝在线播放网址 | 精品国产91亚洲一区二区三区| 国产又黄又猛又粗又爽的片| 久久国产亚洲精品赲碰热| 加勒比日本欧美在线观看| 99久久精品视频一区二区| 国产传媒中文字幕东京热| 国产欧美日产久久婷婷| 高清不卡视频在线观看| 亚洲深夜精品福利一区|