2017-05-20 12:41:16 zhuxiaolilove 阅读数 2105
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WxServer
{
    public class 微信登陆类
    {

        /// <summary>
        /// 获取UUID
        /// </summary>
        /// <returns></returns>
        public static string UUID()
        {
            string appid = "wx782c26e4c19acffb";
            try
            {
                string getUUID_url = "https://login.weixin.qq.com/jslogin?appid=" + appid;//UUID的URL地址
                byte[] bytes = Http.网页请求.WebRequest(getUUID_url, "GET", "");//GET提交并返回数据
                string uuid = Encoding.UTF8.GetString(bytes).Split(new string[] { "\"" }, StringSplitOptions.None)[1];//从返回的Byte中提取出UUID参数
                return uuid;//得到UUID
            }
            catch
            {
                return null;
            }

        }

        /// <summary>
        /// 获取二维码图片
        /// </summary>
        /// <returns></returns>
        public static byte[] showQrCode(string uuid)
        {
            try
            {
                if (uuid != null)
                {
                    string showQrCode_url = "https://login.weixin.qq.com/qrcode/" + uuid;//二维码请求URL
                    byte[] bytes = Http.网页请求.WebRequest(showQrCode_url + "?t=webwx", "GET", "");//GET提交并返回数据
                    return bytes;
                }
                else
                {
                    return null;
                }
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// 检查是否登陆
        /// </summary>
        /// <returns></returns>
        public static object waitForLogin(string uuid)
        {
            try
            {
                string waitForLogin_url = "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=" + uuid;
                byte[] bytes = Http.网页请求.WebRequest(waitForLogin_url, "GET", "");//GET提交并返回数据
                string login_ini = Encoding.UTF8.GetString(bytes);//BYTE转换为字符串
                if (login_ini.Contains("201"))//返回201说明在手机端已扫描,还没点击确认登陆
                {
                    string base64_image = login_ini.Split(new string[] { "\'" }, StringSplitOptions.None)[1].Split(',')[1];//从返回数据中提取出头像
                    byte[] base64_image_bytes = Convert.FromBase64String(base64_image);//头像字符转转换成Byte
                    return base64_image_bytes;
                }
                else
                if (login_ini.Contains("=200"))//返回200说明手机端已点击确认,并返回跳转地址
                {
                    string redirect_url = login_ini.Split(new string[] { "\"" }, StringSplitOptions.None)[1];//从返回数据中提取出跳转地址
                    return redirect_url;
                }
                else
                {
                    return null;
                }
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// 访问登陆地址获取参数
        /// </summary>
        /// <param name="login_redirect"></param>
        public static void Login(string login_redirect)
        {
            try
            {
                byte[] bytes = Http.网页请求.WebRequest(login_redirect + "&fun=new&version=v2&lang=zh_CN", "GET", "");//GET提交请求并返回数据
                string message = Encoding.UTF8.GetString(bytes);//从数组转换成字符串
                WXConfig.skey = message.Split(new string[] { "skey" }, StringSplitOptions.None)[1].TrimStart('>').TrimEnd('<', '/');//从字符串中提取skey
                WXConfig.uin = message.Split(new string[] { "wxuin" }, StringSplitOptions.None)[1].TrimStart('>').TrimEnd('<', '/');//从字符串中提取wxuin
                WXConfig.sid = message.Split(new string[] { "wxsid" }, StringSplitOptions.None)[1].TrimStart('>').TrimEnd('<', '/');//从字符串中提取wxsid
                WXConfig.pass_ticket = message.Split(new string[] { "pass_ticket" }, StringSplitOptions.None)[1].TrimStart('>').TrimEnd('<', '/');//从字符串中提取pass_ticket
                Console.WriteLine("skey=>>" + WXConfig.skey);
                Console.WriteLine("uin=>>" + WXConfig.uin);
                Console.WriteLine("sid=>>" + WXConfig.sid);
                Console.WriteLine("pass_ticket=>>" + WXConfig.pass_ticket);
            }
            catch
            {

            }
        }
    }
}



联系人 URL:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact

VerifyFlag:8 公从号 个人
VerifyFlag:24 公众号 企业
VerifyFlag:56 系统
VerifyFlag:0 好友

            try
            {
                string getContact_url = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?pass_ticket={0}&r={1}&seq=0&skey={2}";

                foreach (CookieItem s in HttpCookieHelper.GetCookieList(Http.网页请求.Cookie))
                {
                    if (s.Key.Contains("webwxuvid"))
                    {
                        Cookies += HttpCookieHelper.CookieFormat(s.Key, s.Value);
                    }
                    if (s.Key.Contains("webwx_auth_ticket"))
                    {
                        Cookies += HttpCookieHelper.CookieFormat(s.Key, s.Value);
                    }
                    if (s.Key.Contains("webwx_data_ticket"))
                    {
                        Cookies += HttpCookieHelper.CookieFormat(s.Key, s.Value);
                    }
                }

                Cookies += "wxuin=" + WXConfig.uin;
                Cookies += ";wxloadtime=" + wxloadtime;
                Cookies += ";last_wxuin=" + WXConfig.uin;
                Cookies += ";wxsid=" + WXConfig.sid;
                Cookies += ";mm_lang=zh_CN";
                Http.网页请求.Cookie = Cookies;
                getContact_url = getContact_url.Replace("{0}", WXConfig.pass_ticket).Replace("{1}", Time()).Replace("{2}", WXConfig.skey);
                byte[] bytes = Http.网页请求.WebRequest(getContact_url, "GET", "");
                string getContact_str = Encoding.UTF8.GetString(bytes);
                WriterText.Save(getContact_str);
                JObject contact_result = JsonConvert.DeserializeObject(getContact_str) as JObject;
                return contact_result;
            }
            catch
            {
                return null;
            }




                                
2017-05-23 15:18:21 RE_PHPzjw 阅读数 7106

目录 List

1. 那一抹淡淡的忧伤—–微信开发基础
2. 用纯js是不可能用纯js了,这辈子都不用纯js了 —– 微信JSSDK开发以及问题解答
3. 要你命3000 —— 微信支付开发系列问题解决

导语

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
本文重点讲最新的JSSDK版本1.2,关于1.2版本的说明可以参考这里
尤其注意从1.2版本开始微信针对IOS系统WKWebview内核做出了重大改变,所以广大开发者当以最新JSSDK1.2版本为开发源码,否则可能造成IOS部分功能无效


开发前准备

步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。


步骤二:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js


步骤三:通过config接口注入权限验证配置

wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: ”, // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: ”, // 必填,生成签名的随机串
signature: ”,// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 });

直接用代码演示

//加载微信JSSDK config
wx.config({
        debug: false,
        appId: 'APPID',
        timestamp: time,
        nonceStr: 'NONCESTR',
        signature: 'SIGNATURE',
        jsApiList: [
            'checkJsApi',
            'onMenuShareTimeline',
            'onMenuShareAppMessage',
            'onMenuShareQQ',
            'onMenuShareWeibo',
            'onMenuShareQZone',
            'hideMenuItems',
            'showMenuItems',
            'hideAllNonBaseMenuItem',
            'showAllNonBaseMenuItem',
            'translateVoice',
            'startRecord',
            'stopRecord',
            'onVoiceRecordEnd',
            'playVoice',
            'onVoicePlayEnd',
            'pauseVoice',
            'stopVoice',
            'uploadVoice',
            'downloadVoice',
            'chooseImage',
            'previewImage',
            'uploadImage',
            'downloadImage',
            'getNetworkType',
            'openLocation',
            'getLocation',
            'hideOptionMenu',
            'showOptionMenu',
            'closeWindow',
            'scanQRCode',
            'chooseWXPay',
            'openProductSpecificView',
            'addCard',
            'chooseCard',
            'openCard',
        ]
    });
    //JSSDK错误报告
    wx.error(function(res){
        console.log(location.href.split('#')[0]);
    });

config里面所涉及到的参数我们通过JSSDK官方demo来提供数据,我对官方的demo进行了再次封装,直接在这里贴出来:

class Jssdk{
    private $appId;
    private $appSecret;

    public function __construct($appId, $appSecret) {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }

    public function getSignPackage() {
        $jsapiTicket = $this->getJsApiTicket();

        // 注意 URL 一定要动态获取,不能 hardcode.
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

        $timestamp = time();
        $nonceStr = $this->createNonceStr();

        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

        $signature = sha1($string);

        $signPackage = array(
            "appId"     => $this->appId,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }

    private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function getJsApiTicket() {
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("jsapi_ticket.php"));
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            // 如果是企业号用以下 URL 获取 ticket
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $this->set_php_file("jsapi_ticket.php", json_encode($data));
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }

        return $ticket;
    }

    private function getAccessToken() {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("access_token.php"));
        if ($data->expire_time < time()) {
            // 如果是企业号用以下URL获取access_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $this->set_php_file("access_token.php", json_encode($data));
            }
        } else {
            $access_token = $data->access_token;
        }
        return $access_token;
    }

    private function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
        // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }

    private function get_php_file($filename) {
        return trim(substr(file_get_contents($filename), 15));
    }
    private function set_php_file($filename, $content) {
        $fp = fopen($filename, "w");
        fwrite($fp, "<?php exit();?>" . $content);
        fclose($fp);
    }
}

务必先拿到数据后注册给JSconfig,否则微信JSSDK是无效的

等你一切准备得当的时候请打开网页调试里的console来查看效果

正确调用的情况:
这里写图片描述

到这里所有的准备工作就完成了


图片选择

调用JSSDK的图片接口

wx.chooseImage({
            count: 1,
            success: function (res) {
                //选择图片成功后
                images.localId = res.localIds;//安卓可以直接使用localIds 预览图片
                if(res.localIds.indexOf("wxlocalresource") != -1){
                    res.localIds = res.localIds.replace("wxlocalresource", "wxLocalResource");
                }
              )};  
               //以下的适配IOS
               //先使用阅览接口(适配IOSWKWebview版本)
                    wx.getLocalImgData({
                        localId: images.localId[i], // 图片的localID
                        success: function (res) {
                            var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
                            $("#chooseImage").parent().before("<li class='upload_action'><img src='"+localData+"'/></li>");
                        }

                    });

图片上传

直接采用递归方法来上传多张图片

function upload() {
    wx.uploadImage({
                        localId: images.localId[i].toString(),
                        isShowProgressTips: 1, // 默认为1,显示进度提示
                        success: function (res) {
                            i++;
                            var media_id = res.serverId;

                            images.serverId.push(res.serverId);//上传到了服务器的ID

                            if (i < length) {
                                upload();
                            }
                        },
                        fail: function (res) {
                            alert(JSON.stringify(res));
                        }
                    });

}

将上传到服务器的图片下载到本地项目

public function getmedia(){
        $media_id = get.sevrid;//前端返回的上传后的媒体id
        $weixin = new Weixinpay(); //实例化微信类
        $access_token = $weixin->getToken(); //获取token

        $url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=".$access_token."&media_id=".$media_id;
        //获取微信“获取临时素材”接口返回来的内容(即刚上传的图片)
        $a = file_get_contents($url);
        //echo $a;
        $filename = date('YmdHis').rand(1000,9999).'.jpg';
        //以读写方式打开一个文件,若没有,则自动创建
        $resource = fopen($_SERVER["DOCUMENT_ROOT"].'/Uploads/User_img/'.$filename, 'w+');
        //将图片内容写入上述新建的文件
        fwrite($resource, $a);
        //关闭资源
        fclose($resource);
        echo '/Car/Common/Uploads/User_img/'.$filename;
    }

通过以上方法我们能达到 用户用微信自带的上传图片系统上传到我们自己服务器上


完整代码

var images = {
        localId: [],
        serverId: []
    };
    choose.onclick = function(){
        wx.chooseImage({
            count: 1,
            success: function (res) {
                //选择图片成功后
                images.localId = res.localIds;
                if(res.localIds.indexOf("wxlocalresource") != -1){
                    res.localIds = res.localIds.replace("wxlocalresource", "wxLocalResource");
                }
                var i = 0, length = images.localId.length;

                function upload() {
                    //先使用阅览接口(适配IOSWKWebview版本)
                    wx.getLocalImgData({
                        localId: images.localId[i], // 图片的localID
                        success: function (res) {
                            var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
                            $("#chooseImage").parent().before("<li class='upload_action'><img src='"+localData+"'/></li>");
                        }

                    });
                    wx.uploadImage({
                        localId: images.localId[i].toString(),
                        isShowProgressTips: 1, // 默认为1,显示进度提示
                        success: function (res) {
                            i++;
                            var media_id = res.serverId;

                            images.serverId.push(res.serverId);
                            $.ajax({
                                url:'getmedia.php',
                                data:{'mid':res.serverId.toString()},
                                type:'get',
                                success:function(res){
                                    $("input[name='qu_img']").val(res);
                                    $("#chooseImage").hide();
                                }

                            });
                            if (i < length) {
                                upload();
                            }
                        },
                        fail: function (res) {
                            alert(JSON.stringify(res));
                        }
                    });

                }
                upload();
            }
        });

    }

演示

这里写图片描述

讨论和询问可以加QQ

1577452412

2017-04-23 15:43:18 aojiancc2 阅读数 2011


            

                  微信接收用户普通消息可以在官方文档中直接看


           

           

                   微信普通消息分为:

            

   

             接受用户文本消息 与 回复文本信息           

             

          注意在接收用户普通消息的时候,推送的xml格式没有eventKey,event 

      

          这个是菜单点击的时候推送的菜单的标识

             

             接收文本消息格式

           

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName> 
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>

           处理文本消息的类   

                        

            

            接收消息 

  /// <summary>
    /// 处理用户发送的文本消息方法
    /// </summary>
    public class TextProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出消息内容
            string Content = xl.Elements().Where(a => a.Name == "Content").FirstOrDefault().Value;
        }
    }

           回复文本消息工具类封装,增加回复文本消息方法       

   /// <summary>
        /// 回复文本消息的方法
        /// </summary>
        public void SendTextMesXml(HttpResponseBase Response, ReTextMsgModel _rmg)
        {

            string rxmls = string.Format(@"<xml>
                               <ToUserName>{0}</ToUserName>
                               <FromUserName>{1}</FromUserName>
                               <CreateTime>{2}</CreateTime>
                               <MsgType><![CDATA[text]]></MsgType>
                               <Content><![CDATA[{3}]]></Content>
                             </xml>           
                           ", _rmg.ToUserName, _rmg.FromUserName
                            , ConvertDateTimeInt(DateTime.Now), _rmg.Content);

            Response.Write(rxmls);

            Response.End();
        }

            在处理类中调用该方法        

