HarmonyOS NEXT——【鸿蒙接入微信/支付宝登录】

1、鸿蒙集成微信登录

1.1、申请授权码

首先我们在接入微信sdk之前,需要在微信开放平台申请平台的id授权码和secret用来进行授权。申请secret我们需要填写BundleID和Identifier,那么这两个东西其实对应的就是鸿蒙应用的包名appName以及鸿蒙应用的appid,我们将应用信息填写后等待审核完成后即可获取到应用对应的平台授权码。接入指南 / 鸿蒙接入指南

补充:如果您还未创建鸿蒙项目,具体查看鸿蒙官网项目创建和发布指导:创建HarmonyOS应用/元服务-创建应用-创建项目和应用-AppGallery Connect帮助中心 - 华为HarmonyOS开发者

1.1.1、查看Bundle ID:

Bundle ID 指的是鸿蒙应用的包名:

1.1.2、查看鸿蒙应用appid:

Identifier 指的是鸿蒙应用的 appId,详情可以在AGC平台上查看:

1.1.3、申请成功并查看授权码:(大概需要等待审核时间一天左右)

申请成功后,将可以在微信开放平台——开发配置——鸿蒙应用,查看到APPID以及AppSecret这两个授权码,在后续集成微信sdk中需要使用。

1.2、微信登录

效果:

参考代码:

import common from '@ohos.app.ability.common';
import * as wxopensdk from '@tencent/wechat_open_sdk';
import { ThirdBindParams } from '../../../../models/thirdLogin/ThirdLoginModel';
import { DialogContent2, H5ShowCustomDialog2 } from '../../../../view/H5CustomDialog';
import { CommonConstants } from '../../../constants/CommonConstants';
import { Request } from '../../request';
import { ThirdBindLoginSend } from './ThirdBindLoginSend';
import { OnWXResp, WXApi, WXEventHandler } from './WXApiWrap';
​
​
export class WXTool {
  static async WXAuthorize() {
    return new Promise<ThirdBindParams>(async (resolve, reject) => {
​
      let onWXResp: OnWXResp = (resp) => {
        let WXCode: string = resp['code']
        if (resp.errCode === 0 && WXCode && WXCode.length > 0) {
          const authRespUrl =
            `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${CommonConstants.WXAPP_ID}&secret=${CommonConstants.WXAPP_SECRET}&code=${WXCode}&grant_type=authorization_code`
          Request.get<object>(authRespUrl).then((res) => {
            let WXAuthCode: string = res['openid']
            //微信授权成功后返回openId用于登录使用,接下来的逻辑就是应用登录的相关逻辑,这里根据业务需求自行编写。
            resolve(WXAuthCode)
          })
        } else {
        
        //这里是我自定义的授权失败的提示框,可根据需求自行更换
          let content: DialogContent2 = {
            title: '提示',
            message: "授权失败",
            rightText: '确认',
          }
          H5ShowCustomDialog2(content)
        }
      }
      WXEventHandler.registerOnWXRespCallback(onWXResp)
     
     //根据需要,配置相关参数
      let req = new wxopensdk.SendAuthReq
      req.isOption1 = false
      req.nonAutomatic = true
      req.scope = 'snsapi_userinfo,snsapi_friend,snsapi_message,snsapi_contact'
      req.state = 'bankoftianjin'
      req.transaction = 'bankoftianjin'
​
      let finished = await WXApi.sendReq(getContext() as common.UIAbilityContext, req)
      if (!finished) {
​
      }
    })
  }
}
​
export async function StartWXLogin() {
  let thirdBindParamObj: ThirdBindParams = await WXTool.WXAuthorize()
  if (thirdBindParamObj) {
    ThirdBindLoginSend.ThirdLoginTrade(thirdBindParamObj)
  }
}

这里我提供下相关sdk导入的参考代码,具体参考微信开放平台相关demo以及文档:

