2016-01-07 19:05:50 hoho_12 阅读数 500
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒
<?php
/**
  * wechat php test
  */

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

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();
            
             	$type=$postObj->MsgType;
				$customevent=$postObj->Event;
            
                $latitude=$postObj->Location_X;
			    $longitude=$postObj->Location_Y;
            
                $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($type=="location"){
                $contentStr="你的纬度是($latitude),经度是($longitude),我已经锁定!";
                $msgType = "text";
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }  
            
               
           
            
            //关键字回复
            	if(!empty( $keyword ))
                {
              		$msgType = "text";
                    if($keyword=="1") {                       
                        $contentStr = "感谢关注泛IT!";}
                    if($keyword=="2") {
                        $contentStr = "联系QQ:,欢迎投稿以及提出宝贵意见";}
                    if($keyword=="3") {                       
                        $contentStr = "你的图片不错,还是输入文字吧!";}
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }
            
             
            //关注公众号后回复
               if($type="event" and $customevent="subscribe"){
                $contentStr="感谢关注泛IT\n您可以分别回复1、2、3";
                $msgType = "text";
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }
            
             
             //图片回复
                if($type="image"){
                $contentStr="你的图片很棒!";
                $msgType = "text";
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }  
//switch语句优化
<pre name="code" class="php"> /*
            		switch($type)
				{    
                        //处理文本
                        case "text":
                        //关键字回复
                        if(!empty( $keyword ))
                        {
                             //$msgType = "text";
                            if($keyword=="1") {                       
                            $contentStr = "回复1查看使用说明\n回复2查看联系方式\n回复3使用翻译字典\n回复4使用机器人聊天功能";}
                            if($keyword=="2") {
                            $contentStr = "联系QQ:,欢迎投稿以及提出宝贵意见";}
                         }else{                	
							$contentStr="此项功能尚未开发"; }                        
						break; 
                        //处理图片信息
                         case "image":
					$contentStr="你的图片不错,还是输入文字吧";
                        break;
                        //处理位置信息
                         case "location":
					$contentStr="你的纬度是($latitude),经度是($longitude),我已经锁定!";
					break;
                        //处理关注事件
                         case "event":
					if($customevent=="subscribe")
					{$contentStr="感谢关注泛IT\n回复1查看使用说明";}
					break;
                            default:
							$contentStr="此项功能尚未开发";						                       
                    }
            			$msgType = "text";
                        $resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
						echo $resultStr;                      
                        */

}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 rulesort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){return true;}else{return false;}}}?>




2015-10-26 12:19:42 misakaqunianxiatian 阅读数 816
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

首先,你需要去有道翻译API官网去申请key:http://fanyi.youdao.com/openapi?path=data-mode

得到key之后,就可以开始从该API获得查询的数据了


