一.
授权流程
1. 接收component_verify_ticket:
[1]微信服务器每隔10分钟会向第三方的消息接收地址推送一次component_verify_ticket,拿到后需要在本地做好存储;
[2]微信第三方平台的消息是加密的(下图),需要进行解密才能获取需要的信息;
[3]接收并解密消息,代码如下:
/** * 授权事件接收URL */ public function msg() { import("@.ORG.ArrayTool"); import("@.ORG.Weixincrypt.WXBizMsgCrypt"); $timestamp = empty($_GET ['timestamp']) ? '' : trim($_GET ['timestamp']); $nonce = empty($_GET ['nonce']) ? '' : trim($_GET ['nonce']); $msgSign = empty($_GET ['msg_signature']) ? '' : trim($_GET ['msg_signature']); $signature = empty($_GET ['signature']) ? '' : trim($_GET ['signature']); $encryptType = empty($_GET ['encrypt_type']) ? '' : trim($_GET ['encrypt_type']); $encryptMsg = file_get_contents('php://input'); $wxData = C("platform_setting"); $encodingAesKey = $wxData['encodingAesKey']; $token = $wxData['token']; $appId = $wxData['appId']; $Wxcrypt = new WXBizMsgCrypt($token, $encodingAesKey, $appId); $postArr = ArrayTool::xml2array($encryptMsg); $format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>"; $fromXml = sprintf($format, $postArr['Encrypt']); //第三方收到公众号平台发送的消息 $msg = ''; $errCode = $Wxcrypt->decryptMsg($msgSign, $timestamp, $nonce, $fromXml, $msg); // 解密 if ($errCode == 0) { $param = ArrayTool::xml2array($msg); switch ($param['InfoType']) { case 'component_verify_ticket' : // 授权凭证 $componentVerifyTicket = $param['ComponentVerifyTicket']; S('component_verify_ticket_' . $appId, $componentVerifyTicket); break; case 'unauthorized' : // 取消授权 break; case 'authorized' : // 授权 break; case 'updateauthorized' : // 更新授权 break; } } exit("success"); }
2.获取component_access_token:
[1]每个令牌是存在有效期(2小时)的,且令牌的调用不是无限制的,请第三方平台做好令牌的管理,在令牌快过期时(比如1小时50分)再进行刷新。所以要对component_access_token做好本地缓存,代码如下:
$wxData = C("setting"); //1. 取得component_verify_ticket $vt = S('component_verify_ticket_' . $wxData['appId']); $at = S('component_access_token_' . $wxData['appId']); //2. 获取第三方平台component_access_token if (empty($at) && !empty($vt)) { $url2 = "https://api.weixin.qq.com/cgi-bin/component/api_component_token"; $post = array(); $post['component_appid'] = $wxData['appId']; $post['component_appsecret'] = $wxData['appSecret']; $post['component_verify_ticket'] = $vt; $return2 = $this->curlPost($url2, $post); if (isset($return2['component_access_token'])) { $at = $return2['component_access_token']; S('component_access_token_' . $wxData['appId'], $at, 6600); //缓存1小时50分钟 = 6600秒 } else { return false; } }
3.获取pre_auth_code(注意这是预授权码,不是授权码):
$wxData = C('platform_setting'); $appId = $wxData['appId']; $HT = new HttpTool(); $at = $HT->getComponentAccessToken(); if ($at) { //3.获取预授权码pre_auth_code $url3 = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token={$at}"; $post = array(); $post['component_appid'] = $appId; $return3 = $HT->curlPost($url3, $post); if (isset($return3['pre_auth_code'])) { $preauthcode = $return3['pre_auth_code']; $redirectUrl = C('site_url') . U("User/App/setauth", array('uid' => $uid)); $weixinUrl = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid={$appId}&pre_auth_code={$preauthcode}&redirect_uri={$redirectUrl}"; redirect($weixinUrl); exit; } } $this->error("亲, 授权失败了!");
4.使用授权码换取公众号的接口调用凭据和授权信息:
//1. 使用授权码换取公众号的接口调用凭据和授权信息 import("@.ORG.HttpTool"); $HT = new HttpTool(); $wxData = C('platform_setting'); $caccessToken = $HT->getComponentAccessToken(); $url1 = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token={$caccessToken}"; $post = array(); $post['component_appid'] = $wxData['appId']; $post['authorization_code'] = $authcode; $return = $HT->curlPost($url1, $post); if (isset($return['authorization_info'])) { $authinfo = $return['authorization_info']; $authid = $authinfo['authorizer_appid']; $accessToken = $authinfo['authorizer_access_token']; $refreshToken = $authinfo['authorizer_refresh_token']; //$funcInfo = $authinfo['func_info']; //2. 获取授权方的公众号帐号基本信息 $url2 = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token={$caccessToken}"; $post = array(); $post['component_appid'] = $wxData['appId']; $post['authorizer_appid'] = $authid; $return2 = $HT->curlPost($url2, $post); if (isset($return2['authorizer_info'])) { $wxinfo = $return2['authorizer_info']; $fcinfo = $return2['authorization_info']; $Wxuser = M("Wxuser"); //是否已经存在 $extFilter = array(); $wxuser['uid'] = $uid; $extFilter['auth_appid'] = $fcinfo['authorizer_appid']; $isExt = $Wxuser->where($extFilter)->find(); $wxuser = array(); $wxuser['uid'] = $uid; $wxuser['token'] = $this->getToken(); $wxuser['wxid'] = $wxinfo['user_name']; //原始ID $wxuser['wxname'] = $wxinfo['nick_name']; //昵称 $wxuser['weixin_type'] = $wxinfo['service_type_info']['id']; //微信类型 授权方公众号类型,0代表订阅号,1代表由历史老帐号升级后的订阅号,2代表服务号 $wxuser['weixin'] = $wxinfo['alias']; //微信号 $wxuser['headerpic'] = $wxinfo['head_img']; //头像 $wxuser['bind_type'] = 1; $wxuser['auth_appid'] = $fcinfo['authorizer_appid']; $wxuser['auth_access_token'] = $accessToken; $wxuser['auth_refresh_token'] = $refreshToken; $wxuser['auth_functions'] = json_encode($fcinfo['func_info']); $wxuser['auth_business_info'] = json_encode($wxinfo['business_info']); $wxuser['create_time'] = time(); if ($isExt) { $sign = $Wxuser->where($extFilter)->save($wxuser); } else { $sign = $Wxuser->add($wxuser); if ($sign) { //添加功能模块 $this->addfc($wxuser['token']); //记录公众号数量 M('Users')->where(array('id' => $uid))->setInc('wechat_card_num'); } } if ($sign) { redirect(C("site_url") . U('User/Index/index')); } } } $this->error("亲,获取授权信息失败!", U('User/Index/index'));
二. 全网发布
代码如下:
/** * 公众号消息与事件接收URL */ public function index() { $timestamp = empty($_GET['timestamp']) ? '' : trim($_GET['timestamp']); $nonce = empty($_GET['nonce']) ? '' : trim($_GET ['nonce']); $msgSign = empty($_GET['msg_signature']) ? '' : trim($_GET['msg_signature']); $signature = empty($_GET['signature']) ? '' : trim($_GET['signature']); $encryptType = empty($_GET['encrypt_type']) ? '' : trim($_GET['encrypt_type']); $openid = trim($_GET['openid']); import("@.ORG.ArrayUtil"); import("@.ORG.Weixincrypt.WXBizMsgCrypt"); $input = file_get_contents('php://input'); $paramArr = ArrayUtil::xml2array($input); //$this->logPrint($paramArr); //$this->logPrint($_GET); //解密 $wxData = C("platform_setting"); $encodingAesKey = $wxData['encodingAesKey']; $token = $wxData['token']; $appId = $wxData['appId']; $Wxcrypt = new WXBizMsgCrypt($token, $encodingAesKey, $appId); $format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>"; $fromXml = sprintf($format, $paramArr['Encrypt']); $errCode = $Wxcrypt->decryptMsg($msgSign, $timestamp, $nonce, $fromXml, $toXml); // 解密 $this->logPrint($toXml); if ($errCode == 0) { $param = ArrayUtil::xml2array($toXml); $keyword = isset($param['Content']) ? trim($param['Content']) : ''; // 案例1 - 发送事件 if (isset($param['Event']) && $paramArr['ToUserName'] == 'gh_3c884a361561') { $contentStr = $param ['Event'] . 'from_callback'; } // 案例2 - 返回普通文本 elseif ($keyword == "TESTCOMPONENT_MSG_TYPE_TEXT") { $contentStr = "TESTCOMPONENT_MSG_TYPE_TEXT_callback"; } // 案例3 - 返回Api文本信息 elseif (strpos($keyword, "QUERY_AUTH_CODE:") !== false) { import("@.ORG.HttpTool"); $authcode = str_replace("QUERY_AUTH_CODE:", "", $keyword); $contentStr = $authcode . "_from_api"; $HT = new HttpTool(); $authDetail = $HT->getAccessTokenByAuthCode($authcode); $accessToken = $authDetail['authorizer_access_token']; $HT->sendFansText($accessToken, $param['FromUserName'], $contentStr); //$tokenInfo = WechatOpenApiLogic::getAuthorizerAccessTokenByAuthCode($ticket); //$param ['authorizerAccessToken'] = $tokenInfo ['authorization_info'] ['authorizer_access_token']; //self::sendServiceMsg($param['FromUserName'], $param['ToUserName'], 1, $contentStr); // 客服消息接口 return 1; } $result = ''; if (!empty($contentStr)) { $xmlTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $result = sprintf($xmlTpl, $param['FromUserName'], $param['ToUserName'], time(), $contentStr); if (isset($_GET['encrypt_type']) && $_GET['encrypt_type'] == 'aes') { // 密文传输 $wxData = C("platform_setting"); $msgCryptObj = new WXBizMsgCrypt($wxData['token'], $wxData['encodingAesKey'], $wxData['appId']); $encryptMsg = ''; $msgCryptObj->encryptMsg($result, $_GET['timestamp'], $_GET['nonce'], $encryptMsg); $result = $encryptMsg; } } echo $result; } }
相关推荐
Thinkphp 3.2 版本 微信开放平台 授权流程代码
微信开放平台网站信息登记表,与微信接口进行对接时,需要先申请微信开放平台账号,使用开放平台账号创建网站,在创建的过程中需要上传微信开放平台网站信息登记表
微信开放平台-获取授权事件接收URL的component_verify_ticket
1 微信开放平台:https://open.weixin.qq.com/ 2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN 3.pc页面...
微信开放平台要求开发者提供应用签名,是为了确保只有授权的应用才能接入其API和服务。开发者需要在平台注册时填写正确的应用签名,否则应用将无法通过审核或者在微信内正常运行。这个工具简化了这一过程,只需将它...
总的来说,这个PHP微信开放平台扫码登录源码涵盖了整个扫码登录的流程,包括获取授权、交换令牌、获取用户信息以及创建/绑定用户账户等步骤。通过研究和实践这个源码,开发者可以更好地理解和掌握微信扫码登录的实现...
微信开放平台SDK文件包,使用微信分享、登录、收藏、支付等功能需要的库以及文件
总的来说,"微信第三方授权及全网发布php代码"是电商网站与微信生态深度融合的重要环节,涉及到的技术广泛,既需要理解微信开放平台的规则,又要熟悉PHP编程和特定电商平台如Ecshop的开发。通过这个过程,开发者能够...
在IT行业中,微信开放平台(WeChat Open Platform)是一个重要的接口平台,允许开发者通过API来实现与微信的各种功能交互,如微信登录、支付、消息推送等。本项目名为"接口类集成登录--微信开放平台weinx",显然是一...
1. 下载申请函:首先,你需要从微信开放平台官方网站下载“微信开放平台转移申请函相关.zip”压缩包,里面包含了申请函的模板和相关说明。 2. 填写申请函:按照提供的模板,仔细填写申请函上的各项信息,包括当前...
微信公共授权书样本.docx
Java微信开放平台APP支付代码是开发者用来集成微信支付功能到Android或iOS应用中的关键组件。这一功能让应用程序能够无缝地处理商品或服务的在线支付,为用户提供便捷的支付体验。以下将详细介绍Java微信开放平台APP...
微信登录授权是现代移动互联网应用中常见的用户身份验证方式,特别是在中国的互联网环境中,微信作为一款全民使用的社交软件,其登录授权...在实际开发过程中,需要遵循微信开放平台的规范,确保授权过程的顺利进行。
7. **回调URL(Callback URL)**:在微信开放平台配置中,我们需要设置回调URL,这个URL是微信服务器在用户授权后将code发送过来的地方。 8. **状态码管理**:为了防止中间人攻击,需要在请求二维码时携带一个随机...
企业微信开放平台Api调试 postman导出 注意:获取access_token 需要更改你自己的corpid 和corpsecret
微信开放平台SDK是微信官方为开发者提供的一套用于在Android系统上集成微信功能的开发工具包。这个SDK包含了丰富的API接口,使得开发者可以方便地在自己的应用中集成微信登录、分享、支付等各项功能,极大地扩展了...
2. **设置微信登录**:在TOM平台的管理后台,找到“微信登录设置”选项,这里你需要填入之前在微信开放平台获取的AppID和AppSecret。 3. **配置Discuz论坛**:登录到你的Discuz论坛后台,找到“微信插件”或者...
“Mnsaas多端SAAS平台运营系统”接入微信开放平台(第三方服务商),微信公众号管理及微信小程序一键授权发布、具备多租户管理、多应用上架购买、多终端(公众号,H5,小程序,PC,APP)可接入、强大的权限节点控制...