介绍

在做微信开放平台第三方应用开发的时候,每次都要登录到微信开放平台中操作,如果多了的话,很不方便,所以想到集成到自己后台操作,这样就可以同时管理n个开放平台里面的n个第三方应用了。

犹豫代码涉及逻辑会比较复杂,所以只提取了相关部分。

步骤

获取cookie和token

在操作第三方之前,需要获取token和cookie,获取方式如下代码:

<?php
namespace App\Utils\Wx;
use App\Models\WxOpen;
use EasyWeChat\Factory;
use Illuminate\Support\Facades\Cache;
/*** Description:* Class WxOpenUtils* User: Vijay <1937832819@qq.com>* Site: https://www.choudalao.com/* Date: 2022/1/11* Time: 11:43* @package App\Utils\Wx*/
class WxOpenUtils extends WxBaseUtils
{protected $msg = null;private $openApp = null;protected static $instance = null;// 登录前的cookie// CACHE_BEFORE_COOKIE_KEY_openAppIdconst CACHE_BEFORE_COOKIE_KEY = 'CACHE_BEFORE_COOKIE_KEY_';// CACHE_LOGIN_COOKIE_KEY_openAppIdconst CACHE_LOGIN_COOKIE_KEY = 'CACHE_LOGIN_COOKIE_KEY_';// CACHE_LOGIN_TOKEN_KEY_openAppIdconst CACHE_LOGIN_TOKEN_KEY = 'CACHE_LOGIN_TOKEN_KEY_';// CACHE_APPLIST_COOKIE_KEY_openAppIdconst CACHE_APPLIST_COOKIE_KEY = 'CACHE_APPLIST_COOKIE_KEY_';const OPEN_BASE_URL = 'https://open.weixin.qq.com';public function __construct(){// 首先要获取open对象$this->openApp = $this->getOpenApp();if (!$this->openApp) {$this->msg = '开放平台获取失败';return false;}}/*** 获取开放平台登录token* User: Vijay <1937832819@qq.com>* Date: 2021/12/26* Time: 21:13* @param bool $isCache* @return bool|mixed*/public function getLogin($isCache = false){$cacheTokenName = self::CACHE_LOGIN_TOKEN_KEY . $this->openApp['id'];$token = Cache::get($cacheTokenName);$cacheCookieName = self::CACHE_LOGIN_COOKIE_KEY . $this->openApp['id'];$cookie = Cache::get($cacheCookieName);$list = ['token' => $token,'cookie' => $cookie];if (!$token || !$cookie || $isCache == true) {$res = $this->setLogin($isCache);if ($res === false) {return false;}$list = array_merge($list, $res);}return $list;}/*** 获取开放平台(根据第三方来得到开放平台信息,开放平台只有后台用到,没有做缓存处理)* User: Vijay <1937832819@qq.com>* Date: 2021/12/26* Time: 21:38* @return array|null*/public function getOpenApp(){if (is_null($this->openApp)) {$this->openApp = [];// 根据自己的数据库设计,查询出开放平台数据,主要是账号密码等数据$openApp = WxOpen::query()->where('id', 1)->first();if (!empty($openApp)) {$this->openApp = $openApp->toArray();}}return $this->openApp;}/*** Description:获取登录token* User: Vijay* Date: 2022/1/10* Time: 22:23* @param bool $isCache* @return bool|mixed*/public function getLoginToken($isCache = false){$cacheTokenName = self::CACHE_LOGIN_TOKEN_KEY . $$this->openApp['id'];$token = Cache::get($cacheTokenName);if (!$token) {$loginList = $this->getLogin($isCache);if ($loginList == false) {return false;}$token = $loginList['token'];}return $token;}/*** User: Vijay <1937832819@qq.com>* Date: 2021/12/28* Time: 21:19* @param bool $isCache* @return array|bool*/private function setLogin($isCache = false){$cookie = $this->getBeforeCookie($isCache);$passwd = md5(trim($this->openApp['password']));$account = $this->openApp['account'];$param = ['account' => $account,'passwd' => $passwd,'f' => 'json','lang' => 'zh_CN','ajax' => '1','key' => '1',// 'token' => null,];$url = self::OPEN_BASE_URL . '/cgi-bin/login';$response = $this->curlExecute($url, 'POST', $param, self::OPEN_BASE_URL, self::OPEN_BASE_URL, $cookie);list($header, $body) = explode("\r\n\r\n", $response, 2);$preg_cookie = '/Set-Cookie: (.*?);/m';preg_match_all($preg_cookie, $header, $cookie);$cacheCookieName = self::CACHE_LOGIN_COOKIE_KEY . $this->openApp['id'];$cookieStr = implode(';', $cookie[1]);Cache::put($cacheCookieName, $cookieStr, 3600);$data = json_decode($body, true);if (!isset($data['base_resp']['err_msg'])) {$this->msg = 'base_resp获取失败';return false;}if ($data['base_resp']['err_msg'] != 'ok') {$this->msg = $data['base_resp']['err_msg'];return false;}$cacheTokenName = self::CACHE_LOGIN_TOKEN_KEY . $this->openApp['id'];$token = $data['base_resp']['token'];Cache::put($cacheTokenName, $token, 3600);return ['token' => $token,'cookie' => $cookieStr];}/*** 设置cookie* User: Vijay <1937832819@qq.com>* Date: 2021/12/26* Time: 19:29* @return string*/private function setBeforeCookie(){$cacheName = self::CACHE_BEFORE_COOKIE_KEY . $this->openApp['id'];$response = $this->curlExecute(self::OPEN_BASE_URL);$preg_cookie = '/Set-Cookie: (.*?);/m';preg_match_all($preg_cookie, $response, $cookie);$cookieStr = implode(';', $cookie[1]);Cache::put($cacheName, $cookieStr, 3600);return $cookieStr;}/*** 获取cookie* User: Vijay <1937832819@qq.com>* Date: 2021/12/26* Time: 20:49* @param bool $isCache true 更新缓存* @return mixed|string*/public function getBeforeCookie($isCache = false){$cacheName = self::CACHE_BEFORE_COOKIE_KEY . $this->openApp['id'];$cookieStr = Cache::get($cacheName);if (empty($cookieStr) || $isCache == true) {return $this->setBeforeCookie();}return $cookieStr;}/*** Description:* User: Vijay* Date: 2022/1/10* Time: 22:29* @param bool $isCache* @return array|bool*/public function appList($isCache = false){$loginList = $this->getLogin($isCache);if ($loginList == false) {return false;}$url = self::OPEN_BASE_URL . '/cgi-bin/applist?t=manage/list&page=0&num=20&openapptype=1&lang=zh_CN&token=' . $loginList['token'];$response = $this->curlExecute($url, 'GET', [], '', '', $loginList['cookie']);list($header, $body) = explode("\r\n\r\n", $response, 2);$preg_cookie = '/Set-Cookie: (.*?);/m';preg_match_all($preg_cookie, $header, $cookie);$cacheCookieName = self::CACHE_APPLIST_COOKIE_KEY . $this->openApp['id'];$cookieStr = implode(';', $cookie[1]);Cache::put($cacheCookieName, $cookieStr, 3600);return ['token' => $loginList['token'],'cookie' => $cookieStr . ';' . $loginList['cookie']];}/*** curl请求* User: Vijay <1937832819@qq.com>* Date: 2021/12/28* Time: 17:26* @param string $url 请求地址* @param string $method 请求方式 GET|POST* @param array $param 请求参数* @param string $origin origin* @param string $referer referer* @param null $cookie* @return bool|string*/public function curlExecute($url, $method = 'GET', $param = [], $origin = '', $referer = '', $cookie = null){$curl = curl_init();$header = ['User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36','Accept: application/json, text/javascript, */*; q=0.01','Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding: gzip, deflate, br','X-Requested-With: XMLHttpRequest','Connection: keep-alive','Sec-Fetch-Dest: empty','Sec-Fetch-Mode: cors','Sec-Fetch-Site: same-origin ','Content-Type: application/x-www-form-urlencoded; charset=UTF-8',];if ($origin) {$header[] = 'Origin: ' . $origin;}if ($referer) {$header[] = 'Referer: ' . $referer;}if ($cookie) {$header[] = 'Cookie: ' . $cookie;}$curloptArr = [CURLOPT_SSL_VERIFYPEER => 0,CURLOPT_HEADER => 1,CURLOPT_URL => $url,CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => '',CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 0,CURLOPT_FOLLOWLOCATION => true,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => $method,CURLOPT_HTTPHEADER => $header,];if ($method == 'POST') {$curloptArr[CURLOPT_POSTFIELDS] = http_build_query($param);}curl_setopt_array($curl, $curloptArr);$response = curl_exec($curl);curl_close($curl);return $response;}/*** User: Vijay <1937832819@qq.com>* Date: 2021/12/26* Time: 17:38* @return null|string*/public function getMsg(){return $this->msg;}
}