下面我直接把responseMsg方法里,实现翻译的代码给出。如果你第一次接触微信API,不懂这个方法是干什么的,可以参考:PHP微信开发--简单文本回复


   public function responseMsg(){
       
	//get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //接收微信发来的XML数据

      	//extract post data
		if(!empty($postStr)){
                
            //解析post来的XML为一个对象$postObj
        	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        
        	$fromUsername = $postObj->FromUserName; //请求消息的用户
        	$toUsername = $postObj->ToUserName; //"我"(订阅号)的公众号id
        	$keyword = trim($postObj->Content); //用户发给订阅号的消息内容
            $time = time(); //时间戳
            $msgtype = 'text'; //消息类型:文本
            $textTpl = "<xml>
						<ToUserName><![CDATA[%s]]></ToUserName>
						<FromUserName><![CDATA[%s]]></FromUserName>
						<CreateTime>%s</CreateTime>
						<MsgType><![CDATA[%s]]></MsgType>
						<Content><![CDATA[%s]]></Content>
						</xml>";

            if($postObj->MsgType == 'event'){ //如果XML信息里消息类型为event
                if($postObj->Event == 'subscribe'){ //如果是订阅事件
                    $contentStr = "欢迎订阅misaka去年夏天!\n更多精彩内容:http://blog.csdn.net/misakaqunianxiatian";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                    echo $resultStr;
                    exit();
                }
            }

            $which = mb_substr($keyword, 0, 2, 'UTF-8');//获取要返回什么样的信息

            if($which== "翻译"){ //如果要进行翻译
                $fanyi = $which;
                $search = str_replace($fanyi, '', $keyword); //要翻译的关键字

                $key = ""; //在有道API申请的key
                $keyfrom = ""; //与key对应
                $url = 'http://fanyi.youdao.com/openapi.do?keyfrom=' . $keyfrom . '&key=' . $key . '&type=data&doctype=json&version=1.1&q=' . urlencode($search);//调用有道翻译API
                
                $json = file_get_contents($url);//也可以用curl来获取
                $res = json_decode($json, true);

                /**
                 * 以下从返回的数据中提取翻译结果
                 */
                $contentStr = '【查询】' . $res['query'] . "\n";
                $contentStr .= "【翻译】\n" . $res['translation'][0] . "\n";

                $str = '';
                foreach($res['basic']['explains'] as $v){
                    $str .= $v . "\n";
                }
                $contentStr .= "【基本释义】\n" . $str;


                if(isset($res['web'])){

                    foreach($res['web'] as $kk=>$vv){
                        sort($vv);
                        $res['web'][$kk] = $vv; //调节字段顺序
                    }

                    $str = '';
                    foreach($res['web'] as $v){
                        foreach($v as $k2=>$v2){
                            if($k2 == 0){
                                $str .= "【". $v2 ."】\n";
                            }else{
                                foreach($v2 as $v3){
                                    $str .= $v3 ."\n";
                                }
                            }
                        }
                    }
                    $contentStr .= "【网络释义】\n" . $str;                   
                }

                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit(); 

            }


注:关注的订阅号返回的信息里要换行,要使用“\n”。在你的网站空间里,将你的代码修改一下,就可以给订阅号发送比如“翻译汉堡包”,订阅号会调用有道的API来返回翻译结果,可以中英文互译,也可以是句子。

2015-10-25 10:22:17 misakaqunianxiatian 阅读数 8052
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

首先,先去微信公众平台注册一个账号(注册要填的东西挺多的),注册好之后,登录进去。

可以看到左侧的“开发者中心”,开启开发者中心前好像还要你完善一些资料,按照步骤完善即可。进入开发者中心之后,先去编辑


修改配置,修改配置的时候,注意:



URL是你自己的域名下的PHP脚本(往下读有该脚本的demo),该脚本用于和微信接口对接。比如http://www.example.com/weixin.php


Token是上述脚本里的定义的一个常量,比如你的PHP脚本里定义了:


define("TOKEN", "my_weixin");

那么,在填写Token时,你就填abcdefgh

EncodingAESKey是消息加密用。你可以自己写一个43为的数字和字母的组合,也可以选择“随机生成”,一般选择随机生成即可


填好之后,保存(如果保存时,提示Token验证失败,那么请确认token一致并多点几次保存试试)。

保存好之后,点击修改配置旁的:“开启”。


然后,就可以编辑你的PHP脚本了。(如果你没有自己的域名,可以使用新浪云的免费的SAE,并最好完成实名认证)


demo的脚本如下:关注该公众平台(比如订阅号之后),功能是:输入hehe则返回hello world!!!如果输入其他字符,则返回输入heeh试试。


header('content-type:text/html;charset=utf-8');

define("TOKEN", "my_weixin"); //define your token
$wx = new wechatCallbackapiTest();

if($_GET['echostr']){
    $wx->valid(); //如果发来了echostr则进行验证
}else{
    $wx->responseMsg(); //如果没有echostr,则返回消息
}


class wechatCallbackapiTest{

	public function valid(){ //valid signature , option

        $echoStr = $_GET["echostr"];
        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"]; //接收微信发来的XML数据

      	//extract post data
		if(!empty($postStr)){
                
            //解析post来的XML为一个对象$postObj
        	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        
        	$fromUsername = $postObj->FromUserName; //请求消息的用户
        	$toUsername = $postObj->ToUserName; //"我"的公众号id
        	$keyword = trim($postObj->Content); //消息内容
            $time = time(); //时间戳
            $msgtype = 'text'; //消息类型:文本
            $textTpl = "<xml>
						<ToUserName><![CDATA[%s]]></ToUserName>
						<FromUserName><![CDATA[%s]]></FromUserName>
						<CreateTime>%s</CreateTime>
						<MsgType><![CDATA[%s]]></MsgType>
						<Content><![CDATA[%s]]></Content>
						</xml>";

    		if($keyword == 'hehe'){
                $contentStr = 'hello world!!!';
            	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
            	echo $resultStr;
            	exit();                                               
            }else{
                $contentStr = '输入hehe试试';
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit();
            }

        }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;
		}
	}
}

如果发送消息,系统提示:该公众平台暂时不能提共服务,请稍后再试。那么多半是代码语法有问题,检查好语法错误再试试。


tip:

在新用户关注你的公众号时,自动返回信息:(把这段代码加在判断$keyword之前)。

            if($postObj->MsgType == 'event'){ //如果XML信息里消息类型为event
                if($postObj->Event == 'subscribe'){ //如果是订阅事件
                    $contentStr = "欢迎订阅misaka去年夏天!\n更多精彩内容:http://blog.csdn.net/misakaqunianxiatian";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                    echo $resultStr;
                    exit();
                }
            }

2017-08-08 17:04:13 somehow1002 阅读数 1663
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

微信开发中的消息验证与消息回复

处理逻辑

  1. 判断微信服务器传来的数据是否含有名为echostr的GET参数
  2. 有则进行服务器消息验证(valid)
  3. 没有则微信推送过来的是一条消息,需要我们处理。
    消息类型分为
    1)事件类型:用户关注/取消关注事件、扫描二维码事件……
    2)被动回复类型:用户发送过来一条文字、图片、语音……
    然后根据需求回复相应的文字、图片、图文….