//entry\src\main\ets\common\utils\微信支付宝三方SDK工具\微信支付宝登录\WXApiWrap.ets
import * as wxopensdk from '@tencent/wechat_open_sdk';
import { CommonConstants } from '../../../constants/CommonConstants';
​
export type OnWXReq = (req: wxopensdk.BaseReq) => void
export type OnWXResp = (resp: wxopensdk.BaseResp) => void
​
const kTag = "WXApiEventHandlerImpl"
​
class WXApiEventHandlerImpl implements wxopensdk.WXApiEventHandler {
  private onReqCallbacks: Map<OnWXReq, OnWXReq> = new Map
  private onRespCallbacks: Map<OnWXResp, OnWXResp> = new Map
​
  registerOnWXReqCallback(on: OnWXReq) {
    this.onReqCallbacks.set(on, on)
  }
  unregisterOnWXReqCallback(on: OnWXReq) {
    this.onReqCallbacks.delete(on)
  }
​
  registerOnWXRespCallback(on: OnWXResp) {
    this.onRespCallbacks.set(on, on)
  }
  unregisterOnWXRespCallback(on: OnWXResp) {
    this.onRespCallbacks.delete(on)
  }
​
  onReq(req: wxopensdk.BaseReq): void {
    wxopensdk.Log.i(kTag, "onReq:%s", JSON.stringify(req))
    this.onReqCallbacks.forEach((on) => {
      on(req)
    })
  }
​
  onResp(resp: wxopensdk.BaseResp): void {
    wxopensdk.Log.i(kTag, "onResp:%s", JSON.stringify(resp))
    this.onRespCallbacks.forEach((on) => {
      on(resp)
    })
  }
}
  /**
   * !!!这里的appid和secret就是一开始申请的授权码。(填写不正确则无法成功进入微信应用!!!)
   * WXAPP_ID = "wx4e71fe1xxxxxxxxx"
   * WXAPP_SECRET = "305a1eb0dc9dxxxxxxxxxxx"
   */
export const WXApi = wxopensdk.WXAPIFactory.createWXAPI(CommonConstants.WXAPP_ID)
export const WXEventHandler = new WXApiEventHandlerImpl

2、鸿蒙集成支付宝sdk登录应用

2.1、获取支付宝平台AppId:

获取 APPID - 支付宝文档中心

2.2、集成支付宝登录:

获取到阿里平台的APPID之后我们便可以开始集成sdk了,步骤较为简单,详情参考阿里开发文档极简版 SDK 调用方法 - 支付宝文档中心

效果:

参考代码

import { AFServiceParams, AFWantParams, AFServiceCenter, AFAuthServiceResponse, AFService } from '@alipay/afservicesdk';
import { ThirdAuthLoginQry, ThirdBindParams } from '../../../../models/thirdLogin/ThirdLoginModel';
import { CommonConstants } from '../../../constants/CommonConstants';
import { Request } from '../../request';
import { ThirdBindLoginSend } from './ThirdBindLoginSend';
​
export class ALITool {
  /**
   * 支付宝登录授权
   */
  static async AliAuthorize() {
    return new Promise<ThirdBindParams>((resolve, reject) => {
​
      let bizParams = new Map<string, string>()
      let url =
        encodeURIComponent(`https://authweb.alipay.com/auth?auth_type=PURE_OAUTH_SDK&app_id=${CommonConstants.ALIAPP_ID}&scope=auth_user&state=init`)   //!!!这里的appid需要拼接的是以上步骤获取的阿里平台的授权码!(填写错误将会跳转报错)
      bizParams.set("url", url);
​
      let backWant: AFWantParams = {
        bundleName: "com.xxxxxxxx", //鸿蒙应用包名
        moduleName: "entry",
        abilityName: "EntryAbility"
      }
​
      let params =
        new AFServiceParams(bizParams, false, true, 'AliPay', backWant, (response: AFAuthServiceResponse) => {
          let result = response.result
          if (result) {
            let parameters = result['parameters']
            if (parameters) {
              let authcode: string = parameters['auth_code']
              if (authcode && authcode.length > 0) {
                  //阿里支付宝授权成功后返回openId用于登录使用,接下来的逻辑就是应用登录的相关逻辑,这里根据业务需求自行编写。
                      resolve(authcode)
              }
​
            }
          }
​
        })
      AFServiceCenter.call(AFService.AFServiceAuth, params)
    })
  }
}
​
export async function StartALILogin() {
  let thirdBindParamObj: ThirdBindParams = await ALITool.AliAuthorize()
  if (thirdBindParamObj) {
    ThirdBindLoginSend.ThirdLoginTrade(thirdBindParamObj)
  }
}

