WeChat パブリック オープン プラットフォーム開発 02---WeChat パブリック プラットフォーム PHP インターフェイスと Java インターフェイスの比較
テクニカル QQ コミュニケーション グループ: JavaDream: 251572072
----------------------------------
このセクションのコードはネチズンの制作物から収集されたものです
---------------------------------- ------ -------
a.java-jsp バージョン
b.PHP インターフェース コード:
/**
? * wechat php テスト
?*/
//トークンを定義します
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
クラス wechatCallbackapiTest
{
?public function valid()
??? {
??????? $echoStr = $_GET["echostr"];
??? ???? //有効な署名、オプション
??????? if($this->checkSignature()){
????? echoStr;
??????? ?exit;
???? }
??//ポストデータを取得します。環境が異なる可能性があります
??$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
???? // 投稿データを抽出
???????????????
????????? ???? $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
?????????? $fromUsername = $postObj->FromUserName;
?? ?? ?????????? $toUsername = $postObj->ToUserName;
????????????$keyword = トリム($postObj->コンテンツ) );
??????????$time = time();
??????????$textTpl = "
???????
???????
???????
???????
???????
?????? ?
???????
?? ??if(!empty( $keyword ))
??????????{
?????????????? ??$msgType = "text";
??? ?????????? ?$contentStr = "wechat の世界へようこそ!";
???????????? ?$resultStr = sprintf 、$fromUsername、$toUsername、$time、$msgType、$contentStr);
????????????? ?echo $resultStr ;
??????? ?????????? }else{
??????????? ?echo "何かを入力してください..."; ???? }
????? }else {
????? ?echo
??? }
??
?プライベート関数 checkSignature()
?{
??????? _GET["署名"];
??????? $timestamp = $_GET["タイムスタンプ"];
??????? $_GET["nonce"] ;?
??????? ??
??$token = TOKEN;
??$tmpArr = array($token, $ timestamp, $nonce);
??sort ($tmpArr);
??$tmpStr = implode( $tmpArr );
??$tmpStr = sha1( $tmpStr );
??if( $tmpStr == $署名 ){
???return true;
??}else{
???return false;
??}
?}
}
?>
-------------------------------------- --------
c.java 版接口
<[email protected] import="java.util.Date"%>
<[email protected] import=" org.dom4j.Element"%>
<[email protected] import="org.dom4j.DocumentHelper"%>
<[email protected] import="org.dom4j.Document"%> ;
<[email protected] import="java.io.IOException"%>
<[email protected] import="java.io.InputStreamReader"%>
<[email protected] import="java.io.BufferedReader"%>
<[email protected] import="java.io.Reader"%>
<[email protected] import="java.security .MessageDigest"%>
<[email protected] import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; -8" pageEncoding="utf-8"%>
<%
?//WeiXinHandler は内部では非final型のオブジェクトを使用できません
?final String TOKEN="weixin";
?final HttpServletRequest Final_request=リクエスト;
?final HttpServletResponse Final_response=response;
%>
<%
class WeiXinHandler{
?public void valid(){
??String echostr=final_request.getParameter( "echostr");
??if(null==echostr||echostr.isEmpty()){
???responseMsg();
??}else{
???if (this.checkSignature()){
????this.print(echostr);
???}else{
????this.print("error");??? ??????????????????????????????????????????? ??????????????????????????????????????????? ??????????????????????????????????????????? ??????????????????????????????????????????? ??????????????????????????????????????????? ??????????????????????????????????????????? ??????????????????????
???}
??}
?}
?//自発回复内容
?public void responseMsg(){
??String postStr=null;
??try{
???postStr=this.readStreamParameter(final_request.getInputStream());
??}catch(Exception e){
???e.printStackTrace();
??}
??//System.out.println(postStr);
??if (null!=postStr&&!postStr.isEmpty()){
???ドキュメント document=null;
???try{
????document = DocumentHelper.parseText(postStr);
???}catch(Exception e){
????e.printStackTrace();
???}
???if(null==document){
????this.print("");
????return;
??? }
???要素 root=document.getRootElement();
?????????? String fromUsername = root.elementText("FromUserName");
?????????? String toUsername = root.elementText("ToUserName");
??????????文字列キーワード = root.elementTextTrim("Content");
?????????? String time = new Date().getTime() "";
?????????????文字列 textTpl = "
????"
????"
??????"
????"
??????">コンテンツ>"
????「
??????"
???
???if(null!=keyword&&!keyword.equals(""))
?????????? {
??????? ??String msgType = "text";
????????????? ?String contentStr = "wechat 世界へようこそ!";
??????????? ?String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);
??????????? ?this.print(resultStr);
????????????? }else{
????????????? ?this.print("何かを入力してください...");
????????????? }
?? }else {
???? ?this.print("");
???? }
?}
?//微信インターフェース验证
?public boolean checkSignature(){
??String 署名 = Final_request.getParameter("signature");
????? ??文字列タイムスタンプ = Final_request.getParameter("タイムスタンプ");
??????? String nonce = Final_request.getParameter("nonce");
???????文字列トークン=TOKEN;
??????? String[] tmpArr={トークン,タイムスタンプ,ノンス};
??????? Arrays.sort(tmpArr);
???????文字列 tmpStr=this.ArrayToString(tmpArr);
??????? tmpStr=this.SHA1Encode(tmpStr);
??????? if(tmpStr.equalsIgnoreCase(signature)){
???return true;
??}else{
???return false;
??}
?}
?//向请求端送信返回数据
?public void print(String content){
??try{
???final_response.getWriter().print(content);
?? ?final_response.getWriter().flush();
???final_response.getWriter().close();
??}catch(Exception e){
???
?? }
?}
?//数组转字符串
?public String ArrayToString(String [] arr){
??StringBuffer bf = new StringBuffer();
??for( int i = 0; arr.length; bf.append(arr[i]);
??}
??return bf.toString();
?}
?//sha1加密
?public String SHA1Encode(String sourceString) {
??String resultString = null;
??try {
?? resultString = new String(sourceString);
???? MessageDigest md = MessageDigest.getInstance("SHA-1");
???? resultString = byte2hexString(md.digest(resultString.getBytes()));
??} catch (Exception ex) {
??}
??return resultString;
?}
?public Final String byte2hexString(byte[] bytes) {
??StringBuffer buf = new StringBuffer(bytes.length * 2);
??for (int i = 0; i < bytes.length; i ) {
???if (((int) bytes[i] & 0xff) <0x10) {
????? ?buf.append("0");
???? ?}
???buf.append(Long.toString((int) bytes[i] & 0xff, 16));
??}
??return buf.toString().toUpperCase( );
?}
?//入流读取postパラメータ
?public String readStreamParameter(ServletInputStream in){
??StringBuilder バッファ = new StringBuilder();
?? BufferedReader Reader=null;
??try{
???reader = new BufferedReader(new InputStreamReader(in));
???String line=null;
???while(( line = Reader.readLine())!=null){
????buffer.append(line);
???????? }
??}catch(Exception e){
???e.printStackTrace();
??}finally{
???if(null!=reader){
????try {
?????reader.close();
????} catch (IOException e) {
?????e.printStackTrace();
????}
???}
??}
??returnbuffer.toString();
?}
}
%>
< ;%
?WeiXinHandler handler=new WeiXinHandler();
?handler.valid();
%>
----------------- ------------------------
d. 以上は PHP インターフェイスと JSP インターフェイスのすべての代コード、
? 现在我们来对いくつか必要注意的地方下分析:
? 最初に、全体的に見られるものとして、jsp は PHP の繁忙期の一部に比べて、多機能なため自己記述が必要です、
? 画像 sha1 加密、xml 文字列等を解析するには、自己検出の第三方のコードが必要です。
? 最初のポイントは、WeChat パブリック プラットフォームから JSP に送信されたパラメータを取得する必要があるということです。通常、それらを取得するには request.getParameter を使用します。 PHP は次のように取得します。
? $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
? この時点で、いくつかの情報をクエリすると、取得できるのは「認識できない MIME タイプ データ」であることがわかります。 $_GET または $_POST 関数を通じて取得されます。元の POST データ
? ここでは、元のデータ ストリームを取得するメソッドを使用して、投稿 XML データ
を解析します。 ?try{
???postStr=this.readStreamParameter(final_request.getInputStream());
??}catch(Exception e){
???e.printStackTrace();
? ?}
-------- ------------------------------------- --------
// 入力ストリームからポストパラメータを読み取ります
?public String readStreamParameter(ServletInputStream in){
??StringBuilderbuffer = new StringBuilder();
?? BufferedReader Reader=null;
??try{
???reader = new BufferedReader(new InputStreamReader(in));
???String line=null;
???while(( line = Reader.readLine())!=null){
????buffer.append(line);
????? }
??}catch(Exception e){
???e.printStackTrace();
??}finally{
???if(null!=reader){
????try {
???? Reader.close();
?? ??} catch (IOException e) {
????e.printStackTrace();
????}
???}
??}
??returnbuffer.toString();
?}
------------------------ ---------- ------------------------
2つ目は、応答メッセージを返信することです。 WeChat プラットフォームで最も一般的な out.Print を使用しようとしましたが、応答がありませんでした。
echo "";
exit;
を記述していることを確認してください。 ---------
メッセージ応答を送り返すには更新操作が必要かもしれないと推測したので、応答内のいくつかの関数を探して次の試みを行いました
// 戻りデータを送信します要求側へ
?public void print(String content){
??try{
???final_response.getWriter().print(content);
???final_response.getWriter( ).flush();
???final_response.getWriter( ).close();
??}catch(Exception e){
???
??}
? }
------------- ------------------------
詳しい紹介はこちらWeChat パブリック プラットフォームのメッセージング インターフェイスについては、WeChat パブリック プラットフォームの公式ドキュメントを参照してください。メッセージの XML 形式とメッセージの送信方法が紹介されています。