背景

  公司有一个产品,需要用到微信授权登录及微信消息推送等功能。本来能够简单的使用公众号的接口将appid和appsecrect等信息写到配置文件里,但是作为一个产品化的东西,从体验等各方面来讲都不能那么的顺畅。于是打算对接微信开放平台。本文是基于Laravel的一次微信开放平台整合记录,如果能够帮到一些朋友,自然是非常高兴的事情。

由浙江百牛信息技术 bainiu.ltd整理发布于博客园

平台账号申请

  网址是https://open.weixin.qq.com/  进入后选择第三方平台,点击创建第三方平台按钮。如下图。

填完基础的信息后。下一步,选择必须的服务,此处省略图,选择你要用到的服务就行了。下图是最后一步需要填写的相关参数信息。登录授权的发起页域名为业务系统部署域名;授权测试公众号列表是用于测试的公众号的原始id,用分号隔开;授权事件接收URL是用于接收component_verify_ticket等公众号授权信息的接口地址,此处先在laravel中写了个接口地址/notification/openPlatform;公众号消息校验Token随便填一个就可以了;解密Key填一个在代替公众号收发消息过程中使用。必须是长度为43位的字符串,只能是字母和数字;消息与事件URL这个厉害了,所有公众号的消息和事件到时候都会转发到这个接口里来的,我这边填/notification/openIndex/$APPID$,后面的$APPID$这个参数到时候会替换成对应公众号的appid,这里只是个占位符,当然路由里必须得有这个参数。如果是没有路由系统的一些框架,可能需要通过pathinfo的方式进行传递了,这里不允许使用?appid=1234这种方式进行传递;开发域名就是系统部署域名,一般小系统跟登录授权域名保持一致,分布式的可能会有多个服务器或者站点来部署;ip地址白名单就不用多说了,就是服务器的ip地址,除了这个ip,其他的都无法访问。

填完上述信息进行保存就OK了。到此整个申请开放平台的第一步过程就结束了。接下来我们就要取写程序,进行测试,腾讯有一套自动化测试系统,通过自动化测试系统才能够进行全网发布,下面要开始Coding了,会贴一些关键代码。

Coding

  编码前先到应用的详情中把AppId和AppSecret拿过来,找个地方先保存起来。

  编码这边用到了一个第三方微信类库,还是比较推荐使用的。叫EasyWechat,通过composer把它添加到项目中去。在config文件中先配置下appid和appsecret等信息。