<think>好的,我现在需要回答用户关于在鸿蒙开发中集成支付宝快捷登录的问题。首先,我得回忆一下鸿蒙开发的相关知识,尤其是关于第三方登录集成的部分。鸿蒙系统使用的是ArkTS语言,而支付宝的快捷登录通常涉及OAuth2.0协议或者SDK的集成。 首先,我应该考虑用户提到的参考内容。引用[2]提到了Harmony-Next的实战项目,里面仿支付宝App的功能,包括一些常用服务。这可能意味着在鸿蒙生态中已经有类似的实现案例,或者有相关的文档支持。不过用户的问题具体是关于快捷登录的集成,所以需要更具体的步骤。 接下来,我需要确认支付宝是否提供了鸿蒙平台的SDK。通常,支付宝会为不同的平台提供SDK,比如Android、iOS、Web等。如果鸿蒙支持兼容Android的库,可能可以使用Android的SDK,但如果是纯鸿蒙应用(HarmonyOS Next),可能需要使用鸿蒙原生的方式。 假设用户使用的是HarmonyOS Next,那么可能需要通过鸿蒙的API来实现。这时候,可能需要使用支付宝放平台的接口,比如OAuth2.0的授权流程。用户需要在支付宝放平台注册应用,获取AppID,配置回调地址等。 然后,在鸿蒙应用中,需要处理用户点击支付宝登录按钮后的跳转流程,调用支付宝的授权接口,获取授权码,再通过服务器交换access_token,最后获取用户息。这里可能需要使用鸿蒙的网络请求模块,比如@ohos.net.http,以及Web组件来处理重定向。 另外,还需要注意鸿蒙的安全机制,比如权限申请。例如,访问网络需要声明ohos.permission.INTERNET权限。同时,回调地址的处理可能需要配置应用的路由或者DeepLink。 可能还需要参考支付宝的官方文档,确认接口的具体参数和流程。如果支付宝没有提供鸿蒙专用的SDK,可能需要使用REST API的方式,或者通过WebView进行OAuth授权。 最后,整理这些步骤,给出一个清晰的实现流程,包括准备工作、代码示例和注意事项。同时,生成相关问题,帮助用户深入理解可能遇到的问题,比如参数配置错误、回调处理、权限问题等。</think>在鸿蒙应用中集成支付宝快捷登录功能,需要遵循以下步骤: ### 一、准备工作 1. **注册支付宝放平台账号** 前往[支付宝放平台](https://open.alipay.com/)创建应用,获取$APPID$和$RSA2$密钥[^2]。 2. **配置鸿蒙应用签名** 在支付宝后台添加鸿蒙应用的包名和签名息(使用鸿蒙应用的SHA256指纹)。 ### 二、代码实现步骤 #### 1. 添加网络权限 在`module.json5`中声明: ```json "requestPermissions": [ { "name": "ohos.permission.INTERNET" } ] ``` #### 2. 实现授权跳转逻辑 使用Web组件加载支付宝授权页面: ```typescript import webview from '@ohos.web.webview'; @Entry @Component struct AlipayLogin { controller: webview.WebviewController = new webview.WebviewController(); build() { Column() { Web({ src: 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=YOUR_APPID&scope=auth_user&redirect_uri=YOUR_CALLBACK_URL', controller: this.controller }) .onUrlLoad((event) => { if (event.url.indexOf('your_callback_url') !== -1) { this.parseAuthCode(event.url); // 解析回调URL中的授权码 } }) } } } ``` #### 3. 解析授权码 ```typescript private parseAuthCode(url: string) { const codeParam = url.split('?')[1].split('&').find(param => param.startsWith('auth_code=')); const authCode = codeParam?.split('=')[1]; if (authCode) { this.getAccessToken(authCode); // 向服务端发起请求 } } ``` #### 4. 服务端交互 通过`@ohos.net.http`发送请求: ```typescript import http from '@ohos.net.http'; async getAccessToken(authCode: string) { let request = http.createHttp(); let response = await request.request( "https://yourserver.com/api/alipay/auth", { method: http.RequestMethod.POST, header: { 'Content-Type': 'application/json' }, extraData: JSON.stringify({ code: authCode }) } ); // 处理返回的用户息 } ``` ### 三、安全注意事项 1. **参数加密** 敏感数据传输应使用$RSA2$加密算法: $$ ciphertext = encrypt(plaintext, publicKey) $$ 2. **防重放攻击** 在请求中添加时间戳和随机数: $$ nonce = \text{randomString}(16) $$ $$ timestamp = \text{Date.now}() $$ ### 四、常见问题排查 - **授权页面无法加载**:检查网络权限是否启,确认$APPID$是否配置正确 - **回调地址不匹配**:确保支付宝后台配置的$redirect_uri$与代码中完全一致 - **签名验证失败**:检查RSA密钥对的匹配性,推荐使用openssl工具验证
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值