2017-08-23 11:06:20 qq_22823581 阅读数 340
  • PHP微信接口开发

    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发...

    15703 人正在学习 去看看 传智



token 是在网页中和微信服务器商量好的哦。下次使用的时候直接代码复制即可使用

<?php
/**
 * Created by PhpStorm.
 * User: liaosp
 * Date: 2017/8/23
 * Time: 10:36
 */

$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$token = 'weixin';  //在网页中配置的token
$signature = $_GET['signature'];
$array = array($timestamp,$nonce,$token);
$tmpstr= implode('',$array);
$tmpstr = sha1($tmpstr);
if ($tmpstr == $signature){
    echo $_GET['echostr'];
    exit;
}


有时候没有用是有bom头的影响

在echo 前面添加     ob_clean();    清楚前面的输出

2017-02-08 12:29:04 zhongyuchuan147 阅读数 1998
  • PHP微信接口开发

    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发...

    15703 人正在学习 去看看 传智

首先准备一个api.php文件 这个文件可以再微信开发平台网站手册里面下载到

需要配置的是token

微信测试地址

https://mp.weixin.qq.com/debug/

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

//define your token
define("TOKEN", "这里写你的token");
$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)){
                /* 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);
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }
		
	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;
		}
	}
}

?>

然后配置你的服务器 

输入你设置的token 配置完成就可以进行开发了

首先需要的几个参数

首先你会拥有一个appID和appsecret


然后你需要设置你的接口配置


这里的url填写你的最开始的那个文件路径

token可以随便写

token填到第一个文件里面去

然后保存提交



提交之后便可以开始开发了 这里附上最基本的获取用户头像和用户名的代码

新建一个文件weixin.php


以下有三个参数需要填写

appid填写你的appid

appsecret填写你的appsecret

redirect_uri填写你的回调域名

<meta charset="utf-8">
<?php
$appid='填写你的appid';
$appsecret='填写你的appsecret';
$redirect_uri='填写你的域名地址/weixin.php';
$code=isset($_GET['code'])?$_GET['code']:'';

$url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';

//获取html代码
function getSslPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}


$user=getSslPage($url);
// $user=file_get_contents($url);
// echo $user;exit;
$access_token=explode('access_token":"',$user)[1];
$access_token=explode('"',$user)[0];//access_token
$openid=explode('"openid":"',$user)[1];
$openid=explode('"',$openid)[0];//openid
$refresh_token=explode('refresh_token":"',$user)[1];
$refresh_token=explode('"',$refresh_token)[0];//refresh_token

$aa=json($user);
echo $aa->access_token;


// $user_info_url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';
$use_url='https://api.weixin.qq.com/sns/oauth2/refresh_token?appid='.$appid.'&grant_type=refresh_token&refresh_token='.$refresh_token;
$user_cont=getSslPage($use_url);
// echo $user_cont;exit;
$access_token=explode('access_token":"',$user_cont)[1];
$access_token=explode('"',$access_token)[0];//access_token
$openid=explode('"openid":"',$user_cont)[1];
$openid=explode('"',$openid)[0];//openid
$refresh_token=explode('refresh_token":"',$user_cont)[1];
$refresh_token=explode('"',$refresh_token)[0];//refresh_token

$user_info='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN;';
$text=getSslPage($user_info);
$arr=json_decode($text,true);
echo '网名:'.$arr['nickname'].'</br>';
echo '头像:<img src='.$arr['headimgurl'].'></br>';
然后微信访问这个weixin.php文件就能看到你的头像和网名了

2018-09-13 10:57:12 HOLYLANCES 阅读数 254
  • PHP微信接口开发

    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发...

    15703 人正在学习 去看看 传智

微信接口配置需要用到http开头的域名,然后将自己的api.php路径填写正确 如下

下面是api.php文件的代码

<?php
/**
 * wechat php test
 */
include "WeChat_message.php";
header('Content-type:text');
//define your token
//定义TOKEN密钥
define("TOKEN", "weixin");
//实例化微信对象
$wechatObj = new wechatCallbackapiTest();
//验证成功后注释掉valid方法
$wechatObj->valid();
//开启自动回复功能
$wechatObj->responseMsg();
//定义类文件
class wechatCallbackapiTest
{
    //定义checkSignature方法
    private function checkSignature(){
        // you must define TOKEN by yourself

        //判断TOKEN密钥是否定义
        if (!defined("TOKEN")) {
            //如果没有定义则抛出异常,返回'TOKEN is not defined!'字符串
            throw new Exception('TOKEN is not defined!');
        }
        //接收微信加密签名
        $signature = $_GET["signature"];
        //接收时间戳信息
        $timestamp = $_GET["timestamp"];
        //接收随机数
        $nonce = $_GET["nonce"];
        //把TOKEN常量赋值给$token变量
        $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;
        }
    }

    //实现valid验证方法:实现对接微信公众平台
    public function valid()
    {
        //通过GET请求接收随机字符串
        $echoStr = $_GET["echostr"];
        //调用checkSignature方法进行用户(开发者)数字签名验证
        //valid signature , option
        if($this->checkSignature()){
            //如果成功,则返回接收到的随机字符串
            echo $echoStr;
            //并退出
            exit;
        }
    }
//=============================================================================================

    /**
     * 主要的控制方法
     */
    public function responseMsg()
    {
        //get post data, May be due to the different environments
        //接收用户端(客户)发送过来的XML数据
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //extract post data
        //判断XML数据是否为空
        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);
            //通过simplexml进行xml解析     PHP中有两大类可以完成对XML的解析,1.PHP的Dom模型2.通过simplexml模型
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            //发送方帐号(一个OpenID)
            $fromUsername = $postObj->FromUserName;
            //开发者微信号
            $toUsername = $postObj->ToUserName;
            //接收用户发送的关键词
            $keyword = trim($postObj->Content);
            //消息类型
            $mysgType = $postObj->MsgType;
            //事件类型,subscribe(订阅)、unsubscribe(取消订阅)
            $event = $postObj->Event;
            //时间戳
            $time = time();
            switch ($mysgType){
                case "event":
                    if ($event == "subscribe"){//订阅
                        keyText($fromUsername,$toUsername,$time);//显示菜单
                    }
                    if ($event == "location_select") {//发送位置
                        $label = $postObj->Label;//地理位置的字符串信息
                        keyText($fromUsername,$toUsername,$time,$label);
                    }
                    break;
                case "text":
                    keyText($fromUsername,$toUsername,$time,$keyword);
                    break;
                default:
                    echo "Input something...";
                    break;
            }
        }else {
            echo "ERROR:XML数据为空";
            exit;
        }
    }




}
?>