1
2
3
4
5
6
'open_platform' => [
        'app_id'   => 'wxc9c43170xxxx791',
        'secret'   => '6d36b19b6xxxxxxxxxf531be47f6235a',
        'token'    => 'kftcvr1436942017',
        'aes_key'  => 'ZQnZsLxxxxxxxxxwmmBSTofPzauHBhCIgsVgLGVwncNA'
    ],

  

  先写几个路由。

  1. Route::any('/notification/openPlatform','Service\OpenPlatformController@notify')->name('notification.openPlatformNotify');    //微信通知,主要是component_verify_ticket等信息
  2. Route::any('/notification/openIndex/{appid}','Service\OpenPlatformController@index')->name('notification.openPlatformIndex');  //所有微信公众号消息入口,包括文本、图文、语音、地理位置等各种信息,这个具体实现就相当于做一个公众号平台了。
  3. Route::any('/wxcallback','Service\OpenPlatformController@wxcallback')->name('notification.openPlatformCallback');          //授权回调方法,用于保存appid和refresh_token
  4. Route::any('/wxauth','Service\OpenPlatformController@auth')->name('notification.openPlatformAuth');              //预授权页面
  5. Route::any('/wxtest','Service\OpenPlatformController@test')->name('notification.openPlatformTest');              //测试页
 

  编写notify方法。SDK 内部已实现缓存 component_veirfy_ticket,开发者无需另行处理该事件。使用 doctrine/cache 来完成缓存工作,它支持基本目前所有的缓存引擎。默认使用文件缓存,如果要用redis等其他缓存方式,比如多台服务器这种情况。请查阅easywechat官方文档缓存那部分。

  1. use App\Http\Controllers\Controller;
  2. use EasyWeChat\Core\Exception;
  3. use EasyWeChat\Foundation\Application;
  4. use EasyWeChat\OpenPlatform\Guard;
  5. use Illuminate\Support\Facades\DB;
  6. use Symfony\Component\HttpFoundation\Response;
  7.  
  8. public function notify(){
  9. $options = ['open_platform' => config('wechat.open_platform')];
  10. $app = new Application($options);
  11. $openPlatform = $app->open_platform;
  12.  
  13. $server = $openPlatform->server;
  14.  
  15. $server->setMessageHandler(function($event) use($openPlatform){
  16. switch ($event->InfoType) {
  17. case Guard::EVENT_AUTHORIZED: // 授权成功
  18. $res = $openPlatform->getAuthorizationInfo($event->AuthorizationCode);
  19. //@TODO 此处需要检查res是否正常
  20. //Save to DB
  21. $appid = $res->authorization_info['authorizer_appid'];
  22. $refresh_token = $res->authorization_info['authorizer_refresh_token'];
  23. DB::table("wechat_platform")->where('app','hr')->update(['appid' => $appid,'refresh_token' => $refresh_token]);
  24.  
  25. break;
  26. case Guard::EVENT_UPDATE_AUTHORIZED: // 更新授权
  27. //
  28. break;
  29. case Guard::EVENT_UNAUTHORIZED: // 取消授权
  30. //
  31. break;
  32.  
  33. }
  34. });
  35.  
  36. $response = $server->serve();
  37. return $response;
  38. }
 

  编写预授权页面。这里前端要写个页面,在页面中加上超链接,必须在同一个域名下。链接到auth方法。

  1. <a style="color: inherit" href="http://hr.hackcat.com/wxauth"><p>微信平台绑定</p></a>

这边会跳转到微信的授权页。弹出一个授权二维码,公众号账号的主人扫一下授权一下会跳回到下面的回调页面。

  1. public function auth(){
  2. $options = ['open_platform' => config('wechat.open_platform')];
  3. $app = new Application($options);
  4. $openPlatform = $app->open_platform;
  5. $response = $openPlatform->pre_auth->redirect('http://hr.hackcat.com/wxcallback');
  6. return $response;
  7. }
 

  编写授权回调页面。这里主要是保存 authorizer_appid和authorizer_refresh_token信息,用于今后api的调用。

  1. public function wxcallback(){
  2. $options = ['open_platform' => config('wechat.open_platform')];
  3. $app = new Application($options);
  4. $openPlatform = $app->open_platform;
  5.  
  6. try{
  7. $res = $openPlatform->getAuthorizationInfo($authorizationCode = null);
  8. $appid = $res->authorization_info['authorizer_appid'];
  9. $refresh_token = $res->authorization_info['authorizer_refresh_token'];
  10.  
  11. DB::table("wechat_platform")->where('app','hr')->update(['appid' => $appid,'refresh_token' => $refresh_token]);
  12.  
  13. return 'Success';
  14. }catch (Exception $ex){
  15. abort(404,$ex->getMessage());
  16. }
  17. }
 
  1. public function test(){
  2. $options = ['open_platform' => config('wechat.open_platform')];
  3. $app = new Application($options);
  4. $openPlatform = $app->open_platform;
  5. $authInfo = DB::table("wechat_platform")->where('app','hr')->first();
  6.  
  7. $app = $openPlatform->createAuthorizerApplication($authInfo->appid, $authInfo->refresh_token);
  8. $userService = $app->user;
  9. $user = $userService->get("oSQ2Ks_6ns0ahqKvzO_voIzbMdjI");
  10. dd($user);
  11.  
  12. }
 

上面的是测试方法,用于测试保存的appid和refresh_token是否工作。

这一篇就到此为止吧,期间mac的chrome奔溃了N次,重复写了好几遍,都快怒了。