使用方式

调用 $appList = WxOpenUtils::getInstance()->appList();来获取token和cookie.

后面请求中要带上token和cookie,第三方操作中全部大写的代表参数,用到的几个变量分别如下,

$appList = WxOpenUtils::getInstance()->appList();
COOKIE:$appList['cookie'] . ';__CURRENT_TOKEN__=' . $appList['token'];
TOKEN:$appList['token']
APPID: POST添加应用返回该应用的APPID

第三方操作

拿到token和cookie后,接下来的工作就比较简单啦,这里只提供接口和参数,自己去实现吧。

POST添加应用

地址:

https://open.weixin.qq.com/cgi-bin/component_acct?action=create_component&token=TOKEN

请求头:

referer:https://open.weixin.qq.com/wxaopen/createThirdAccount?token=TOKEN&lang=;
origin:https://open.weixin.qq.com;

数据包:

{"name":"应用名称","desc":"描述","icon_url":"图片地址","official_site_url":"首页(随机编个域名吧)","industry_tag_id_list":[2001],"type":0
}

添加应用成功会返回该应用的APPID,把它取出来后面要用。

GET获取第三方详情

地址:

https://open.weixin.qq.com/cgi-bin/component_acct?action=detail&t=manage/plugin_detail&token=TOKEN&appid=APPID&f=json';
POST修改ip和公众号