代码示例

<?php
define("TOKEN","###your token###");
require_once 'response.class.php';

$res=new response();
if(!isset($_GET['echostr'])){
    responseMsg();
}else{
    valid();
}

function valid(){
    /* @微信服务器消息验证
     *
     * 1)将token、timestamp、nonce三个参数进行字典序排序
     * 2)将三个参数字符串拼接成一个字符串进行sha1加密
     * 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
     *
     * */
    $echoStr=$_GET['echostr'];
    $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){
        echo $echoStr;
        exit();
    }
}

function responseMsg(){
    /* @获取微信推送过来的post数据(xml)
     * 
     * 以下旧的提取方式,php高版本已经废弃了
     * $postStr=$GLOBALS['HTTP_RAW_POST_DATA'];
     * 
     * */
    $postStr=file_get_contents("php://input");

    /* @将xml数据转化为obj
     * 
     * */
    $postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);

    /* @根据接收到的不同消息,进行相应回复
     * 1.用户关注事件
     * 2.用户发送消息被动回复
     * 
     * */
    if(strtolower($postObj->MsgType)=='event'){
        if(strtolower($postObj->Event)=='subscribe'){//用户关注事件
            $content="欢迎关注XXXX";
            responseText($postObj, $content);
        }
    }else if(strtolower($postObj->MsgType)=='text'){
        switch(trim($postObj->Content)){
            /*被动回复文本信息*/
            case 'test':
                $content="this is test!";
                responseText($postObj, $content);
                break;
            case 'time':
                $content="现在是北京时间:".date("Y-m-d H:i:s",time());
                responseText($postObj, $content);
                break;
            case 'website':
                $content="<a href='http://www.hewie.cn'>乘风破浪</a>";
                responseText($postObj, $content);
                break;
            /*被动回复图文信息*/
            case 'news':
                $arr=array(
                    array(
                    'title'=>'我的csdn博客',
                    'description'=>'欢迎访问我的csdn博客',
                    'picUrl'=>'http://avatar.csdn.net/9/5/4/1_somehow1002.jpg',
                    'url'=>'http://blog.csdn.net/somehow1002',
                    ),
                    array(
                    'title'=>'开源中国',
                    'description'=>'。。。。。',
                    'picUrl'=>'https://www.oschina.net/img/ie/logo_osc.png','',
                    'url'=>'https://www.oschina.net/',
                    ),
                );
                responseNews($postObj, $arr);
                break;
            default:
                $content="sorry, I don't understand!";
                $res->responseText($postObj, $content);
                break;
        }
    }
}

function responseText($postObj,$content){
    /* @文字消息回复格式
     * 
     * <xml>
     * <ToUserName><![CDATA[toUser]]></ToUserName>
     * <FromUserName><![CDATA[fromUser]]></FromUserName>
     * <CreateTime>12345678</CreateTime>
     * <MsgType><![CDATA[text]]></MsgType>
     * <Content><![CDATA[你好]]></Content>
     * </xml>
     * 
     * */
    $fromUserName=$postObj->ToUserName;
    $toUserName=$postObj->FromUserName;
    $time=time();
    $msgType='text';
    $template="<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    </xml>";
    echo sprintf($template,$toUserName,$fromUserName,$time,$msgType,$content);
}

