ホームページ WeChat アプレット WeChatの開発 WeChat 開発: WeChat クライアントから送信されたメッセージの処理

WeChat 開発: WeChat クライアントから送信されたメッセージの処理

Feb 28, 2017 am 09:33 AM
WeChatの開発

WeChat 開発に関する前回のブログ投稿「WeChat 開発 (01) 開発者になる方法」では、WeChat 開発者モードをオンにしました。このブログ投稿では、WeChat フォロワーから公式アカウントに送信されたメッセージを処理するだけです。

WeChat 開発者モードをオンにするときに URL アドレスを設定すると、Tencent の WeChat サーバーは URL アドレスに get リクエストを送信し、検証するためのいくつかのパラメーターを送信します。リクエストの取得に関して言えば、公式アカウントをフォローしている WeChat ファンから送信されたメッセージについては、Tencent の WeChat サーバーが URL アドレスに投稿リクエストを送信します。リクエストの内容は次の形式になります。フォーム内の XML ドキュメント。

つまり、この URL アドレスの get リクエストの処理メソッドは WeChat 開発者モードを有効にするために特別に使用され、post リクエストは WeChat ファンから送信されたメッセージやトリガーされたイベントを処理するために使用されます。開発作業の出発点は、URL アドレスの後処理方法です。

以下の最も単純な例を処理してみましょう: ファンが私たちにテキスト メッセージを送信し、私たちはメッセージで彼に返信します: 「こんにちは、+ 彼の WeChat openId」

以下にコードを直接投稿します:

URL 対応する処理サーブレット:

public class CoreServlet extends HttpServlet 
{
	private static final long serialVersionUID = 4440739483644821986L;

	/**
	 * 请求校验(确认请求来自微信服务器)
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		// 微信服务端发来的加密签名
		String signature = request.getParameter("signature");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		// 随机字符串
		String echostr = request.getParameter("echostr");
		
		PrintWriter out = response.getWriter();
		// 请求校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
		if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			out.print(echostr);
		}
		out.close();
		out = null;
	}

	/**
	 * 请求校验与处理
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		// 接收参数微信加密签名、 时间戳、随机数
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");

		PrintWriter out = response.getWriter();
		// 请求校验
		if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			Message msgObj = XMLUtil.getMessageObject(request);	// 读取微信客户端发来的消息(xml字符串),并将其转换为消息对象
			if(msgObj != null){
				String xml = "<xml>" +
						 "<ToUserName><![CDATA[" + msgObj.getFromUserName() + "]]></ToUserName>" +	// 接收方帐号(收到的OpenID)
						 "<FromUserName><![CDATA[" + msgObj.getToUserName() + "]]></FromUserName>" +	// 开发者微信号
						 "<CreateTime>12345678</CreateTime>" +
						 "<MsgType><![CDATA[text]]></MsgType>" +
						 "<Content><![CDATA[你好,"+ msgObj.getFromUserName() +"]]></Content>" +
						 "</xml>";
				out.write(xml);	// 回复微信客户端的消息(xml字符串)
				out.close();
				return;
			}
		}
		out.write("");
		out.close();
	}
}
ログイン後にコピー

XMLメッセージからメッセージオブジェクトへの変換を実現するXML文字列処理ツールクラス:

public class XMLUtil 
{
	/**
	 * 从request中读取用户发给公众号的消息内容
	 * @param request
	 * @return 用户发给公众号的消息内容
	 * @throws IOException
	 */
	public static String readRequestContent(HttpServletRequest request) throws IOException
	{
		// 从输入流读取返回内容
		InputStream inputStream = request.getInputStream();
		InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
		BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
		String str = null;
		StringBuilder buffer = new StringBuilder();
		
		while ((str = bufferedReader.readLine()) != null) {
			buffer.append(str);
		}
		
		// 释放资源
		bufferedReader.close();
		inputStreamReader.close();
		inputStream.close();
		
		return buffer.toString();
	}
	
