백엔드 개발 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 기반 앱

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 Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? 화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? Dec 29, 2023 pm 02:27 PM

많은 사용자들이 스마트 시계를 선택할 때 Huawei 브랜드를 선택하게 됩니다. 그 중 Huawei GT3pro와 GT4가 가장 인기 있는 선택입니다. 두 제품의 차이점을 궁금해하는 사용자가 많습니다. Huawei GT3pro와 GT4의 차이점은 무엇입니까? 1. 외관 GT4: 46mm와 41mm, 재질은 유리 거울 + 스테인레스 스틸 본체 + 고해상도 섬유 후면 쉘입니다. GT3pro: 46.6mm 및 42.9mm, 재질은 사파이어 유리 + 티타늄 본체/세라믹 본체 + 세라믹 백 쉘입니다. 2. 건강한 GT4: 최신 Huawei Truseen5.5+ 알고리즘을 사용하면 결과가 더 정확해집니다. GT3pro: ECG 심전도, 혈관 및 안전성 추가

Jul 24, 2023 pm 07:55 PM

Java의 String.valueOf() 함수를 사용하여 기본 데이터 유형을 문자열로 변환 Java 개발에서 기본 데이터 유형을 문자열로 변환해야 할 때 일반적인 방법은 String 클래스의 valueOf() 함수를 사용하는 것입니다. 이 함수는 기본 데이터 유형의 매개변수를 허용하고 해당 문자열 표현을 반환할 수 있습니다. 이 기사에서는 기본 데이터 유형 변환을 위해 String.valueOf() 함수를 사용하는 방법을 살펴보고 다음과 같은 몇 가지 코드 예제를 제공합니다.

char 배열을 문자열로 변환하는 방법 char 배열을 문자열로 변환하는 방법 Jun 09, 2023 am 10:04 AM

char 배열을 문자열로 변환하는 방법: 할당을 통해 달성할 수 있습니다. char 배열이 문자열에 직접 값을 할당하고 실행하도록 하려면 {char a[]=" abc d\0efg ";string s=a;} 구문을 사용합니다. 변환을 완료하는 코드입니다.

Java에서 final, finally 및 finalize의 차이점 Java에서 final, finally 및 finalize의 차이점 Feb 19, 2024 pm 12:16 PM

Java에서 final, finally 및 finalize의 차이점에는 특정 코드 예제가 필요합니다. Java 프로그래밍에서는 final, finally 및 finalize라는 세 가지 키워드가 철자가 비슷하더라도 의미와 사용법이 다른 경우가 많습니다. 이 기사에서는 이 세 가지 키워드의 차이점을 자세히 설명하고 독자의 이해를 돕기 위해 코드 예제를 제공합니다. 1. Final 키워드 final 키워드는 클래스, 메소드, 변수에 사용할 수 있습니다. 그 기능은 수정된 클래스를 만드는 것입니다.

Java에서는 final 키워드만 사용하여 상수를 정의할 수 있나요? Java에서는 final 키워드만 사용하여 상수를 정의할 수 있나요? Sep 20, 2023 pm 04:17 PM

상수 변수는 값이 고정되어 있고 프로그램에 단 하나의 복사본만 존재하는 변수입니다. 상수 변수를 선언하고 값을 할당하면 프로그램 전체에서 해당 값을 다시 변경할 수 없습니다. 다른 언어와 달리 Java는 상수를 직접 지원하지 않습니다. 그러나 변수를 static 및 final로 선언하여 상수를 생성할 수 있습니다. 정적 - 정적 변수를 선언하면 컴파일 타임에 메모리에 로드됩니다. 즉, 하나의 복사본만 사용할 수 있습니다. 최종 - 최종 변수를 선언한 후에는 해당 값을 수정할 수 없습니다. 따라서 인스턴스 변수를 static 및 final로 선언하여 Java에서 상수를 생성할 수 있습니다. 예시 데모 classData{&am

수정: Windows 11에서 캡처 도구가 작동하지 않음 수정: Windows 11에서 캡처 도구가 작동하지 않음 Aug 24, 2023 am 09:48 AM

Windows 11에서 캡처 도구가 작동하지 않는 이유 문제의 근본 원인을 이해하면 올바른 솔루션을 찾는 데 도움이 될 수 있습니다. 캡처 도구가 제대로 작동하지 않는 주요 이유는 다음과 같습니다. 초점 도우미가 켜져 있습니다. 이렇게 하면 캡처 도구가 열리지 않습니다. 손상된 응용 프로그램: 캡처 도구가 실행 시 충돌하는 경우 응용 프로그램이 손상되었을 수 있습니다. 오래된 그래픽 드라이버: 호환되지 않는 드라이버가 캡처 도구를 방해할 수 있습니다. 다른 응용 프로그램의 간섭: 실행 중인 다른 응용 프로그램이 캡처 도구와 충돌할 수 있습니다. 인증서가 만료되었습니다. 업그레이드 프로세스 중 오류로 인해 이 문제가 발생할 수 있습니다. 이 문제는 대부분의 사용자에게 적합하며 특별한 기술 지식이 필요하지 않습니다. 1. Windows 및 Microsoft Store 앱 업데이트

Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열)를 바꿉니다. Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열)를 바꿉니다. Jul 25, 2023 pm 05:16 PM

Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열) 바꾸기 Java에서 문자열은 불변 객체입니다. 즉, 문자열 객체가 생성되면 해당 값을 수정할 수 없습니다. 그러나 문자열에서 특정 문자나 문자열을 바꿔야 하는 상황이 발생할 수 있습니다. 이때 Java의 String 클래스에 있는 replacement() 메소드를 사용하여 문자열 교체를 구현할 수 있습니다. String 클래스의 replacement() 메소드에는 두 가지 유형이 있습니다.

2w 단어 자세한 설명 문자열, yyds 2w 단어 자세한 설명 문자열, yyds Aug 24, 2023 pm 03:56 PM

안녕하세요 여러분, 오늘은 Java: String에 대한 기본 지식을 여러분과 공유하겠습니다. String 클래스의 중요성은 말할 필요도 없이 우리 백엔드 개발에서 가장 많이 사용되는 클래스라고 할 수 있으므로 이에 대해 이야기할 필요가 있다.

See all articles