博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信第三方开放平台-笔录
阅读量:5077 次
发布时间:2019-06-12

本文共 7470 字,大约阅读时间需要 24 分钟。

一、创建第三方平台

点击创建第三方平台后开始填写资料,这里主要注意的有以下几点

1.平台类型

分两种:定制化开发服务商 和 平台型服务商(我这边介绍的是平台型服务商)

2.权限集

分别有公众号 和 小程序的权限 当然两边都可以同时选择,只要选择你需要的权限就可以了,我这里介绍的是小程序

3.开发资料

①授权发起也域名(即用户打开我们自己的授权页域名 例如www.abc.com)

②授权事件接收URL(我们接收所有授权小程序或公众号取消授权通知、授权成功通知、授权更新通知事件的url地址 , 包括接收微信平台推送的ticket)

③消息与事件接收URL (我们接收所有授权小程序或公众号的消息和事件推送,例如客服消息 微信就会推送到这个地址上)

这里要注意一点:该参数按规则填写(需包含/$APPID$,如www.abc.com/$APPID$/callback) 填写的地址需要包含/$APPID$ 我们后续可以用nginx 重写地址 把访问指向同一个地址就可以了

例如:我填写的地址是 www.abc.com/msg/$APPID$/msgEventPath.php    nginx重写地址:  rewrite ^/msg/(.*)/(.*)\.php /msgEventPath.php last;

④其它按照提示填写就可以了,记得天上白名单ip

然后提交审核就可以了

 

二、开发部分

1.保存component_verify_ticket, 微信端会定时推送消息到配置好的 授权事件接收URL 上,我们需要保存这个component_verify_ticket和 不断更新,component_verify_ticket必须保持是微信端推送的最新一个

loadXML($encryptMsg);$array_e = $xml_tree->getElementsByTagName('Encrypt');$array_s = $xml_tree->getElementsByTagName('MsgSignature');$encrypt = $array_e->item(0)->nodeValue;$format = "
";$from_xml = sprintf($format, $encrypt);//解密数据$msg = '';$timeStamp = empty ($_GET ['timestamp']) ? '' : trim($_GET ['timestamp']);$nonce = empty ($_GET ['nonce']) ? '' : trim($_GET ['nonce']);$msg_sign = empty ($_GET ['msg_signature']) ? "" : trim($_GET ['msg_signature']);$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);if ($errCode == 0) { $msg_data = CommonUtil::xmlToArray($msg); //保存ComponentVerifyTicket if (!empty($msg_data['ComponentVerifyTicket'])) { //保存/更新到数据库code }}

 

2.用component_verify_ticket去换取第三方平台的token(第三方平台指的就是我们自己在开发的平台)

token是有有效期的,所以我们要保存它的过期时间,并将token做缓存,当token没过期时就不用再去换取,反之我们要利用最新的component_verify_ticket去重新获取token

/**     * 获取开放平台调用token     * @param $appid     * @param $appsecret     * @param $ticket     * @param string $token_save_path     * @return bool     */    public static function getToken($appid , $appsecret ,$ticket){        if(empty($appid) || empty($appsecret)){            return FormatUtil::formatReturn(-1 , 'fail' , false);        }        $url = 'https://api.weixin.qq.com/cgi-bin/component/api_component_token';        $data = array(            'component_appid' => $appid,            'component_appsecret' => $appsecret,            'component_verify_ticket' => $ticket,        );        $token_info = CommonUtil::curl_post(json_encode($data) , $url);        $token_info = json_decode($token_info , true);        if(!$token_info || empty($token_info['component_access_token'])){            return FormatUtil::formatReturn(-2 , 'fail' , false);        }        return FormatUtil::formatReturn($token_info['errcode'] , $token_info['errmsg'] , $token_info);    }

3.换取预授权码pre_auth_code

pre_auth_code是用来换取微信端的授权二维码的

/**     * 获取预授权码     * @param $appid     * @param $token     * @return multitype     */    public static function getPreAuthCode($appid , $token){        $url = 'https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=';        $url .= $token;        $data = array(            'component_appid' => $appid,        );        $pre_auth_code_info = CommonUtil::curl_post(json_encode($data) , $url);        $pre_auth_code_info = json_decode($pre_auth_code_info , true);        if(!$pre_auth_code_info || empty($pre_auth_code_info['pre_auth_code'])){            return FormatUtil::formatReturn(-1 , 'fail' , false);        }        return FormatUtil::formatReturn($pre_auth_code_info['errcode'] , $pre_auth_code_info['errmsg'] , $pre_auth_code_info);    }

4.跳转到授权页面