及WeChat_message.php文件代码

<?php

/**关键字回复/发送文本信息
 * @param $fromUsername
 * @param $toUsername
 * @param $time
 * @param string $keyword
 */
function keyText($fromUsername,$toUsername,$time,$keyword = "?"){
    //文本发送模板
    $Tpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>
            </xml>";

    //回复类型,如果为"text",代表文本类型
    $msgType = "text";
    if($keyword == "?" || $keyword == "?"){
        $contentStr = "可操作菜单有\n1.开发人\n?.菜单";
    }else if($keyword == "1"){//发送1 回复的内容
        $contentStr = "开发人:LRJ 你的openid:".$fromUsername;
    }else{
        $contentStr = "".$keyword;
    }
    //格式化字符串(对xml进行格式化操作,把里面相关的变量格式化成字符串)
    //文本形式
    $resultStr = sprintf($Tpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    echo $resultStr;//输出
}

配置成功后记得把api.php里的valid()方法注释掉

2018-11-17 15:47:56 chenwill3 阅读数 87
  • PHP微信接口开发

    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发...

    15703 人正在学习 去看看 传智

纵观微信公众平台开发的各类书籍,基本上微信定制开发都是从微信消息开始的,主要是服务器被动回复消息这块为主,这个模块也算微信的核心,这次将以验证微信消息来自微信服务器为例,分享下我的代码

一  入口的切入点

我们知道做微信开发需要处理来自用户、微信服务器的各类的消息,查阅微信文档可总结出的规律是 验证消息来自微信服务器为GET请求,其他微信消息的推送是POST请求 , 根据这一规律我们就可以将校验和消息推送统一进行处理

二 代码的实现

1 php可以通过$_SERVER['REQUEST_METHOD']获取请求的类型

2 按照流程程序需要校验signature的有效性并返回正确signature

3 计算signature,php的步骤是  数组排序、把数组转成字符串、sha1计算出signature(非常重要)

对于第三部php还算比较简单,但是像java的话就比较复杂,这里先贴出php的算法

function checkSignature()
    {
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

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

        if ($tmpStr) {
            return $tmpStr;
        } else {
            return "";
        }
    }

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

这个是从微信开发文档上摘抄过来的,给大家做参考,详细的可查阅微信开发文档

function isValid()
    {
        $signature = $_GET["signature"];
        if ($signature == $this->checkSignature()) {
            return true;
        } else {
            return false;
        }
    }

上述两个方法我写到了名为WeixinHandler的类里面,TOKEN是定义好的常量

define("TOKEN", "weixinCourse");


// 步骤
// 1 判断请求方法,get请求一般为消息验证,post为其他消息交互
// 2 验证signature是否正确(消息来自微信服务器)
$handler = new WeixinHandler();
$reqMethod = strtolower($_SERVER["REQUEST_METHOD"]);
if ("get" == $reqMethod && !empty($_GET["echostr"])) {
    if ($handler->isValid()) {
        $echostr = $_GET["echostr"];
        echo $echostr;
        exit();
    }
} else {
    //判断消息类型,返回"你发送的是xxx消息"
    $handler->responseMessage();
}

responseMessage用来处理各类的消息,因为这次主要是入门,这个方法下次的博客分享会给出来,到这里校验消息来自微信服务器的功能已经完成了,但是还是需要注意一下几点

1 填写的URL需要外网可以访问且越简单越好,不建议url为带参数的形式;可使用花生壳、ngrok等

2 Token必须和程序定义的保持一致

java的消息校验可参考这个,因为本人是搞java的,就忍不住多啰嗦一下

https://blog.csdn.net/lyq8479/article/details/8944988

2018-04-07 16:56:45 W_SSNY 阅读数 221
  • PHP微信接口开发

    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发...

    15703 人正在学习 去看看 传智


接入微信公众平台开发,开发者需要按照如下步骤完成:

1.填写服务器配置(url,token);

2.验证消息的确来自微信服务器(signature,timestamp,nonce,echostr);

3.依据接口文档实现业务逻辑,代码如下:

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

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

class wechatCallbackapiTest
{
	public function run()
    { 
        if($this->checkSignature()==false){
            die('非法请求');
        }

        if(isset($_GET["echostr"])){
            $echostr = $_GET['echostr'];
            echo $echostr;
        }else{
            $this->responseMsg();
        }
        // $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"];
        file_put_contents('msg.txt',$postStr,FILE_APPEND);
      	//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 ))
                {
                	$contentStr = $this->huifu($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;
        }
    }

    public function huifu($keywords){
    	if($keywords == "天气"){
    		$contentStr = "今天挺冷的!";
    		return $contentStr;
    	}else if($keywords == "放假"){
    		$contentStr = "放假日期为四月五号到六号!";
    		return $contentStr;
    	}else{
    		$contentStr = "sorry,我不知道";
    		return $contentStr;
    	}
    }
		
	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;
		}
	}
}

?>
其实打通接口一行代码即可完成:echo $_GET['echostr'];

另请注意,微信公众号接口必须以http://或https://开头,分别支持80端口和443端口。





没有更多推荐了,返回首页