	/**
	 * 将xml文档的内容转换成map
	 * @param xmlDoc
	 * @return map
	 */
	public static Map<String, String> xmlToMap(String xmlDoc)
	{
		//创建一个新的字符串
        StringReader read = new StringReader(xmlDoc);
        //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
        InputSource source = new InputSource(read);
        //创建一个新的SAXBuilder
        SAXBuilder sb = new SAXBuilder();
        
        Map<String, String> xmlMap = new HashMap<String, String>();
        try {
            Document doc = sb.build(source);	//通过输入源构造一个Document
            Element root = doc.getRootElement();	//取的根元素
            
            List<Element> cNodes = root.getChildren();	//得到根元素所有子元素的集合(根元素的子节点,不包括孙子节点)
            Element et = null;
            for(int i=0;i<cNodes.size();i++){
                et = (Element) cNodes.get(i);	//循环依次得到子元素
                xmlMap.put(et.getName(), et.getText());
            }
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return xmlMap;
	}
	
	/**
	 * 将保存xml内容的map转换成对象
	 * @param map
	 * @return
	 */
	public static Message getMessageObject(Map<String, String> map)
	{
		if(map != null){
			String MsgType = map.get("MsgType");
			
			// 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video, 
			// 地理位置消息:location, 链接消息:link)
			if("text".equals(MsgType)){
				TextMessage msg = new TextMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setContent(map.get("Content"));
				return msg;
			}
			if("ImageMessage".equals(MsgType)){
				ImageMessage msg = new ImageMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setPicUrl(map.get("PicUrl"));
				msg.setMediaId(map.get("MediaId"));
				return msg;
			}
			if("video".equals(MsgType)){
				VideoMessage msg = new VideoMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setMediaId(map.get("MediaId"));
				msg.setThumbMediaId(map.get("ThumbMediaId"));
				return msg;
			}
			if("voice".equals(MsgType)){
				VoiceMessage msg = new VoiceMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setMediaId(map.get("MediaId"));
				msg.setFormat(map.get("Format"));
				return msg;
			}
			if("location".equals(MsgType)){
				LocationMessage msg = new LocationMessage();

				msg.setLocation_X(map.get("Location_X"));
				msg.setLocation_Y(map.get("Location_Y"));
				msg.setScale(map.get("Scale"));
				msg.setLabel(map.get("Label"));
				return msg;
			}
			if("link".equals(MsgType)){
				LinkMessage msg = new LinkMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setTitle(map.get("Title"));
				msg.setDescription(map.get("Description"));
				msg.setUrl(map.get("Url"));
				return msg;
			}
		}
		return null;
	}
	
	/**
	 * 将保存xml内容的map转换成对象
	 * @param map
	 * @return
	 * @throws IOException 
	 */
	public static Message getMessageObject(HttpServletRequest request) throws IOException
	{
		String xmlDoc = XMLUtil.readRequestContent(request);	// 读取微信客户端发了的消息(xml)
		Map<String, String> map = XMLUtil.xmlToMap(xmlDoc);		// 将客户端发来的xml转换成Map
		if(map != null){
			String MsgType = map.get("MsgType");
			
			// 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video, 
			// 地理位置消息:location, 链接消息:link)
			if("text".equals(MsgType)){
				TextMessage msg = new TextMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setContent(map.get("Content"));
				return msg;
			}
			/*if("ImageMessage".equals(MsgType)){
				ImageMessage msg = new ImageMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setPicUrl(map.get("PicUrl"));
				msg.setMediaId(map.get("MediaId"));
				return msg;
			}
			if("video".equals(MsgType)){
				VideoMessage msg = new VideoMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setMediaId(map.get("MediaId"));
				msg.setThumbMediaId(map.get("ThumbMediaId"));
				return msg;
			}
			if("voice".equals(MsgType)){
				VoiceMessage msg = new VoiceMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setMediaId(map.get("MediaId"));
				msg.setFormat(map.get("Format"));
				return msg;
			}
			if("location".equals(MsgType)){
				LocationMessage msg = new LocationMessage();

				msg.setLocation_X(map.get("Location_X"));
				msg.setLocation_Y(map.get("Location_Y"));
				msg.setScale(map.get("Scale"));
				msg.setLabel(map.get("Label"));
				return msg;
			}
			if("link".equals(MsgType)){
				LinkMessage msg = new LinkMessage();
				XMLUtil.initCommonMsg(msg, map);
				
				msg.setTitle(map.get("Title"));
				msg.setDescription(map.get("Description"));
				msg.setUrl(map.get("Url"));
				return msg;
			}*/
		}
		return null;
	}
	
	public static void initCommonMsg(Message msg, Map<String, String> map)
	{
		msg.setMsgId(map.get("MsgId"));
		msg.setMsgType(map.get("MsgType"));
		msg.setToUserName(map.get("ToUserName"));
		msg.setFromUserName(map.get("FromUserName"));
		msg.setCreateTime(map.get("CreateTime"));
	}
}
ログイン後にコピー

ファンから送られるメッセージは6種類(テキストメッセージ、画像メッセージ、音声メッセージ、ビデオメッセージ)に分けられます、地理的位置メッセージ、リンク メッセージ):

