Unverified 提交 0ecc3810 authored 作者: yeliulee's avatar yeliulee

add impl for payment & share for wechat on ohos

Signed-off-by: 's avataryeliulee <yeliuleet@gmail.com> (cherry picked from commit 480e8f770167ca3905e9c0b7b09d94d25fb788c1)
上级 ee981f7d
...@@ -9,10 +9,11 @@ import { ...@@ -9,10 +9,11 @@ import {
MethodResult, MethodResult,
NewWantListener, NewWantListener,
} from '@ohos/flutter_ohos'; } from '@ohos/flutter_ohos';
import * as wechatOpenSDK from "@tencent/wechat_open_sdk" import * as wechatSDK from "@tencent/wechat_open_sdk"
import { FluwxAuthHandler } from './handlers/FluwxAuthHandler'; import { FluwxAuthHandler } from './handlers/FluwxAuthHandler';
import { AbilityConstant, common, Want } from '@kit.AbilityKit'; import { AbilityConstant, common, Want } from '@kit.AbilityKit';
import { WXAPiHandler } from './handlers/WXAPiHandler'; import { WXAPiHandler } from './handlers/WXAPiHandler';
import { FluwxShareHandler } from './handlers/FluwxShareHandler';
const MESSAGE_CHANNEL_NAME = "com.jarvanmo/fluwx" const MESSAGE_CHANNEL_NAME = "com.jarvanmo/fluwx"
const KEY_ERR_STR = "errStr" const KEY_ERR_STR = "errStr"
...@@ -21,11 +22,14 @@ const KEY_OPEN_ID = "openId" ...@@ -21,11 +22,14 @@ const KEY_OPEN_ID = "openId"
const KEY_TYPE = "type" const KEY_TYPE = "type"
/** FluwxPlugin **/ /** FluwxPlugin **/
export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, AbilityAware, NewWantListener, wechatOpenSDK.WXApiEventHandler { export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, AbilityAware, NewWantListener, wechatSDK.WXApiEventHandler {
private channel: MethodChannel | null = null; private channel: MethodChannel | null = null;
private appContext: common.Context | null = null; private appContext: common.Context | null = null;
private binding: AbilityPluginBinding | null = null; private uiContext: common.UIAbilityContext | null = null;
private binding: AbilityPluginBinding | null = null
private authHandler: FluwxAuthHandler | null = null; private authHandler: FluwxAuthHandler | null = null;
private shareHandler: FluwxShareHandler | null = null;
private extMsg: string | null = null;
getUniqueClassName(): string { getUniqueClassName(): string {
return "FluwxPlugin" return "FluwxPlugin"
...@@ -36,44 +40,39 @@ export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, Ab ...@@ -36,44 +40,39 @@ export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, Ab
this.channel.setMethodCallHandler(this) this.channel.setMethodCallHandler(this)
this.appContext = binding.getApplicationContext(); this.appContext = binding.getApplicationContext();
this.authHandler = new FluwxAuthHandler(this.channel); this.authHandler = new FluwxAuthHandler(this.channel);
this.shareHandler = new FluwxShareHandler();
} }
onDetachedFromEngine(binding: FlutterPluginBinding): void { onDetachedFromEngine(binding: FlutterPluginBinding): void {
this.channel = null; this.channel = null;
this.appContext = null; this.appContext = null;
this.authHandler = null; this.authHandler = null;
this.shareHandler = null;
} }
onAttachedToAbility(binding: AbilityPluginBinding): void { onAttachedToAbility(binding: AbilityPluginBinding): void {
WXAPiHandler.setContext(binding.getAbility().context); this.binding = binding
this.binding = binding; this.uiContext = binding.getAbility().context;
WXAPiHandler.setContext(this.uiContext);
binding.addOnNewWantListener(this) binding.addOnNewWantListener(this)
} }
onDetachedFromAbility(): void { onDetachedFromAbility(): void {
this.binding = null; this.binding?.removeOnNewWantListener(this)
this.binding = null
this.uiContext = null;
} }
// 微信回调 start onMethodCall(call: MethodCall, result: MethodResult): void {
if (call.method.startsWith("share")) {
onReq = (req: wechatOpenSDK.BaseReq): void => { this.shareHandler?.share(call, result);
}
onResp = (resp: wechatOpenSDK.BaseResp): void => {
if (resp instanceof wechatOpenSDK.SendAuthResp) {
this.handleAuthResponse(resp);
return; return;
} }
}
// 微信回调 end
onNewWant(want: Want, launchParams: AbilityConstant.LaunchParam): void {
WXAPiHandler.wxApi?.handleWant(want, this)
}
onMethodCall(call: MethodCall, result: MethodResult): void {
switch (call.method) { switch (call.method) {
case "isWeChatInstalled":
WXAPiHandler.checkWeChatInstallation(result);
break;
case "registerApp": case "registerApp":
WXAPiHandler.registerApp(call, result); WXAPiHandler.registerApp(call, result);
break; break;
...@@ -86,15 +85,100 @@ export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, Ab ...@@ -86,15 +85,100 @@ export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, Ab
case "stopAuthByQRCode": case "stopAuthByQRCode":
this.authHandler?.stopAuthByQRCode(result); this.authHandler?.stopAuthByQRCode(result);
break; break;
case "isWeChatInstalled": case "payWithFluwx":
WXAPiHandler.checkWeChatInstallation(result); this.handlePay(call, result);
break;
case "payWithHongKongWallet":
// TODO
result.notImplemented();
break;
case "launchMiniProgram":
// TODO
result.notImplemented();
break;
case "subscribeMsg":
// TODO
result.notImplemented();
break;
case "autoDeduct":
// TODO
result.notImplemented();
break;
case "autoDeductV2":
// TODO
result.notImplemented();
break;
case "openWXApp":
result.success(WXAPiHandler.wxApi?.openWechat(this.uiContext));
break;
case "getExtMsg":
result.success(this.extMsg);
this.extMsg = null;
break;
case "openWeChatCustomerServiceChat":
// TODO
result.notImplemented();
break;
case "checkSupportOpenBusinessView":
// TODO
result.notImplemented();
break;
case "openBusinessView":
// TODO
result.notImplemented();
break;
case "openWeChatInvoice":
// TODO
result.notImplemented();
break;
case "openUrl":
// TODO
result.notImplemented();
break;
case "openRankList":
// TODO
result.notImplemented();
break;
case "attemptToResumeMsgFromWx":
this.attemptToResumeMsgFromWx(result);
break;
case "selfCheck":
result.success(null)
break; break;
default: default:
result.notImplemented() result.notImplemented();
} }
} }
handleAuthResponse(resp: wechatOpenSDK.SendAuthResp) { onNewWant(want: Want, launchParams: AbilityConstant.LaunchParam): void {
WXAPiHandler.wxApi?.handleWant(want, this);
}
// 微信回调 start
onReq = (req: wechatSDK.BaseReq): void => {
// TODO
}
onResp = (resp: wechatSDK.BaseResp): void => {
if (resp instanceof wechatSDK.SendAuthResp) {
this.onAuthResponse(resp);
return;
}
if (resp instanceof wechatSDK.SendMessageToWXResp) {
this.onSendMessageToWXResp(resp);
return;
}
if (resp instanceof wechatSDK.PayResp) {
this.onPayResp(resp);
return;
}
}
// 微信回调 end
onAuthResponse(resp: wechatSDK.SendAuthResp) {
const result: Map<string, ESObject> = new Map(); const result: Map<string, ESObject> = new Map();
result.set(KEY_ERR_CODE, resp.errCode); result.set(KEY_ERR_CODE, resp.errCode);
result.set(KEY_ERR_STR, resp.errStr); result.set(KEY_ERR_STR, resp.errStr);
...@@ -108,4 +192,52 @@ export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, Ab ...@@ -108,4 +192,52 @@ export default class FluwxPlugin implements FlutterPlugin, MethodCallHandler, Ab
this.channel?.invokeMethod("onAuthResponse", result); this.channel?.invokeMethod("onAuthResponse", result);
} }
onSendMessageToWXResp(resp: wechatSDK.SendMessageToWXResp) {
const _result: Map<string, ESObject> = new Map();
_result.set(KEY_ERR_CODE, resp.errCode);
_result.set(KEY_ERR_STR, resp.errStr);
_result.set(KEY_TYPE, resp.type);
_result.set(KEY_OPEN_ID, resp.openId);
this.channel?.invokeMethod("onShareResponse", _result);
}
onPayResp(resp: wechatSDK.PayResp) {
const _result: Map<string, ESObject> = new Map();
_result.set(KEY_ERR_CODE, resp.errCode);
_result.set(KEY_ERR_STR, resp.errStr);
_result.set(KEY_TYPE, resp.type);
_result.set("prepayId", resp.prepayId);
_result.set("returnKey", resp.returnKey);
_result.set("extData", resp.extData);
this.channel?.invokeMethod("onPayResponse", _result);
}
async handlePay(call: MethodCall, result: MethodResult) {
if (!WXAPiHandler.wxApi) {
result.error("Unassigned WxApi", "please config wxapi first", null);
return;
}
const request = new wechatSDK.PayReq();
request.appId = call.argument("appId");
request.partnerId = call.argument("partnerId");
request.prepayId = call.argument("prepayId");
request.packageValue = call.argument("packageValue");
request.nonceStr = call.argument("nonceStr");
request.timeStamp = call.argument("timeStamp").toString();
request.sign = call.argument("sign");
request.signType = call.argument("signType");
request.extData = call.argument("extData");
const done = await WXAPiHandler.wxApi?.sendReq(this.uiContext, request);
result.success(done);
}
attemptToResumeMsgFromWx(result: MethodResult) {
WXAPiHandler.wxApi?.handleWant(this.binding?.getAbility().launchWant, this)
}
} }
\ No newline at end of file
import { Any, MethodCall, MethodResult } from "@ohos/flutter_ohos"
import * as wechatSDK from "@tencent/wechat_open_sdk"
import { WXAPiHandler } from "./WXAPiHandler"
import { buffer } from "@kit.ArkTS"
import { fileUri } from "@kit.CoreFileKit"
export class FluwxShareHandler {
share(call: MethodCall, result: MethodResult) {
if (!WXAPiHandler.wxApi) {
result.error("Unassigned WxApi", "please config wxapi first", null);
return;
}
switch (call.method) {
case "shareText":
this.shareText(call, result);
break;
case "shareMiniProgram":
// TODO
result.notImplemented();
break;
case "shareImage":
this.shareImage(call, result);
break;
case "shareMusic":
// TODO
result.notImplemented();
break;
case "shareVideo":
// TODO
result.notImplemented();
break;
case "shareWebPage":
// TODO
result.notImplemented();
break;
case "shareFile":
// TODO
result.notImplemented();
break;
default:
result.notImplemented();
break;
}
}
async shareText(call: MethodCall, result: MethodResult) {
const textObj = new wechatSDK.WXTextObject();
textObj.text = call.argument("source");
const mediaMsg = new wechatSDK.WXMediaMessage();
mediaMsg.mediaObject = textObj;
const req = new wechatSDK.SendMessageToWXReq();
req.message = mediaMsg;
result.success(WXAPiHandler.wxApi?.sendReq(WXAPiHandler.uiContext, req))
}
async shareImage(call: MethodCall, result: MethodResult) {
const map: Map<string, Any> = call.argument("source") ?? new Map();
// const imageHash: string | null = call.argument("imgDataHash");
const bytes: Uint8Array | null = map.get("uint8List");
const imageObj = new wechatSDK.WXImageObject();
if (bytes) {
const buff: buffer.Buffer = buffer.from(bytes.buffer);
imageObj.imageData = buff.toString("base64", 0, buff.length);
} else {
const localImagePath: string | null = map.get("localImagePath");
if (localImagePath) {
imageObj.uri = localImagePath.startsWith("file://") ? localImagePath : fileUri.getUriFromPath(localImagePath)
}
}
const mediaMsg = new wechatSDK.WXMediaMessage();
mediaMsg.mediaObject = imageObj;
const req = new wechatSDK.SendMessageToWXReq();
req.message = mediaMsg;
result.success(WXAPiHandler.wxApi?.sendReq(WXAPiHandler.uiContext, req));
}
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论