2017-01-24 16:49:19 ZHIYUANfL 阅读数 18369
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

一、微信小程序web开发工具下载地址


1.1 在微信公众平台-小程序里边去下载开发工具下载地址


1.2 下载后安装一下就可以使用了:


二、创建项目


2.1 微信小程序web开发工具需要扫码登陆,所以必须先绑定开发者才可以:



2.2 已经绑定的开发者可以创建项目,需要填写AppID、项目名称、本地开发目录。





AppID需要去设置里边获取,如果不填的话官方给的提示是部分功能受限:




三、开发工具界面介绍:





1. 编辑:开发的时候,需要到编辑区去写代码 

2. 调试:开发完需要调试程序的时候需要切换到这个区域,调试区有很多工具可供使用。

3. 项目:在这里可以上传或者预览项目

4. 编译:就相当于运行项目的意思

5. 关闭:关闭当前工程

6. 微信小程序web开发工具提供实时预览的功能,界面的效果会在这个区域显示

7. 这个区域可以看到整个项目的文档目录结构

8. 这个区域是编码区

9. 这里是选择屏幕尺寸的地方

10. 模拟网络环境:2G/3G/4G/WiFi



四、调试区六大工具介绍:


在调试区开发工具提供了6种调试模式:


4.1 Console

Console的意思是控制台,做过开发的都知道几乎每个IDE都会有控制台,可以显示错误信息和打印变量的信息等。


 

4.2 Sources

Sources显示了当前项目的所有脚本文件,微信小程序框架会对这些脚本文件进行编译。

Source下边还有一个区域,做过软件开发的都知道,一般下边是控制台会显示一些log信息、断电调试等等。



4.3 Network

Network顾名思义:这个区域显示的是与网络相关的信息,我这里暂时没有进行网络请求。



4.4 Storage

官方的解释是显示当前项目的使用wx.setStorage或者wx.setStorageSync后的数据存储情况。这个后续用到再慢慢研究


 

4.5 AppData

AppData是显示当前项目显示的具体数据,可以在这里编译,并且会在页面实时显示。



4.6 Wxml


Wxml调试区:把他的名字换一下的话大家就好理解了,其实他的实质就是HTML+CSS,微信只是把HTML改成了Wxml而已。学过HTML的人一看就明白,左侧的区域是HTML语言+CSS的一些标签属性。右侧可以便捷的设置CSS的属性。




转自:http://lib.csdn.net/article/5/52864?knId=1796#focustext


2019-09-03 11:34:57 husong_ 阅读数 273
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

如果你要开发自己的微信小程序或者小游戏,微信开发者工具是必不可少的,因为有些微信封装的方法只有微信开发者工具上才能使用,还有一个重要的原因就是,我们提交我们的代码审核必须通过该工具来提交,所有要做微信小程序和小游戏的开发,这个工具的学习是必不可少的。

老实说该工具不管是对久经沙场的老人还是萌新来说都是非常简单的,能很快上手,并且还是中文的哦,下面我们看看整体界面

image

整个编辑器大题分为四块,模拟器编辑器调试器工具栏,下面我们每个模块来独立讲解

一、模拟器

模拟器是工具为了让我们的代码达到所见即所得的效果,我们编写的代码效果能很快的在左边的界面上显示出去,做过web开发的小伙伴应该也很清楚,浏览器上按下F12也可以达到类似的效果,其实微信开发工具本身就是对浏览器进行了一定程度的封装,我们使用起来也相对亲切,模拟器还可以模拟不同手机,百分比、网络状态等,极大的方便了我们的开发和测试

image

二、编辑器

编辑器是每个开发工具必不可少的一部分,功能也大同小异,微信开发工具上有新增WXML、WXSS等文件的快捷方式,还是比较方便的,微信小程序采用的是ES6的语法,这个工具的提示确实有些差了,很多时候都不能提示出来,所以有很多人现在会采用WebStorm(前端开发最强神器)编写后在到微信开发工具上提交,当然也会有些坑,后续将专门讲解,不过微信开发工具目前更新速度还是很快的,希望能快点改善智能提示的问题