PS: 这个系统由于用不到消息管理,所以去掉了权限的消息管理功能,全网发布的时候就不用写消息管理的测试了。如果有朋友遇到了全网发布时候测试问题,欢迎留言。

原文:https://www.cnblogs.com/hackcat/p/7089318.html

微信开放平台搭建之EasyWeChat的更多相关文章

  1. EasyWeChat微信开放平台第三方平台接入

    EasyWeChat微信开放平台第三方平台接入 https://www.cnblogs.com/bainiu/p/8022729.html

  2. 【小程序】基于.NET CORE2.1 的 微信开放平台 第三方平台开发 教程一 准备工作

    微信第三方平台概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认 ...

  3. weixin 微信开放平台 微信公众平台

    官网地址入口 微信小程序 https://mp.weixin.qq.com/ appid and openid not match 1.appid :是公众号的ID. 2.openid:关注公众号生成 ...

  4. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  5. C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理

    在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...

  6. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  7. 微信开放平台,微信登陆第三方网站 提示redirect_uri 参数错误

    在微信开放平台上我填写的回调域是:bbs.qiaoshisui.com/LoginApi/WeiXinCallBack,我构造的链接是:https://open.weixin.qq.com/conne ...

  8. 微信开放平台API开发资料

    微信大概两年前开启了微信公众平台的API供开发者使用,从账号登陆.消息发送.用户账号管理.公众号菜单.客服接口.微信商店接口.用户卡券接口 以及微信支付接口.可以说是全方面覆盖了电商所需要的要素,与阿 ...

  9. Android App接入微信开放平台注意事项

    一.Android第三方应用接入微信开放平台的注意事项: 1. 到微信开放平台官网申请正式的AppID(需通过审核),要填写包名.app签名的md5值.至于如何获取app签名信息,官方提供签名包apk ...

随机推荐

  1. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  2. C++第4次实验(提高班)—继承和派生1

    从项目2和项目3中选1题作为实验.剩下2题写成作业. [项目1 - 龙三] 请在以下程序的横线处填上适当内容,以使程序完整,并使程序的输出为: Name: 龙三 Grade: 19 #include ...

  3. PHPExcel简易使用教程

    在企业里使用PHP进行开发,不可避免总会遇到读/写Excel的需求,遇到这种需求,一般使用PHPExcel类库进行开发. PHPExcel现在最新版本是1.8.0,最低需要PHP5.2版本,支持读取x ...

  4. &lt;LeetCode OJ&gt; 121. /122. Best Time to Buy and Sell Stock(I / II)

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  5. 【BZOJ3834】[Poi2014]Solar Panels 分块好题

    [BZOJ3834][Poi2014]Solar Panels Description Having decided to invest in renewable energy, Byteasar s ...

  6. 【BZOJ1786】[Ahoi2008]Pair 配对 DP

    [BZOJ1786][Ahoi2008]Pair 配对 Description Input Output Sample Input 5 4 4 2 -1 -1 3 Sample Output 4 题解 ...

  7. 洛谷 2868 [USACO07DEC]观光奶牛Sightseeing Cows

    题目戳这里 一句话题意 L个点,P条有向边,求图中最大比率环(权值(Fun)与长度(Tim)的比率最大的环). Solution 巨说这是0/1分数规划. 话说 0/1分数规划 是真的难,但貌似有一些 ...

  8. ABAP upload file(*.txt *.csv *.xls)

    转自:http://blog.csdn.net/jy00873757/article/details/8534492 在SAP我们经常会用到*.txt, *.csv, *.xls三种文件格式 *.TX ...

  9. tensorflow:typeerror:‘noneType’ object is not callable

    程序运行报错 typeerror: ‘noneType’ object is not callable 解决方法:删除缓存文件,再次运行没有错误 删除__pycache__文件夹

  10. 在Spring中基于JDBC进行数据访问时如何控制超时

    超时分类 超时根据作用域可做如下层级划分: Transaction Timeout > Statement Timeout > JDBC Driver Socket Timeout Tra ...