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

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

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

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

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

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

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

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

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

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

二、發(fā)展鋪墊

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

1、公眾號分類

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

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

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

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

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

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

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

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

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

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

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

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

4、開發(fā)文檔

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

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

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

5、一些術(shù)語

1)管理員和操作員

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

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

2)Ip 白名單

在開發(fā)過程中,我們需要訪問微信服務(wù)器,比如采集。發(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ā)者工具的。無需手機(jī)操作。

3)開發(fā)者微信

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

4)JS接口安全域名

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

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

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

5)微信打開標(biāo)簽

類似于HTML,微信獨有的標(biāo)簽。比如

跳轉(zhuǎn)小程序:
跳轉(zhuǎn)App:
服務(wù)號訂閱通知:
音頻播放:

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

1、概覽

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

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




    wechat
    
    
    


	
    
掃一掃

2、驗證

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

1)訪問微信服務(wù)器獲取

2)訪問微信服務(wù)器

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

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

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

在上面的例子中,

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

獲取這個json對象并不容易??梢栽谖⑿殴娞柟芾砗笈_獲取,每個公眾號都有唯一的;時間戳也很容易獲得;隨機(jī)字符串由自己決定,比較容易;最麻煩的是這個簽名,我調(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());//隨機(jī)串
        wc.setTimestamp((long) (new Date()).getTime() / 1000);//時間戳
        wc.setSignature(getSignature(wc.getNonceStr(), wc.getTimestamp(), url));//簽名
        return wc;
    }
    @postConstruct
    void init() {
    	/*
    		由于從微信服務(wù)器獲取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)變量保存一份。不過,應(yīng)用程序重啟它們就消失了,并且不會自動過期
	//而從微信獲取到的token和ticket有效期是7200秒
    private String _ticket = null;
    private String _token = null;
	//鎖。為避免并發(fā),使用鎖機(jī)制,不要大家都去獲取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;//隨機(jī)串的長度為16。這個數(shù)值是自己定的 private String getNonceStr() {// 生成隨機(jī)字符串noncestr String chars = "AbCDEFGHIJKLMNOpQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; Stringbuffer noncestr = new Stringbuffer(); int limit = chars.length() - 1; for (int i = 0 分享名稱:微信公眾號開發(fā)php微信公眾號開發(fā),開發(fā)什么?備忘。。php微信公眾號開發(fā)教程
瀏覽地址:http://muchs.cn/news36/295736.html

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

廣告

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