From 6ac02ae5da09a0b0911b14bf85975e8b8ce55d8c Mon Sep 17 00:00:00 2001 From: Alex Li Date: Wed, 8 Sep 2021 13:50:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E3=80=8C=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=88=86=E3=80=8D=20(#90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v7lin/wechat_kit/WechatKitPlugin.java | 28 +++++++++++++++++++ ios/Classes/WechatKitPlugin.m | 27 ++++++++++++++++++ lib/src/model/resp.dart | 22 +++++++++++++++ lib/src/model/resp.g.dart | 18 ++++++++++++ lib/src/wechat.dart | 28 +++++++++++++++++++ 5 files changed, 123 insertions(+) diff --git a/android/src/main/java/io/github/v7lin/wechat_kit/WechatKitPlugin.java b/android/src/main/java/io/github/v7lin/wechat_kit/WechatKitPlugin.java index 17156c8..6ab1094 100644 --- a/android/src/main/java/io/github/v7lin/wechat_kit/WechatKitPlugin.java +++ b/android/src/main/java/io/github/v7lin/wechat_kit/WechatKitPlugin.java @@ -23,6 +23,7 @@ import com.tencent.mm.opensdk.modelbiz.OpenWebview; import com.tencent.mm.opensdk.modelbiz.SubscribeMessage; import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram; import com.tencent.mm.opensdk.modelbiz.WXOpenCustomerServiceChat; +import com.tencent.mm.opensdk.modelbiz.WXOpenBusinessView; import com.tencent.mm.opensdk.modelmsg.LaunchFromWX; import com.tencent.mm.opensdk.modelmsg.SendAuth; import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; @@ -85,6 +86,7 @@ public final class WechatKitPlugin implements FlutterPlugin, ActivityAware, Plug private static final String METHOD_SUBSCRIBEMSG = "subscribeMsg"; private static final String METHOD_LAUNCHMINIPROGRAM = "launchMiniProgram"; private static final String METHOD_OPENCUSTOMERSERVICECHAT = "openCustomerServiceChat"; + private static final String METHOD_OPENBUSINESSVIEW = "openBusinessView"; private static final String METHOD_PAY = "pay"; private static final String METHOD_ONLAUNCHFROMWXREQ = "onLaunchFromWXReq"; @@ -96,6 +98,7 @@ public final class WechatKitPlugin implements FlutterPlugin, ActivityAware, Plug private static final String METHOD_ONSUBSCRIBEMSGRESP = "onSubscribeMsgResp"; private static final String METHOD_ONLAUNCHMINIPROGRAMRESP = "onLaunchMiniProgramResp"; private static final String METHOD_ONOPENCUSTOMERSERVICECHATRESP = "onOpenCustomerServiceChatResp"; + private static final String METHOD_ONOPENBUSINESSVIEWRESP = "onOpenBusinessViewResp"; private static final String METHOD_ONPAYRESP = "onPayResp"; private static final String METHOD_ONAUTHGOTQRCODE = "onAuthGotQrcode"; private static final String METHOD_ONAUTHQRCODESCANNED = "onAuthQrcodeScanned"; @@ -109,6 +112,7 @@ public final class WechatKitPlugin implements FlutterPlugin, ActivityAware, Plug private static final String ARGUMENT_KEY_TIMESTAMP = "timestamp"; private static final String ARGUMENT_KEY_SIGNATURE = "signature"; private static final String ARGUMENT_KEY_URL = "url"; + private static final String ARGUMENT_KEY_QUERY = "query"; private static final String ARGUMENT_KEY_USERNAME = "username"; private static final String ARGUMENT_KEY_SCENE = "scene"; private static final String ARGUMENT_KEY_TEXT = "text"; @@ -137,10 +141,12 @@ public final class WechatKitPlugin implements FlutterPlugin, ActivityAware, Plug private static final String ARGUMENT_KEY_TEMPLATEID = "templateId"; private static final String ARGUMENT_KEY_RESERVED = "reserved"; private static final String ARGUMENT_KEY_CORPID = "corpId"; + private static final String ARGUMENT_KEY_BUSINESSTYPE = "businessType"; private static final String ARGUMENT_KEY_PARTNERID = "partnerId"; private static final String ARGUMENT_KEY_PREPAYID = "prepayId"; private static final String ARGUMENT_KEY_PACKAGE = "package"; private static final String ARGUMENT_KEY_SIGN = "sign"; + private static final String ARGUMENT_KEY_EXTINFO = "extInfo"; private static final String ARGUMENT_KEY_RESULT_ERRORCODE = "errorCode"; private static final String ARGUMENT_KEY_RESULT_ERRORMSG = "errorMsg"; @@ -309,6 +315,15 @@ public final class WechatKitPlugin implements FlutterPlugin, ActivityAware, Plug if (channel != null) { channel.invokeMethod(METHOD_ONOPENCUSTOMERSERVICECHATRESP, map); } + } else if (resp instanceof WXOpenBusinessView.Resp) { + if (resp.errCode == BaseResp.ErrCode.ERR_OK) { + WXOpenBusinessView.Resp openBusinessViewResp = (WXOpenBusinessView.Resp) resp; + map.put(ARGUMENT_KEY_BUSINESSTYPE, openBusinessViewResp.businessType); + map.put(ARGUMENT_KEY_RESULT_EXTMSG, openBusinessViewResp.extMsg); + } + if (channel != null) { + channel.invokeMethod(METHOD_ONOPENBUSINESSVIEWRESP, map); + } } else if (resp instanceof PayResp) { // 支付 if (resp.errCode == BaseResp.ErrCode.ERR_OK) { @@ -363,6 +378,8 @@ public final class WechatKitPlugin implements FlutterPlugin, ActivityAware, Plug handleLaunchMiniProgramCall(call, result); } else if (METHOD_OPENCUSTOMERSERVICECHAT.equals(call.method)) { handleOpenCustomerServiceChat(call, result); + } else if (METHOD_OPENBUSINESSVIEW.equals(call.method)) { + handleOpenBusinessView(call, result); } else if (METHOD_PAY.equals(call.method)) { handlePayCall(call, result); } else { @@ -587,6 +604,17 @@ public final class WechatKitPlugin implements FlutterPlugin, ActivityAware, Plug result.success(null); } + private void handleOpenBusinessView(@NonNull MethodCall call, @NonNull Result result) { + final WXOpenBusinessView.Req req = new WXOpenBusinessView.Req(); + req.businessType = call.argument(ARGUMENT_KEY_BUSINESSTYPE); + req.query = call.argument(ARGUMENT_KEY_QUERY); + req.extInfo = call.argument(ARGUMENT_KEY_EXTINFO); + if (iwxapi != null) { + iwxapi.sendReq(req); + } + result.success(null); + } + private void handlePayCall(@NonNull MethodCall call, @NonNull Result result) { final PayReq req = new PayReq(); req.appId = call.argument(ARGUMENT_KEY_APPID); diff --git a/ios/Classes/WechatKitPlugin.m b/ios/Classes/WechatKitPlugin.m index 9b5ca44..f2ba9d3 100644 --- a/ios/Classes/WechatKitPlugin.m +++ b/ios/Classes/WechatKitPlugin.m @@ -52,6 +52,7 @@ static NSString *const METHOD_SHAREMINIPROGRAM = @"shareMiniProgram"; static NSString *const METHOD_SUBSCRIBEMSG = @"subscribeMsg"; static NSString *const METHOD_LAUNCHMINIPROGRAM = @"launchMiniProgram"; static NSString *const METHOD_OPENCUSTOMERSERVICECHAT = @"openCustomerServiceChat"; +static NSString *const METHOD_OPENBUSINESSVIEW = @"openBusinessView"; #ifndef NO_PAY static NSString *const METHOD_PAY = @"pay"; #endif @@ -65,6 +66,7 @@ static NSString *const METHOD_ONSHAREMSGRESP = @"onShareMsgResp"; static NSString *const METHOD_ONSUBSCRIBEMSGRESP = @"onSubscribeMsgResp"; static NSString *const METHOD_ONLAUNCHMINIPROGRAMRESP = @"onLaunchMiniProgramResp"; static NSString *const METHOD_ONOPENCUSTOMERSERVICECHATRESP = @"onOpenCustomerServiceChatResp"; +static NSString *const METHOD_ONOPENBUSINESSVIEWRESP = @"onOpenBusinessViewResp"; #ifndef NO_PAY static NSString *const METHOD_ONPAYRESP = @"onPayResp"; #endif @@ -80,6 +82,7 @@ static NSString *const ARGUMENT_KEY_NONCESTR = @"noncestr"; static NSString *const ARGUMENT_KEY_TIMESTAMP = @"timestamp"; static NSString *const ARGUMENT_KEY_SIGNATURE = @"signature"; static NSString *const ARGUMENT_KEY_URL = @"url"; +static NSString *const ARGUMENT_KEY_QUERY = @"query"; static NSString *const ARGUMENT_KEY_USERNAME = @"username"; static NSString *const ARGUMENT_KEY_SCENE = @"scene"; static NSString *const ARGUMENT_KEY_TEXT = @"text"; @@ -109,6 +112,7 @@ static NSString *const ARGUMENT_KEY_DISABLEFORWARD = @"disableForward"; static NSString *const ARGUMENT_KEY_TEMPLATEID = @"templateId"; static NSString *const ARGUMENT_KEY_RESERVED = @"reserved"; static NSString *const ARGUMENT_KEY_CORPID = @"corpId"; +static NSString *const ARGUMENT_KEY_BUSINESSTYPE = @"businessType"; #ifndef NO_PAY static NSString *const ARGUMENT_KEY_PARTNERID = @"partnerId"; static NSString *const ARGUMENT_KEY_PREPAYID = @"prepayId"; @@ -117,6 +121,7 @@ static NSString *const ARGUMENT_KEY_PREPAYID = @"prepayId"; static NSString *const ARGUMENT_KEY_PACKAGE = @"package"; static NSString *const ARGUMENT_KEY_SIGN = @"sign"; #endif +static NSString *const ARGUMENT_KEY_EXTINFO = @"extInfo"; static NSString *const ARGUMENT_KEY_RESULT_ERRORCODE = @"errorCode"; static NSString *const ARGUMENT_KEY_RESULT_ERRORMSG = @"errorMsg"; @@ -200,6 +205,8 @@ static NSString *const ARGUMENT_KEY_RESULT_AUTHCODE = @"authCode"; [self handleLaunchMiniProgramCall:call result:result]; } else if ([METHOD_OPENCUSTOMERSERVICECHAT isEqualToString:call.method]) { [self handleOpenCustomerServiceChatCall: call result:result]; + } else if ([METHOD_OPENBUSINESSVIEW isEqualToString:call.method]) { + [self handleOpenBusinessViewCall: call result:result]; } #ifndef NO_PAY else if ([METHOD_PAY isEqualToString:call.method]) { @@ -413,6 +420,19 @@ static NSString *const ARGUMENT_KEY_RESULT_AUTHCODE = @"authCode"; result(nil); } +- (void)handleOpenBusinessViewCall:(FlutterMethodCall *)call + result:(FlutterResult)result { + WXOpenBusinessViewReq *req = [[WXOpenBusinessViewReq alloc] init]; + req.businessType = call.arguments[ARGUMENT_KEY_BUSINESSTYPE]; + req.query = call.arguments[ARGUMENT_KEY_QUERY]; + req.extInfo = call.arguments[ARGUMENT_KEY_EXTINFO]; + [WXApi sendReq:req + completion:^(BOOL success){ + // do nothing + }]; + result(nil); +} + #ifndef NO_PAY - (void)handlePayCall:(FlutterMethodCall *)call result:(FlutterResult)result { PayReq *req = [[PayReq alloc] init]; @@ -546,6 +566,13 @@ static NSString *const ARGUMENT_KEY_RESULT_AUTHCODE = @"authCode"; [_channel invokeMethod:METHOD_ONLAUNCHMINIPROGRAMRESP arguments:dictionary]; } else if ([resp isKindOfClass:[WXOpenCustomerServiceResp class]]) { [_channel invokeMethod:METHOD_ONOPENCUSTOMERSERVICECHATRESP arguments:dictionary]; + } else if ([resp isKindOfClass:[WXOpenBusinessViewResp class]]) { + if (resp.errCode == WXSuccess) { + WXOpenBusinessViewResp *openBusinessViewResp = (WXOpenBusinessViewResp *)resp; + [dictionary setValue:openBusinessViewResp.businessType forKey:ARGUMENT_KEY_BUSINESSTYPE]; + [dictionary setValue:openBusinessViewResp.extMsg forKey:ARGUMENT_KEY_RESULT_EXTMSG]; + } + [_channel invokeMethod:METHOD_ONOPENBUSINESSVIEWRESP arguments:dictionary]; } else { #ifndef NO_PAY if ([resp isKindOfClass:[PayResp class]]) { diff --git a/lib/src/model/resp.dart b/lib/src/model/resp.dart index 1a686b2..773b790 100755 --- a/lib/src/model/resp.dart +++ b/lib/src/model/resp.dart @@ -182,6 +182,28 @@ class OpenCustomerServiceChatResp extends BaseResp { Map toJson() => _$OpenCustomerServiceChatRespToJson(this); } +@JsonSerializable(explicitToJson: true) +class OpenBusinessViewResp extends BaseResp { + const OpenBusinessViewResp({ + required this.businessType, + required this.extMsg, + required int errorCode, + String? errorMsg, + }) : super( + errorCode: errorCode, + errorMsg: errorMsg, + ); + + factory OpenBusinessViewResp.fromJson(Map json) => + _$OpenBusinessViewRespFromJson(json); + + final String businessType; + final String extMsg; + + @override + Map toJson() => _$OpenBusinessViewRespToJson(this); +} + @JsonSerializable( explicitToJson: true, ) diff --git a/lib/src/model/resp.g.dart b/lib/src/model/resp.g.dart index fa40656..b02ad3e 100644 --- a/lib/src/model/resp.g.dart +++ b/lib/src/model/resp.g.dart @@ -107,6 +107,24 @@ Map _$OpenCustomerServiceChatRespToJson( 'errorMsg': instance.errorMsg, }; +OpenBusinessViewResp _$OpenBusinessViewRespFromJson(Map json) { + return OpenBusinessViewResp( + businessType: json['businessType'] as String, + extMsg: json['extMsg'] as String, + errorCode: json['errorCode'] as int? ?? 0, + errorMsg: json['errorMsg'] as String?, + ); +} + +Map _$OpenBusinessViewRespToJson( + OpenBusinessViewResp instance) => + { + 'businessType': instance.businessType, + 'extMsg': instance.extMsg, + 'errorCode': instance.errorCode, + 'errorMsg': instance.errorMsg, + }; + PayResp _$PayRespFromJson(Map json) { return PayResp( errorCode: json['errorCode'] as int? ?? 0, diff --git a/lib/src/wechat.dart b/lib/src/wechat.dart index 3c56ac6..96fce34 100755 --- a/lib/src/wechat.dart +++ b/lib/src/wechat.dart @@ -43,6 +43,7 @@ class Wechat { static const String _METHOD_LAUNCHMINIPROGRAM = 'launchMiniProgram'; static const String _METHOD_OPENCUSTOMERSERVICECHAT = 'openCustomerServiceChat'; + static const String _METHOD_OPENBUSINESSVIEW = 'openBusinessView'; static const String _METHOD_PAY = 'pay'; static const String _METHOD_ONLAUNCHFROMWXREQ = 'onLaunchFromWXReq'; @@ -56,6 +57,7 @@ class Wechat { 'onLaunchMiniProgramResp'; static const String _METHOD_ONOPENCUSTOMERSERVICECHATRESP = 'onOpenCustomerServiceChatResp'; + static const String _METHOD_ONOPENBUSINESSVIEWRESP = 'onOpenBusinessViewResp'; static const String _METHOD_ONPAYRESP = 'onPayResp'; static const String _METHOD_ONAUTHGOTQRCODE = 'onAuthGotQrcode'; static const String _METHOD_ONAUTHQRCODESCANNED = 'onAuthQrcodeScanned'; @@ -69,6 +71,7 @@ class Wechat { static const String _ARGUMENT_KEY_TIMESTAMP = 'timestamp'; static const String _ARGUMENT_KEY_SIGNATURE = 'signature'; static const String _ARGUMENT_KEY_URL = 'url'; + static const String _ARGUMENT_KEY_QUERY = 'query'; static const String _ARGUMENT_KEY_USERNAME = 'username'; static const String _ARGUMENT_KEY_SCENE = 'scene'; static const String _ARGUMENT_KEY_TEXT = 'text'; @@ -97,10 +100,12 @@ class Wechat { static const String _ARGUMENT_KEY_TEMPLATEID = 'templateId'; static const String _ARGUMENT_KEY_RESERVED = 'reserved'; static const String _ARGUMENT_KEY_CORPID = 'corpId'; + static const String _ARGUMENT_KEY_BUSINESSTYPE = 'businessType'; static const String _ARGUMENT_KEY_PARTNERID = 'partnerId'; static const String _ARGUMENT_KEY_PREPAYID = 'prepayId'; static const String _ARGUMENT_KEY_PACKAGE = 'package'; static const String _ARGUMENT_KEY_SIGN = 'sign'; + static const String _ARGUMENT_KEY_EXTINFO = 'extInfo'; static const String _SCHEME_FILE = 'file'; @@ -173,6 +178,10 @@ class Wechat { _respStreamController.add(OpenCustomerServiceChatResp.fromJson( (call.arguments as Map).cast())); break; + case _METHOD_ONOPENBUSINESSVIEWRESP: + _respStreamController.add(OpenBusinessViewResp.fromJson( + (call.arguments as Map).cast())); + break; case _METHOD_ONPAYRESP: _respStreamController.add(PayResp.fromJson( (call.arguments as Map).cast())); @@ -569,6 +578,25 @@ class Wechat { ); } + /// 调起支付分 + /// * 免确认模式:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_7.shtml + /// * 需确认授权:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_11.shtml + /// * 拉起小程序:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_23.shtml + Future openBusinessView({ + required String businessType, + required String query, + String? extInfo, + }) { + return _channel.invokeMethod( + _METHOD_OPENBUSINESSVIEW, + { + _ARGUMENT_KEY_BUSINESSTYPE: businessType, + _ARGUMENT_KEY_QUERY: query, + if (extInfo != null) _ARGUMENT_KEY_EXTINFO: extInfo, + }, + ); + } + /// 支付 - x.y.z-iOS-NoPay 版本下 iOS 调用会直接抛出异常 No implementation [MissingPluginException] /// 参数说明:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2 Future pay({