用户授权的时候会先打开我们自己的一个页面 (例如 http://www.abc.com/authorization.php ),这个页面里需要做一个按钮或者用js去跳转到微信的授权页面

注意:必须要用js去跳转,用php是不行的

$pre_auth_code = pre_auth_code;$redirect_uri = 'http://www.abc.com/redirect.php'; //回调地址 必须和授权地址同一个域名$redirect_uri = urlencode($redirect_uri);//微信授权二维码地址$url = 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid='.OPEN_APPID.'&pre_auth_code='.$pre_auth_code.'&redirect_uri='.$redirect_uri.'&auth_type=2';//页面自动跳转echo "";exit;

跳转后得到授权码,注意这个页面只能用网页访问,小程序访问不了,因为不能将微信域名配置为业务域名

用户扫码后 就可以授权给第三方平台了

5.授权回调 获取授权二维码时需要提供 预授权码和回调地址;用户点击授权后 页面会直接跳转到回调地址

我们可以通过  $_GET['auth_code'] 去获取授权用户的小程序或二维码 调用接口的access_token(有效期两小时) 并将其保存/更新

然后我们就可以获取授权用户小程序或公众号的信息

/**     * 获取授权用户信息     * @param $authorizer_appid     * @return multitype     */    public static function getAuthorizerInfo($appid , $component_access_token , $authorizer_appid){        $url = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token='.$component_access_token;        $data = array(            "component_appid" => $appid,            "authorizer_appid" => $authorizer_appid,        );        $authorization_info = CommonUtil::curl_post(json_encode($data) , $url);        $authorization_info = json_decode($authorization_info , true);        if(!$authorization_info || !is_array($authorization_info)){            return FormatUtil::formatReturn(-1 , 'fail' , false);        }        return FormatUtil::formatReturn(0 , 'success' , $authorization_info);    }

6.客服消息等

当授权小程序或公众号 收到客服消息或其它一些信息时,微信端会同时把信息推送到我们配置好的 消息与事件接收URL 中;我们需要对数据进行解密并进行后续操作

require_once "./encode/wxBizMsgCrypt.php";$encryptMsg = file_get_contents ( 'php://input' );$ret = array ();// 第三方发送消息给公众平台$time_stamp = empty ( $_GET ['timestamp'] ) ? '' : trim ( $_GET ['timestamp'] );$nonce = empty ( $_GET ['nonce'] ) ? '' : trim ( $_GET ['nonce'] );$msg_sign = empty ( $_GET ['msg_signature'] ) ? "" : trim ( $_GET ['msg_signature'] );$encryptMsg = file_get_contents ( 'php://input' );$pc = new WXBizMsgCrypt ( OPEN_MSG_VERIFY_TOKEN, OPEN_ENCRYPT_KEY, OPEN_APPID );$postArr = CommonUtil::xmlToArray ( $encryptMsg ); // xml对象解析$format = "
";$from_xml = sprintf ( $format, $postArr ['Encrypt'] );// 第三方收到公众号平台发送的消息$msg = '';$errCode = $pc->decryptMsg ( $msg_sign, $time_stamp, $nonce, $from_xml, $msg ); // 解密
if ($errCode == 0) {
  //后续操作 }

7.全网发布

当你开发好所有业务流程后,需要在 微信开放平台后台 点击 全网发布,这样用户才能使用,不然只能白名单的小程序或公众号使用

全网发布需要注意的有几点:

①自动检测,微信会进行自动检测程序,我们需要把说明看清楚

②暂时没有测试资源,这种情况是因为自动检测的人数过多,微信端没有资源,这个我们需要等待一下迟点再发布就行

 

③消息推送检测

自动化测试的专用测试公众号的信息如下:

(1)appid: wx570bc396a51b8ff8

(2)Username: gh_3c884a361561

自动化测试的专用测试小程序的信息如下:

(1)appid:wxd101a85aa106f53e

(2)Username: gh_8dad206e9538

以上是微信自动检测的两个测试号,我们需要在 消息与事件接收URL 做判断是否测试号访问,如果是我们需要马上做出回应(客服消息推送)

 回应代码晚点贴出来。。。

/**     * 发送客服消息     * @param $authorizer_access_token     * @param $touser     * @param $content     * @param string $msgtype     */    public static function sendCustomerMessage($authorizer_access_token , $touser , $content , $msgtype = 'text'  ){        $url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$authorizer_access_token;        $data = array(            "access_token" => $authorizer_access_token,            "touser" => $touser,            "msgtype" => $msgtype,        );        switch ($msgtype){            case "text":                $data["text"] = ["content" => $content];                break;        }        $send_data = CommonUtil::curl_post(json_encode($data) , $url);        error_log('【'.date('Y-m-d H:i:s').'】$send_data:'.var_export($send_data , true)."\n" , 3 , '/web/php/tmp/kenTest.log');        $send_data = json_decode($send_data , true);        if(!$send_data || !is_array($send_data)){            return FormatUtil::formatReturn(-1 , 'fail' , false);        }        return FormatUtil::formatReturn(0 , 'success' , $send_data);    }

 

 

以上微信第三方平台开发流程适用于公众号和小程序,但我是以小程序举例,部分接口可能与公众号不同,需要查看官方文档

后续再优化更新细节,有不懂的可以留言

转载于:https://www.cnblogs.com/KenChung/p/10731050.html

你可能感兴趣的文章
软件目录结构规范
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
蓝桥杯-分小组-java
查看>>
Android Toast
查看>>
iOS开发UI篇—Quartz2D使用(绘制基本图形)
查看>>
docker固定IP地址重启不变
查看>>
桌面图标修复||桌面图标不正常
查看>>
JavaScript基础(四)关于对象及JSON
查看>>
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
雨林木风 GHOST_XP SP3 快速装机版YN12.08
查看>>
数据结构3——浅谈zkw线段树
查看>>