`
zzc1684
  • 浏览: 1191400 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

阅读更多

微信公众开放平台开发02---微信公众平台PHP接口和java接口对比
技术qq交流群:JavaDream:251572072
-----------------------------------
这一节中的代码收集于网友的制作
-------------------------------------------
a.java-jsp版
b.PHP的接口代码:
<?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 = "<xml>
       <ToUserName><![CDATA[%s]]></ToUserName>
       <FromUserName><![CDATA[%s]]></FromUserName>
       <CreateTime>%s</CreateTime>
       <MsgType><![CDATA[%s]]></MsgType>
       <Content><![CDATA[%s]]></Content>
       <FuncFlag>0</FuncFlag>
       </xml>";            
    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版接口
<%@page import="java.util.Date"%>
<%@page import="org.dom4j.Element"%>
<%@page import="org.dom4j.DocumentHelper"%>
<%@page import="org.dom4j.Document"%>
<%@page import="java.io.IOException"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="java.io.Reader"%>
<%@page import="java.security.MessageDigest"%>
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
 //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 = "<xml>"+
      "<ToUserName><![CDATA[%1$s]]></ToUserName>"+
      "<FromUserName><![CDATA[%2$s]]></FromUserName>"+
      "<CreateTime>%3$s</CreateTime>"+
      "<MsgType><![CDATA[%4$s]]></MsgType>"+
      "<Content><![CDATA[%5$s]]></Content>"+
      "<FuncFlag>0</FuncFlag>"+
      "</xml>";            
   
   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 < arr.length; 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 < 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 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的格式和消息的发送方式等。

分享到:
评论

相关推荐

    微信公众平台开发周边酒店查询源码

    微信公众平台功能实现 周边酒店查询 php开发 xml封装数据

    微信公众平台接口java版

    模仿php版本。已经调通。微信开放公众平台的接口java版

    JAVA微信公众平台Token验证

    首先要开启开发模式必须要进行Token的一个验证,你给出一个地址,微信发送请求,然后你给出相应,就这么简单。虽然说是简单,但是这是事后才说的,官方只有PHP的DEMO,我用JAVA开发的时候各种蛋疼不会弄,不过好在...

    微信开放端口工具

    首先声明我是用java-tomcat来研究微信公众平台的。 微信公众平台要成为开发者,需要填写接口配置信息中的“URL”和“Token”这两项(参见:http://mp.weixin.qq.com/wiki/index.php?title=接入指南),郁闷的是官网...

    java微信公众平台开发自定义菜单项目代码

    整理高手们的博客代码 转自:... 希望对于初学者有所帮助,少走弯路, jar包和源代码都有, 下次我准备根据php开发整理出java版的开发实用的天气, 地图, 公交等接口代码开发。 敬请期待。

    微信支付V3.3.6完美开发示例 java+php

    微信公众平台支付接口。java版+PHP版微信支付V3.3.6Demo经测试可完美运行,如果遇到问题请仔细阅读微信V3.3.6版本微信支付文档,其实微信支付不难开发。本人经过网上各种例子摸爬滚打,终于将两种语言的微信支付测试...

    【毕业设计】基于微信公众平台的高校教务和学习(教学)平台.zip

    【毕业设计】基于微信公众平台的高校教务和学习(教学)平台.zip 高校教务和学习(教学)平台基于微信公众平台,从移动端的特性出发,帮助师生解决教务问题 技术: PHP、javascript、AJAX、CI 框架,ThinkPHP, 微信...

    java版微信公众平台消息接口应用示例

    主要介绍了java版微信公众平台消息接口应用,结合实例形式对比分析了PHP与java应用微信公众平台接口的相关调用与操作技巧,需要的朋友可以参考下

    基于SSM的微信公众平台微商城源码.zip

    基于SSM的微信公众平台微商城源码.zip

    微信支付 js api 接口文档及例子demo

    开发微信使用的 微信支付的接口, 在公众帐号上跳转到的 html页面上,使用js进行支付,里面有 java php asp c# 的例子

    微信网页授权oauth2.0版

    首先,去微信公众平台测试号管理注册公众号。 地址:http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index IDE:IntelliJ IDEA 2020.1.3 x64 (找度娘破解) 微信开发者工具 (官网去...

    微信支付技术文档

    微信支付技术文档。内容非常全面。包括:微信支付(APP)、微信支付(web扫码)、微信支付(公众账号)、【微信...用户维权系统及接口说明V1.6.pdf、【微信支付】退款及对账开发指南.pdf等等,还有两个php、java的实例demo

    微信公众号开发入门代码及示例

    开发微信公众号需要掌握相关的技术知识和开发流程,以下是一些说明: 1. 微信公众号类型及功能 微信公众号分为订阅号和服务号两种类型,订阅号适合做品牌传播,服务号则支持更多业务场景和高级功能。开发前需要确定...

    微信开发

    教程名称:微信开发 【】1.经典PHP微信公众号平台开发视频教程.zip ... 【】5.JAVA微信公众平台开发教程(PDF电子版).zip 【】6.微信 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    基于Java的微信公众平台开发框架,包括基础消息收发核心框架,基础API框架,以及应用层的web框架.zip

    包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...

    微信公众号

    微信开发基本流程实现,基于java,实现对接,自定义菜单,...里面有很多的代码demo一本书:微信公众平台应用开发 (豆瓣)一系列视频:初识Java微信公众号开发;Java微信公众号开发进阶GitHub有很多开源的代码可以学习。

    微信官方支付DEOM

    微信官方支付DEOM,其中包括( java、php、 asp、 c#、 html)五中语言例子,注意开发之前请先在微信公众后台修改支付目录

    微信公众号加密解密包

    用法详见我的博客 微信公众号开发-0010 接入微信公众平台

    公众平台/公众账号/微信支付/官方文档demo/SDK

    公众平台/公众账号支付/微信支付/官方文档demo/SDK 包括 java .net php 支付 退款 发货 警告 维权 文档 demo

Global site tag (gtag.js) - Google Analytics