/**
 * 微信消息基类
 * @author yuanfang
 * @date 2015-03-23
 */
public class Message 
{
	private String MsgId;	// 消息id,64位整型
	private String MsgType;	// 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video, 地理位置消息:location, 链接消息:link)
	private String ToUserName;	//开发者微信号
	private String FromUserName; // 发送方帐号(一个OpenID)
	private String CreateTime;	// 消息创建时间 (整型)
	
	public String getToUserName() {
		return ToUserName;
	}
	public void setToUserName(String toUserName) {
		ToUserName = toUserName;
	}
	public String getFromUserName() {
		return FromUserName;
	}
	public void setFromUserName(String fromUserName) {
		FromUserName = fromUserName;
	}
	public String getCreateTime() {
		return CreateTime;
	}
	public void setCreateTime(String createTime) {
		CreateTime = createTime;
	}
	public String getMsgType() {
		return MsgType;
	}
	public void setMsgType(String msgType) {
		MsgType = msgType;
	}
	public String getMsgId() {
		return MsgId;
	}
	public void setMsgId(String msgId) {
		MsgId = msgId;
	}
	
}
ログイン後にコピー

テキスト メッセージ カテゴリ:

package com.sinaapp.wx.msg;

public class TextMessage extends Message 
{
	private String Content;	// 文本消息内容

	public String getContent() {
		return Content;
	}

	public void setContent(String content) {
		Content = content;
	}
	
}
ログイン後にコピー

OK、ファンから公式アカウントに送信されたテキスト メッセージの最も簡単な処理です。これに返信するだけです。彼: こんにちは、そして次のように彼の WeChat openId を追加します: こんにちは、orJydljfkg3-r0_dj3rkdfvjl

WeChat 開発および WeChat クライアントから送信されたメッセージの処理に関連するその他の記事については、PHP Chinese net に注目してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP WeChat 開発: メッセージの暗号化と復号化を実装する方法 PHP WeChat 開発: メッセージの暗号化と復号化を実装する方法 May 13, 2023 am 11:40 AM

PHP は、Web 開発およびサーバーサイド プログラミング、特に WeChat 開発で広く使用されているオープン ソースのスクリプト言語です。現在、ますます多くの企業や開発者が WeChat 開発に PHP を使用し始めています。これは、PHP が本当に学びやすく、使いやすい開発言語となっているためです。 WeChat の開発では、メッセージの暗号化と復号化はデータのセキュリティに関わるため、非常に重要な問題となります。暗号化と復号化の方法を持たないメッセージの場合、ハッカーは簡単にデータを入手でき、ユーザーに脅威を与える可能性があります。

PHP を使用して WeChat マス メッセージング ツールを開発する PHP を使用して WeChat マス メッセージング ツールを開発する May 13, 2023 pm 05:00 PM

WeChat の人気に伴い、マーケティング ツールとして WeChat を使用し始める企業が増えています。 WeChat グループ メッセージング機能は、企業が WeChat マーケティングを行うための重要な手段の 1 つです。ただし、手動送信のみに頼ると、マーケターにとって非常に時間と労力がかかる作業になります。したがって、WeChat マス メッセージング ツールを開発することが特に重要です。この記事では、PHP を使用して WeChat マス メッセージング ツールを開発する方法を紹介します。 1. 準備作業 WeChat マス メッセージング ツールを開発するには、次の技術点を習得する必要があります。 PHP WeChat パブリック プラットフォーム開発の基礎知識 開発ツール: Sub

PHP WeChat 開発: ユーザータグ管理を実装する方法 PHP WeChat 開発: ユーザータグ管理を実装する方法 May 13, 2023 pm 04:31 PM

WeChat パブリック アカウントの開発において、ユーザー タグ管理は非常に重要な機能であり、開発者がユーザーをよりよく理解し、管理できるようになります。この記事では、PHPを使用してWeChatのユーザータグ管理機能を実装する方法を紹介します。 1. WeChat ユーザーの openid を取得する WeChat ユーザータグ管理機能を使用する前に、まずユーザーの openid を取得する必要があります。 WeChat パブリック アカウントの開発では、ユーザーの承認を通じて openid を取得するのが一般的です。ユーザー認証が完了したら、次のコードを通じてユーザーを取得できます。