地址:

https://open.weixin.qq.com/cgi-bin/component_acct?action=detail&t=manage/plugin_detail&token=TOKEN&appid=APPID;

请求头:

referer:https://open.weixin.qq.com/wxaopen/serviceprovider/APPID?token=TOKEN;
origin:https://open.weixin.qq.com;

数据包:

{"token":TOKEN,"action":"direct_modify","white_acct":"公众号原始id","white_ip":"ip白名单",
}
POST修改权限集(这一步就是添加公众号网页授权)

地址:

https://open.weixin.qq.com/cgi-bin/component_acct?action=modify_funcscopecategory&category_list=4

请求头:

referer: https://open.weixin.qq.com/wxaopen/authoritylist/APPID?token=TOKEN&lang=zh_CN';
origin:https://open.weixin.qq.com;

数据包:

category_list=4&appid=APPID&token=TOKEN
POST修改开发资料

地址:

https://open.weixin.qq.com/cgi-bin/component_acct?action=modify_dev_info&token=TOKEN&appid=APPID

请求头:

referer: https://open.weixin.qq.com/wxaopen/createThirdAccount/modifyDevInfo?appId=APPID&token=TOKEN;
origin:https://open.weixin.qq.com;

数据包:

{"token":"这个token是消息加解密token","auth_domain":"授权发起域名","allow_container_domain":false,"ticket_url":"授权事件接收URL","msg_url":"消息与事件接收URL","white_ip":"白名单IP","white_acct":["公众号ID"],"symmetric_key":"消息加解密Key","sns_domain":"我们用的分享域名;号分割","wxa_server_domain":"","jump_h5_domain":"","ticket_url_qbase":{"enable":false,"container":{"env":"","path":"","service":""},"function":{"env":"","function_name":""}},"msg_url_qbase":{"enable":false,"container":{"env":"","path":"","service":""},"function":{"env":"","function_name":""}}
}
POST删除第三方

地址:

https://open.weixin.qq.com/cgi-bin/component_acct?action=del_component;

请求头:

referer:  https://open.weixin.qq.com/cgi-bin/applist?t=manage/list&page=0&num=20&openapptype=2048&token=TOKEN;
origin:https://open.weixin.qq.com;

数据包:

{"appid":APPID,"token":TOKEN,"action":"del_component","lang":"zh_CN","f":"json","ajax":"1","key":"1",
}

