微信公众号三方平台开发【component_access_token篇】

本文介绍了微信公众号第三方平台授权的具体流程,包括预授权码获取、授权页面展示、管理员授权确认及授权码调用API等内容,并详细解释了component_access_token的获取与管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天开始前,补充一点之前忘了说的事儿——第三方平台授权流程。

在获得component_verify_ticket(上期已介绍如何获取)和component_access_token(本期后面将介绍如何获取)后,我们就会开始进入正式的授权流程了,具体流程大致如下:

  1. 获取预授权码(pre_auth_code):预授权码是第三方平台实现公众号授权托管的必备信息;
  2. 进入授权页:我们可以在自己的网站中设置“微信公众号授权”入口,引导微信公众号管理员进入授权页(授权页地址包含第三方平台的appid、预授权码以及回调URL等参数,如:https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx);
  3. 微信公众号管理员确认并同意登录授权:微信公众号管理员进入第三方平台授权页后,需要确认并同意将自己的微信公众号授权给第三方平台,从而完成授权流程(授权完成后,授权页会自动跳转到回调URL,并将授权码和过期时间加在回调URL的参数中,如:redirect_url?auth_code=xxx&expires_in=600);
  4. 利用授权码调用微信公众号相关API:得到授权码后,我们可以使用授权码来获取授权微信公众号的接口调用凭据(authorizer_access_token,简称令牌),之后,我们就可以通过这个接口调用凭据去调用微信公众号相关API,从而代微信公众号实现其业务(我们能够调用到哪些API,取决于微信公众号管理员给我们授权了哪些权限集,当然也还取决于微信公众号自身所拥有哪些权限)。

Ok!下面进入今天的正题,如何获取第三方平台component_access_token(第三方平台compoment_access_token是第三方平台授权流程中接口的调用凭据,简称令牌。每个令牌都存在有效期(2小时),并且是有限制的,所以这里我们需要好令牌的管理,在令牌快过期时(比如1小时55分)再次进行刷新请求获取新的令牌。)。

在我们获取到微信服务器推送过来的component_verify_ticket后,需要将其作为参数,向微信服务器发送请求来获取component_access_token。

接口调用请求说明

http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/cgi-bin/component/api_component_token

POST数据示例:

{
"component_appid":"appid_value" ,
"component_appsecret": "appsecret_value",
"component_verify_ticket": "ticket_value"
}

参数说明
参数说明
component_appid第三方平台appid
component_appsecret第三方平台appsecret
component_verify_ticket微信后台推送的ticket,此ticket会定时推送

component_appid和component_appsecret在第三方平台详情页进行查看。

返回说明

正常情况,微信会返回如下json数据包:
{
"component_access_token":"61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA",
"expires_in":7200
}

结果参数说明
参数说明
component_access_token第三方平台access_token
expires_in有效期
具体程序实现:

public function get_component_access_token()
$res = $this->component_detail();//获取第三方平台基础信息
$last_time = $res['token_time'];//上一次component_access_token获取时间
$component_access_token = $res['component_access_token'];//获取数据查询到的component_access_token
$difference_time = $this->validity($last_time);//上一次获取时间与当前时间的时间差
//判断component_access_token是否为空或者是否超过有效期
if(empty($component_access_token) || $difference_time>7000){
$component_access_token = $this->get_component_access_token_again();
}
return $component_access_token;
}
//获取第三方平台基础信息
public function component_detail(){
$res = M('Public')->where(array('id'=>1))->find();
return $res;
}
//重新获取component_access_token
public function get_component_access_token_again(){
$url = 'https://api.weixin.qq.com/cgi-bin/component/api_component_token';
$tok = $this->component_detail();
$param ['component_appid'] = $tok['appid'];
$param ['component_appsecret'] = $tok['appsecret'];
$param ['component_verify_ticket'] = $tok['componentverifyticket'];
$data = post_data ( $url, $param );
$token['component_access_token'] = $data ['component_access_token'];
$token['token_time'] = date("Y-m-d H:i:s");
M('Public') ->where(array('id'=>1))->setField($token);
return $data['component_access_token'];
}
//获取时间差
public function validity($time){
$current_time = time();
$difference_time = $current_time - strtotime($time);
return $difference_time;
}

