微信消息体加密php版

使用wx_sample.php和加密的demo.php拼接而成,微信官方的wiki写的比较烂,难以理解,demo也不是很好,类中使用了空参数过程中赋值,初学者难以理解,不如直接得到加密解密方便。另外逻辑上也先写加密后解密,也和微信处理流程相反,造成理解困难。

<?php
/**
  * wechat php test
  */

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

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

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

    public function responseMsg()
    {
		include_once "wxBizMsgCrypt.php";

$encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG";
$token = TOKEN;
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$appId = "wx47224801062443cc";
$msg_sign = $_GET["msg_signature"];
//解密
$pc = new WXBizMsgCrypt($token, $encodingAesKey, $appId);

		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
		$msg = '';
$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $postStr, $msg);
if ($errCode == 0) {
	$postStr=$msg;
	if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
              	$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);
					//加密
					$encryptMsg = '';
$errCode = $pc->encryptMsg($resultStr, $timeStamp, $nonce, $encryptMsg);
							if ($errCode == 0) {
								echo $encryptMsg ;
							} else {
								print($errCode . "\n");
							}

                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }

} else {
	print($errCode . "\n");
}

      	//extract post data

    }

	private function checkSignature()
	{
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }

        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
		sort($tmpArr, SORT_STRING);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );

		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
}

?>
时间: 2024-12-10 02:05:08

微信消息体加密php版的相关文章

微信消息体签名及加解密功能详细解析以及.net实现

原文:微信消息体签名及加解密功能详细解析以及.net实现 前言 微信消息体签名及加密功能已上线,明文传输确实存在安全风险,鉴于微信的用户范围使用之广泛,必定会成为众矢之的.所以大家还是尽快接入安全模式为好.仔细阅读官方接入指南,发现这次安全升级只是涉及到用户在微信对话窗口中与公众好消息交互,所以此次升级还是比较简单的.下面为大家一一道来. 一.功能解析 微信消息体签名及加密功能已上线,出于安全考虑,强烈建议您尽快接入消息加密功能,消除安全风险.详见公告.公众平台接口调试工具已经全面支持消息体加密

asp.net C# 微信消息自动回复 asp.net版

//asp.net C# 微信消息自动回复 asp.net版 protected void Page_Load(object sender, EventArgs e) { if (Request.HttpMethod == "POST") { string weixin = ""; weixin = PostInput();//获取xml数据 if (!string.IsNullOrEmpty(weixin)) { ResponseMsg(weixin);////调

[号外]微信公众平台开发---消息体签名及加解密

离刚开始做微信开发到现在已经两个月了,因为被分配了另外一个任务,所以微信的开发就先放到了一遍. 在小公司便是如此,只有自己一个人做开发,所以哪里需要就要先转到哪一块.其实想想自己也没什么太好的理由说留在这个公司,想想也就是工作比较放松点,老板人还可以,项目上也催的不紧,孩子还小家里有点事了可以随时请假回家,这次也是家里父亲和小孩都住院了请了半个月假刚过来. 闲话不多说,先说下微信开发的博客,微信开发也算完成了一部分,因为没有完成,所以之前的『微信公众平台开发(一)---接口介绍及配置』起了个头便

微信开发(五)微信消息加解密 (EncodingAESKey)

div#cpmenu {height:200px;float:left;} div#cpcontent {height:200px;width:150px;float:left;} 文章作者:松阳 原文链接:http://blog.csdn.net/fansongy/article/details/44005301 消息体加密 随着微信服务开发在越来越多的领域应用,应用的安全性逐渐被重视起来.本文主要阐述如何为微信的消息加密的原理与Java版本的实现. 原理 做过微信开发的朋友们都知道,微信使用

微信开发(准备工作简版)

1.准备工作 1.1 首先需要一个url地址,用来接收相关的数据 1.2 注册开发者账号进行开发(可用公众平台测试账号) 1.3 appid,第三方用户唯一凭证(你的AppID) 1.4 secret,第三方用户唯一凭证密钥,即Appsecret 1.3 需要access_token,access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.access_token的存储至少要保留512个字符空间.access_token的有效期为2个小时,需定时刷新,

Java服务端和安卓客户端对消息的加密

import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.bi

微信公众平台消息体加解密实现

一.消息体加解密 微信公众平台在配置服务器时,提供了3种加解密的模式供开发者选择,即明文模式.兼容模式.安全模式,选择兼容模式和安全模式前,需在开发者中心填写消息加解密密钥EncodingAESKey. 明文模式:维持现有模式,没有适配加解密新特性,消息体明文收发,默认设置为明文模式 兼容模式:公众平台发送消息内容将同时包括明文和密文,消息包长度增加到原来的3倍左右:公众号回复明文或密文均可,不影响现有消息收发:开发者可在此模式下进行调试 安全模式(推荐):公众平台发送消息体的内容只含有密文,公

C#微信公众号开发系列教程三(消息体签名及加解密)

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的

微信公众平台消息体签名及加解密实例(Java)

前言: 最近在研究微信公众平台的开发,玩得不亦乐乎.基本的回复功能已经实现了,而且回复用到了图灵机器人的接口.其实图灵机器人已经有微信接口可以直接调用.如果项目的需要,想要做个性化需求的话,用这种方式是行不通的.我现在的解决方案是,我开发的应用A作为中间层,连接微信接口与图灵机器人接口.有点扯远了,如题,微信官方为了更高的安全性,10月份推出了消息体签名验证.网上关于此项的实例不多,其实根据官方的例子,重新封装一下,就可以了. 一.准备工作: 1.已申请了相关的订阅号或者服务号(可以用虚拟器,具