/// <summary>
    /// 处理用户发送的文本消息方法
    /// </summary>
    public class TextProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出消息内容
            string Content = xl.Elements().Where(a => a.Name == "Content").FirstOrDefault().Value;

            //回复的内容
            string retmes = "";

            if (Content == "1")
                retmes = "用户输入1";
            else if (Content == "2")
                retmes = "用户输入了2";
            else
                retmes = "随便回复一个^_^";

            //组建回复文本信息的类
            ReTextMsgModel rsm = new ReTextMsgModel();

            rsm.MsgType = "text";
            rsm.Content = retmes;
            rsm.ToUserName = FromUserName;
            rsm.FromUserName = ToUserName;

            //调用回复文本信息方法
            new SendMesTool().SendTextMesXml(_response, rsm);

            //记录一个日志
            LogTool.AddLog(new MsgLog() { MsgType = "Text", Content = Content });

            _response.End();

        }
    }

                    效果如下

            


            发表情也会认为是一个文本信息!!

            



           接受用户图片消息 与 回复图片信息

           

                  接收图片消息看官方文档,格式为       

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[image]]></MsgType>
 <PicUrl><![CDATA[this is a url]]></PicUrl>
 <MediaId><![CDATA[media_id]]></MediaId>
 <MsgId>1234567890123456</MsgId>
 </xml>
         

             其他都一样,主要是两个属性PicUrl和MediaId,一个是图片的url,

          一个是对应图片的Id

          可以先取出来,记录在日志中查看

    /// <summary>
    /// 处理图片信息的方法
    /// </summary>
    public class ImageProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出图片连接
            string PicUrl = xl.Elements().Where(a => a.Name == "PicUrl").FirstOrDefault().Value;

            //取出MediaId,图片资源对应的id
            string MediaId = xl.Elements().Where(a => a.Name == "MediaId").FirstOrDefault().Value;

            //记录一个日志
            LogTool.AddLog(new MsgLog() { MsgType = "Image", Remark = "PicUrl:" + PicUrl,
                                          Remark2 = MediaId });

            _response.End();
        }
    }
              

             PicUrl就是一个图片链接,可以在浏览器中访问

            

            MediaId是串很长的字符

            


            回复图片信息

                  先看看文档        

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>
                        

              其实其他都一样主要是一个MediaId,如果回复一个和用户一样的图片

           就把用户传递的MediaId回传给他就行了,如果要回复其他图片,看文档上解释

             

             需要通过素材接口上传,然后获取一个与之关联的MediaId就可了


              

               编写回复图片信息的model           

   /// <summary>
    /// 回复图片信息的model
    /// </summary>
    public class ReImageMsgModel
    {
        public string ToUserName { get; set; }
        public string FromUserName { get; set; }
        public int CreateTime { get; set; }
        public string MsgType { get; set; }
        public string MediaId { get; set; }
    }
            

           在回复信息的工具类中编写回复图片信息的方法          

  /// <summary>
        /// 回复图片消息的方法
        /// </summary>
        public void SendImageMesXml(HttpResponseBase Response, ReImageMsgModel _rmg)
        {

            string rxmls = string.Format(@"<xml>
                               <ToUserName>{0}</ToUserName>
                               <FromUserName>{1}</FromUserName>
                               <CreateTime>{2}</CreateTime>
                               <MsgType><![CDATA[{3}]]></MsgType>
                               <Image>
                                  <MediaId><![CDATA[{4}]]></MediaId>
                                 </Image>
                             </xml>           
                           ", _rmg.ToUserName, _rmg.FromUserName
                            , ConvertDateTimeInt(DateTime.Now),_rmg.MsgType,_rmg.MediaId);

            Response.Write(rxmls);
            Response.End();
        }
         

            在图片信息处理类中调用该方法进行回复一个图片信息        

  /// <summary>
    /// 处理图片信息的方法
    /// </summary>
    public class ImageProcess : BaseProcess
    {
        public override void Process(XElement xl, HttpRequestBase _request, HttpResponseBase _response)
        {
            //取出发送者与接收者账号
            string ToUserName = xl.Elements().Where(a => a.Name == "ToUserName").FirstOrDefault().Value;
            string FromUserName = xl.Elements().Where(a => a.Name == "FromUserName").FirstOrDefault().Value;

            //取出图片连接
            string PicUrl = xl.Elements().Where(a => a.Name == "PicUrl").FirstOrDefault().Value;

            //取出MediaId,图片资源对应的id
            string MediaId = xl.Elements().Where(a => a.Name == "MediaId").FirstOrDefault().Value;


            //组建回复图片信息的类
            ReImageMsgModel rsm = new ReImageMsgModel();

            rsm.MsgType = "image";
            rsm.MediaId = MediaId;
            rsm.ToUserName = FromUserName;
            rsm.FromUserName = ToUserName;

            new SendMesTool().SendImageMesXml(_response, rsm);

            //记录一个日志
            LogTool.AddLog(new MsgLog() { MsgType = "Image", Remark = "PicUrl:" + PicUrl,
                                          Remark2 = MediaId });

            _response.End();
        }
    }
             

           效果如下

            

           

           




          

