微信公众开放平台开发02---微信公众平台PHP接口和java接口对比
发布日期:2021-06-29 17:56:21
浏览次数:2
分类:技术文章
本文共 7293 字,大约阅读时间需要 24 分钟。
微信公众开放平台开发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版接口 < import="java.util.Date"%> < import="org.dom4j.Element"%> < import="org.dom4j.DocumentHelper"%> < import="org.dom4j.Document"%> < import="java.io.IOException"%> < import="java.io.InputStreamReader"%> < import="java.io.BufferedReader"%> < import="java.io.Reader"%> < import="java.security.MessageDigest"%> < 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的格式和消息的发送方式等。转载地址:https://credream.blog.csdn.net/article/details/23040877 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月13日 17时10分23秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2021-05-19
2019-04-30
2021-05-19
2019-04-30
todolist
2019-04-30
2021-05-22
2019-04-30
react 购物车
2019-04-30
react 路由
2019-04-30
2021-06-07
2019-04-30
面试-项目
2019-04-30
Mysql主从复制的配置(双机互为主从)
2019-04-30
java io输入输出流详解
2019-04-30
log4j在java中实现
2019-04-30
android studio 优先源码编译解决隐藏文件报红问题
2019-04-30
Android studio 两种方式将项目生成为jar包
2019-04-30
系统签名方式二 将as生成的jks 注入系统签名 变成带有系统签名的jks
2019-04-30
AMS 的启动过程 面试 笔记
2019-04-30
AMS 重要数据结构 面试 笔记
2019-04-30
Activity栈管理 面试 笔记
2019-04-30
window、windowManager 和 WMS 的关系面试 笔记
2019-04-30
Window 的属性面试 笔记
2019-04-30
Window 的标志
2019-04-30