微信公众号开发全部流程,使用自己的订阅号开发的1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29787335/article/details/69243641

前言:我是一名php开发菜鸡,目前觉得自己技术不太行了,所以想提高一下自己的技术水平,然而没找到更好的方法,所以我打算将所有的微信接口全部写一遍,一边学习,一边开发,一边以写日记的方式记录下这段艰辛但是有意义的时光,也方便大家学习,我会写的很详细,如果有错误的地方请留言给我,我会及时修改的。(我不会告诉你我上班没任务,都是用上班时间学习的,下班我就打游戏去了,哈哈哈哈哈哈哈哈~~~~double kill)。


1.首先你得有一个服务器,至于什么是服务器,我就不多说了,阿里云有(要钱的),免费的也有,这个链接是方倍工作室免费的服务器申请流程,自己看吧,我就不多写了http://www.cnblogs.com/txw1958/p/wechat-tutorial.html


2.如何申请一个测试账号呢?为什么要选用微信测试账号呢?

申请地址 , http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login是个人都会申请的,我相信;

原因很简单,因为他的所有的接口权限都会给你,方便写代码撒


3.申请成功后你会看到一个appID一个appsecret,留好备用,接下来我们点击一下消息接口使用指南,来看一下,这里有这么一段话,挺适合装逼用的,那些开发过微信的php程序员经常会用这个问题来询问那些面试的或者是不会微信开发的人,你就记住一点,一个公众号,一个openID,多个公众号互通,用UnionID,就行了,装逼技巧一学到手了。这个页面上还有很多东西可以看,但是我就不一一讲解了,后面有用到的地方,我会上这里面的图的。


4.现在我们需要去填写URL和Token了,这我就很苦恼了,以前开发都是别人把微信配置好了,我就直接开始撸代码,现在完蛋了,自己要开始配置了,有点慌,还是打开那个消息接口使用指南,点击开始开发,接入指南,第一步:URL是开发者用来接受微信消息和事件的接口URL,Token可以由开发者任意填写,用作生成签名,该Token会和接口URL中包含的Token进行比对,从而验证安全性。第二步:验证服务器的地址是否有效,当你提交你的url和token之后,微信服务器将发送GET请求到你填写的服务器地址URL上,GET请求携带4个参数,signature(微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数,nonce参数)。timestamp(时间戳),nonce(随机数),echostr(随机字符串),作为开发者的你,需要通过检验signature对请求进行检验(检验方式马上在下面,不要急会写的),若确认此次get请求来自微信服务器,请原样返回echostr参数内容,然后呢就接入成功了,否则你就失败了~

4(附上)检验方式也叫检验流程,这里出了一点问题,测试号不知道为什么总是报配置错误,我查了下是微信端的问题,应为他errorCode返回的是-1,系统繁忙,所以我打算用我自己的号来继续学习,

url配置好了,token随便填,符合规则就行,然后就给你们上代码,我用的是tp3.2的框架,我是在home/index里写的三个方法,

<?php
namespace Home\Controller;
use Think\Controller;
define("TOKEN", "123456");


class IndexController extends Controller {
 
public function index()
{
  $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $echoStr = $_GET["echostr"];
if(empty($echoStr)){
$this->responseMsg();
}else{
if($this->checkSignature($signature,$timestamp,$nonce)){
echo $echoStr;
exit;
}
}
}



private function checkSignature($signature,$timestamp,$nonce)
{
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            $this->error('TOKEN is not defined!');
        }
        
$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;
}
}

public function responseMsg()
{
$postStr = file_get_contents("php://input");
//file_put_contents('postsrt.txt', $postStr);
if (!empty($postStr)){
               $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch($RX_TYPE){
case 'text':
$result = $this->receiveText($postObj);
break;
case 'image':
$result = $this->receiveImage($postObj);
file_put_contents('postsrt3.txt',$result);
break;
default:
$result = "unknow msg type:".$RX_TYPE;
break;
}
echo $result;
}else{
echo '';
exit;
}
}

}

我在文件上面定义了token  

这里的token要和在微信公众号里填的一样才行不然你微信里点击提交就会出错,

代码写了好,这个时候就可以点击提交了,提交成功,失败会有原因,请自行查阅,然后启用就会进入开发模式,不启用就是编辑模式,至于这两种模式有何区别,我想说你一个撸代码的,编辑模式就交给客服妹子去玩吧,你搞搞开发模式就够了。