三、调试器

第一眼看到这个调试器有没有一点眼熟,它和浏览器按下F12后几乎是一样的,但是微信工具也做了一些简化和新增,我们主要看看几个不同和比较有用的三个功能

image

1、Storage

Storage可以理解成一个本地存储数据库,可以通过wx.setStorageSync(‘logs’, logs)等方法将我们需要的数据直接存储和取出,有时在开发的过程中是非常有用的,后续将介绍具体使用场景

2、AppData

AppData中主要存储了我们在页面上所有用到的变量,这个对于我们开发和调试来说是非常重要的,能通过它快速看到每个值的赋值情况,快速定位问题

3、Audits

这个是一个程序性能的分析工具,可以在开发和开发完成后,测试一下,看看我们的程序在那块还需要进行优化,非常方便

三、工具栏

工具栏提供了我们一些常用的操作,在此我们也只将一下常用到的,和一些有用的,主要有以下几点

image

1、预览

点击预览按钮后,我们可以用我们的后台绑定的微信扫描,在真机上看具体的效果,因为工具毕竟是模拟器,在模拟器上没问题,而在手机上却存在问题的情况是常有的,所以开发完一个功能后,我们有必要在真机上看看效果

2、真机调试

如果在“预览”中发现在真机上有问题,我们可以点击真机调试,我们的手机上也能看到调试信息,非常方便的让我们进行调试真机问题

3、清缓存

有时候我们可能用到Storage或者修改了页面和样式等,但是在渲染的时候还是使用的原来的代码,此时清缓存就是非常必要的操作了

4、上传

上传是在我们将我们的小程序开发完成后,点击上传,就会将我们的代码提交给微信官方审核了,只有审核通过后,其他用户才能在微信中搜索和使用我们自己开发的小程序

5、详情

image

详情中可以设置项目的一下信息,主要关注开发基础库的选择,版本不要过低或过高,教低的版本会让很多方法无法使用,太高的版本会让很多微信版本较低的用户无法使用你的小程序(当然你可以做兼容处理);开发使用本地的服务时,需要勾选上“不校验本地域名…”,这样小程序就可以调用本地的服务了

2015-02-21 17:22:34 afanxingzhou 阅读数 7599
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

1.基础知识在上一篇地址有讲解和图片,内容大致包括微信开发者模式后台配置、微信公众开发者文档代码详解。

2.本篇将粘贴出包括所有类型在内的消息处理办法,在开发者模式下用代码完成所有编辑模式的基础内容。

3.本篇代码是最基础的微信公众平台功能,大家要掌握如何套用。

4.代码下载点击:http://download.csdn.net/detail/afanxingzhou/8796933

===============================================万能的阉割线================================================================

<?php
/*
    李凡的实验
*/

define("TOKEN", "weixin");                                       //定义常量"TOKEN"为weixin,这里的weixin和上图Token值一致。
$wechatObj = new wechatCallbackapiTest();                      //将wechatCallbackapiTest类实例化,对象名为wechatObj。
/*
开发者文档——验证消息真实性:http://mp.weixin.qq.com/wiki/4/2ccadaef44fe1e4b0322355c2312bfa8.html
在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。校验方式与首次提交验证申请一致。
*/
if (!isset($_GET['echostr'])) {                                //从微信服务器(你的公众号)获取随机字符$echostr;isset()判断参数是否设置,参数存在且有值为true
    $wechatObj->responseMsg();                                 //若没有echostr,表示已经通过验证,直接调用responseMsg()方法
}else{
    $wechatObj->valid();                  //若存在echostr,表示第一次提交验证申请,调用验证方法valid(),判断微信服务器(你的公众号)与网站服务器的是否连通。
}

class wechatCallbackapiTest
{
    //验证消息
    public function valid()
    {
        $echoStr = $_GET["echostr"];       //微信服务器发送来的字符串,验证通过,将该字符串原样输出,表示验证成功!
        if($this->checkSignature()){       //调用checkSignature()方法检查签名(Signature)是否一致
            echo $echoStr;
            exit;
        }
    }

