微信开发php端的代码要怎么写_php微信开发代码 - CSDN
  • 首先准备一个api.php文件 这个文件可以再微信开发平台网站手册里面下载到 需要配置的是token 微信测试地址 https://mp.weixin.qq.com/debug/ <?php /** * wechat php test */ //define your token define("TOKEN...

    首先准备一个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文件就能看到你的头像和网名了

    展开全文
  • 本系列文章属作者原创文章,请尊重作者的劳动成果,转载请注明出处:walkingmanc的专栏 , 谢谢! 同时欢迎大家加入微信商城开发QQ群:...所谓的不写代码玩转微信公众号,其实就是在编辑模式下如何使用微信公众号的意

    本系列文章属作者原创文章,请尊重作者的劳动成果,转载请注明出处:walkingmanc的专栏 , 谢谢!

    同时欢迎大家加入微信商城开发QQ群:364072602,共同探讨进步。 


             为什么叫不写代码玩转微信公众号呢? 我们大家都知道,微信公众号有两种模式,一种是编辑模式,一种是开发模式。所谓的不写代码玩转微信公众号,其实就是在编辑模式下如何使用微信公众号的意思,呵呵,是不是有种恍然大悟的感觉。

           其实,如果你关注的微信公众号比较多的话,你会发现有很多有名的公众号,它们没有菜单,每天都会发布4到5篇文章的多图文消息,例如我们之前提到的爆笑来袭等等都属于这一类,其实这类都是订阅号。

    不写代码玩转订阅号

    你如果是一个微信公众号爱好者,你一定关注了很多的公众号,在阅读订阅号上的文章的时候,你是不是经常发现一些订阅号除了标题和内容外,还经常带一些导语和结尾语?例如爆笑来袭的导语见图1 和结尾语 图2.

    图 1



    图 2 

    那么这些导语和结尾语是怎么做出来的呢?

           其实,导语部分的“只有1%的人回去点”是一张图片,这部分是很简单的。结尾语是由一个分割线,一个无序列表,然后加上字体加粗和字体变色就可以实现,这些功能在微信公众号图文编辑页面都是有的,可以直接使用,编辑好后效果如下图3.


    图 3


    我们在公众号发图文消息时,微信平台本来就为我们提供了一个编辑界面,你可以在这个编辑界面编辑多图文的内容,包括标题,作者,原文链接,如果你在原文链接里面填写了一个链接的话,那么每篇图文最后面会有一个阅读原文的链接,点击后跳转到你的原文链接。中间部分就是我们编辑图文内容的地方了,在其中你可以插入图片,改变字体大小和颜色,但是你是无法选择字体的,这也是这种方式的局限性。而且这种方式提供的排版功能也很有限,很多稍微复杂一点的效果它就无法实现了。

    比如我们上面的“爆笑来袭”导语部分的那个ID: baoxiao99 所在的框,以及其它很多你看到的各种多姿多彩的效果和排版等等,都是通过其它更高级的方式实现的。

    多图文编辑模式进阶-使用word 排版大量文字

    既然单凭微信自带的后台编辑器无法满足我们图文消息编辑的要求,那么我们应该怎么办呢?

         首先,如果你的文章内容很多,样式很简单的话,你可以先在word里面进行文字的排版,但是要记住的是字体一定只能选择宋体,否则当你把word里面编辑好的文章拷贝到微信图文里面时会发现所有的文字字体都无法正常显示。

    也就是说,我们可以使用word对大量文字的对齐,大小和颜色等等进行调整,调整好了后拷贝到微信图文里面,这样比直接在微信后台编辑要快很多。但是这只是比较适合正文内容的编辑,因为一般来说,正文内容格式变化比较少,但是文字数目多。

    如果你的文章内容风格各异,各种特效非常多的话,那么word就无能为力了,这时候我们就要再使用其它方法了。例如要实现图4  的效果。


    图 4

    多图文编辑模式进阶-使用html+css实现各种特效

            那么要实现各种特效该怎么做呢,因为我们的微信在显示文章内容时其实是使用了其内置的浏览器来显示的,这个内置的浏览器内核和我们普通上网使用的浏览器是类似的,也是支持html和css 的,但是因为微信公众号后台并没有直接提供源码编辑模式,所以,我们想实现这些特效就必须先借助一些网页编辑工具将要实现的特效先做出来,例如使用dw,然后在浏览器里面先预览该特效,没有问题以后再将该特效直接拷贝到微信后台的图文编辑框中就可以了。

    我们以文本框特效为例给大家讲。

            我要实现的特效效果如下 图5 所示。



    图 5

    这种效果你在微信平台自带编辑器或者word里面都是无法实现的,我们需要借助网页编辑工具dw来做,

    1.    打开dw 编辑器。

    2 .  将下面的代码拷贝到dw里面

    [html] view plain copy
    1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
    2. <p>  
    3.     <spanstylespanstyle="border:0px;margin:0px;padding:6px10px;color:#ffffff;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:5px;background-color:#6600FF;box-shadow:#a5a5a55px 5px 2px;">微信公众号图文编辑-多色圆角背景</a>  
    4.     </span>  
    5. </p>  
    6. <p></p>  
    7. <p>  
    8.     <spanstylespanstyle="border:0px;margin:0px;padding:6px10px;color:#ffffff;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:5px;background-color:#006600;box-shadow:#a5a5a55px 5px 2px;">微信公众号图文编辑-多色圆角背景</a>  
    9.     </span>  
    10. </p>  
    11. <p></p>  
    12. <p>  
    13.     <span  
    14.         style="border: 0px; margin: 0px; padding: 6px10px; color: #ffffff; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-color: #0000FF;">微信公众号图文编辑-多色圆角背景</a></span>  
    15. </p>  
    16. <p></p>  
    17. <p>  
    18.     <span  
    19.         style="border: 0px; margin: 0px; padding: 6px10px; color: #ffffff; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-color: #222222;">微信公众号图文编辑-多色圆角背景</a></span>  
    20. </p>  
    21. <p></p>  
    22. <p>  
    23.     <span  
    24.         style="border: 0px; margin: 0px; padding: 6px10px; color: #ffffff; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-color: #cd0000;">微信公众号图文编辑-多色圆角背景</a></span>  
    25. </p>  
    26. <p></p>  
    27. <p>  
    28.     <span  
    29.         style="border: 0px; margin: 0px; padding: 6px10px; color: #ffffff; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-color: #FF3300;">微信公众号图文编辑-多色圆角背景</a></span>  
    30. </p>  
    31. <p></p>  
    32. <p>  
    33.     <span  
    34.         style="border: 0px; margin: 0px; padding: 6px10px; color: #ffffff; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-color: #FFFF00;"><spanclassspanclass="STYLE1">微信公众号图文编辑-多色圆角背景</span></a></span>  
    35. </p>  
    36. <p></p>  

    3. 现在,在浏览器下查看效果



         如果 浏览器里面查看的效果没有问题,那么就可以在浏览器里面选择全部内容,然后右键复制,最后粘贴到微信公众平台图文编辑栏内了。




          

           最后根据你的需要修改显示的文字就可以了。需要注意的一点就是,当你粘贴到微信编辑栏时请选择保留源格式。


      

    在上面的过程中,其中最重要的一步就是第2步制作所需要效果的源码,因为制作html页面是网页设计的基础,所以我这里没有过多的讲述。大家可以根据自己的需要来使用html和css 制作出自己需要的效果,然后按照上面的方法复制到微信图文框里面就可以了。

       其实大家纵观所有的微信公众号,基本上只有导语和结尾语部分稍微有那么一点特效,正文部分大部分都是纯文字或图片或视频,而导语和结尾语部分的特效制作一次之后以后每次发布图文消息时直接复制使用即可,也就是说,特效是为我们的公众号润色的,就好像女生化妆一样,如果过多的浓妆艳抹而没有内涵,那么即使你特效再多也不能吸引人。


    多图文编辑模式进阶-它山之石

           有时候,我们浏览公众号时,发现有些公众号的多图文特别漂亮,非常想自己也做出那样的效果来,但是又没有太多的空余时间怎么办。 这里我教给大家一个“江洋大盗”式的方法,让你不费吹灰之力马上拿来自己使用。

     

    我们明白,微信上显示的图文消息其本质就是html页面,明白了这一点,我们只要能在电脑上的浏览器上打开这个图文消息,那么我们就可以按照上面的步骤将浏览器中显示的特效复制拷贝到我们自己的服务号图文框中供自己使用了。

    具体方法是:打开自己喜欢的图文消息,点击右上角的分享按钮,选择复制链接,然后将复制的链接通过QQ发到自己的电脑上,然后在电脑上打开这个链接地址,这样我们就实现了在电脑浏览器上打开微信的图文消息。如图9.



    图 9


          

    这时候,你就可以直接将自己喜欢的特效复制粘贴到我们自己的服务号里面去了,非常偷懒也非常方便。

     

    多图文编辑模式进阶-独门绝技

     

    我打算在独门绝技里面写一些常见的微信图文小技巧。

    最近大家有没有发现别人家的公众号图文标题里都有一个特殊符号,比如㊙,






    看上去特别又醒目,一定吸引来不少阅读数,这个特殊符号怎么加的呢?

    这个其实就是emoji表情。大家是不是经常看见有的QQ好友的昵称里面或者个性签名里面都有一些看上去特别萌的表情呢?其实这也是emoji表情,简单的说,emoji表情是智能手机所支持的一种符号表情,你在电脑上编辑时输入这些表情所对应的符号,那么这些符号在手机上显示时就是对应的图片表情了。具体如何发送一个emoji表情呢?

    1.   打开网址:http://code.iamcal.com/php/emoji/,可以看到最左侧是表情的预览,右边依次是几种类型编码下,这个表情所对应的代码,有Unified、DoCoMo、KDDI 、Softbank、Google

    2. 选择一个自己喜欢的表情,例如 那个红色的 密 字。 如图11  



    图 11



    3   找到对应的Unified编码,是U+3299

    4 . 然后打开另外一个网址:http://www.busydoingnothing.co.uk/emoji.html,在这个网页内,可以搜索一下“U+3299”,找到对应的替代表情字符,如下图12



    图 12



    5.   看到右侧的符号了吗?将右侧的那个表情符号,复制到公众微信的标题和摘要编辑框,即可!然后预览下,你就可以在手机看到你要的表情了。

    是不是很简单的呢? 基本的过程就是找到你喜欢的emoji表情的unfield编码,然后根据这个编码再找到这个emoji表情的替代符号,最后将这个替代符号放到微信图文的标题或者正文内容里面,最后再手机微信上打开这个图文就可以看到真正的表情了。

    值得一提的是,有些表情的替代字符,网页或者word或者记事本都显示不出来或者只显示了一个小方框,例如“U+25FC”和“U+1F004”,如下图


                                     





    可以看到,只显示方框或者什么都不显示。没事,你只要跟上面的步骤一样,直接移动你的鼠标光标,选定这个区域(空白方框区域或者什么都不显示的对应区域),然后黏贴到公众微信上,预览下,手机照样可以显示。

    有了以上的知识,对一个专业的微信订阅号的运营者来说,已经足够了。你在制作图文消息时,正文如果有大量文字可以借助word排版,而对于导语或者结尾语部分,需要特效的话,需要借助dw来制作一个html的效果页面,然后将效果复制粘贴到微信里面。

    最后需要一些锦上添花的emoji表情时可以通过我上面介绍的emoji表情的使用来为自己的图文消息添加emoji表情。

     

    多图文编辑模式-终极大法

       一个功夫,都是从基础到终极,一门手艺,同样也是从基本的到高级的。我们到这里就可以开始把我的终极大法传授给大家了。

    这个终极大法就是第三方图文编辑器。它是独立于腾讯微信公众平台之外,由第三方企业或个人针对公众账号管理者开发的,能够便捷进行微信素材编辑和排版的在线工具。三方编辑器功能强大,简单快捷,能在分分钟就做出旋律多彩的多图文消息来,而且做出的多图文只需要简单的复制粘贴到微信后台的多图文编辑框就可以完美呈现了,不需要做任何改动,非常快捷高效。我几乎把所有的在线编辑器都试了一遍,现在就拿其中的一款“微推宝“编辑器为例来给大家说明。

    1.   打开http://www.weituibao.com/editor  ,使用QQ 自动注册一个登录帐号并登录。

    2. 登录后会看到页面下方有很多已经编辑好的模板,有单图文的,也有多图文的。根据你的需要选择一个你喜欢的模板,点击下方的 按钮进入编辑器。如图14 所示。


    图 14



    3.   在这里,是一个已经排版好了的多图文模板,你无需改变它的样式和布局。你只需要修改一下标题,作者,文字内容就可以完成了。这是不是有点像小学的时候将隔壁小明的试卷拿过来改成自己的名字一样简单呢? 的确是够单的了。

    当然,这个网站还提供了一个客户端工具“微小宝”,根据网站的提示直接下载即可。 这个根据的主要作用就是可以同时管理多个微信公众号,而且可以很方便的进行素材管理和多图文编辑,   编辑好了以后可以一键发送到多个微信公众号,也可以将编辑好的素材暂时保持到云端。”微小宝“具有”微推宝“在线图文编辑器的有功能,而且 更重要的一点是,微小宝还有一个杀手锏功能,就是抓取功能。如图 15





    图 15

    你只需要在抓取微信页面的输入框输入你喜欢的微信图文的url地址,然后单击抓取按钮,这个图文消息马上自动的被复制到你的编辑器里面了,连视频和图片都原封不动的被复制过来了,你只需要把文字内容替换成你自己的内容,然后再点击发送就可以发一篇和你看到的图文版式一模一样的文章了。不费吹灰之力。我们把这种方式称为所见即所得,意思就是,你浏览别人的微信发现了一个非常漂亮的多图文消息,你想变成自己的,那么你只需要将这个多图文的url复制到微小宝的抓取框即可。

    到这里,你已经修炼到了顶层,也就已经玩转了微信的公众号了,但是这还只是其中的订阅号,你已经成了一个顶级的微信订阅号运营了。

        在以后的内容中,我们将去开辟微信更为强大的功能。而为了发挥这种更为强大的功能,我们需要会一定的代码。

     

    展开全文
  • 微信开发源码注释

    2016-06-11 18:11:55
    本文用于解释微信开发中的中PHP代码意义,用于学习先关基础知识。

    本文用于解释微信开发中的中PHP代码意义,记录学习php基础知识。

    1、PHP代码开始与结束标记

        <?

        // PHP code

        >


    2、PHP注释信息使用双斜线//

         注释块使用/* ... ...*/


    3、PHP语句结束,使用分号(;)


    4、PHP常量定义 define

     

    <?php
    define("CONSTANT", "Hello world.");
    echo CONSTANT; // outputs "Hello world."
    echo Constant; // outputs "Constant" and issues a notice.
    
    define("GREETING", "Hello you.", true);
    echo GREETING; // outputs "Hello you."
    echo Greeting; // outputs "Hello you."
    
    ?> 

    5、php$符号是变量符号;把$符号加上字符串,这个字符串就是一个变量名或对象名。

    可以使用两个以及多个$,比如:

    可变变量
    $first ="hello";
    $hello ="world";
    echo $first." ".$$first;
    结果是 hello world
    
    $$first就是$hello,因为$first的值是hello

    6、php中类相关定义以及实例化,class 声明累,new实例化

          类中定义可以方法以及属性

          属性值需要使用$标示以及权限修饰关键字 public private

          类的继承使用extends

    7、实例化一个对象后,使用 -> 操作符来访问对象的成员属性和方法。比如:

    object->var_name;
    object->function_name; 

    8、在定义的类里面访问成员的属性或者方法,可以使用伪变量 $this 。$this 用于表示当前对象或对象本身 。

    <?php
    class Person {
    // 人的成员属性
    var $name; //人的名字
    var $age; //人的年龄
    
    //人的成员 say() 方法
    function say() {
    echo "我的名字叫:".$this->name."<br />";
    echo "我的年龄是:".$this->age;
    }
    }
    //类定义结束
    
    $p1 = new Person(); //实例化一个对象
    $p1->name = "Gonn"; //给 $p1 对象属性赋值
    $p1->age = 25;
    $p1->say(); //调用对象中的 say()方法
    ?> 

    9、PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

        $GLOBALS //在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。
        $_SERVER  //保存关于报头、路径和脚本位置的信息。
        $_REQUEST  //用于收集 HTML 表单提交的数据。
        $_POST //广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。
        $_GET  //用于收集提交 HTML 表单 (method="get") 之后的表单数据。也可以收集 URL 中的发送的数据。
        $_FILES
        $_ENV
        $_COOKIE
        $_SESSION
    

    PHP中全局变量
    元素/代码 描述
    $_SERVER['PHP_SELF'] 返回当前执行脚本的文件名。
    $_SERVER['GATEWAY_INTERFACE'] 返回服务器使用的 CGI 规范的版本。
    $_SERVER['SERVER_ADDR'] 返回当前运行脚本所在的服务器的 IP 地址。
    $_SERVER['SERVER_NAME'] 返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn)。
    $_SERVER['SERVER_SOFTWARE'] 返回服务器标识字符串(比如 Apache/2.2.24)。
    $_SERVER['SERVER_PROTOCOL'] 返回请求页面时通信协议的名称和版本(例如,“HTTP/1.0”)。
    $_SERVER['REQUEST_METHOD'] 返回访问页面使用的请求方法(例如 POST)。
    $_SERVER['REQUEST_TIME'] 返回请求开始时的时间戳(例如 1577687494)。
    $_SERVER['QUERY_STRING'] 返回查询字符串,如果是通过查询字符串访问此页面。
    $_SERVER['HTTP_ACCEPT'] 返回来自当前请求的请求头。
    $_SERVER['HTTP_ACCEPT_CHARSET'] 返回来自当前请求的 Accept_Charset 头( 例如 utf-8,ISO-8859-1)
    $_SERVER['HTTP_HOST'] 返回来自当前请求的 Host 头。
    $_SERVER['HTTP_REFERER'] 返回当前页面的完整 URL(不可靠,因为不是所有用户代理都支持)。
    $_SERVER['HTTPS'] 是否通过安全 HTTP 协议查询脚本。
    $_SERVER['REMOTE_ADDR'] 返回浏览当前页面的用户的 IP 地址。
    $_SERVER['REMOTE_HOST'] 返回浏览当前页面的用户的主机名。
    $_SERVER['REMOTE_PORT'] 返回用户机器上连接到 Web 服务器所使用的端口号。
    $_SERVER['SCRIPT_FILENAME'] 返回当前执行脚本的绝对路径。
    $_SERVER['SERVER_ADMIN'] 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
    $_SERVER['SERVER_PORT'] Web 服务器使用的端口。默认值为 “80”。
    $_SERVER['SERVER_SIGNATURE'] 返回服务器版本和虚拟主机名。
    $_SERVER['PATH_TRANSLATED'] 当前脚本所在文件系统(非文档根目录)的基本路径。
    $_SERVER['SCRIPT_NAME'] 返回当前脚本的路径。
    $_SERVER['SCRIPT_URI'] 返回当前页面的 URI。

    $_GET传递参数实例

    假设我们有一张页面含有带参数的超链接:

    <html>
    <body>
    
    <a href="test_get.php?subject=PHP&web=W3school.com.cn">测试 $GET</a>
    
    </body>
    </html>
    

    当用户点击链接 "Test $GET",参数 "subject" 和 "web" 被发送到 "test_get.php",然后您就能够通过 $_GET 在 "test_get.php" 中访问这些值了。

    下面的例子是 "test_get.php" 中的代码:

    实例

    <html>
    <body>
    
    <?php 
    echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
    ?>
    
    </body>
    </html>
    

    10、PHP中用于输出信息,使用关键字echo

    11、function用于定义类中的方法;

    12、关键词解释:

            isset(var) ---检测变量是否设置,如果 var 存在并且值不是 NULL 则返回 TRUE,否则返回FALSE

            empty(var)检查一个变量是否为空,当var存在,并且是一个非空非零的值时返回FALSE 否则返回 TRUE.

            echo输出一个或多个字符串

            exit输出一个消息并且退出当前脚本

            -> 是对象成员访问符号

            => 是数组成员访问符   

    微信开发第一课实例代码如下:

    <?php
    /*
        WeiXin 学习代码实例
    */
    
    define("TOKEN", "weixin");
    $wechatObj = new wechatCallbackapiTest();
    if (isset($_GET['echostr'])) {
        $wechatObj->valid();
    }else{
        $wechatObj->responseMsg();
    }
    
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
    
        private function checkSignature()
        {
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
    
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr, SORT_STRING);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );
    
            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
    
        public function responseMsg()
        {
            $postStr = $GLOBALS["HTTP_RAW_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($keyword == "?" || $keyword == "?")
                {
                    $msgType = "text";
                    $contentStr = date("Y-m-d H:i:s",time());
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }
            }else{
                echo "";
                exit;
            }
        }
    }
    ?>

    1. 微信在接受信息后,通过$_GET方法请求是否设置了echostr
    2. 微信加密签名:signature--结合token参数以及timestamp、nonce参数等
    3. timestamp--时间戳
    4. nonce--随机数
    5. echostr-- 随机字符串

    微信信息构造XML类型如下:

    字符串类型

                          <xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                          </xml>










    展开全文
  • PHP微信支付开发实例 这篇文章主要为大家详细介绍了PHP微信支付开发过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PHP微信支付开发过程,分享给大家,供大家参考,具体内容如下 1....

    PHP微信支付开发实例


    这篇文章主要为大家详细介绍了PHP微信支付开发过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    PHP微信支付开发过程,分享给大家,供大家参考,具体内容如下

    1.开发环境 
    Thinkphp 3.2.3 
    微信:服务号,已认证 
    开发域名:http://test.paywechat.com (自定义的域名,外网不可访问)

    2.需要相关文件和权限 
    微信支付需申请开通 
    微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/home/index.html 
    微信支付开发者文档:https://pay.weixin.qq.com/wiki/doc/api/index.html 
    微信支付SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

    3.开发 
    下载好微信支付PHP版本的SDK,文件目录为下图:

    这里写图片描述

    这里写图片描述 

    把微信支付SDK的Cert和Lib目录放入Thinkphp,目录为 

    这里写图片描述 

    现在介绍微信支付授权目录问题,首先是微信支付开发配置里面的支付授权目录填写, 

    这里写图片描述

    然后填写js接口安全域。

    这里写图片描述

    最后设置网页授权 

    这里写图片描述

    这里写图片描述

    这些设置完,基本完成一半,注意设置的目录和我thinkphp里面的目录。 

    这里写图片描述

    4.微信支付配置

    这里写图片描述

    把相关配置填写正确。

    [php] view plain copy
    1. /** 
    2. * 配置账号信息 
    3. */  
    4.   
    5. class WxPayConfig  
    6. {  
    7.  //=======【基本信息设置】=====================================  
    8.  //  
    9.  /** 
    10.  * TODO: 修改这里配置为您自己申请的商户信息 
    11.  * 微信公众号信息配置 
    12.  *  
    13.  * APPID:绑定支付的APPID(必须配置,开户邮件中可查看) 
    14.  *  
    15.  * MCHID:商户号(必须配置,开户邮件中可查看) 
    16.  *  
    17.  * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置) 
    18.  * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert 
    19.  *  
    20.  * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), 
    21.  * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN 
    22.  * @var string 
    23.  */  
    24.  const APPID = '';  
    25.  const MCHID = '';  
    26.  const KEY = '';  
    27.  const APPSECRET = '';  
    28.   
    29.  //=======【证书路径设置】=====================================  
    30.  /** 
    31.  * TODO:设置商户证书路径 
    32.  * 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载, 
    33.  * API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书) 
    34.  * @var path 
    35.  */  
    36.  const SSLCERT_PATH = '../cert/apiclient_cert.pem';  
    37.  const SSLKEY_PATH = '../cert/apiclient_key.pem';  
    38.   
    39.  //=======【curl代理设置】===================================  
    40.  /** 
    41.  * TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0 
    42.  * 本例程通过curl使用HTTP POST方法,此处可修改代理服务器, 
    43.  * 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置) 
    44.  * @var unknown_type 
    45.  */  
    46.  const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220";  
    47.  const CURL_PROXY_PORT = 0;//8080;  
    48.   
    49.  //=======【上报信息配置】===================================  
    50.  /** 
    51.  * TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】, 
    52.  * 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少 
    53.  * 开启错误上报。 
    54.  * 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报 
    55.  * @var int 
    56.  */  
    57.  const REPORT_LEVENL = 1;  
    58. }  

    现在开始贴出代码:

    [php] view plain copy
    1. namespace Wechat\Controller;  
    2. use Think\Controller;  
    3. /** 
    4.  * 父类控制器,需要继承 
    5.  * @file ParentController.class.php 
    6.  * @author Gary <lizhiyong2204@sina.com> 
    7.  * @date 2015年8月4日 
    8.  * @todu 
    9.  */  
    10. class ParentController extends Controller {   
    11.  protected $options = array (  
    12.  'token' => ''// 填写你设定的key  
    13.  'encodingaeskey' => ''// 填写加密用的EncodingAESKey  
    14.  'appid' => ''// 填写高级调用功能的app id  
    15.  'appsecret' => ''// 填写高级调用功能的密钥  
    16.  'debug' => false,  
    17.  'logcallback' => ''  
    18.  );   
    19.  public $errCode = 40001;   
    20.  public $errMsg = "no access";   
    21.   
    22.  /** 
    23.  * 获取access_token 
    24.  * @return mixed|boolean|unknown 
    25.  */  
    26.  public function getToken(){  
    27.  $cache_token = S('exp_wechat_pay_token');  
    28.  if(!empty($cache_token)){  
    29.  return $cache_token;  
    30.  }  
    31.  $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';  
    32.  $url = sprintf($url,$this->options['appid'],$this->options['appsecret']);   
    33.  $result = $this->http_get($url);  
    34.  $result = json_decode($result,true);   
    35.  if(empty($result)){  
    36.  return false;  
    37.  }   
    38.  S('exp_wechat_pay_token',$result['access_token'],array('type'=>'file','expire'=>3600));  
    39.  return $result['access_token'];  
    40.  }  
    41.   
    42.  /** 
    43.  * 发送客服消息 
    44.  * @param array $data 消息结构{"touser":"OPENID","msgtype":"news","news":{...}} 
    45.  */  
    46.  public function sendCustomMessage($data){  
    47.  $token = $this->getToken();  
    48.  if (empty($token)) return false;   
    49.  $url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s';  
    50.  $url = sprintf($url,$token);  
    51.  $result = $this->http_post($url,self::json_encode($data));  
    52.  if ($result)  
    53.  {  
    54.  $json = json_decode($result,true);  
    55.  if (!$json || !empty($json['errcode'])) {  
    56.  $this->errCode = $json['errcode'];  
    57.  $this->errMsg = $json['errmsg'];  
    58.  return false;  
    59.  }  
    60.  return $json;  
    61.  }  
    62.  return false;  
    63.  }  
    64.   
    65.  /** 
    66.  * 发送模板消息 
    67.  * @param unknown $data 
    68.  * @return boolean|unknown 
    69.  */  
    70.  public function sendTemplateMessage($data){  
    71.  $token = $this->getToken();  
    72.  if (empty($token)) return false;  
    73.  $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";  
    74.  $url = sprintf($url,$token);  
    75.  $result = $this->http_post($url,self::json_encode($data));  
    76.  if ($result)  
    77.  {  
    78.  $json = json_decode($result,true);  
    79.  if (!$json || !empty($json['errcode'])) {  
    80.  $this->errCode = $json['errcode'];  
    81.  $this->errMsg = $json['errmsg'];  
    82.  return false;  
    83.  }  
    84.  return $json;  
    85.  }  
    86.  return false;  
    87.  }  
    88.   
    89.   
    90.  public function getFileCache($name){  
    91.  return S($name);  
    92.  }  
    93.   
    94.  /** 
    95.  * 微信api不支持中文转义的json结构 
    96.  * @param array $arr 
    97.  */  
    98.  static function json_encode($arr) {  
    99.  $parts = array ();  
    100.  $is_list = false;  
    101.  //Find out if the given array is a numerical array  
    102.  $keys = array_keys ( $arr );  
    103.  $max_length = count ( $arr ) - 1;  
    104.  if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1  
    105.  $is_list = true;  
    106.  for($i = 0; $i < count ( $keys ); $i ++) { //See if each key correspondes to its position  
    107.  if ($i != $keys [$i]) { //A key fails at position check.  
    108.   $is_list = false; //It is an associative array.  
    109.   break;  
    110.  }  
    111.  }  
    112.  }  
    113.  foreach ( $arr as $key => $value ) {  
    114.  if (is_array ( $value )) { //Custom handling for arrays  
    115.  if ($is_list)  
    116.   $parts [] = self::json_encode ( $value ); /* :RECURSION: */  
    117.  else  
    118.   $parts [] = '"' . $key . '":' . self::json_encode ( $value ); /* :RECURSION: */  
    119.  } else {  
    120.  $str = '';  
    121.  if (! $is_list)  
    122.   $str = '"' . $key . '":';  
    123.  //Custom handling for multiple data types  
    124.  if (!is_string ( $value ) && is_numeric ( $value ) && $value<2000000000)  
    125.   $str .= $value//Numbers  
    126.  elseif ($value === false)  
    127.  $str .= 'false'//The booleans  
    128.  elseif ($value === true)  
    129.  $str .= 'true';  
    130.  else  
    131.   $str .= '"' . addslashes ( $value ) . '"'//All other things  
    132.  // :TODO: Is there any more datatype we should be in the lookout for? (Object?)  
    133.  $parts [] = $str;  
    134.  }  
    135.  }  
    136.  $json = implode ( ','$parts );  
    137.  if ($is_list)  
    138.  return '[' . $json . ']'//Return numerical JSON  
    139.  return '{' . $json . '}'//Return associative JSON  
    140.  }  
    141.   
    142.  /** 
    143.  +---------------------------------------------------------- 
    144.  * 生成随机字符串 
    145.  +---------------------------------------------------------- 
    146.  * @param int $length 要生成的随机字符串长度 
    147.  * @param string $type 随机码类型:0,数字+大小写字母;1,数字;2,小写字母;3,大写字母;4,特殊字符;-1,数字+大小写字母+特殊字符 
    148.  +---------------------------------------------------------- 
    149.  * @return string 
    150.  +---------------------------------------------------------- 
    151.  */  
    152.  static public function randCode($length = 5, $type = 2){  
    153.  $arr = array(1 => "0123456789", 2 => "abcdefghijklmnopqrstuvwxyz", 3 => "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 4 => "~@#$%^&*(){}[]|");  
    154.  if ($type == 0) {  
    155.  array_pop($arr);  
    156.  $string = implode(""$arr);  
    157.  } elseif ($type == "-1") {  
    158.  $string = implode(""$arr);  
    159.  } else {  
    160.  $string = $arr[$type];  
    161.  }  
    162.  $count = strlen($string) - 1;  
    163.  $code = '';  
    164.  for ($i = 0; $i < $length$i++) {  
    165.  $code .= $string[rand(0, $count)];  
    166.  }  
    167.  return $code;  
    168.  }   
    169.   
    170.   
    171.  /** 
    172.  * GET 请求 
    173.  * @param string $url 
    174.  */  
    175.  private function http_get($url){  
    176.  $oCurl = curl_init();  
    177.  if(stripos($url,"https://")!==FALSE){  
    178.  curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);  
    179.  curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);  
    180.  curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1  
    181.  }  
    182.  curl_setopt($oCurl, CURLOPT_URL, $url);  
    183.  curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );  
    184.  $sContent = curl_exec($oCurl);  
    185.  $aStatus = curl_getinfo($oCurl);  
    186.  curl_close($oCurl);  
    187.  if(intval($aStatus["http_code"])==200){  
    188.  return $sContent;  
    189.  }else{  
    190.  return false;  
    191.  }  
    192.  }  
    193.   
    194.  /** 
    195.  * POST 请求 
    196.  * @param string $url 
    197.  * @param array $param 
    198.  * @param boolean $post_file 是否文件上传 
    199.  * @return string content 
    200.  */  
    201.  private function http_post($url,$param,$post_file=false){  
    202.  $oCurl = curl_init();  
    203.  if(stripos($url,"https://")!==FALSE){  
    204.  curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);  
    205.  curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);  
    206.  curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1  
    207.  }  
    208.  if (is_string($param) || $post_file) {  
    209.  $strPOST = $param;  
    210.  } else {  
    211.  $aPOST = array();  
    212.  foreach($param as $key=>$val){  
    213.  $aPOST[] = $key."=".urlencode($val);  
    214.  }  
    215.  $strPOST = join("&"$aPOST);  
    216.  }  
    217.  curl_setopt($oCurl, CURLOPT_URL, $url);  
    218.  curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );  
    219.  curl_setopt($oCurl, CURLOPT_POST,true);  
    220.  curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);  
    221.  $sContent = curl_exec($oCurl);  
    222.  $aStatus = curl_getinfo($oCurl);  
    223.  curl_close($oCurl);  
    224.  if(intval($aStatus["http_code"])==200){  
    225.  return $sContent;  
    226.  }else{  
    227.  return false;  
    228.  }  
    229.  }  
    230. }  
    [php] view plain copy
    1. namespace Wechat\Controller;  
    2. use Wechat\Controller\ParentController;  
    3. /** 
    4.  * 微信支付测试控制器 
    5.  * @file TestController.class.php 
    6.  * @author Gary <lizhiyong2204@sina.com> 
    7.  * @date 2015年8月4日 
    8.  * @todu 
    9.  */  
    10. class TestController extends ParentController {  
    11.  private $_order_body = 'xxx';  
    12.  private $_order_goods_tag = 'xxx';  
    13.  public function __construct(){  
    14.  parent::__construct();  
    15.  require_once ROOT_PATH."Api/lib/WxPay.Api.php";  
    16.  require_once ROOT_PATH."Api/lib/WxPay.JsApiPay.php";  
    17.  }  
    18.   
    19.  public function index(){  
    20.  //①、获取用户openid  
    21.  $tools = new \JsApiPay();  
    22.  $openId = $tools->GetOpenid();   
    23.  //②、统一下单  
    24.  $input = new \WxPayUnifiedOrder();   
    25.  //商品描述  
    26.  $input->SetBody($this->_order_body);  
    27.  //附加数据,可以添加自己需要的数据,微信回异步回调时会附加这个数据  
    28.  $input->SetAttach('xxx');  
    29.  //商户订单号  
    30.  $out_trade_no = \WxPayConfig::MCHID.date("YmdHis");  
    31.  $input->SetOut_trade_no($out_trade_no);  
    32.  //总金额,订单总金额,只能为整数,单位为分   
    33.  $input->SetTotal_fee(1);  
    34.  //交易起始时间  
    35.  $input->SetTime_start(date("YmdHis"));  
    36.  //交易结束时间  
    37.  $input->SetTime_expire(date("YmdHis", time() + 600));  
    38.  //商品标记  
    39.  $input->SetGoods_tag($this->_order_goods_tag);  
    40.  //通知地址,接收微信支付异步通知回调地址 SITE_URL=http://test.paywechat.com/Charge  
    41.  $notify_url = SITE_URL.'/index.php/Test/notify.html';  
    42.  $input->SetNotify_url($notify_url);  
    43.  //交易类型  
    44.  $input->SetTrade_type("JSAPI");  
    45.  $input->SetOpenid($openId);  
    46.  $order = \WxPayApi::unifiedOrder($input);  
    47.  $jsApiParameters = $tools->GetJsApiParameters($order);  
    48.  //获取共享收货地址js函数参数  
    49.  $editAddress = $tools->GetEditAddressParameters();  
    50.   
    51.  $this->assign('openId',$openId);  
    52.  $this->assign('jsApiParameters',$jsApiParameters);  
    53.  $this->assign('editAddress',$editAddress);  
    54.  $this->display();   
    55.  }  
    56.   
    57.  /** 
    58.  * 异步通知回调方法 
    59.  */  
    60.  public function notify(){  
    61.  require_once ROOT_PATH."Api/lib/notify.php";  
    62.  $notify = new \PayNotifyCallBack();  
    63.  $notify->Handle(false);  
    64.  //这里的IsSuccess是我自定义的一个方法,后面我会贴出这个文件的代码,供参考。  
    65.  $is_success = $notify->IsSuccess();   
    66.  $bdata = $is_success['data'];   
    67.  //支付成功  
    68.  if($is_success['code'] == 1){   
    69.  $news = array(  
    70.   'touser' => $bdata['openid'],  
    71.   'msgtype' => 'news',  
    72.   'news' => array (  
    73.   'articles'=> array (  
    74.    array(  
    75.    'title' => '订单支付成功',  
    76.    'description' => "支付金额:{$bdata['total_fee']}\n".  
    77.    "微信订单号:{$bdata['transaction_id']}\n"  
    78.    'picurl' => '',  
    79.    'url' => ''   
    80.    )  
    81.   
    82.   )  
    83.   )  
    84.  );  
    85.  //发送微信支付通知  
    86.  $this->sendCustomMessage($news);   
    87.  }else{//支付失败  
    88.   
    89.  }  
    90.  }  
    91.   
    92.  /** 
    93.  * 支付成功页面 
    94.  * 不可靠的回调 
    95.  */  
    96.  public function ajax_PaySuccess(){  
    97.  //订单号  
    98.  $out_trade_no = I('post.out_trade_no');  
    99.  //支付金额  
    100.  $total_fee = I('post.total_fee');  
    101.  /*相关逻辑处理*/  
    102.   
    103.  }  

    贴上模板HTML

    [xhtml] view plain copy
    1. <html>  
    2. <head>  
    3.  <meta http-equiv="content-type" content="text/html;charset=utf-8"/>  
    4.  <meta name="viewport" content="width=device-width, initial-scale=1"/>   
    5.  <title>微信支付样例-支付</title>  
    6.  <script type="text/javascript">  
    7.  //调用微信JS api 支付  
    8.  function jsApiCall()  
    9.  {  
    10.  WeixinJSBridge.invoke(  
    11.  'getBrandWCPayRequest',  
    12.  {$jsApiParameters},  
    13.  function(res){  
    14.  WeixinJSBridge.log(res.err_msg);  
    15.  //取消支付  
    16.  if(res.err_msg == 'get_brand_wcpay_request:cancel'){  
    17.  //处理取消支付的事件逻辑  
    18.  }else if(res.err_msg == "get_brand_wcpay_request:ok"){  
    19.  /*使用以上方式判断前端返回,微信团队郑重提示:  
    20.  res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。  
    21.  这里可以使用Ajax提交到后台,处理一些日志,如Test控制器里面的ajax_PaySuccess方法。  
    22.  */  
    23.  }  
    24.  alert(res.err_code+res.err_desc+res.err_msg);  
    25.  }  
    26.  );  
    27.  }  
    28.   
    29.  function callpay()  
    30.  {  
    31.  if (typeof WeixinJSBridge == "undefined"){  
    32.  if( document.addEventListener ){  
    33.  document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);  
    34.  }else if (document.attachEvent){  
    35.  document.attachEvent('WeixinJSBridgeReady', jsApiCall);   
    36.  document.attachEvent('onWeixinJSBridgeReady', jsApiCall);  
    37.  }  
    38.  }else{  
    39.  jsApiCall();  
    40.  }  
    41.  }  
    42.  //获取共享地址  
    43.  function editAddress()  
    44.  {  
    45.  WeixinJSBridge.invoke(  
    46.  'editAddress',  
    47.  {$editAddress},  
    48.  function(res){  
    49.  var value1 = res.proviceFirstStageName;  
    50.  var value2 = res.addressCitySecondStageName;  
    51.  var value3 = res.addressCountiesThirdStageName;  
    52.  var value4 = res.addressDetailInfo;  
    53.  var tel = res.telNumber;   
    54.  alert(value1 + value2 + value3 + value4 + ":" + tel);  
    55.  }  
    56.  );  
    57.  }  
    58.   
    59.  window.onload = function(){  
    60.  if (typeof WeixinJSBridge == "undefined"){  
    61.  if( document.addEventListener ){  
    62.  document.addEventListener('WeixinJSBridgeReady', editAddress, false);  
    63.  }else if (document.attachEvent){  
    64.  document.attachEvent('WeixinJSBridgeReady', editAddress);   
    65.  document.attachEvent('onWeixinJSBridgeReady', editAddress);  
    66.  }  
    67.  }else{  
    68.  editAddress();  
    69.  }  
    70.  };  
    71.   
    72.  </script>  
    73. </head>  
    74. <body>  
    75.  <br/>  
    76.  <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span></b></font><br/><br/>  
    77.  <div align="center">  
    78.  <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button>  
    79.  </div>  
    80. </body>  
    81. </html>  

    notify.php文件代码,这里有在官方文件里新添加的一个自定义方法。

    [php] view plain copy
    1. require_once ROOT_PATH."Api/lib/WxPay.Api.php";  
    2. require_once ROOT_PATH.'Api/lib/WxPay.Notify.php';  
    3. require_once ROOT_PATH.'Api/lib/log.php';  
    4.   
    5. //初始化日志  
    6. $logHandlernew \CLogFileHandler(ROOT_PATH."/logs/".date('Y-m-d').'.log');  
    7. $log = \Log::Init($logHandler, 15);  
    8.   
    9. class PayNotifyCallBack extends WxPayNotify  
    10. {  
    11.  protected $para = array('code'=>0,'data'=>'');  
    12.  //查询订单  
    13.  public function Queryorder($transaction_id)  
    14.  {  
    15.  $input = new \WxPayOrderQuery();  
    16.  $input->SetTransaction_id($transaction_id);  
    17.  $result = \WxPayApi::orderQuery($input);  
    18.  \Log::DEBUG("query:" . json_encode($result));  
    19.  if(array_key_exists("return_code"$result)  
    20.  && array_key_exists("result_code"$result)  
    21.  && $result["return_code"] == "SUCCESS"  
    22.  && $result["result_code"] == "SUCCESS")  
    23.  {  
    24.  return true;  
    25.  }  
    26.  $this->para['code'] = 0;  
    27.  $this->para['data'] = '';  
    28.  return false;  
    29.  }  
    30.   
    31.  //重写回调处理函数  
    32.  public function NotifyProcess($data, &$msg)  
    33.  {  
    34.  \Log::DEBUG("call back:" . json_encode($data));  
    35.  $notfiyOutput = array();  
    36.   
    37.  if(!array_key_exists("transaction_id"$data)){  
    38.  $msg = "输入参数不正确";  
    39.  $this->para['code'] = 0;  
    40.  $this->para['data'] = '';  
    41.  return false;  
    42.  }  
    43.  //查询订单,判断订单真实性  
    44.  if(!$this->Queryorder($data["transaction_id"])){  
    45.  $msg = "订单查询失败";  
    46.  $this->para['code'] = 0;  
    47.  $this->para['data'] = '';  
    48.  return false;  
    49.  }  
    50.   
    51.  $this->para['code'] = 1;  
    52.  $this->para['data'] = $data;  
    53.  return true;  
    54.  }  
    55.   
    56.  /** 
    57.  * 自定义方法 检测微信端是否回调成功方法 
    58.  * @return multitype:number string 
    59.  */  
    60.  public function IsSuccess(){  
    61.  return $this->para;  
    62.  }  
    63. }  
    到这里基本上完成,可以在微信端打开http://test.paywechat.com/Charge/index.php/Test/index/
    我的环境,HTTP服务器没有重写url,微信支付继续探索中,有些地方可能写的有问题或不足,望大家谅解,互相学习。
    展开全文
  • 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下。 二、获取代码 微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip 三、分析代码 ...

    一、摘要

    微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下。

    二、获取代码

    微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip

    三、分析代码

    完整代码如下:

    复制代码
    <?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;
            }
        }
    }
    
    ?>
    复制代码

    3.1 整体分析

    原始示例代码大致分为四个部分:

    • 定义TOKEN
    • 声明一个类 wechatCallbackapiTest
    • 创建类wechatCallbackapiTest 的一个实例对象 $wechatObj
    • 调用类的 valid() 方法。

    3.2 详细分析

    3.2.1 定义TOKEN

    define("TOKEN", "weixin");

    define 是用来给常量赋值的函数,这句话的意思是赋予“TOKEN”这个常量值为“weixin”。

    TOKEN 是用来进行交互安全认证的,开发者可以随意定义,要和公众平台里设置的一样。

    3.2.2 声明一个类

    class wechatCallbackapiTest{

    }

    声明一个类 wechatCallbackapiTest,该类中包含有三个方法(函数)。

    a. public function valid()

    用于申请 成为开发者 时向微信发送验证信息。

    b. public function responseMsg()

    处理并回复用户发送过来的消息,也是用的最多的一个函数,几乎所有的功能都在这里实现。

    复制代码
    responseMsg 函数详解:

    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    接收微信公众平台发送过来的用户消息,该消息数据结构为XML,不是php默认的识别数据类型,因此这里用了$GLOBALS['HTTP_RAW_POST_DATA']来接收,同时赋值给了$postStr

    if (!empty($postStr))
    判断$postStr是否为空,如果不为空(接收到了数据),就继续执行下面的语句;如果为空,则跳转到与之相对应的else语句。

    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    使用simplexml_load_string() 函数将接收到的XML消息数据载入对象$postObj中。这个严谨的写法后面还得加个判断是否载入成功的条件语句,不过不写也没事。

    $fromUsername = $postObj->FromUserName;
    将对象$postObj中的发送消息用户的OPENID赋值给$fromUsername变量

    $toUsername = $postObj->ToUserName;
    将对象$postObj中的公众账号的ID赋值给$toUsername变量

    $keyword = trim($postObj->Content);
    trim() 函数从字符串的两端删除空白字符和其他预定义字符,这里就可以得到用户输入的关键词

    $time = time();
    time() 函数返回当前时间的 Unix 时间戳,即自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。

    $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 ))
    判断$keyword是否为空,不为空则继续执行下面的语句;如果为空,则跳转到与之相对应的else语句,即 echo "Input something...";

    $msgType = "text";
    消息类型是文本类型

    $contentStr = "Welcome to wechat world!";
    回复的消息内容

    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    使用sprintf() 函数将格式化的数据写入到变量中去;
    $fromUsername, $toUsername, $time, $msgType, $contentStr 分别顺序替换模板里“%s”位置,也即是“$resultStr”这个变量最后实际为:

    <xml>
    <ToUserName><![CDATA[$toUsername]]></ToUserName>
    <FromUserName><![CDATA[$fromUsername]]></FromUserName>
    <CreateTime>$time</CreateTime>
    <MsgType><![CDATA[$msgType]]></MsgType>
    <Content><![CDATA[$contentStr]]></Content>
    <FuncFlag>0</FuncFlag>      //位0x0001被标志时,星标刚收到的消息。
    </xml>

    echo $resultStr;     //把回复的消息输出

    复制代码

    c. private function checkSignature()

    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请求原样返回echostr参数内容,则接入生效,否则接入失败。

    signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

    加密/校验流程:
    1. 将token、timestamp、nonce三个参数进行字典序排序
    2. 将三个参数字符串拼接成一个字符串进行sha1加密
    3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    3.2.3 创建实例对象

    $wechatObj = new wechatCallbackapiTest();

    3.2.4 调用类方法验证

    $wechatObj->valid();

    调用类的valid()方法执行接口验证,接口设置成功后将其注释掉。

    四、总结

    以上是对微信官方示例代码的一个分析,有解释不对的地方,还请高手指出。另外,该代码只是官方给出的简单示例代码,如果要做复杂的开发,还是要求开发者按照严谨的开发模式改写该段代码,会在后续教程中娓娓道来。

    五、参考

    微信官方公众平台API文档:http://mp.weixin.qq.com/wiki/index.php

    六、关注

    请关注 卓锦苏州 微信公众帐号,卓锦苏州 基于BAE 平台开发,针对于主流的微信功能进行开发测试。

    您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。

    1. 登录微信客户端,通讯录 -> 添加朋友 -> 查找公众号 -> zhuojinsz,查找并关注。

    2. 扫描二维码:

    卓锦苏州 功能列表。

     


    David Camp

    我们永远相信,分享是一种美德 | We Believe, Great People Share Knowledge...

    展开全文
  • 1.基础知识在上一篇有讲解和图片,内容大致包括微信开发者模式...3.本篇代码是最基础的微信公众平台功能,大家掌握如何套用。4.我的代码下载点击:http://pan.baidu.com/s/1bntptJT<?php /* 李凡的实验 */ define(
  • 微信公众平台开发之消息管理是子恒老师《微信公众平台开发》视频教程的第4部。详细讲解了用php开发微信,对微信公众平台中的消息管理开发。内容包含微信关键字回复,多图文消息回复开发,接收图片消息,视频,小视频...
  • 微信开发之难点解析

    2015-12-13 21:57:03
    1.微信开发属于web开发,选合适的语言 尽管web开发有众多的语言,但是我觉得有必要提醒尽量选择主流、合适的语言。通过微信给的例子支持的语言就可以看出个一二三。PHP,jsp我觉得貌似比较主流,其他的语言也能做...
  • 微信开发之入门教程

    2016-01-12 10:55:26
    微信开发也是有了一定的认识。在此,小宝鸽再次无私地分享给大家啦。其实微信开发跟web开发没有多大的区别,只是经过了微信,然后再由浏览器打开。因为经过微信,因此你的web会附加一些微信平台所提供的一些功能,...
  • 微信公众号开发代码

    2018-07-17 01:09:54
    代码https://github.com/dodgepudding/wechat-php-sdk  
  • 微信公众平台现金红包开发PHP开发微信公众平台现金红包thinkPHP开发微信公众平台现金红包
  • “`
  • 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下。 二、获取代码 微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip 三、分析代码 完整代码...
  • “`
  • ** 微信小程序的简单实现 ...小程序是最近十分受欢迎的一项创新,因其简单方便,不需要大内存下载。...所以小程序和小游戏的用户日益剧增。...小程序和小游戏是在开发工具中实现的,就像C语言,c++,Java等的语...
  • 微信公众平台PHP开发

    2013-07-12 09:51:55
    最近在做微信公众平台开发,一口气了二十几个功能,挺有意思的~     今天来分享一下开发经验~ 微信公众平台提供的接口很简单,先看看消息交互流程:     说的通俗一些,用户使用微信发送消息 -> 微信将数据...
  • 微信公众平台开发微信编辑器开发是子恒老师《微信公众平台开发》视频教程的第11部。详细讲解了用php进行微信编辑器的开发。内容包含微信公众号编辑器开发思路,编辑器前端页面,功能实现,添加新样式等等。欢迎...
  • 因为是一个连载系列,所以会以一个初学者,也就是接触过编程但是没有接触过微信公众号开发的角度去文章,希望能给大家带来微信公众号开发相关知识的同时更多的给初学者一种解决问题的思路以及学习的方法!...
  • 两个星期前,学校请了传智播客的老师给我们做实训,讲了一个微信公众号开发,感觉挺有意思,在这里做一下记录,以便以后复习. 一、了解微信公众平台 1. 什么是微信公众平台? 微信公众平台是腾讯为了让用户申请和管理...
  • “`
1 2 3 4 5 ... 20
收藏数 28,518
精华内容 11,407
关键字:

微信开发php端的代码要怎么写