微信公众号_微信公众号开发 - CSDN
微信公众号 订阅
微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字、图片、语音、视频的全方位沟通、互动 。形成了一种主流的线上线下微信互动营销方式。2016年1月18日,腾讯在北京发布消息称,中国政务微信公号已逾10万。2018年4月,腾讯已查处9.9万多个违规公众号 [1]  。11月16日,微信公众平台发布公告称,个人注册公众号数量上限调整为1个 [2]  。2019年12月26日,微信公众号文章无法打开,点击文章链接后显示空白。随后,微信团队道歉,公众号后台大部分功能已经修复。 [3-4] 展开全文
微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字、图片、语音、视频的全方位沟通、互动 。形成了一种主流的线上线下微信互动营销方式。2016年1月18日,腾讯在北京发布消息称,中国政务微信公号已逾10万。2018年4月,腾讯已查处9.9万多个违规公众号 [1]  。11月16日,微信公众平台发布公告称,个人注册公众号数量上限调整为1个 [2]  。2019年12月26日,微信公众号文章无法打开,点击文章链接后显示空白。随后,微信团队道歉,公众号后台大部分功能已经修复。 [3-4]
信息
外文名
Wechat Official Account
类    型
开放应用平台
分    类
订阅号和服务号
中文名
微信公众号
认证收费
服务号、订阅号认证均需300元/年
隶属企业
腾讯公司
微信公众号发展历程
2018年6月27日,微信官方宣布,微信公众平台上线开放转载功能,文章可以直接被转载,不需要人工再次确认。 [5]  2018年11月16日,微信公众平台发布公告称,即日起,公众号注册将做调整:个人主体注册公众号数量上限由2个调整为1个;企业类主体注册公众号数量上限由5个调整为2个。 [2]  2018年12月29日,微信公众平台运营功能再次升级,修改已发送文章的错别字上限由5个上调至10个,同时支持增、删和替换,但标题和摘要依然无法修改,修改机会依然有且仅有一次。 [6]  2019年8月,滴滴出行宣布,与万达酒店及度假村达成战略合作。用户可在万达酒店微信公众号内使用滴滴叫车。 [7]  2020年6月29日,微信公众号增加两项新功能,在文章底部新增了“分享”和“赞”。其中,用户点击“分享”可“分享到朋友圈”或“发送给朋友”。这两项新功能已陆续全量开放。 [8] 
收起全文
  • 课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决...
  • 开发微信公众号(二)

    万次阅读 2018-05-23 00:35:56
    看完昨天的文章「开发微信公众号(一)」 估计不少人已经开始期待我继续更新了,这不赶紧马不停蹄,加班加点给你们更新了第二篇。现在的你已经有了一个属于自己的微信公众号,那么你想如果按照微信公众号的自动回复...


                            


    看完昨天的文章「开发微信公众号(一)」 估计不少人已经开始期待我继续更新了,这不赶紧马不停蹄,加班加点给你们更新了第二篇。


    现在的你已经有了一个属于自己的微信公众号,那么你想如果按照微信公众号的自动回复,来实现用户发送电影名就可以获得想要的电影链接,那是得设置多少的呀,这显然是不可能的,那么我们就要用到服务器来帮我们实现了的,腾讯,阿里云的都可以,当然如果你是学生那么就可以享有购买服务器时的福利了的,有10元/月支持学生购买服务器的,个人感觉还是蛮划算的。那么问题又来了,不是学生党购买似乎会觉得有点贵,这里我直接给大家一个福利,关注我的微信公众号,回复「令牌」,不知道令牌是什么?没关系,先接着往下看的!我直接把我的令牌给大家用,直到服务器崩掉,先到先得,崩了之后我再修改令牌! 但是你如果想做好一个项目的有收益的话,肯定是要付出的,就像你加入张哥的星球也是通过付费获得知识,这是同样的一个道理,就算之后可能会失败,没有收益,但是你收获到了技术上的知识,我想这也是不错的! 


    购买服务器(我以腾讯服务器作为例子)


    1、百度搜索「腾讯云」,学生党百度搜索「腾讯云校园服务」进入腾讯云网站首页


                        


    2、点击--产品--计算--云服务器


                                


    3、进入云服务器选购界面点击--立即购买,如果没有登录的话需要登录,自己的QQ号就可以;


                                


    5、选择需要的配置,提交订单支付即可

    一定要选择选择 Ubuntn Serve !

    一定要选择选择 Ubuntn   Serve !

    一定要选择选择 Ubuntn   Serve !


                            


    重要的事情说三遍,使用 Ubuntn 会比 window 方便太多了的,而且我也是用的Ubuntn,不怎么清楚其他的服务器,如果不知道用没关系,我会详细描述好操作的,而且作为一位优秀的程序员,你迟早的接触到 Linux ,没有图形界面的,这个时候了解一下,绝对是没有坏处的,只会让你变的更优秀!


    接口微信公众号如果你有了自己的服务器之后呢,你需要你的服务器与微信之间产生联系的,这里我们需要用到别人已经开发好的微信公众号开发框架  WeRoBot 建议看到这里了,去百度一下 WeRoBot 官方文档了解,否则可能会有点不知道什么意思!如果现在的你还处于迷茫的状态,也请硬着头皮操作下去,登录进入你的服务器, 现在我们先直接部署好,让你看到效果再解释原因的,看到现在的不懂 Ubuntn 下的 Vim 操作,可以现在就学下的,简单的基本操作,现在请执行好以下命令:


    vim rebot.py     //创建一个rebot.py 

    键盘按下 i      //切换到 vim 的输入模式   复制以下代码   


    import werobot

    robot = werobot.WeRoBot(token='tokenhere') 

    // tokenhere 这里自己可以随便填写的,比如 token = 'aaa'


    @robot.handler

    def hello(message):

        return 'Hello World!'


    # 让服务器监听在 0.0.0.0:80


    robot.config['HOST'] = '0.0.0.0'

    robot.config['PORT'] = 80

    robot.run()


    按下 Esc    然后按下  Shift + :      

      

    //切换到 Vim 下的命令模式 


    输入 wq                     

                     

    //保存并退出


    sudo python3 rebot.py       

       

    //运行程序rebot 接下来不用动了的,按下 Ctr + C 可以取消,但是现在不要动


                            


                           


    回到微信公众号的后台了,基本配置里面,将你的服务器IP 与令牌(token)

    就是你之前代码里写的那个 token ,填入微信公众号后台,消息加密,点随机生成,明文模式,点击启用,OK 到这里应该就是部署好了的,发送消息,微信就会自动回复hello world 是不是特别的激动,没错到了这里就说明接口配置已经成功完成好了的!甚至你还可以回复图文消息,将代码改成这样!相信某些聪明的人大概已经知道实现原理是什么了吧!


    import werobot

    robot = werobot.WeRoBot(token='tokenhere')

    @robot.text

    def articles(message):

        return [

            [

                "title",

                "description",

                "img",

                "url"

            ],

            [

                "whtsky",

                "I wrote WeRoBot",

                "https://secure.gravatar.com/avatar/0024710771815ef9b74881ab21ba4173?s=420",

                "http://whouz.com/"

            ]

        ]

    robot.run()





    这些代码在 Werobot 都可以看得到,所以要多看文档的,如果已经配置成功了的,可以留言扣个1 ,如果存在疑惑,不懂,请多看微信的官方文档以及 Werobot 的官方文档,多看官方文档是最好的学习方法,或者直接私聊我!!

    有人说:我把服务器退出了就实现不了呀,那么 Linux 的强大就体现出来了


    sudo nohup python3 rebot.py &


    一条命令,这样退出服务器,后台也是可以运行的!

    最后,你需要学什么:Vim 的基本操作,Ubuntn 的基本操作,以及 Werobot!终于完成好了服务器接口微信公众号后台了的,下次将会介绍如何建立好自己的数据库!




    推荐阅读:  开发微信公众号(一)



    PS:如果觉得文章还不错的话,还请大家点赞分享下。算是对「fightjiang」最大的支持!



           每 天 分 享 Python 干 货

         

    展开全文
  • 微信公众号+小程序开发

    千人学习 2019-08-05 11:45:27
    微信公众号+小程序开发》是结合了部分《微信开发深度解析》内容录制的系列课程,独立于书本,包含了更多的操作演示和案例演示。 课程内容分为两大部分: 第一部分:微信公众号及小程序开发基础技能 第二部分:...
  • 微信公众号开发小记(一)开篇

    万次阅读 2018-08-10 12:33:33
    接下来的时间里,我会以连载的形式分享微信公众号开发的相关文章,其中也会说一下我遇到的问题以及解决的思路,以及在开发过程中的一些感悟!因为是一个连载系列,所以会以一个初学者,也就是接触过编程但是没有接触...

    接下来的时间里,我会以连载的形式分享微信公众号开发的相关文章,其中也会说一下我遇到的问题以及解决的思路,以及在开发过程中的一些感悟!因为是一个连载系列,所以会以一个初学者,也就是接触过编程但是没有接触过微信公众号开发的角度去写文章,希望能给大家带来微信公众号开发相关知识的同时更多的给初学者一种解决问题的思路以及学习的方法!

    在我的印象当中,微信公众号开发好像一直都是PHP干的事,之前也从未接触过微信公众号开发,可以说是头一次做微信公众号开发的知识!

    因为一直在运营微信公众号,所以多多少少都会经常看到这个

    image

    也就是微信公众平台开发文档,但是一直觉得自己不会做这块,所以也就没有当回事,谁知世事难料,没想到有一天自己也做起了微信公众号的开发。

    那就开始吧!首先做微信公众号开发,你必须离不开的就是这个官方技术文档了,因为需要经常的去看,去查!建议先把这个技术文档看一遍!

    然后你就会看到很重要的一条文档,就是它

    image

    就是这个接入指南,有这么三个步骤

    1. 填写服务器配置
    2. 验证服务器地址的有效性
    3. 根据接口文档实现业务逻辑

    首先,作为一个初学者,肯定有些不懂,那该怎么办?这里的不懂应该就是这个服务器配置,什么玩意,什么服务器配置,如何验证以及实现业务逻辑?

    其实在做了一遍微信公众号开发之后发现,这个技术文档真的已经很详细了,仔细看技术文档,这三步都有解释,首先是这个服务器配置

    image

    这里面比较重要的就是这个URL,文档中解释这个URL是用来接收微信服务器发送过来的消息的,而下面的那个token则是做验证用的。

    首先,要明白先来看一张图

    image

    比如说,我们在手机上给微信公众号发送一个消息,这就相当于一个request请求,然后这个request到达微信服务器,紧接着微信服务器对这个request做出解析,然后开始响应一个response给你,这样你就收到了相应的回复。

    以上是正常的没经过对微信公众平台的二次开发的请求和响应,但是,现在我们进行了微信公众号的开发,就变成了这样

    image

    也就是说,当我们进行微信公众号的开发之后,用户的请求就不再有微信服务器去做处理了,而是由我们自己的服务做处理,然后把消息传给微信服务器,微信服务器再将消息返回给我们的用户。

    在这个过程中,微信服务器起了一个中间商的作用,所以经过这样的分析,微信公众号开发要把我的一点就是,你只要返回给微信服务器正确的数据,微信服务器就能帮你做正确的事情。

    所以作为微信公众号开发的第一步就是接入,你需要将自己的服务器和微信服务器做接通,只有接通之后,用户发送的请求到达微信服务器之后,微信服务器才知道该将这个请求转发给哪个服务器来处理。

    那么该如何接通,这就是技术文档中的接入指南三步走了,也就是这个

    1. 填写服务器配置
    2. 验证服务器地址的有效性
    3. 根据接口文档实现业务逻辑

    首先第一个问题就是这个服务器配置到底该填写啥,技术文档中说是填写一个url,可是这个url具体是什么呢?

    那首先就要搞明白,这个url是用来干嘛的,技术文档中说了,这个url是用来接收微信服务器发送过来的请求的,要对请求做处理?想一想,request?处理?该怎么做呢?

    看一段代码

    
    public class OneServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }

    你知道这个URL,也就是服务器配置该填写上什么了吗?

    未完待续!

    展开全文
  • SpringBoot微信公众号开发

    千人学习 2019-06-03 10:27:32
    通过热门框架spring boot来学习微信公众号开发,帮助同学们快速入门微信公众号开发。
  • 微信公众号+vue+微信支付

    万次阅读 2018-07-11 14:25:32
    在上一篇文章中本人讲述了微信公众号的授权以及获取用户信息,在此基础上今天这篇博客跟大家分享一下微信支付的流程及代码,还有自己在开发时的一些坑。1、在进行微信支付时,除了需要一个公众号之外,你还需要一个...

    在上一篇文章中本人讲述了微信公众号的授权以及获取用户信息,在此基础上今天这篇博客跟大家分享一下微信支付的流程及代码,还有自己在开发时的一些坑。

    1、在进行微信支付时,除了需要一个公众号之外,你还需要一个微信商户。根据商户申请规则进行商户申请

    2、开始配置开发所需要的参数如下所示:


    这是公众号的基本开发配置,这里在微信授权的时候就已经需要配置了 但是注意AppSecret在你第一次配置的时候就需要备份下来,如果没有备份那么下次使用的话你就需要去重置它


    网页域名授权,你需要填写正确的可以访问的项目域名,确保微信可以访问

    3、公众号配置好后我们需要开始配置微信商户平台的内容了

    商户平台需要进行的配置是:商户号,支付密钥

    商户号一般都是和自己公众号的商户号是一样的

    主要是一个支付密钥的配置


    然后是域名配置 和公众号差不多


    配置支付的参数完成之后就可以开始进行开发了  不过在支付开发中可能会有些许的麻烦  那就是你不能在线下本机测试,因为IP白名单的限制  除非你将自己的本机地址进行地址映射,但是映射操作比较繁琐,如果自己的项目不是很大的话那就自己麻烦一点部署项目然后进行测试吧,如果你想进行映射之后本机测试这里可以推荐一个组件给你访问链接https://natapp.cn/

    4、开始正式的代码书写 这里使用的SDK是(

    (1)后台进行支付配置: 

               //实例配置

                var config = new WeChatConfig()
                {
                    AppId = "wx7a87835d950f228f",
                    AppSecret = "97d8581300ed49326c53db5373e07104",
                    MchId = "1502779501",
                    Notify = "http://medicalapi.xin-lai.com/PayNotify/0/wechat",//这是支付回调路径(不是前端路径,这个很坑)
                    TenPayKey = "wlsoftnewhissong3355180meiyanfei",  
                    PayAppId = "wx7a87835d950f228f"
                };
                WeChatSDKBuilder.Create()
                    //设置日志记录
                    .WithLoggerAction((tag, message) =>
                    {
                        logger.Debug(string.Format("Tag:{0}\tMessage:{1}", tag, message));
                    })
                    //注册Key。不再需要各个控制注册
                    .Register(WeChatFrameworkFuncTypes.GetKey, model =>
                        {
                            return "wx8370799bb85178a8";
                        }
                    )
                    //注册获取配置函数:根据Key获取微信配置(加载一次后续将缓存)
                    .Register(WeChatFrameworkFuncTypes.Config_GetWeChatConfigByKey,
                        model =>
                        {
                            return config;
                        })
                   //注册微信支付配置
                   .Register(WeChatFrameworkFuncTypes.Config_GetWeChatPayConfigByKey, model =>
                        {
                            return config;
                        }
                   )

                    .Build();

    你可以将config写在项目的配置文件中然后进行获取  我这里是直接实例化直接了当

    (2)支付还需要配置回调处理逻辑:

    //支付回调设置
                PayNotifyBuilder
                    .Create()
                //设置日志记录
                .WithLoggerAction((tag, message) =>
                {
                    logger.Debug(string.Format("Tag:{0}\tMessage:{1}", tag, message));
                }).WithPayNotifyFunc(async(input) =>
                {
                    switch (input.Provider)
                    {
                        case "wechat":
                            {
                                var api = new WeChatPayApi();
                                var output = api.PayNotifyHandler(input.Request.Body);
                                if (output.IsSuccess())
                                {
                                    bool theresult = true;
                                    var resultLog = output.ToJsonString();
                                    logger.Debug("微信支付处理成功: " + resultLog);
                                    //判断支付类别并编辑处理
                                    if (output.Attach.StartsWith("门诊"))
                                    {
                                        OutpatientsAppService outpatientsAppService = new OutpatientsAppService(new XmlSerializeAppService());
                               theresult= await outpatientsAppService.LoadChargeListInfo(new Outpatients.Dto.LoadChargeListInfoinput()
                                        {
                                            patCardNo = output.Attach.Substring(2),
                                            psOrdNum = output.TransactionId,
                                            hisOrdNum = output.OutTradeNo,
                                            payMode = "WXPay",
                                            payAmt = Convert.ToDecimal(output.TotalFee) % 100,
                                            payTime =output.TimeEnd,
                                            patCardType= "院内诊疗卡",
                                            agtOrdNum= output.Attach.Substring(2),
                                        });
                                    }
                                    else if (output.Attach.StartsWith("住院"))
                                    {
                                        logger.Debug("进入住院缴费!");
                                    }
                                    else if (output.Attach.StartsWith("挂号"))
                                    {
                                        RegistrationsAppService registrationsAppService = new RegistrationsAppService(new XmlSerializeAppService());
                                        theresult= await registrationsAppService.RegistPay(output.Attach.Substring(2));


                                    }


                                    if (theresult == true)
                                    {
                                        logger.Debug(output.Attach.Substring(0, 2) + "缴费支付完成!");
                                        logger.Debug("缴费卡号!"+output.Attach.Substring(2));
                                    }
                                    else
                                    {
                                        logger.Debug(output.Attach.Substring(0,2)+"缴费支付未完成!");
                                    }
                                }
                                else
                                {
                                    //此处编写失败处理逻辑
                                    var failLog = output.ToJsonString();
                                    logger.Error("微信支付处理失败: " + failLog);


                                    return await Task.FromResult("<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[回调处理失败]]></return_msg></xml>");
                                }

                            }
                            break;
                        default:
                            break;
                    }
                    return null;

                }).Build();

    (3)支付接口的封装与调用

    先是进行微信统一下单

     /// <summary>
        /// 支付接口实现类
        /// </summary>
        [Produces("application/json")]
        [Route(ApiPrefix + "[controller]")]
        public class WhechatPayAppService : AppServiceBase, IwhechatPayAppService
        {
            /// <summary>
            /// 依赖注入
            /// </summary>
            private readonly IHttpContextAccessor _httpContextAccessor;


            public WhechatPayAppService(IHttpContextAccessor httpContextAccessor)
            {
                _httpContextAccessor = httpContextAccessor;
            }
            /// <summary>
            /// 下单 获取微信支付授权
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            [AbpAllowAnonymous]
            [HttpPost("GetPayurl")]
            public async Task<UnifiedorderResult> GetPayurl(Payinfoinput input)
            {
                //获取实际IP
                string clientIp = null;
                if (clientIp.IsNullOrWhiteSpace())
                    clientIp = _httpContextAccessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();


                clientIp = clientIp ?? "8.8.8.8";


                using (UnitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant, AbpDataFilters.MustHaveTenant))
                {
                    var config = WeChatConfigManager.Current.GetPayConfig();
                    var result = WeChatApisContext.Current.TenPayV3Api.Unifiedorder(new WeChat.SDK.Pays.TenPayV3.UnifiedorderRequest
                    {
                        Body = input.Body,
                        OpenId = input.OpenId,
                        TimeStart = DateTime.Now.ToString("yyyyMMddHHmmss"),
                        TimeExpire = DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"),
                        TradeType = "JSAPI",
                        DeviceInfo = "WEB",
                        TotalFee =Convert.ToInt32(input.Cash * 100).ToString(),
                        OutTradeNo = input.OutTradeNo,
                        SpbillCreateIp = clientIp,
                        Attach=input.Attach,
                    });
                    if (result.ReturnCode == "FAIL")
                        throw new UserFriendlyException(result.Message);
                    var dict = new Dictionary<string, string>
                    {
                        {"appId", result.AppId},
                        {"timeStamp", PayUtil.GetTimestamp()},
                        {"nonceStr", result.NonceStr},
                        {"package", "prepay_id=" + result.PrepayId},
                        {"signType", "MD5"}
                    };
                    dict.Add("paySign", PayUtil.CreateMd5Sign(dict, WeChatConfigManager.Current.GetPayConfig().TenPayKey));


                    return new UnifiedorderResult
                    {
                        MWebUrl = null,
                        PrepayId = "prepay_id=" + result.PrepayId,
                        TradeType = result.TradeType,
                        AppId = result.AppId,
                        paySign= dict["paySign"],
                        nonceStr = result.NonceStr,
                        timeStamp= dict["timeStamp"],
                        msg=result.ErrCodeDes,
                    };
                }
            }

    前端调用统一下单接口 发起支付


    统一下单完成之后  用完成返回的参数唤起支付


    前端js会返回支付的结果给你  同时后台会异步的根据你配置的url返回支付回调的信息 

    坑:当微信支付完成页面收起之后,会回到你原来的页面  但是这时你的这个页面是没有路径的

    在这里一般前端只做简单的页面处理,后台进行具体业务处理如上述支付回调配置所述   这样你的支付就完成了  

    相比微信授权来说 公众号的内容就比较好理解了!  

    展开全文
  • 微信公众号开发——项目搭建

    万次阅读 2018-09-11 15:23:25
    前往微信公众平台(https://mp.weixin.qq.com/)获取开发权限和开发账号,公众号分为好几种,小程序,订阅号,服务号,企业号,个人只能用订阅号,权限比较少(api接口权限); 二 想要自定义模块功能或者是回复...

    一 

    前往微信公众平台(https://mp.weixin.qq.com/)获取开发权限和开发账号,公众号分为好几种,小程序,订阅号,服务号,企业号,个人只能用订阅号,权限比较少(api接口权限);

    想要自定义模块功能或者是回复信息啥的,就得有一个自己的后台来写接口,所以要配置自己的服务器

    基本配置:服务器配置(首页-开发-基本配置-服务器配置)

    进入修改配置,这里的服务器地址必须是外网(没有服务器的小伙伴如果这里分不清。。外网特征就是别人可以通过你的本机ip直接访问到,在简单点就是,你如果使用WiFi连接的网络那就肯定是内网或者说是局域网,查看方式,window键加R键,输入cmd回车,然后输入ipconfig 查看你当前的ip,然后百度本机ip,不一样的话就不是外网,解决办法是使用natapp进行内网穿透或者是用路由器进行端口映射,将服务器的某个端口映射出去,在最后会有详细步骤)而且是80端口,格式为ip/域名+wx(接口名 ,固定,但是前面可以加路由比如ip/home/wx)Token随便写个;

    然后是后台不多说先上代码:

    /// <summary>
    /// 配合微信服务器验证域名或者是ip的可用行或者是获取消息的推送--pxj
    /// </summary>
    [AtSkipAuthorize]
    public void wx()
    {
    	//获取消息推送,或者是事件推送,类型是xml文件流
    	if (Request.RequestType == "POST")
    	{
    
    	}
    	else
    	{
    		#region 验证请求来源是否是微信
    		string signature = Request["signature"].ToString();
    		string timestamp = Request["timestamp"].ToString();
    
    		string nonce = Request["nonce"].ToString();
    		string echostr = Request["echostr"].ToString();
    		string token = "hellowb";
    		List<string> list = new List<string>() { token, timestamp, nonce };
    		list.Sort();
    		string data = string.Join("", list);
    		byte[] temp1 = Encoding.UTF8.GetBytes(data);
    		SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
    		byte[] temp2 = sha.ComputeHash(temp1);
    
    		var hashCode = BitConverter.ToString(temp2);
    		hashCode = hashCode.Replace("-", "").ToLower();
    
    		if (hashCode == signature)
    		{
    			Response.Write(echostr);
    			Response.End();
    		}
    		LogHelper.WriteLog("signature:" + signature + " timestamp:" + timestamp + " nonce:" + nonce + " echostr:" + echostr);
    		#endregion
    	}
    }

    写好后台配置好服务器就可以在微信公众号网站也就是刚才的那个页面点击提交了,点击提交后微信的服务器会向你所配置的服务器80端口的这个接口发送GET请求,验证接口是否正确,如果提交成功,恭喜你可以进入下一个坑了;

    当你在写微信公众号的页面的时候,你有时候会用到上传图片或者打开摄像机等要求,这时候要接入JS_SDK,配置签名等等,这个签名应该算是配置里最难受的一块了。。。

    签名的获取有几个步骤,先是要通过appid和appSecret来获取access_token,然后用access_token来获取jsapi_ticket,代码如下

     //获取access_token
    string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
    var wc = new WebClient();
    string access_tokenRet = wc.DownloadString(url);
    string access_token = JsonHelper.JsonToObj<AccessTokenModel>(access_tokenRet).Access_Token;
    accesstokenstatic = access_token;
    
    //获取jsapi_ticket
    string Jsapi_TicketUrl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
    var jsapiRet = wc.DownloadString(Jsapi_TicketUrl);
    string ticket = JsonHelper.JsonToObj<TickModel>(jsapiRet).ticket;
    ticketstatic = ticket;

    然后获取十位的时间戳和自己写的随机字符串和页面传来的url,将jsapi_ticket,url,timestamp(时间戳),nocestr(随机字符串随便写一个就行)sort方法排序,然后根据这几个的顺序进行赋值并用sha1加密如下

    string signaturestring = "jsapi_ticket=" + ticket + "&noncestr=" + nocestr + "&timestamp=" + timestamp + "&url=" + url2;
    byte[] temp1 = Encoding.UTF8.GetBytes(signaturestring);
    
    SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
    byte[] temp2 = sha.ComputeHash(temp1);
    var hashCode = BitConverter.ToString(temp2);
    hashCode = hashCode.Replace("-", "").ToLower();

     如此一来全部的都有了,返回这些就行了,如果报错了说url不合法就要取配置以下域名,二级域名也能用;

    四 ,带参二维码的扫描和事件的推送

    当你的公众号涉及到分享二维码给其他人,每一张二维码上还得要有你的信息的时候,需要在公众号的二维码上添加上一个场景值,比如你的用户id,当客户或者是其他用户通过你分享的二维码进入公众号的时候,微信服务器会推送给你一个xml包,其中一个子节点上就存着那个场景值;

    直接上代码--获取部分,

     public void GetQrCode()
     {
    	 string accesstoken = accesstokenstatic;
    	 if (string.IsNullOrEmpty(accesstoken))
    	 {
    		 //先主动取获取以下所需要的变量
    		 getaccesstoken(null, null);
    		 accesstoken = accesstokenstatic;
    		 Timer();
    	 }
    	//使用匿名对象作为post的参数然后再序列化
    	 var datap = new
    	 {
    		 //二维码的有效期(10天)
    		 expire_seconds = 864000,
    		 //类型动态的二维码
    		 action_name = "QR_SCENE",
    		 //信息
    		 action_info = new
    		 {
    			 scene = new {
    				 //自定义参数数值型为scene_id ,字符为scene_str
    				 scene_id = 15552300793
    			 }
    		 }
    	 };
    	 //使用流发送post带参请求
    	 string url = string.Format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}",accesstoken);
    	 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    	 request.Method = "POST";
    	 request.ContentType = "application/json";
    	 byte[] data = Encoding.UTF8.GetBytes(JsonHelper.ModelToJson(datap));
    	 request.ContentLength = data.Length;
    	 using (Stream strea = request.GetRequestStream())
    	 {
    		 strea.Write(data,0,data.Length);
    		 strea.Close();
    	 }
    	 HttpWebResponse respose = (HttpWebResponse)request.GetResponse();
    	 Stream stream = respose.GetResponseStream();
    	 string stringRespose = "";
    	 using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
    	 {
    		 stringRespose = sr.ReadToEnd();
    	 }
    	 if (string.IsNullOrEmpty(stringRespose))
    	 {
    		 Response.Write("sorry");
    	 }
    	 else { 
    		 //此时已经获取到二维码所使用的ticket
    		 string qrticket = JsonHelper.JsonToObj<QrCoderTicektModel>(stringRespose).ticket; 
    		 //二维码解析后的地址(可以自己转化为二维码)
    		 string qrurl =  JsonHelper.JsonToObj<QrCoderTicektModel>(stringRespose).url; 
    		 Response.Write("hhhhhh");
    		 LogHelper.WriteLog("getsometing:" + stringRespose);
    	 }
     }

    现在是获得了二维码的解析后的url,和获取二维码的ticket;有两种方式可以得到二维码,一种是直接将这个地址url返给前端,前端自己生成,二是后台获取到这个二维码后保存到服务器,前端自己去取;

    获取微信的推送,如刚才所说,扫码的时候会发送一个xml包;

    代码如下

    public void wx()
    {
    	//获取消息推送,或者是事件推送,类型是xml文件流
    	if (Request.RequestType == "POST")
    	{
    		#region 推送
    		//加载xml包,获取推送的内容
    		StreamReader sr = new StreamReader(Request.InputStream);
    		string xmlData = sr.ReadToEnd();
    		LogHelper.WriteLog(xmlData);
    		var doc = new XmlDocument();
    		doc.LoadXml(xmlData);
    		//获取xml包里的消息类型和事件类型,分类处理
    		var msgTypeNode = doc.SelectSingleNode("xml/MsgType");
    		var evenTypeNode = doc.SelectSingleNode("xml/Event");
    		string msgTypeString = msgTypeNode.InnerText;
    		if (evenTypeNode == null)
    		{
    			//此时为普通的消息推送
    		}
    		else
    		{
    			//此时为事件推送
    			string evenTypeString = evenTypeNode.InnerText;
    			//扫描带参的二维码的时候和关注和取关的推送
    			if (evenTypeString == "SCAN" || evenTypeString == "subscribe")
    			{
    				string SaoMaRenOpenId = doc.SelectSingleNode("xml/FromUserName").InnerText;
    				var BeiSaoRenCanShuNode = doc.SelectSingleNode("xml/EventKey");
    				if (BeiSaoRenCanShuNode != null)
    				{
    					string BeiSaoRenCanShuSting = BeiSaoRenCanShuNode.InnerText.Split('_')[1];
    					//已经获取扫码人和被扫人的个人id,下面就是存到数据库做关联就ok了,用到的时候取
    				}
    			}
    
    			//地理位置推送
    			if (evenTypeString == "LOCATION")
    			{
    
    			}
    
    			//点击自定义菜单拉去信息的时候的推送
    			if (evenTypeString == "CLICK")
    			{
    
    			}
    		}
    		#endregion
    	}

    五,

    natapp内网穿透:

    https://natapp.cn/注册,登录,获取自己的隧道,下载客户端,解压,cmd进入客户端的文件夹,natapp.exe -authtoken = "你的autotoken",

    如下则成功了

     

     

    展开全文
  • 项目实现地址。查看我的[Github地址]... 目前具体可获取指标(包含但不局限):阅读数、点赞数(在看)、评论内容及总数、正文内容及图片、是否为头条、是否为原创。
  • 微信公众号实现登陆

    千次阅读 2019-02-20 15:34:44
    微信公众号实现静默登陆与非静默登陆 非静默登陆 (1)需要引导用户点击 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;”...
  • 1、OAuth2.0简介  OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该... ...每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某...
  • 免费创建微信公众号全攻略

    万次阅读 2016-03-11 22:08:56
    微信的平台分为公众平台和开放平台。 公众平台就是面向公众的平台。 分为3类: 订阅号 : 发布信息用的,面向个人或企业俗称自媒体(无微信支付), 。 服务号 : 面向企业的公众平台,比如招行等企业的应用(和钱有关)。 ...
  • 如何创建一个微信公众号

    万次阅读 2018-08-29 21:46:46
    最近有不少问我怎样从0创建一个微信公众号,简单指导之后感觉大家都不太明白,所以打算写一篇教程文章来告诉大家如何创建订阅号,欣然提笔! 这里我们首先打开网址https://mp.weixin.qq.com/,我们会看到下面的界面...
  • 用Django开发微信公众号

    千次阅读 2018-12-11 16:48:28
    用Django开发微信公众号 准备工作: 1.申请一个微信公众号 2.安装Python,PyCharm,下载wechatpy(pip install wechatpy) 3.服务器 如是自己没有服务器,下载ngrok ,ngrok 是一个反向代理,通过在公共端点和本地运行...
  • 微信公众号开发(一)服务器及接口的配置

    万次阅读 多人点赞 2019-05-22 09:21:41
    微信公众号开发(一)服务器及接口的配置 关于微信公众号中的订阅号和服务的区别这里不多加讨论,网上有很多资源可以搜到,这里直接进入正题,如果是个人开发者,这里建议使用测试号进行开发学习,测试号的权限要比...
  • 关于python爬取搜狗微信公众号文章永久链接 本文主要讲解思路,代码部分请自行解决 搜狗微信搜素获取公众号及文章 通过微信公众平台获取永久链接 python+scrapy框架 mysql数据库存储+读取公众号 获取搜狗...
  • 微信公众号主要面向名人、政府、媒体、企业等机构推出的合作推广业务。在这里可以通过微信渠道将品牌推广给上亿的微信用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象。 3. 公众平台 微信公众平...
  • 微信公众号之开发者工具

    万次阅读 2020-04-06 16:49:32
    一、前言 这次的项目主要是关于微信公众号的一个开发,本人这次分配的模块是后台微信公众号的支付和退款,第一次接触微信公众的项目刚开始一脸懵逼,开发过程中遇到各种坑,所以想自己写一篇详细的关于微信公众号的...
  • 微信公众号网页授权登录

    万次阅读 2018-09-11 09:08:37
    微信公众号网页授权登录: 前端时间做了一个微信公众号的项目,就是微信公众号的菜单点击我的个人中心,就向用户授权登录 获取用户的信息,进行业务逻辑的操作,微信公众号官方文档,这是我写的文章,里面有很多...
  • 如果公司需要开发小程序,首先要在公司微信公众号里面申请小程序,快速开通并认证之后才能使用。微信最新推出,只要认证过微信公众号,那么接着认证微信小程序就可以复用微信公众号资质注册小程序流,快速注册认证小...
  • 微信小程序与微信公众号同一用户登录问题 最近在做微信小程序与微信公众号登录合并的接口。整理相关资料以及个人认识的心得写了这篇文章与大家一起分享。 首先,简单说下我遇到的问题是我们的程序调用微信...
1 2 3 4 5 ... 20
收藏数 267,732
精华内容 107,092
关键字:

微信公众号