    //检查签名
    //官网可下载代码——http://mp.weixin.qq.com/wiki/4/2ccadaef44fe1e4b0322355c2312bfa8.html
    private function checkSignature()
    {
        $signature = $_GET["signature"];  //从微信服务器(你的公众号)获取签名
        $timestamp = $_GET["timestamp"]; //从微信服务器获取时间戳
        $nonce = $_GET["nonce"];         //从微信服务器获取随机数
        $token = TOKEN;                  //将自己核心代码中定义的Token赋值到这里
        $tmpArr = array($token, $timestamp, $nonce);  //创建数组变量——token+timestamp+nonce
        sort($tmpArr, SORT_STRING);                  //对$tmpArr数组中的 参数 排序;SORT_STRING:把值作为字符串来处理。        $tmpStr = implode($tmpArr);                  //把数组中的 参数 组合为一个字符串——$tmpStr=$token+$timestamp+$nonce
        $tmpStr = sha1($tmpStr);                     //对字符串$tmpStr进行sha1加密。没有问题的话它会和 $signature 一致

        if($tmpStr == $signature){                  //验证Token一致,通过验证,返回true
            return true;
        }else{
            return false;
        }
    }
//================================================请求校验结束,相应消息一步曲开始========================================================
    //响应消息
    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];               //获取微信端发送的消息;因为消息是XML数据格式,使用$_POST无法解析,故使用此方法获取
        if (!empty($postStr)){                                   //不是空内容,即有消息发送过来的话,就...
            
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
/*将$postStr变量进行解析并将 解析后所有数据 赋予 新对象$postObj。
simplexml_load_string():PHP中解析XML的函数;
第一个参数:要解析的XML字符串;
第二个参数:规定新对象所属类——SimpleXMLElement;
第三个参数:将CDATA设置为文本节点,CDATA标签中的文本XML不解析。*/
            $RX_TYPE = trim($postObj->MsgType); //从$postObj对象获取消息类型 MsgType。包括文本、图片、语音、视频、位置、链接 + 事件

            switch ($RX_TYPE)        //根据不同的消息类型,进行不同的处理
            {
                case "event":
                    $result = $this->receiveEvent($postObj);       //消息类型属于事件(event),调用 接收到事件 方法,将包含所有数据的$postObj传参传过去
                    break;
                case "text":
                    $result = $this->receiveText($postObj);       //用户发送的是 文本,调用 接收到文本 方法
                    break;
                case "image":
                    $result = $this->receiveImage($postObj);      //用户发送的是 图片,调用 接收到图片 方法
                    break;
                case "location":
                    $result = $this->receiveLocation($postObj);   //用户发送的是 地理位置,调用 接收到地理位置 方法
                    break;
                case "voice":
                    $result = $this->receiveVoice($postObj);      //用户发送的是 音频,调用 接收到音频 方法 
                    break;
                case "video":
                    $result = $this->receiveVideo($postObj);       //用户发送的是 视频,调用 接收到视频 方法
                    break;
                case "link":
                    $result = $this->receiveLink($postObj);        //用户发送的是 链接,调用 接收到链接 方法
                    break;
                default:
                    $result = "unknown msg type: ".$RX_TYPE;        //未知消息类型
                    break;
            }
            echo $result;                                           //输出回复消息,即 发送微信。
        }else {
            echo "";
            exit;
        }
    }