5.接下来搞一下access_token的获取,不要问我为什么,就是这么任性,很简单这个东西,你只需要一个能够执curl的方法发送一个get请求就好了,

//获取access_token,然后存进session
public function huoquaccessToken(){
$appid = C('APPID');//读取配置
$appsecret = C('APPSECRET');//读取配置
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$data = '';
$output = curlpost($url,$data);
$jsoninfo = json_decode($output, true);
$access_token = $jsoninfo["access_token"];
session('access_token',$access_token);
}


 //curl POST 请求

function curlpost($url,$data = null){ 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 
    if (!empty($data)){ 
        curl_setopt($curl, CURLOPT_POST, 1); 
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    $output = curl_exec($curl); 
    curl_close($curl); 
    return $output; 
}

先上一波代码更加不要问我为什么方法名取得如此随意,那都是因为任性,简单的解释下,第一句获取appid,你可以不获取直接写在这,我这是读取的配置,我写在配置里面在,appsecret也一样,curlpost是一个公用方法,就是执行http请求用的,然后你就打印看下access_token获取到没有,就这么简单。报错就检查你的代码。


6.获取一下微信服务器的ip地址,也很简单,上面我们说了如何获取access_token,现在正是利用access_token的时候,我将上面获取到的access_token存进session里面,然后现在看下获取为新服务器ip地址的代码

//获取微信服务器的ip地址,利用已经获取的access_token
public function huoquaip(){
$access_token = session('access_token');//读取access_token
$url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$access_token;
$data = '';
$output = curlpost($url,$data);
$jsoninfo = json_decode($output, true);
dump($jsoninfo);
}

这应该不需要过多的解释了吧,很简单,发送请求就ok了,

这是我获取到的结果,至于有什么用,我不知道你们看着办。


7.现在开始写消息的接口,消息分为文本消息,图片消息,语音消息,视频消息,地理位置,链接,就写2个例子吧,一个文本消息一个图片消息,当一个关注你公众账号的人给你的公众号发送消息的时候,为新服务器会将消息发送到你填写的url上,你只需要接收,然后解析出来就知道是什么消息了,我看了很多别人写的例子很有意思,他们会根据用户发送的关键字去匹配消息,然后给用户发送与之对应的消息,大家可以网上自行查阅,我要开始上代码了,

   /*
* 接受文本消息
*/
private function receiveText($object){
$content = "你发送的是文本,内容为:".$object->Content;
$result = $this->transmitText($object,$content);
//file_put_contents('postsrt2.txt',$result);
return $result;
}

/*
* 接受图片消息
*/
private function receiveImage($object){
$content = "你发送的是图片,地址为:".$object->PicUrl;
$result = $this->transmitText($object,$content);
//file_put_contents('postsrt2.txt',$result);
return $result;
}


/*
* 回复文本消息
*/
private function transmitText($object,$content){
$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>";  
$result = sprintf($textTpl,$object->FromUserName,$object->ToUserName,time(),'text',$content);
file_put_contents('postsrt1.txt',$result);
return $result;
}


这是一个index方法,当用户给公众号发送消息的时候,微信就会将消息发送到这个方法,我写了一个判断,如果是验证url以及token的话就会接收到$echoStr,如果没收到$echoStr就会是发送消息过来,其实我问了一下老司机,验证(好像)只需要做一次就好了,成功之后后面都不会再验证了,都只会给你发送用户发的消息了,但是我不确定是不是真的,所以呢,我也不敢打保票,我写的是好像,然后我们看下responseMsg,首先是接收为新服务器传过来的消息,因为消息是xml的,所以需要用函数simplexml_load_string去解析橙一个对象,80行的意思是获取消息的类型,然后进行判断,receiveText和receiveImage我上图$content是我要回复的消息,transmitText这个方法,,然后就大功告成了,不信你们可以搜索我的订阅号(测试使用订阅号,图片是一个清秀的男生),然后你给我发送文本消息,我就会给你回复了。我写这段代码的时候就出现了问题,这个时候很多人会很郁闷,妈的怎么调试呢~是不是很烦,我快烦死了,然后我去找了老司机问下,调试方法你就用他会生成一个文件然后你去看这个文件有没有写入就知道是不是执行到了这里了,好吧,那就这样吧,再爱都曲终人散了。


如果有人愿意交流一下可以加QQ群:390679585,不是卖广告,重要的事情说一遍,不是卖广告


后续还有用服务号弄的菜单等。。。。

猜你喜欢

转载自blog.csdn.net/qq_29787335/article/details/69243641