# MultiApi-hm **Repository Path**: mlethe/MultiApi-hm ## Basic Information - **Project Name**: MultiApi-hm - **Description**: MultiApi是华为、微信、QQ分享,华为、微信、QQ授权登录,华为、微信、支付宝支付等 - **Primary Language**: TypeScript - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-12-13 - **Last Updated**: 2026-03-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MultiApi(API12) ### 简介 MultiApi,是微信、QQ、华为的封装使用如微信支付、微信登录、微信分享,QQ登录、QQ分享、华为支付、华为登录等。 ### 下载安装 ```cmd ohpm install @mlethe/multi-api ``` 1.模块oh-package.json5文件中引入依赖 ```json { "dependencies":{ "@mlethe/multi-api": "version" } } ``` ## 用法 ### 初始化 ```typescript MultiApi.instance .setWechat("wxd5a474c635b8fd17", "59622f0fc42838fddd69ebdb645ef1ff") .setQQ("102061317", "102061317") .setDebug(BuildProfile.DEBUG) .init(); ``` ### 生命周期监听 1、在继承 UIAbility 的 Ability 中的方法重新及实现 ```typescript // 进入前台的监听 onForeground(): void { // Ability has brought to foreground MultiApi.instance.onForeground(); } // 回到app的监听及数据 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void { MultiApi.instance.handleWant(want); } ``` ### 统一回调监听 ```typescript const callback: OnActionCallback = { /** * 完成回调监听 * * @param media 类型 * @param map 数据 */ onComplete: (type: MultiMedia, record: Record) => { console.log("multi onComplete: " + type + ", record->" + JSON.stringify(record)); }, /** * 取消回调监听 */ onCancel: (type: MultiMedia) => { console.log("multi onCancel: " + type); }, /** * 失败回调监听 * * @param media 类型 * @param code 错误码: * -8000 未初始化 * -8001 APP未安装 * -8002 不支持该功能 * -8003 参数错误 * -8004 启动失败 * -8005 第三方sdk未初始化成功 * -8006 请求不一致 * -8007 异步发起失败 * -8008 没有响应数据 * -9000 授权失败 * -9001 accessToken获取失败 * -9002 accessToken过期 * -9003 获取用户信息失败 * -9500 分享类型错误 * @param msg 错误信息 */ onFailure: (type: MultiMedia, code: number, msg: string) => { console.log("multi onFailure: " + type + ", code->" + code + ", msg->" + msg); } }; ``` ### 统一释放内存 ```typescript // 组件的 aboutToDisappear() 方法中调用 MultiApi.instance.release(); ``` ### 支付 #### 微信支付 [接入文档](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/ohos.html) 1、在开发者的 App module 中的oh-package.json5文件,在dependencies中加入微信 opensdk 的依赖项 ```json { "dependencies": { "@tencent/wechat_open_sdk": "^1.0.14" } } ``` 2、在开发者的 App module 中的build-profile.json5文件里加入下方声明 ```json { "buildOptionSet": [ { "arkOptions": { "runtimeOnly": { "packages": [ "@tencent/wechat_open_sdk" ] } } } ] } ``` 3、在开发者的 App module 的 module.json5 里加入下方声明,详情可查看[使用canOpenLink判断应用是否可访问](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/canopenlink-V5) ```json { "module": { "abilities": [ { "skills": [ { "actions": [ "wxentity.action.open" ] } ] } ], "querySchemes": [ "weixin" ] } } ``` 4.唤起支付 ```typescript // 唤起支付 new PayAction(MultiMedia.WECHAT) .setAppId("") // 微信AppId .setMerchantId("") // 微信商户ID,merchantId .setPrepayId("") // 微信支付预支付交易会话ID .setPackageValue("Sign=WXPay") // 微信支付固定值Sign=WXPay .setNonceStr("") // 微信支付随机字符串 .setTimeStamp(0) // 微信支付时间戳 .setSign("") // 微信支付签名 .setExtData("") // 拓展信息 .setCallback(callback) // 回调监听 .pay(this.context); ``` 5、成功结果返回 | 键 | 说明 | |:---------:|:-----------------------------------------------:| | extData | 第三方app自定义字符串,微信不作解析,在回调时带回给第三方 注意:字符串长度不能超过1024 | | openId | 普通用户的标识,对当前开发者账号唯一 | | returnKey | 返回给商家的信息 | | prepayId | 微信支付预支付交易会话ID | #### 支付宝 [接入文档](https://opendocs.alipay.com/open/00dn73) 1、在开发者的 App module 中的oh-package.json5文件,在dependencies中加入支付宝 cashiersdk 的依赖项 ```json { "dependencies": { "@cashier_alipay/cashiersdk": "^15.8.36" } } ``` 2、在开发者的 App module 中的build-profile.json5文件里加入下方声明 ```json { "buildOptionSet": [ { "arkOptions": { "runtimeOnly": { "packages": [ "@cashier_alipay/cashiersdk" ] } } } ] } ``` 3、在开发者的 App module 的 module.json5 里加入下方声明,详情可查看[使用canOpenLink判断应用是否可访问](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/canopenlink-V5) ```json { "module": { "querySchemes": [ "alipays" ] } } ``` 4、唤起支付 ```typescript // 支付宝SDK唤起支付 new PayAction(MultiMedia.ALIPAY) .setOrderInfo("") // 支付订单信息 .setCallback(callback) // 回调监听 .pay(this.context, this.pathStack); // 支付宝SDK WebView 支付拦截 new PayAction(MultiMedia.ALIPAY) .setInterceptorWithUrl("") // url链接 .setCallback(callback) // 回调监听 .pay(this.context); // 支付返回H5是否拦截:true 已拦截,false 未拦截 // 支付宝scheme链接唤起支付(回调监听失效) // 1.二维码链接唤起支付(回调监听失效) new PayAction(MultiMedia.ALIPAY) .setQrcode("") // 二维码支付链接 .setCallback(callback) // 回调监听 .pay(this.context); // 2.url链接唤起支付(回调监听失效) new PayAction(MultiMedia.ALIPAY) .setUrl("") // url支付链接 .setCallback(callback) // 回调监听 .pay(this.context); // 3.签约唤起(回调监听失效) new PayAction(MultiMedia.ALIPAY) .setSigningLink("") // 签约链接 .setCallback(callback) // 回调监听 .pay(this.context); ``` 4、成功结果返回 | 键 | 说明 | |:------:|:-----------:| | result | 本次操作返回的结果数据 | | memo | 保留参数,一般无内容 | #### 华为 [接入文档](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/iap-iap#section18798154545516) 1、唤起支付 ```typescript new PayAction(MultiMedia.HUAWEI) .setProductId("productId") // 商品id .setProductType(0) // 商品类型: 0:消耗型商品,1:非消耗型商品,2:自动续期订阅商品 .setDeveloperPayload("") // 商户侧保留信息 .setReservedInfo("") // 要求JSON String格式,商户可以将额外需要传入的字段以key-value的形式设置在JSON String中,并通过该参数传入。例如:let reservedInfo = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; .setPromotionalOfferId("") // 优惠ID。优惠ID来源于开发者为自动续期订阅商品配置优惠促销时设置的促销优惠标志符。传递该字段且要生效,需同时在jwsRepresentation字段中传递促销优惠信息。 .setApplicationUserName("") // 用户账户相关联的混淆字符串,唯一标识用户。传递优惠ID场景,可以传递该字段。 .setJwsRepresentation("") // 包含购买参数信息的JWS格式签名数据。购买参数,如优惠促销等。详细说明见生成订阅优惠签名购买参数。 .setCallback(callback) .pay(this.context); ``` 2、成功结果返回 | 键 | 说明 | |:---------------------:|:---------------------------------------------------------------------------------:| | type | 商品类型: 0:消耗型商品,1:非消耗型商品,2:自动续期订阅商品 | | jwsPurchaseOrder | 包含订单信息的JWS格式数据。可参见对返回结果验签解码验签获取相关购买数据的JSON字符串,其包含的参数请参见PurchaseOrderPayload。 | | jwsSubscriptionStatus | 包含订阅状态信息的JWS格式数据。可参见对返回结果验签解码验签获取相关订阅状态信息的JSON字符串,其包含的参数请参见SubGroupStatusPayload。 | ### 授权登录 #### 微信 [接入文档](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/ohos.html) 1、在开发者的 App module 中的oh-package.json5文件,在dependencies中加入微信 opensdk 的依赖项 ```json { "dependencies": { "@tencent/wechat_open_sdk": "^1.0.14" } } ``` 2、在开发者的 App module 中的build-profile.json5文件里加入下方声明 ```json { "buildOptionSet": [ { "arkOptions": { "runtimeOnly": { "packages": [ "@tencent/wechat_open_sdk" ] } } } ] } ``` 3、在开发者的 App module 的 module.json5 里加入下方声明,详情可查看[使用canOpenLink判断应用是否可访问](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/canopenlink-V5) ```json { "module": { "abilities": [ { "skills": [ { "actions": [ "wxentity.action.open" ] } ] } ], "querySchemes": [ "weixin" ] } } ``` 4.唤起登录 ```typescript new OauthAction(MultiMedia.WECHAT) .setScopes(["snsapi_userinfo"]) // snsapi_userinfo 个人信息 .setCallback(callback) // 回调监听 .oauth(this.context); ``` 5、成功结果返回 | 键 | 说明 | |:------------:|:-------------------------------------------:| | accessToken | accessToken | | refreshToken | refreshToken | | expiration | 过期时间(毫秒) | | openid | 普通用户的标识,对当前开发者账号唯一 | | unionid | 用户统一标识。针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的。 | | nickname | 普通用户昵称 | | sex | 普通用户性别,0 为未知,1 为男性,2 为女性 | | iconUrl | 用户头像,用户没有头像时该项为空 | | province | 普通用户个人资料填写的省份 | | city | 普通用户个人资料填写的城市 | | country | 国家,如中国为 CN | #### QQ [接入文档](https://wiki.connect.qq.com/harmonyos_sdk%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba) 1、在开发者的 App module 中的oh-package.json5文件,在dependencies中加入微信 opensdk 的依赖项 ```json { "dependencies": { "@tencent/qq-open-sdk": "^1.0.4" } } ``` 2、在开发者的 App module 中的build-profile.json5文件里加入下方声明 ```json { "buildOptionSet": [ { "arkOptions": { "runtimeOnly": { "packages": [ "@tencent/qq-open-sdk" ] } } } ] } ``` 3、在开发者的 App module 的 module.json5 里加入下方声明 ```json { "module": { "abilities": [ { "skills": [ { "entities": [ "entity.system.browsable" ], "actions": [ "ohos.want.action.viewData" ], "uris": [ { "scheme": "qqopenapi", // 接收 QQ 回调数据 "host": "xxxxxxxxx", // 业务申请的互联 appId,如果填错会导致 QQ 无法回调 "pathRegex": "\\b(auth|share)\\b", "linkFeature": "Login" } ] } ] } ], "querySchemes": [ "qqopenapi" ] } } ``` 4.唤起登录 ```typescript new OauthAction(MultiMedia.QQ) .setScopes(["all"]) // all 个人信息 .setCallback(callback) // 回调监听 .oauth(this.context); ``` 5、成功结果返回 | 键 | 说明 | |:------------------:|:----------------------------------------------------------------:| | accessToken | accessToken | | refreshToken | refreshToken | | expiration | 过期时间(毫秒) | | openid | 普通用户的标识,对当前开发者账号唯一 | | unionid | 用户统一标识。针对一个QQ开放平台账号下的应用,同一用户的 unionid 是唯一的。(未申请unionID接口调用权限时为空) | | nickname | 普通用户昵称 | | sex | 普通用户性别,0 为未知,1 为男性,2 为女性 | | iconUrl | 用户头像 | | is_yellow_year_vip | 标识是否为年费黄钻用户(0:不是; 1:是) | | yellow_vip_level | 黄钻等级 | #### 华为 [接入文档](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/iap-iap#section18798154545516) 1、唤起登录 ```typescript new OauthAction(MultiMedia.HUAWEI) .setScopes(["profile"]) // profile 基本信息,如昵称头像等(元服务不支持该scope)。openid:华为账号用户的OpenID、UnionID。phone:华为账号快速验证手机号。quickLoginAnonymousPhone:获取华为账号绑定的匿名手机号(该scope只能与openid同时使用)。 .setCallback(callback) .oauth(this.context); ``` 2、成功结果返回 | 键 | 说明 | |:-----------------:|:-------------------------------------------:| | openid | 普通用户的标识,对当前开发者账号唯一 | | unionid | 用户统一标识。针对一个华为开放平台账号下的应用,同一用户的 unionid 是唯一的。 | | nickname | 普通用户昵称 | | iconUrl | 用户头像,用户没有头像时该项为空 | | authorizationCode | 用户授权临时凭据 | | idToken | 用户身份认证信息 | ### 分享 #### 微信(支持分享到朋友圈,不支持收藏) [接入文档](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/ohos.html) 1、在开发者的 App module 中的oh-package.json5文件,在dependencies中加入微信 opensdk 的依赖项 ```json { "dependencies": { "@tencent/wechat_open_sdk": "^1.0.14" } } ``` 2、在开发者的 App module 中的build-profile.json5文件里加入下方声明 ```json { "buildOptionSet": [ { "arkOptions": { "runtimeOnly": { "packages": [ "@tencent/wechat_open_sdk" ] } } } ] } ``` 3、在开发者的 App module 的 module.json5 里加入下方声明,详情可查看[使用canOpenLink判断应用是否可访问](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/canopenlink-V5) ```json { "module": { "abilities": [ { "skills": [ { "actions": [ "wxentity.action.open" ] } ] } ], "querySchemes": [ "weixin" ] } } ``` 4.唤起分享 ```typescript // 文字类型分享 const share: ShareText = new ShareText("分享测试内容"); new ShareAction(MultiMedia.WECHAT) .setShare(share) .setShareScene(ShareScene.FRIEND) // FRIEND: 好友,CIRCLE: 朋友圈 .setCallback(callback) .share(this.context); // 图片类型分享 const share: ShareImage = new ShareImage(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); new ShareAction(MultiMedia.WECHAT) .setShare(share) .setShareScene(ShareScene.FRIEND) // FRIEND: 好友,CIRCLE: 朋友圈 .setCallback(callback) .share(this.context); // 网页类型分享 const share: ShareWeb = new ShareWeb("https://www.baidu.com"); share.setTitle("分享网页"); share.setDescription("分享网页测试描述"); share.setThumbImage(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); new ShareAction(MultiMedia.WECHAT) .setShare(share) .setShareScene(ShareScene.FRIEND) // FRIEND: 好友,CIRCLE: 朋友圈 .setCallback(callback) .share(this.context); // 小程序类型分享(不支持分享到朋友圈) const share: ShareMini = new ShareMini("gh_d43f693ca31f", "/pages/media"); share.setTitle("小程序消息Title"); share.setDescription("小程序消息Desc"); share.setThumbImage(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); new ShareAction(MultiMedia.WECHAT) .setShare(share) .setShareScene(ShareScene.FRIEND) // FRIEND: 好友,CIRCLE: 朋友圈 .setCallback(callback) .share(this.context); // 视频类型分享 const share: ShareVideo = new ShareVideo("https://illoll.sdfsdf.cn/video/huai_auen.mp4"); share.setTitle("分享视频"); share.setDescription("分享视频描述"); share.setThumbImage(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); new ShareAction(MultiMedia.WECHAT) .setShare(share) .setShareScene(ShareScene.FRIEND) // FRIEND: 好友,CIRCLE: 朋友圈 .setCallback(callback) .share(this.context); ``` #### QQ [接入文档](https://wiki.connect.qq.com/harmonyos_sdk%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba) 1、在开发者的 App module 中的oh-package.json5文件,在dependencies中加入微信 opensdk 的依赖项 ```json { "dependencies": { "@tencent/qq-open-sdk": "^1.0.4" } } ``` 2、在开发者的 App module 中的build-profile.json5文件里加入下方声明 ```json { "buildOptionSet": [ { "arkOptions": { "runtimeOnly": { "packages": [ "@tencent/qq-open-sdk" ] } } } ] } ``` 3、在开发者的 App module 的 module.json5 里加入下方声明 ```json { "module": { "abilities": [ { "skills": [ { "entities": [ "entity.system.browsable" ], "actions": [ "ohos.want.action.viewData" ], "uris": [ { "scheme": "qqopenapi", // 接收 QQ 回调数据 "host": "xxxxxxxxx", // 业务申请的互联 appId,如果填错会导致 QQ 无法回调 "pathRegex": "\\b(auth|share)\\b", "linkFeature": "Login" } ] } ] } ], "querySchemes": [ "qqopenapi" ] } } ``` 4.唤起分享 ```typescript // 网页分享 const share: ShareWeb = new ShareWeb("http://www.qq.com"); share.setTitle("测试网页标题") share.setDescription("测试网页摘要") share.setThumbImage(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); new ShareAction(MultiMedia.QQ) .setCallback(callback) .setShare(share) .share(this.context); // 图片类型分享 const share: ShareImage = new ShareImage(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); new ShareAction(MultiMedia.WECHAT) .setShare(share) .setShareScene(ShareScene.FRIEND) // FRIEND: 好友,CIRCLE: 朋友圈 .setCallback(callback) .share(this.context); // 多图分享到QQ空间(仅支持网络图片) const images:Array = []; images.push(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); images.push(new ImageObject({ imagePath: "https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png" })); const share: ShareImage = new ShareImage(images); new ShareAction(MultiMedia.WECHAT) .setShare(share) .setShareScene(ShareScene.FRIEND) // FRIEND: 好友,CIRCLE: 朋友圈 .setCallback(callback) .share(this.context); ```