//===================================================响应消息二部曲开始,核心代码的核心===================================================
    //接收事件类型消息——关注;取消关注;扫描带参数二维码;上报地理位置;自定义菜单;点击菜单拉取消息;点击菜单跳转链接
    private function receiveEvent($object)                   //这里的$object来自$postObj————包含解析了微信消息 的对象
    {
        $content = "";                                       //为文本变量赋初值
        switch ($object->Event)                              //获取事件类型
        {
            case "subscribe":                                    //1.关注事件
                $content = "欢迎关注柯南大学人民武装学院官方微信公众号,学院微信号正处于开发者试验阶段,欢迎提出宝贵意见! ";//关注后回复给用户的消息
                $content .= (!empty($object->EventKey))?("\n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey)):"";
                /*第二个content:高级功能,未关注公众号时用户扫描 带参数二维码 回复内容
                break;
            case "unsubscribe":
                $content = "取消关注";                          //2.取消关注事件,可以不写content
                break;
            case "SCAN":
                $content = "扫描场景 ".$object->EventKey;       //用户已关注公众号,扫描 带参数二维码 回复内容。
                break;
            case "CLICK":                                       // 自定义菜单事件之拉取消息回复
                switch ($object->EventKey)                      //点击菜单拉取消息,EventKey为 click类型 菜单按钮的key值
                {
                    case "jianjie":
                         $content = array();
                         $content[] = array("Title"=>"学院简介","Description"=>"河南大学人民武装学院,是河南省军区与河南大学联合创办,我省唯一的人民武装类高等院校。", "PicUrl"=>"http://henurenwu.duapp.com/images/xueyuan.jpg", "Url" =>"http://henurenwu.duapp.com/about/jianjie.html");
                         break;                               //点击"jianjie"click按钮,设置推送 图文消息
                    case "gonggao":
                    	$content = "最新通告:\n\n恭喜我校本年度有38名同学考取研究生!\n\n更多公告请点击:\n\nhttp://henurenwu.duapp.com/gonggao/xueyuan_gonggao.html";
                    	break;                                //这里超链接会点击跳转
                    case "zhaopin":
                    	$content = "点击查看最新招聘信息\n\nhttp://henurenwu.duapp.com/zhaopin/2015-2-14.html";
                    	break;
                    case "yijianfankui":
                    	$content = "请用‘@+您的意见’的形式将你的意见发送到公众号:";
                    	break;
                    case "game2048":
                    	$content = "点击将跳转到Game Box,尽情玩耍吧!(游戏过程不消耗流量)<a href='http://henurenwu.duapp.com/GameBox/GameBox.html'>点击进入Game Box</a>";
                    	break;                                  //加入超链接符号后文字会添上超链接
                    default:
                        $content = "点击菜单:".$object->EventKey; //没有设置key和超链接的 空白按钮,点击后回复消息
                        break;
                }
                break;
            case "LOCATION":                                     //地理位置事件——对公众号发送位置
                $content = "上传位置:纬度 ".$object->Latitude.";经度 ".$object->Longitude;    //回复地理位置
                break;
            case "VIEW":
                $content = "跳转链接 ".$object->EventKey;        //自定义菜单之跳转链接事件——如果设置了链接就不会回复这句话
                break;
            default:
                $content = "receive a new event: ".$object->Event;  //出现新的事件类型回复消息,目前还没出现
                break;
        }
        if(is_array($content)){                                  //判断$content是否为数组类型——回复信息为图文、音乐类型$content会是数组格式,正好区分
            if (isset($content[0]['PicUrl'])){                   //图文消息,[0]['PicUrl']:第一条消息的PicUrl列;[1]['PicUrl']表示第二条消息的PicUrl列
                $result = $this->transmitNews($object, $content);//调用 传输图文 方法,将包含消息的$postObj,回复消息$content进行传参
            }else if (isset($content['MusicUrl'])){              //isset():参数存在且非空时为true
                $result = $this->transmitMusic($object, $content);//调用 传输音乐 方法
            }
        }else{
            $result = $this->transmitText($object, $content);     //调用 传输文本 方法
        }
        return $result;                                           //返回结果
    }

    //接收文本消息
    private function receiveText($object)
    {
        switch ($object->Content)                                  // 关键字回复
        {
            case "文本":                                           //用户发送内容是“文本”
                $content = "这是个文本消息";                       //回复消息
                break;
            case "图文":
            case "单图文":                                         //用户发送内容为“单图文”
                $content = array();                                //图文消息需先创建数组
                $content[] = array("Title"=>"单图文标题",  "Description"=>"单图文内容", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");                    //单图文,只写一个$content,里面的内容是根据 文本消息XML数据格式 编写
                break;
            case "多图文":
                $content = array();
                $content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                break;                                            //多图文,最多10条
            case "音乐":
                $content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");                          //音乐,和单图文结构相近,数组内容根据 音乐消息XML数据格式 编写
                break;
            case "@":                                           //发送消息包含@符号
            	$content = "感谢您的反馈,让我们一同建设美好的校园!";//回复文本消息
            	break;
            default:                                            //发送文本内容不在上述内容,默认回复以下消息
                $content = "请回复其它关键词/从菜单获取信息\n\n".date("Y-m-d H:i:s",time())."\n河南大学人民武装学院";
                break;
        }
        if(is_array($content)){
            if (isset($content[0]['PicUrl'])){
                $result = $this->transmitNews($object, $content);
            }else if (isset($content['MusicUrl'])){
                $result = $this->transmitMusic($object, $content);
            }
        }else{
            $result = $this->transmitText($object, $content);
        }
        return $result;
    }

    //接收图片消息
    private function receiveImage($object)
    {
        $content = array("MediaId"=>$object->MediaId);                    //用户向公众号发送图片消息,提取媒体ID。所有的$content都供传参到XML数据中使用
        $result = $this->transmitImage($object, $content);                //调用 传输图片 方法
        return $result;
    }

    //接收位置消息
    private function receiveLocation($object)
    {
        $content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label;                                                                    //从$object对象(=$postObj对象)获取位置参数
        $result = $this->transmitText($object, $content);                //调用 传输文本 方法
        return $result;
    }

    //接收语音消息
    private function receiveVoice($object)
    {
        if (isset($object->Recognition) && !empty($object->Recognition)){       //用户发送的语音消息,能够识别且识别结果非空(公众号需开通语音识别功能)
            $content = "你刚才说的是:".$object->Recognition;                   //回复文本,将识别结果回复给用户
            $result = $this->transmitText($object, $content);                   //调用 回复文本 方法
        }else{
            $content = array("MediaId"=>$object->MediaId);               //建立数组,内容"MediaId",数据来源:语音消息的MediaId
            $result = $this->transmitVoice($object, $content);           //调用 传输语音 方法
        }

        return $result;
    }

    //接收视频消息
    private function receiveVideo($object)
    {
        $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");
        $result = $this->transmitVideo($object, $content);
        return $result;
    }

    //接收链接消息
    private function receiveLink($object)
    {
        $content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url;
        $result = $this->transmitText($object, $content);
        return $result;
    }
//====================================================修改代码三部曲,官方文档上台========================================================
    //回复文本消息
    private function transmitText($object, $content)           //以下XML数据格式由微信规定,不可更改
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
<pre name="code" class="php">/*将xml格式中的数据分别赋值;
sprintf()为变参函数:第一个参数$textTpl表示对它改变参数;
第二个参数叫$fromUsername(它存的是用户的OpenID),因为数据传输方向掉头了——原来是用户给服务器发送消息,ToUserName表示服务器;现在服务器要发送数据给用户(OpenID),ToUserName表示用户;
第三个参数和第二个参数道理一样;
第四个参数$time:消息创建时间;
第五个参数:消息类型,这里表示文本;
第六个参数:消息内容:服务器向用户发送的消息
*/
return $result; } 
//回复图片消息
    private function transmitImage($object, $imageArray)
    {
        $itemTpl = "<Image>
    <MediaId><![CDATA[%s]]></MediaId>                 //其它数据类型都有独有的部分,独有的部分从前面传参得到
</Image>";


        $item_str = sprintf($itemTpl, $imageArray['MediaId']);


        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>              //当然也有通用的部分
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str                                           //将独有的部分放置在合适的位置,不能破坏微信文档规定的格式。以下类同
</xml>";


        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }


    //回复语音消息
    private function transmitVoice($object, $voiceArray)
    {
        $itemTpl = "<Voice>
    <MediaId><![CDATA[%s]]></MediaId>
</Voice>";


        $item_str = sprintf($itemTpl, $voiceArray['MediaId']);


        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
$item_str
</xml>";


        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }


    //回复视频消息
    private function transmitVideo($object, $videoArray)
    {
        $itemTpl = "<Video>
    <MediaId><![CDATA[%s]]></MediaId>
    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
</Video>";


        $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);


        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
$item_str
</xml>";


        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }


    //回复图文消息
    private function transmitNews($object, $newsArray)
    {
        if(!is_array($newsArray)){
            return;
        }
        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($newsArray as $item){
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
        }
        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";


        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
        return $result;
    }


    //回复音乐消息
    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = "<Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";


        $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);


        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";


        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