2016-04-20 17:22:55 eadio 阅读数 8600

     首先声明,在接下来一系列公众号第三方开发教程中,核心原理是参照下面博主的源码:

http://www.cnblogs.com/sujingnan/p/4397203.html

拓展业务需求的。

 

     为什么会有这个教程系列,主要是因为公司业务拓展。之前是我们需要向客户索要公众号,帮他们管理一系列东西,现在需求更改为,让客户一键授权给我们,自己管理图文跳转消息。

 

     那么,首先我们需要到微信开放平台【公众号第三方平台】创建属于自己的第三方平台。【前提是你需要注册一个开放平台账号,这个和以前注册的公众号是不一样的,不能直接拿来使用,需要另外注册】。


1、注册开放平台账号----进入管理中心----进入公众号第三方平台----点击创建...。然后跟着步骤一步一步填写完,这里我已经创建好了,但是要讲下第三步一些填写开放资料需要注意的。

 

2、我这里创建的是mvc项目,以下某些术语都是根据c#语法来的。

首先,授权流程相关----授权事件url,这个地址要具体填写到项目里头的方法,而且必须是post方法。


微信文档上说的太含糊了,不过也有可能是我笨,理解力不足!尴尬我这里解释下:其实是因为有了这个方法,微信每隔十分钟会请求这个地址。然后附加一些参数【签名啊、时间戳等等】,然后我们透过这些参数来获取component_verify_ticket协议。然后返回"success"字符串告诉微信我们已经获取到了协议串。大致可以理解为:jQueryajax方法,就是在前端开发的时候,只要先装好url,通过附加data参数,返回的值出来就好了。只不过微信请求的时候没有细致说附加了哪些参数。尤其是加密数据,因此才通过获取流数据方式读取。

3、授权后,其他的业务在公众号消息与事件接受url设定的地址上执行。最后提交审核。通过可以在管理中心查看,未全网发布前,还可以继续修改平台信息。


 


 

2016-07-25 17:14:32 wanggmm 阅读数 7332

一、

可以在页头加这段代码试试

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

二、


网页是无法控制浏览器进行缓存的。

如果不想要缓存,唯一的办法就是在url后面添加参数,比如www.123.com/test.html?v=20150316

参数可以用时间戳

缺点就是你每次打开的时候都需要重新加载网页

或者在url后面加的参数为版本号,每次版本改变就重新加载也行,

如果觉得手动改变版本号太麻烦,可以用gulp-revgulp-rev-replace自动化

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