微信开放平台第三方接口集成相关推荐

  1. (第三方平台)开发相关,解除80端口占用,微信公众号分享jssdk实现,微信开放平台登录接口接入,2022微信分享接入本地调试,微信分享定制

    一.开发相关 1.平台地址 微信开放平台 QQ互联平台SDK 2.文章收集 来自CSDN兄台的QQ登录使用的教程 微信网站应用开发的详细流程和引导 VueJs单页应用实现微信网页授权及微信分享功能 [ ...

  2. 微信开放平台-第三方平台开发配置及常见的问题

    目录 概述 参考文档 开源项目&工具 第三方平台设置 问题及解决方法 概述 本实例:第三方平台+微信公众号(服务号) 微信开放平台-第三方平台,为广大公众号和小程序提供运营服务和行业解决方案. ...

  3. 微信开放平台 第三方平台获取推送的component_verify_ticket php

    在thinkphp6中调用 php7.4 下载微信开发文档里的sdk代码 php版本 但里面有些函数已经弃用 需要修改些(sdk有些地方能与开发环境等稍有出入 需要适当修改 兼容 查看另一篇文档 修改 ...

  4. 微信开放平台 第三方平台开发

    1.开放账号 首先,开放平台和第三方平台不是一回事,第三方平台只是开放平台中一个分支,提供的是公众号的授权,代替公众号拥有者操作公众号的部分权利(与授权的权限有关) 微信开放平台拥有单独账号,需要开发 ...

  5. 微信开放平台-第三方平台-全网发布接入【java版本】

    微信给出的文档 概述 在第三方平台方创建成功并最终开发测试完毕,提交全网发布申请时,微信服务器会通过自动化测试的方式,检测服务的基础逻辑是否可用,在确保基础可用的情况下,才会允许公众号第三方平台提交全 ...

  6. EasyWeChat微信开放平台第三方平台接入流程

    授权流程技术说明: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Authorization_Process ...

  7. 微信开放平台第三方开发,注册试用小程序,一整套流程

    大家好,我是小悟 对服务商来说,试用小程序的好处不言而喻,主打一个先创建后认证的流程.只需要提供小程序名称和openid便可快速注册一个试用小程序,在认证之前,有效期14天,大致流程如下. 注册试用小 ...

  8. 微信开放平台第三方平台授权小程序权限集id对应中文说明

    微信的官方文档没有找到完整的说明,以下数据是一个一个授权对比得到,特此备注 return ['17' => '帐号管理权限','18' => '开发管理与数据分析权限','19' => ...

  9. 详解微信开放平台第三方平台代小程序开发业务基本接口调用逻辑

    详解微信第三方小程序代开发 微信申请第三方之后可以获取授权方的很多权限,主要的是生码和待开发,生码的第三方授权之前已经写了一篇文章,最近做了小程序待开发,总结一下写下来供大家参考 由百牛信息技术bai ...

最新文章

  1. Java-CAS初探
  2. 【盘它!】那些让效率MAX的工具和方法(Mac篇)
  3. 使用systemctl设置tomcat开机自启动
  4. 每日 30 秒 ⏱ HTML Cosplay
  5. spring源码分析-core.io包里面的类
  6. 比较两张大小相同的照片的差异,返回数值
  7. linux 程序收到sigsegv信号_linux下定位多线程内存越界问题实践总结
  8. java后台异步任务执行器TaskManager
  9. C++_类和对象_C++多态_案例3-电脑组装---C++语言工作笔记075
  10. JavaWeb——mybatis一对一、一对多查询
  11. 对计算机硬件的工作原理的认识,计算机硬件组成及工作原理
  12. SpringBoot2 结合BeetlSQL开发
  13. 求推荐民法论文选题?
  14. 使用miniSipServer为中小企业搭建VOIP服务器
  15. cc2530单片机的内核是什么_ZigBee技术开发:CC2530单片机原理及应用简介,目录书摘...
  16. 考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之目录(矩阵及其运算、向量与向量空间、欧氏空间、线性方程组、特征值/特征向量及相似矩阵、二次型、线性空间与线性变换)
  17. java动图_马上学会!教你一个快速制作GIF动图的方法!
  18. 深入java虚拟机视频教程_从原理到实战深入学习JAVA虚拟机,视频教程下载
  19. 一个产品的风险预测怎么写_创业计划书中,项目风险评估怎么写?
  20. Arduino入门(一)

热门文章

  1. 【生活不随便】2019猪年,新春快乐!
  2. 会场安排问题(PTA可过)
  3. linux网络95值工具,Linux下网络故障排查工具之ping|traceroute和tcptraceroute|mtr工具
  4. 2010 年 Web 设计风 (下)
  5. win7怎么把计算机放到桌面6,win7摄像头怎么开 6种方法教学【图文】
  6. foxmail如何下载全部邮件以及常用知识
  7. ButterknifeZelezny在AndroidStudio中的配置与使用方法
  8. qq聊天界面 java_JAVA基于Swing和netty仿QQ界面聊天小项目
  9. Linux命令修复方法,Linux系统MBR的修复方法
  10. 这篇《淘宝十年产品事》的书评不错