<think>我们正在处理的是关于在ArkTS中实现微信登录时遇到的跳转问题。根据用户描述,问题可能出现在从微信登录页面跳转回应用时。我们需要结合HarmonyOS的路由机制微信登录SDK的使用方法来分析。参考引用[2]中提到:在HarmonyOS中,ArkTS页面Web页面之间的跳转是通过路由栈操作实现的。例如,使用`navPathStack.pushPath()`进行跳转。但微信登录通常涉及三方SDK,跳转可能由微信控制。微信登录流程通常包括:1.应用调用微信登录API,跳转到微信授权页面。2.用户在微信授权页面确认后,微信会跳转回应用指定的回调页面(或通过回调函数)。在HarmonyOS中,我们需要正确处理微信跳转回应用的场景。可能的问题点:-回调页面未正确配置(在微信开放平台配置的应用签名包名必须与HarmonyOS应用一致)。 -在ArkTS中,回调页面的路由配置不正确,导致微信无法跳转回来。解决方案步骤:1. **配置微信开放平台**:确保在微信开放平台配置的应用包名签名正确。HarmonyOS应用的包名可以在`config.json`中查看,签名可以通过调试证书获取(具体获取方式参考微信开放平台文档)。2.**配置回调页面**:微信登录需要指定一个回调页面(或URIScheme)。在HarmonyOS中,我们可以通过配置`ability`的`intentFilter`来捕获这个回调。例如,在`config.json`中为entryAbility添加一个intentFilter:```json"intents": [{"action":{"action": "android.intent.action.VIEW"},"entities":[{"entity": "entity.system.default"}],"uris":[{"scheme":"wechat", //这里替换成你在微信开放平台注册的scheme"host":"callback"}]}]```3.**在Ability中处理回调**:当微信跳转回应用时,会触发Ability的`onCreate`或`onNewIntent`方法。我们需要在这里解析回调数据,并跳转到相应的ArkTS页面。```typescriptimport abilityfrom '@ohos.ability.ability';importwantConstant from'@ohos.ability.wantConstant';export defaultclass EntryAbility extendsAbility{onCreate(want,launchParam) {console.log("EntryAbilityonCreate");//当应用被微信回调打开时,want的uri会包含微信回调的数据if (want.uri){//解析uri,获取微信返回的code或token//然后通过事件总线或全局变量将数据传递给ArkTS页面,或者直接跳转到处理登录结果的页面//例如,使用路由跳转到登录结果页面,并携带参数}}onNewWant(want) {console.log("EntryAbilityonNewWant");//同上处理}}```4.**在ArkTS页面中发起微信登录请求**:在需要微信登录的页面,调用微信SDK的登录方法,并指定回调的URI(即上面配置的scheme)。```typescript//假设微信登录SDK的调用方法wechat.login({//...其他参数callback:"wechat://callback"//与intentFilter中配置的schemehost一致});```5.**处理路由跳转问题**:如果回调后需要跳转到指定的ArkTS页面,注意在Ability中获取到回调数据后,使用路由跳转。但注意,Ability中不能直接操作UI,因此我们可以通过发布事件或设置全局数据,然后在ArkTS页面中监听并跳转。6. **检查页面路由配置**:参考引用[4]中提到的页面路径配置问题,确保在`main_pages.json`中正确配置了回调页面的路径(如果回调页面是一个ArkTS页面)。常见问题:-回调页面未在`main_pages.json`中配置,导致找不到页面(如引用[4]的错误)。-回调的URI Scheme没有在`config.json`中正确配置intentFilter。-微信开放平台配置的包名、签名与HarmonyOS应用不一致。如果以上步骤都正确,但问题仍然存在,可以尝试在微信开放平台删除应用重新配置,或者检查网络是否正常(微信登录需要网络)。由于微信登录SDK的具体使用可能因版本而异,请参考微信官方提供的HarmonyOS SDK文档。相关问题:1.如何在HarmonyOS中配置Ability的intentFilter以捕获URI Scheme回调?2.微信登录回调后如何将数据传递给ArkTS页面?3.如何获取HarmonyOS应用的签名并在微信开放平台配置?4.在ArkTS中如何调用微信登录接口?5.如何处理微信登录过程中的网络异常?</think>### ArkTS 微信登录跳转问题解决方案 在 HarmonyOS 应用开发中,实现微信登录时的页面跳转问题通常涉及路由配置、回调处理技术栈切换。以下是系统化的解决方案: #### 1. **路由配置问题**(最常见) - **问题现象**:跳转目标页面时报错 `can't find this page`(参考引用[4]) - **解决方案**: ```json // resources/base/profile/main_pages.json { "src": [ "pages/Index", // 主页面 "pages/WechatAuth", // 微信授权页面 "pages/LoginSuccess" // 登录成功回调页 ] } ``` **关键点**: - 路径必须与文件实际位置完全匹配(区分大小写) - 使用 `"pages/LoginSuccess"` 格式而非 `"/pages/LoginSuccess"` - 修改后执行 **Build > Rebuild Project** 刷新路由表 #### 2. **微信回调处理** - **问题场景**:微信授权后无法正确跳回应用 - **解决方案**: ```typescript // 在微信登录按钮事件中 onWechatLogin() { // 1. 调用微信SDK发起授权 wechat.auth({ appId: "YOUR_APPID", redirectUri: "pages/LoginSuccess" // 指定回调页 }); // 2. 显式导航到加载页(避免白屏) router.pushUrl({ url: "pages/Loading" // 中转页面 }) } ``` #### 3. **Web-ARKTS 混合技术栈处理** 当登录流程涉及 Web 页面时(参考引用[2]): ```typescript // 在Web组件中处理微信回调 Web({ src: "https://weixin.qq.com/auth" }) .onInterceptRequest((event) => { if (event.request.url.includes("auth_success")) { // 截获成功回调 router.replaceUrl({ url: "pages/LoginSuccess" }) return true; // 阻止默认跳转 } }) ``` #### 4. **页面传参问题** ```typescript // 登录成功页接收参数 import router from '@ohos.router'; @Entry @Component struct LoginSuccess { @State authCode: string = "" onPageShow() { this.authCode = router.getParams()?.['code'] || "" // 使用authCode向后台交换token } } ``` #### 5. **配置验证清单** 1. **微信开放平台配置**: - 包名:`config.json` 中的 `bundleName` - 签名:使用 `keytool -list -v -keystore .\mykeys.p12` 获取 SHA-256 2. **URI Scheme 白名单**: ```json // module.json5 "abilities": [{ "name": "EntryAbility", "skills": [{ "entities": ["entity.system.browsable"], "actions": ["action.system.view"], "uris": [{ "scheme": "wechat", "host": "callback" }] }] }] ``` #### 6. **调试建议** - 使用 **ADB 日志过滤**: `hdc shell hilog | grep Ace` - 测试路径跳转: ```typescript router.getRoutes().then(routes => { console.log("当前路由表: " + JSON.stringify(routes)) }) ``` > **避坑指南**:微信 Android 平台要求回调页必须是 **https** 协议(引用[1]),本地开发需使用 `ngrok` 等工具暴露 HTTPS 地址。 --- ### 相关问题 1. 如何解决微信登录回调中的 "redirect_uri 参数错误"? 2. ArkTS 应用中如何处理微信登录的 access_token 过期刷新? 3. 微信登录如何与 HarmonyOS 的帐户系统打通? 4. 在跨设备场景下如何同步微信登录状态? 5. 如何实现微信登录失败后的降级处理(如短信验证)? [^1]: 微信回调地址仅支持 https 链接 [^2]: Web 与 ArkTS 页面跳转机制 [^4]: 路由配置路径匹配规则
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值