首頁 後端開發 php教程 微信公众开放平台开发02-微信公众平台PHP接口和java接口对比

微信公众开放平台开发02-微信公众平台PHP接口和java接口对比

Jun 13, 2016 am 11:57 AM
final gt lt string

微信公众开放平台开发02---微信公众平台PHP接口和java接口对比

微信公众开放平台开发02---微信公众平台PHP接口和java接口对比
技术qq交流群:JavaDream:251572072
-----------------------------------
这一节中的代码收集于网友的制作
-------------------------------------------
a.java-jsp版
b.PHP的接口代码:
/**
? * wechat php test
? */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
?public function valid()
??? {
??????? $echoStr = $_GET["echostr"];

??????? //valid signature , option
??????? if($this->checkSignature()){
??????? ?echo $echoStr;
??????? ?exit;
??????? }
??? }

??? public function responseMsg()
??? {
??//get post data, May be due to the different environments
??$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

????? ?//extract post data
??if (!empty($postStr)){
???????????????
????????????? ?$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
??????????????? $fromUsername = $postObj->FromUserName;
??????????????? $toUsername = $postObj->ToUserName;
??????????????? $keyword = trim($postObj->Content);
??????????????? $time = time();
??????????????? $textTpl = "
???????
???????
???????%s
???????
???????
???????0
???????
";????????????
????if(!empty( $keyword ))
??????????????? {
????????????? ??$msgType = "text";
??????????????? ?$contentStr = "Welcome to wechat world!";
??????????????? ?$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
??????????????? ?echo $resultStr;
??????????????? }else{
??????????????? ?echo "Input something...";
??????????????? }

??????? }else {
??????? ?echo "";
??????? ?exit;
??????? }
??? }
??
?private function checkSignature()
?{
??????? $signature = $_GET["signature"];
??????? $timestamp = $_GET["timestamp"];
??????? $nonce = $_GET["nonce"];?
??????? ??
??$token = TOKEN;
??$tmpArr = array($token, $timestamp, $nonce);
??sort($tmpArr);
??$tmpStr = implode( $tmpArr );
??$tmpStr = sha1( $tmpStr );
??
??if( $tmpStr == $signature ){
???return true;
??}else{
???return false;
??}
?}
}

?>
--------------------------------------------------
c.java版接口











?//WeiXinHandler为内部类不能使用非final类型的对象
?final String TOKEN="weixin";
?final HttpServletRequest final_request=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 document=null;
???try{
????document = DocumentHelper.parseText(postStr);
???}catch(Exception e){
????e.printStackTrace();
???}
???if(null==document){
????this.print("");
????return;
???}
???Element root=document.getRootElement();
??????????? String fromUsername = root.elementText("FromUserName");
??????????? String toUsername = root.elementText("ToUserName");
??????????? String keyword = root.elementTextTrim("Content");
??????????? String time = new Date().getTime()+"";
??????????? String textTpl = ""+
??????""+
??????""+
??????"%3$s"+
??????""+
??????""+
??????"0"+
??????"
";????????????
???
???if(null!=keyword&&!keyword.equals(""))
??????????? {
????????? ??String msgType = "text";
??????????? ?String contentStr = "Welcome to wechat world!";
??????????? ?String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);
??????????? ?this.print(resultStr);
??????????? }else{
??????????? ?this.print("Input something...");
??????????? }

???? }else {
???? ?this.print("");
???? }
?}
?//微信接口验证
?public boolean checkSignature(){
??String signature = final_request.getParameter("signature");
??????? String timestamp = final_request.getParameter("timestamp");
??????? String nonce = final_request.getParameter("nonce");
??????? String token=TOKEN;
??????? String[] tmpArr={token,timestamp,nonce};
??????? Arrays.sort(tmpArr);
??????? String 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; i ?? 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 ???if (((int) bytes[i] & 0xff) ????? ?buf.append("0");
???? ?}
???buf.append(Long.toString((int) bytes[i] & 0xff, 16));
??}
??return buf.toString().toUpperCase();
?}
?//从输入流读取post参数
?public String readStreamParameter(ServletInputStream in){
??StringBuilder buffer = 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();
????}
???}
??}
??return buffer.toString();
?}
}
%>
?WeiXinHandler handler=new WeiXinHandler();
?handler.valid();
%>
-----------------------------------------
d.以上就是PHP接口和JSP接口的所有代码,
? 现在我们来对一些需要注意的地方做下分析:
? 首先的从总体看的话,jsp要比PHP繁琐一些,因为很多函数需要自己写,
? 像sha1加密,解析xml字符串等都需要自己找第三方的库。
? 第一点,我们要获取微信公众平台给jsp发送的post或get参数,正常情况下都是用request.getParameter就可以获取到,
? 但是在写的过程中发现PHP是这样获取
? $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
? 这时通过查询一些资料知道这样获取的是无法通过$_GET或$_POST函数得到的”未识别 MIME 类型的数据“,原始的 POST 数据
? 所以这里使用获取原始数据流的方式来解析post的xml数据
? String postStr=null;
??try{
???postStr=this.readStreamParameter(final_request.getInputStream());
??}catch(Exception e){
???e.printStackTrace();
??}
-----------------------------------------------------
//从输入流读取post参数
?public String readStreamParameter(ServletInputStream in){
??StringBuilder buffer = 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();
????}
???}
??}
??return buffer.toString();
?}
--------------------------------------------------------------
第二个,是response消息返回给微信平台,我尝试的用最一般的out.print去做,但是发现没反应,观察PHP的代码写法
echo "";
exit;
------------------
猜想可能需要有个刷新的操作才能把消息response回去,于是找了下response内的一些函数做出以下尝试
//向请求端发送返回数据
?public void print(String content){
??try{
???final_response.getWriter().print(content);
???final_response.getWriter().flush();
???final_response.getWriter().close();
??}catch(Exception e){
???
??}
?}
---------------------------------------
关于微信公众平台的消息接口的详细介绍,可以参看微信公众平台的官方文档,里面介绍了消息的xml的格式和消息的发送方式等。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
華為GT3 Pro和GT4的差異是什麼? 華為GT3 Pro和GT4的差異是什麼? Dec 29, 2023 pm 02:27 PM