===================================================结尾小结===============================================================

总结一下,整体来看基础的消息处理代码都在这里了,用图片对整体再进行了解一下

我用注释的方式进行讲解,对大家查阅代码造成一定不便请大家谅解。

有问题或愿意共同进行微信公众平台开发研究的伙伴请联系邮箱:lifan.25@qq.com,欢迎!

因为之前反复修改,导致内容错乱,2015年2月25日00:46:47重新修改。


2018-09-01 18:50:22 qq934235475 阅读数 12477
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

写在之前:

由于业务扩展,公司需要开发小程序,之前在做RN开发,才结束,就得边学边维护。

但是,有东西学,当然是好的,正所谓工欲善其事必先利其器,开发一个新项目之前,版本管理工具可是第一位。

进入微信开发工具后,发现需要使用新的版本工具 - “工蜂”,在这之前公司用的 GitLab 搭建的服务器,本以为有什么不同,但是忘记了是 TX 的!!!咳咳,不难发现,这是微信开发工具有意推广 TX 的工蜂,其实也大同小异。

题外,工蜂?真的把我们程序猿当做蜜蜂了啊?啊,喂!

注:阅读之前,需要有git的相关操作以及机器安装Git。(补课传送门:https://git-scm.com/book/zh/v2


机器环境:

  1. Mac 10.13.3
  2. Git version 2.10.1

步骤说明:

  1. 需要登录工蜂平台(当蜜蜂传送门:https://git.code.tencent.com/users/sign_in),注册账户。
  2. 配置账户信息。
  3. 创建项目及分支。
  4. 微信开发工具配置。
  5. 拉取项目,提交合并测试。

以上五步,第一步进入自行注册即可,剩下四步。那么,废话不多说,let's go.


二,配置账户信息

登录后,点击【个人设置】配置好用户名及昵称后,在【密码设置】里配置好密码。

 


三,创建项目及分支

 

点击【返回个人中心】

 

 

右上角【创建项目】

 

 

在【新建项目】时,可以对项目名称进行命名,路径也就是项目名称啦。

 

这样,我们的项目版本库就创建好啦,当然,有的同学会问了,我的版本库是空的,那我下载什么?根据下面的提示,进入项目文件夹,比如使用微信开发工具新建了一个小程序的Project,那么进入该文件夹下,根据提示【创建一个新的版本库】进行操作即可。

四,微信开发工具配置。

使用微信开发工具打开项目,注意版本。

点击版本管理。

以下是基本的 git 操作以及分支的展示。【确实界面很简洁,看起来很舒服,但是,换成中文,竟然有一点不适应。】

接下来,点击【设置】->【网络和认证】,对账户进行配置,也就是刚才工蜂上面填写的。

配置完成啦。

注:如果需从git上拉取别的新项目,需使用git命令拉取项目到文件夹之后,再使用微信开发工具打开进行如上操作即可。

git clone "url"

五,拉取项目,提交合并测试。

点击拉取,选择分支以及合并方式即可拉取该分支下的更新。

出现这个小勾,则表示拉取成功啦,在【历史】一栏中可以查看。

 


附加步骤:

什么?为什么还会有附加步骤,说好的五步走呢?

哈哈哈哈,打不过我吧,啦啦啦啦啦啦啦啦~各位忘了,第一步不是注册账户吗,抵消抵消~

咳咳,言归正传,通常 Gitmaster 分支,是对外发布的主要稳定版本,也就是生产版本。所以,需要新建一个自己的分支对项目进行操作。

此外,需要一个 develop 分支来对大家开发的代码进行合并,之后在上线的时候,推送到 master 分支。

master 分支的 bug ,切一个新分支【命名为 master + 预计发布日期 如 master20181212 】出来进行修改,而新功能则在 develop 上继续开发。详细传送门:http://blog.jobbole.com/109466/)。

所以,我们现在需要新建一个自己的分支来供自己提交代码,上述大概的流程是:

提交并推送到【自己的分支】->合并推送到【 develop 分支】->合并推送到【 master 分支】


话不多说,开搞开搞。

点击【项目】,然后找到刚才初始化后的项目点击进入:

点击【分支】即可查看当前项目下拥有的分支

这里已经有了两个分支,一个是 master ,一个是我自己创建的分支,点击右上角【创建分支】,进行新分支创建。

输入新分支的名称,以及分支的来源(from)

创建好之后,在微信开发工具中进行相应操作。

点击【分支】即可新建一个本地分支

选择基于哪个分支创建,这里命名需和远程新建的一样

创建好之后,点击抓取

这样,我们本地有了新建的分支,远程也有了新建的分支。那么新建的分支提交并推送代码后,点击【合并】,比如我A分支提交推送后,本地检出(check out)master分支,然后合并本地的A分支,在点击推送。这样,远程的A和master分支都有了更新的代码,其他伙伴更新分支,即可下载到你提交的代码。


好了,就先写到这儿,可能说得有点快,有不详细获取错误的地方,欢迎指出。当然,有什么不明白也可以留言交流。


不知道我有没有写得通俗易懂,如果觉得哪步有疑惑,可以留言,欢迎指出不足。

下面是我自己搞的一个公众号,分享讨论交流技术~,也可以解答一些你遇到的问题,给我留言就行。

感谢 Thanks♪(・ω・)ノ。

2019-05-23 19:51:08 rememberyf 阅读数 266
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

一、微信小程序web开发工具下载地址

 

1.1 在微信公众平台-小程序里边去下载开发工具下载地址

1.2 下载后安装一下就可以使用了:

二、创建项目

 

2.1 微信小程序web开发工具需要扫码登陆,所以必须先绑定开发者才可以:

 

2.2 已经绑定的开发者可以创建项目,需要填写AppID、项目名称、本地开发目录。

 

 

AppID需要去设置里边获取,如果不填的话官方给的提示是部分功能受限:

 

 

 

三、开发工具界面介绍:

 

 

 

1. 编辑:开发的时候,需要到编辑区去写代码 

2. 调试:开发完需要调试程序的时候需要切换到这个区域,调试区有很多工具可供使用。

3. 项目:在这里可以上传或者预览项目

4. 编译:就相当于运行项目的意思

5. 关闭:关闭当前工程

6. 微信小程序web开发工具提供实时预览的功能,界面的效果会在这个区域显示

7. 这个区域可以看到整个项目的文档目录结构

8. 这个区域是编码区

9. 这里是选择屏幕尺寸的地方

10. 模拟网络环境:2G/3G/4G/WiFi

 

 

 

四、调试区六大工具介绍:

 

在调试区开发工具提供了6种调试模式:

 

4.1 Console

Console的意思是控制台,做过开发的都知道几乎每个IDE都会有控制台,可以显示错误信息和打印变量的信息等。

 

4.2 Sources

Sources显示了当前项目的所有脚本文件,微信小程序框架会对这些脚本文件进行编译。

Source下边还有一个区域,做过软件开发的都知道,一般下边是控制台会显示一些log信息、断电调试等等。

 

4.3 Network

Network顾名思义:这个区域显示的是与网络相关的信息,我这里暂时没有进行网络请求。

 

4.4 Storage

官方的解释是显示当前项目的使用wx.setStorage或者wx.setStorageSync后的数据存储情况。这个后续用到再慢慢研究

 

4.5 AppData

AppData是显示当前项目显示的具体数据,可以在这里编译,并且会在页面实时显示。

 

4.6 Wxml

 

Wxml调试区:把他的名字换一下的话大家就好理解了,其实他的实质就是HTML+CSS,微信只是把HTML改成了Wxml而已。学过HTML的人一看就明白,左侧的区域是HTML语言+CSS的一些标签属性。右侧可以便捷的设置CSS的属性。

 

 

转自:http://lib.csdn.NET/article/5/52864?knId=1796#focustext

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