PHP WeChat 開発: グループ メッセージ送信レコードの実装方法 PHP WeChat 開発: グループ メッセージ送信レコードの実装方法 May 13, 2023 pm 04:31 PM

WeChat が人々の生活においてますます重要なコミュニケーション ツールになるにつれ、その機敏なメッセージング機能はすぐに多くの企業や個人に支持されるようになりました。企業にとって、WeChat をマーケティング プラットフォームとして開発することがトレンドになっており、WeChat 開発の重要性が徐々に顕著になってきています。その中でも、グループ送信機能はさらに広く使用されているため、PHP プログラマとしてグループ メッセージ送信レコードを実装するにはどうすればよいでしょうか?以下に簡単に紹介します。 1. WeChat パブリック アカウントに関する開発知識を理解する グループ メッセージ送信レコードの実装方法を理解する前に、

PHP WeChat 開発: カスタマー サービスのチャット ウィンドウ管理を実装する方法 PHP WeChat 開発: カスタマー サービスのチャット ウィンドウ管理を実装する方法 May 13, 2023 pm 05:51 PM

WeChat は現在、世界最大のユーザーベースを持つソーシャル プラットフォームの 1 つであり、モバイル インターネットの普及に伴い、ますます多くの企業が WeChat マーケティングの重要性を認識し始めています。 WeChat マーケティングを実施する場合、顧客サービスは重要な部分です。カスタマー サービスのチャット ウィンドウをより適切に管理するために、WeChat 開発に PHP 言語を使用できます。 1. PHP WeChat 開発の概要 PHP は、Web 開発の分野で広く使用されているオープン ソースのサーバー側スクリプト言語です。 WeChat パブリック プラットフォームが提供する開発インターフェイスと組み合わせると、PHP 言語を使用して WeChat を実行できます。

PHP WeChat開発:投票機能の実装方法 PHP WeChat開発:投票機能の実装方法 May 14, 2023 am 11:21 AM

WeChat パブリック アカウントの開発では、投票機能がよく使用されます。投票機能はユーザーが気軽に交流に参加できるほか、イベントの開催や意見調査などにも重要なツールです。この記事では、PHPを使用してWeChatの投票機能を実装する方法を紹介します。 WeChat公式アカウントの認証を取得する まずはWeChat公式アカウントの認証を取得する必要があります。 WeChatパブリックプラットフォームでは、WeChatパブリックアカウント、公式アカウント、およびパブリックアカウントに対応するトークンのAPIアドレスを設定する必要があります。 PHP言語を使用した開発の過程では、WeChatが公式に提供するPHを使用する必要があります

PHP WeChat 開発: 音声認識を実装する方法 PHP WeChat 開発: 音声認識を実装する方法 May 13, 2023 pm 09:31 PM

モバイル インターネットの普及に伴い、WeChat をソーシャル ソフトウェアとして使用する人が増えており、WeChat のオープン プラットフォームは開発者に多くの機会をもたらしています。近年、人工知能技術の発展に伴い、音声認識技術は携帯端末開発において徐々に人気のある技術の一つになってきています。 WeChat 開発では、音声認識をどのように実装するかが多くの開発者にとって懸念事項となっています。この記事では、PHP を使用して音声認識機能を実装する WeChat アプリケーションを開発する方法を紹介します。 1. 音声認識の原理 音声認識の実装方法を紹介する前に、まず言語を理解しましょう

WeChat 開発に PHP を使用するにはどうすればよいですか? WeChat 開発に PHP を使用するにはどうすればよいですか? May 21, 2023 am 08:37 AM

インターネットとモバイル スマート デバイスの発展に伴い、WeChat はソーシャルおよびマーケティング分野に欠かせないものになりました。デジタル化が進むこの時代において、WeChat 開発に PHP を使用する方法が多くの開発者の焦点になっています。この記事では主に、PHP を WeChat 開発に使用する方法とそのヒントや注意事項を紹介します。 1. 開発環境の準備 WeChat を開発する前に、まず対応する開発環境を準備する必要があります。具体的には、PHP オペレーティング環境と WeChat パブリック プラットフォームをインストールする必要があります。

See all articles