function responseNews($postObj,$arr){
    /* @图文消息回复格式
     * #一个item一则图文消息
     * 
     * <xml>
     * <ToUserName><![CDATA[toUser]]></ToUserName>
     * <FromUserName><![CDATA[fromUser]]></FromUserName>
     * <CreateTime>12345678</CreateTime>
     * <MsgType><![CDATA[news]]></MsgType>
     * <ArticleCount>2</ArticleCount>
     * <Articles>
     * <item>
     * <Title><![CDATA[title1]]></Title>
     * <Description><![CDATA[description1]]></Description>
     * <PicUrl><![CDATA[picurl]]></PicUrl>
     * <Url><![CDATA[url]]></Url>
     * </item>
     * <item>
     * <Title><![CDATA[title]]></Title>
     * <Description><![CDATA[description]]></Description>
     * <PicUrl><![CDATA[picurl]]></PicUrl>
     * <Url><![CDATA[url]]></Url>
     * </item>
     * </Articles>
     * </xml>
     * 
     * */
    $fromUserName=$postObj->ToUserName;
    $toUserName=$postObj->FromUserName;
    $time=time();
    $msgType='text';
    $template="<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[news]]></MsgType>
                    <ArticleCount>".count($arr)."</ArticleCount>
                    <Articles>";
    foreach($arr as $v){
        $template.="
                    <item>
                    <Title><![CDATA[".$v[title]."]]></Title>
                    <Description><![CDATA[".$v[description]."]]></Description>
                    <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>
                    <Url><![CDATA[".$v[url]."]]></Url>
                    </item>";
    }
    $template.="
                    </Articles>
                    </xml>";
    echo sprintf($template,$toUserName,$fromUserName,time());
}

参考微信开发手册
原文地址:http://blog.csdn.net/somehow1002/article/details/76919270
个人见解,如有错误之处,欢迎指正。

2016-09-28 12:30:37 qq_34341290 阅读数 264
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

开发公众号

1:首先去这个微信开发平台去申请一个账号;

2;登陆进去去申请自己的订阅号,有自己的id和应用密钥;开启服务器配置(微信自带的那些回复消息就不能用了),我们自己去开发这个微信订阅号;

3:接口:接口权限(我们自己的接口权限少),so 使用这个测试账号,有个接口信息修改,那个url:自己的线上域名;Token:是微信的token(要一致);

4:去这个接入指南里面下载这个php示例代码,放到线上;

5:自己关注这个微信测试账号:发个消息,会有回复;这个文本自动回复就成功了;

6:创建菜单:先进入这个自定义菜单,里面有个json,把他放到线上,它需要这个token,我们把这个token值获取到,用在创建菜单的地址上,用curl获取这个地址的信息;

7:其实,不管我们在微信上创建什么东西的时候,都需要用到这个token,所以,我门可以把这个token封装到一个方法里,去调用它;

7:微信发送文本和照片:发送文本就是以上4.5.6,发送照片其实也差不多,把下载的demo里面的东西改下就行,例如:在代码上,微信有个发送照片的xml格式,我门可以直接拿过来用,把下面的text变成image;还有看下微信开发手册里面的发送照片的配置,那些也需要修改下,就可以直接用了;

8:当我门这些修改全都修改了之后,重新关注下这个公众测试号,要不就是24小时之后才生效;

9:关于这个网页授权:就是如果用户在微信客户端中访问第三方网页,公众号可以通过这个微信网页授权机制,获取用户基本信息;

1:在微信公众号请求用户网页授权之前,我们需要到开发者中心页配置授权回掉域名,请主意,这里填写的是个域名(字符串),而不是URL地址

2:网页授权的两种scope说明:

(1):以snsapi_basescope发起的网页授权,是用来获取用户进入的openid

(2):以snsapi_userinfoscope发起的网页授权,是用来获取的用户的基本信息,这种授权是需要用户点击是否同意,才可获取

3:还有其他的,就不一一介绍了,自己看看说明文档

4:其实,微信网页授权就4步:

1):引导用户进入授权页面同意授权,获取code

2):通过code换取网页授权的scces_token;

3):如果需要:我门可以自己刷新网页授权的access_token(避免授权过期)

4):根据access——tokenoppenid来获取用户的基本信息

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