許多用戶在選擇智慧型手錶的時候都會選擇的華為的品牌,其中華為GT3pro和GT4都是非常熱門的選擇,不少用戶都很好奇華為GT3pro和GT4有什麼區別,下面就給大家介紹一下二者。華為GT3pro和GT4有什麼差別一、外觀GT4:46mm和41mm,材質是玻璃鏡板+不鏽鋼機身+高分纖維後殼。 GT3pro:46.6mm和42.9mm,材質是藍寶石玻璃鏡+鈦金屬機身/陶瓷機身+陶瓷後殼二、健康GT4:採用最新的華為Truseen5.5+演算法,結果會更加的精準。 GT3pro:多了ECG心電圖和血管及安

使用java的String.valueOf()函數將基本資料型別轉換為字串 使用java的String.valueOf()函數將基本資料型別轉換為字串 Jul 24, 2023 pm 07:55 PM

使用Java的String.valueOf()函數將基本資料型別轉換為字串在Java開發中,當我們需要將基本資料型別轉換為字串時,常見的方法是使用String類別的valueOf()函數。這個函數可以接受基本資料類型的參數,並傳回對應的字串表示。在本文中,我們將探討如何使用String.valueOf()函數進行基本資料型別轉換,並提供一些程式碼範例來

怎麼把char數組轉string 怎麼把char數組轉string Jun 09, 2023 am 10:04 AM

char陣列轉string的方法:可以透過賦值來實現,使用{char a[]=" abc d\0efg ";string s=a;}語法,讓char陣列對string直接賦值,執行程式碼即可完成轉換。

Java中final、finally、finalize的區別 Java中final、finally、finalize的區別 Feb 19, 2024 pm 12:16 PM

Java中final、finally、finalize的區別,需要具體程式碼範例在Java程式設計中,經常會遇到final、finally、finalize這三個關鍵字,它們雖然拼字相似,但卻有不同的意思和用法。本文將詳細解釋這三個關鍵字的區別,同時給出程式碼範例以幫助讀者更好地理解。一、final關鍵字final關鍵字可以用於類別、方法和變數。它的作用是使被修飾的類

修復:截圖工具在 Windows 11 中不起作用 修復:截圖工具在 Windows 11 中不起作用 Aug 24, 2023 am 09:48 AM

為什麼截圖工具在Windows11上不起作用了解問題的根本原因有助於找到正確的解決方案。以下是截圖工具可能無法正常工作的主要原因:對焦助手已開啟:這可以防止截圖工具開啟。應用程式損壞:如果截圖工具在啟動時崩潰,則可能已損壞。過時的圖形驅動程式:不相容的驅動程式可能會幹擾截圖工具。來自其他應用程式的干擾:其他正在運行的應用程式可能與截圖工具衝突。憑證已過期:升級過程中的錯誤可能會導致此issu簡單的解決方案這些適合大多數用戶,不需要任何特殊的技術知識。 1.更新視窗與Microsoft應用程式商店應用程

使用java的String.replace()函數替換字串中的字元(字串) 使用java的String.replace()函數替換字串中的字元(字串) Jul 25, 2023 pm 05:16 PM

使用Java的String.replace()函數替換字串中的字元(字串)在Java中,字串是不可變的對象,這意味著一旦創建了一個字串對象,就無法修改它的值。但是,你可能會遇到需要替換字串中的某些字元或字串的情況。這時候,我們可以使用Java的String類別中的replace()方法來實作字串的替換。 String類別的replace()方法有兩種重

在Java中,僅使用final關鍵字可以定義一個常數嗎? 在Java中,僅使用final關鍵字可以定義一個常數嗎? Sep 20, 2023 pm 04:17 PM

常量變數是其值固定且程式中只存在一個副本的變數。一旦你聲明了一個常數變數並給它賦值,你就不能在整個程式中再次改變它的值。與其他語言不同,Java不直接支援常數。但是,你仍然可以透過宣告一個變數為靜態和final來創建一個常數。靜態-一旦你聲明了一個靜態變量,它們將在編譯時加載到內存中,即只有一個副本可用。 Final-一旦你宣告了一個final變量,就不能再修改它的值。因此,你可以透過將實例變數宣告為靜態和final來在Java中創建一個常數。範例 示範classData{&am

使用java的String.length()函數取得字串的長度 使用java的String.length()函數取得字串的長度 Jul 25, 2023 am 09:09 AM

使用Java的String.length()函數取得字串的長度在Java程式設計中,字串是一種非常常見的資料類型,我們經常需要取得字串的長度,即字串中字元的個數。在Java中,我們可以使用String類別的length()函數來取得字串的長度。下面是一個簡單的範例程式碼:publicclassStringLengthExample{publ

See all articles