diff --git a/android/build.gradle b/android/build.gradle index 9c60cce..49f8063 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 23 buildToolsVersion "23.0.1" + defaultConfig { minSdkVersion 16 targetSdkVersion 22 @@ -16,6 +17,6 @@ android { dependencies { compile 'com.facebook.react:react-native:+' - compile files('libs/libammsdk.jar') + compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+' } diff --git a/android/libs/libammsdk.jar b/android/libs/libammsdk.jar deleted file mode 100755 index 0cd8a5c..0000000 Binary files a/android/libs/libammsdk.jar and /dev/null differ diff --git a/android/src/main/java/cn/reactnative/modules/wx/WeChatModule.java b/android/src/main/java/cn/reactnative/modules/wx/WeChatModule.java index 3825b77..d463a6e 100644 --- a/android/src/main/java/cn/reactnative/modules/wx/WeChatModule.java +++ b/android/src/main/java/cn/reactnative/modules/wx/WeChatModule.java @@ -11,7 +11,6 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.NinePatchDrawable; import android.net.Uri; -import android.support.annotation.Nullable; import android.util.Log; import com.facebook.common.executors.UiThreadImmediateExecutorService; @@ -38,21 +37,25 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.RCTNativeAppEventEmitter; -import com.tencent.mm.sdk.modelbase.BaseReq; -import com.tencent.mm.sdk.modelbase.BaseResp; -import com.tencent.mm.sdk.modelmsg.SendAuth; -import com.tencent.mm.sdk.modelmsg.SendMessageToWX; -import com.tencent.mm.sdk.modelmsg.WXImageObject; -import com.tencent.mm.sdk.modelmsg.WXMediaMessage; -import com.tencent.mm.sdk.modelmsg.WXMusicObject; -import com.tencent.mm.sdk.modelmsg.WXTextObject; -import com.tencent.mm.sdk.modelmsg.WXVideoObject; -import com.tencent.mm.sdk.modelmsg.WXWebpageObject; -import com.tencent.mm.sdk.modelpay.PayReq; -import com.tencent.mm.sdk.modelpay.PayResp; -import com.tencent.mm.sdk.openapi.IWXAPI; -import com.tencent.mm.sdk.openapi.IWXAPIEventHandler; -import com.tencent.mm.sdk.openapi.WXAPIFactory; +import com.tencent.mm.opensdk.constants.Build; +import com.tencent.mm.opensdk.constants.ConstantsAPI; +import com.tencent.mm.opensdk.modelbase.BaseReq; +import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram; +import com.tencent.mm.opensdk.modelmsg.SendAuth; +import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; +import com.tencent.mm.opensdk.modelmsg.WXImageObject; +import com.tencent.mm.opensdk.modelmsg.WXMediaMessage; +import com.tencent.mm.opensdk.modelmsg.WXMiniProgramObject; +import com.tencent.mm.opensdk.modelmsg.WXMusicObject; +import com.tencent.mm.opensdk.modelmsg.WXTextObject; +import com.tencent.mm.opensdk.modelmsg.WXVideoObject; +import com.tencent.mm.opensdk.modelmsg.WXWebpageObject; +import com.tencent.mm.opensdk.modelpay.PayReq; +import com.tencent.mm.opensdk.modelpay.PayResp; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; import java.io.ByteArrayOutputStream; import java.util.Date; @@ -73,6 +76,7 @@ public class WeChatModule extends ReactContextBaseJavaModule implements IWXAPIEv private static final String RCTWXShareTypeText = "text"; private static final String RCTWXShareTypeVideo = "video"; private static final String RCTWXShareTypeAudio = "audio"; + private static final String RCTWXShareTypeMiniPro = "miniprogram"; private static final String RCTWXShareType = "type"; private static final String RCTWXShareText = "text"; @@ -81,6 +85,9 @@ public class WeChatModule extends ReactContextBaseJavaModule implements IWXAPIEv private static final String RCTWXShareWebpageUrl = "webpageUrl"; private static final String RCTWXShareImageUrl = "imageUrl"; private static final String RCTWXShareThumbImageSize = "thumbImageSize"; + private static final String RCTWXShareUserName = "userName"; + private static final String RCTWXSharePath = "path"; + private static final String RCTWXShareMiniProType = "miniprogramType"; public WeChatModule(ReactApplicationContext reactContext) { @@ -93,7 +100,7 @@ public WeChatModule(ReactApplicationContext reactContext) { } catch (PackageManager.NameNotFoundException e) { throw new Error(e); } - if (!appInfo.metaData.containsKey("WX_APPID")){ + if (!appInfo.metaData.containsKey("WX_APPID")) { throw new Error("meta-data WX_APPID not found in AndroidManifest.xml"); } appId = appInfo.metaData.get("WX_APPID").toString(); @@ -131,8 +138,16 @@ public void isWXAppInstalled(Callback callback) { } @ReactMethod - public void isWXAppSupportApi(Callback callback) { - callback.invoke(null, api.isWXAppSupportAPI()); + public void isWXAppSupportApi(String type, Callback callback) { + int apiVersion = api.getWXAppSupportAPI(); + boolean isSupport = apiVersion >= Build.MIN_SDK_INT; + if (type == "Pay") { + isSupport &= apiVersion >= Build.PAY_SUPPORTED_SDK_INT; + } else if (type == "WXLaunchMiniProgram") { + isSupport &= apiVersion >= Build.MINIPROGRAM_SUPPORTED_SDK_INT; + } + + callback.invoke(null, isSupport); } @ReactMethod @@ -143,8 +158,7 @@ public void login(ReadableMap config, Callback callback) { } if (config.hasKey("state")) { req.state = config.getString("state"); - } - else { + } else { req.state = new Date().toString(); } callback.invoke(api.sendReq(req) ? null : INVOKE_FAILED); @@ -156,12 +170,12 @@ public void shareToTimeline(ReadableMap data, Callback callback) { } @ReactMethod - public void shareToSession(ReadableMap data, Callback callback){ + public void shareToSession(ReadableMap data, Callback callback) { _share(SendMessageToWX.Req.WXSceneSession, data, callback); } @ReactMethod - public void pay(ReadableMap data, Callback callback){ + public void pay(ReadableMap data, Callback callback) { PayReq payReq = new PayReq(); if (data.hasKey("partnerId")) { payReq.partnerId = data.getString("partnerId"); @@ -188,6 +202,25 @@ public void pay(ReadableMap data, Callback callback){ callback.invoke(api.sendReq(payReq) ? null : INVOKE_FAILED); } + @ReactMethod + public void launchMiniPro(ReadableMap data, Callback callback) { + WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req(); + req.userName = data.getString("userName"); + req.path = data.getString("path"); + req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE; + if (data.hasKey("miniprogramType")) { + switch (data.getInt("miniprogramType")) { + case 1: + req.miniprogramType = WXLaunchMiniProgram.Req.MINIPROGRAM_TYPE_PREVIEW; + break; + case 2: + req.miniprogramType = WXLaunchMiniProgram.Req.MINIPROGRAM_TYPE_PREVIEW; + break; + } + } + callback.invoke(api.sendReq(req) ? null : INVOKE_FAILED); + } + @Override public void onReq(BaseReq baseReq) { @@ -197,32 +230,42 @@ public void onReq(BaseReq baseReq) { public void onResp(BaseResp baseResp) { WritableMap map = Arguments.createMap(); map.putInt("errCode", baseResp.errCode); - if (baseResp.errStr == null || baseResp.errStr.length()<=0) { + if (baseResp.errStr == null || baseResp.errStr.length() <= 0) { map.putString("errStr", _getErrorMsg(baseResp.errCode)); - } - else { + } else { map.putString("errStr", baseResp.errStr); } map.putString("transaction", baseResp.transaction); - if (baseResp instanceof SendAuth.Resp) { - SendAuth.Resp resp = (SendAuth.Resp)(baseResp); - - map.putString("type", "SendAuth.Resp"); - map.putString("code", resp.code); - map.putString("state", resp.state); - map.putString("url", resp.url); - map.putString("lang", resp.lang); - map.putString("country", resp.country); - map.putString("appid", appId); - } - else if (baseResp instanceof SendMessageToWX.Resp){ - SendMessageToWX.Resp resp = (SendMessageToWX.Resp)(baseResp); - map.putString("type", "SendMessageToWX.Resp"); - } - else if (baseResp instanceof PayResp) { - PayResp resp = (PayResp)(baseResp); - map.putString("type", "Pay.Resp"); - map.putString("returnKey", resp.returnKey); + + switch (baseResp.getType()) { + case ConstantsAPI.COMMAND_SENDAUTH: + SendAuth.Resp authResp = (SendAuth.Resp) (baseResp); + map.putString("type", "SendAuth.Resp"); + map.putString("code", authResp.code); + map.putString("state", authResp.state); + map.putString("url", authResp.url); + map.putString("lang", authResp.lang); + map.putString("country", authResp.country); + map.putString("appid", appId); + break; + case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX: + SendMessageToWX.Resp msgResp = (SendMessageToWX.Resp) (baseResp); + map.putString("type", "SendMessageToWX.Resp"); + break; + case ConstantsAPI.COMMAND_PAY_BY_WX: + PayResp payResp = (PayResp) (baseResp); + map.putString("type", "Pay.Resp"); + map.putString("returnKey", payResp.returnKey); + map.putString("prepayId", payResp.prepayId); + map.putString("extData", payResp.extData); + break; + case ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM: + WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) baseResp; + map.putString("type", "WXLaunchMiniProgram.Resp"); + map.putString("extMsg", launchMiniProResp.extMsg); + break; + default: + break; } getReactApplicationContext() @@ -262,7 +305,7 @@ private void _autoRegisterAppId() { } } - private void _share(final int scene, final ReadableMap data, final Callback callBack){ + private void _share(final int scene, final ReadableMap data, final Callback callBack) { if (data.hasKey(RCTWXShareImageUrl)) { String imageUrl = data.getString(RCTWXShareImageUrl); @@ -284,6 +327,7 @@ public void onNewResultImpl(DataSource> dataS } dataSource.close(); } + @Override public void onFailureImpl(DataSource> dataSource) { dataSource.close(); @@ -303,15 +347,14 @@ public void onProgressUpdate(DataSource> data resizeOptions = new ResizeOptions(size, size); } _downloadImage(imageUrl, resizeOptions, dataSubscriber); - } - else { + } else { _share(scene, data, null, callBack); } } private void _share(int scene, ReadableMap data, Bitmap image, Callback callback) { WXMediaMessage message = new WXMediaMessage(); - if (data.hasKey(RCTWXShareTitle)){ + if (data.hasKey(RCTWXShareTitle)) { message.title = data.getString(RCTWXShareTitle); } if (data.hasKey(RCTWXShareDescription)) { @@ -329,8 +372,7 @@ private void _share(int scene, ReadableMap data, Bitmap image, Callback callback object.text = data.getString(RCTWXShareText); } message.mediaObject = object; - } - else if (type.equals(RCTWXShareTypeImage)) { + } else if (type.equals(RCTWXShareTypeImage)) { WXImageObject object = new WXImageObject(); if (data.hasKey(RCTWXShareImageUrl)) { if (image != null) { @@ -340,37 +382,59 @@ else if (type.equals(RCTWXShareTypeImage)) { } } message.mediaObject = object; - } - else { + } else { if (type.equals(RCTWXShareTypeNews)) { WXWebpageObject object = new WXWebpageObject(); - if (data.hasKey(RCTWXShareWebpageUrl)){ + if (data.hasKey(RCTWXShareWebpageUrl)) { object.webpageUrl = data.getString(RCTWXShareWebpageUrl); } - if (data.hasKey("extInfo")){ + if (data.hasKey("extInfo")) { object.extInfo = data.getString("extInfo"); } message.mediaObject = object; - } - else if (type.equals(RCTWXShareTypeVideo)) { + } else if (type.equals(RCTWXShareTypeVideo)) { WXMusicObject object = new WXMusicObject(); if (data.hasKey(RCTWXShareWebpageUrl)) { object.musicUrl = data.getString(RCTWXShareWebpageUrl); } message.mediaObject = object; - } - else if (type.equals(RCTWXShareTypeAudio)) { + } else if (type.equals(RCTWXShareTypeAudio)) { WXVideoObject object = new WXVideoObject(); if (data.hasKey(RCTWXShareWebpageUrl)) { object.videoUrl = data.getString(RCTWXShareWebpageUrl); } message.mediaObject = object; + } else if (type.equals(RCTWXShareTypeMiniPro)) { + WXMiniProgramObject object = new WXMiniProgramObject(); + if (data.hasKey(RCTWXShareWebpageUrl)) { + object.webpageUrl = data.getString(RCTWXShareWebpageUrl); + } + object.userName = data.getString(RCTWXShareUserName); + if (data.hasKey(RCTWXSharePath)) { + object.path = data.getString(RCTWXSharePath); + } + object.miniprogramType = WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE; + if (data.hasKey(RCTWXShareMiniProType)) { + switch (data.getInt(RCTWXShareMiniProType)) { + case 1: + object.miniprogramType = WXMiniProgramObject.MINIPROGRAM_TYPE_TEST; + break; + case 2: + object.miniprogramType = WXMiniProgramObject.MINIPROGRAM_TYPE_PREVIEW; + break; + } + } + if (data.hasKey(RCTWXShareImageUrl) && image != null) { + Bitmap thumb = Bitmap.createScaledBitmap(image, 375, 300, true); + message.thumbData = _Bitmap2Bytes(thumb); + } + message.mediaObject = object; } if (image != null) { Log.e("share", "image no null"); message.setThumbImage(image); - }else { + } else { Log.e("share", "image null"); } } @@ -390,15 +454,10 @@ else if (type.equals(RCTWXShareTypeAudio)) { req.message = message; req.scene = scene; - boolean success = api.sendReq(req); - - if (success == false) { - callback.invoke("INVOKE_FAILED"); - } + callback.invoke(api.sendReq(req) ? null : INVOKE_FAILED); } - private static @Nullable - Uri getResourceDrawableUri(Context context, @Nullable String name) { + private static Uri getResourceDrawableUri(Context context, String name) { if (name == null || name.isEmpty()) { return null; } @@ -413,7 +472,7 @@ Uri getResourceDrawableUri(Context context, @Nullable String name) { .build(); } - private void _downloadImage(String imageUrl, ResizeOptions resizeOptions, DataSubscriber> dataSubscriber) { + private void _downloadImage(String imageUrl, ResizeOptions resizeOptions, DataSubscriber> dataSubscriber) { Uri uri = null; try { @@ -480,7 +539,7 @@ private Bitmap _drawable2Bitmap(Drawable drawable) { } } - private byte[] _Bitmap2Bytes(Bitmap bm){ + private byte[] _Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 70, baos); return baos.toByteArray(); diff --git a/index.js b/index.js index ac27380..2bb28c8 100644 --- a/index.js +++ b/index.js @@ -9,7 +9,7 @@ function translateError(err, result) { } if (typeof err === 'object') { if (err instanceof Error) { - return this.reject(ret); + return this.reject(err); } return this.reject(Object.assign(new Error(err.message), { errCode: err.errCode })); } else if (typeof err === 'string') { @@ -19,35 +19,21 @@ function translateError(err, result) { } // Save callback and wait for future event. -let savedCallback = undefined; +const savedCallback = {}; function waitForResponse(type) { return new Promise((resolve, reject) => { - if (savedCallback) { - savedCallback('User canceled.'); - } - savedCallback = result => { + savedCallback[type] = result => { if (result.type !== type) { - // - //if (__DEV__) { - // throw new Error('Unsupported response type: ' + resp.type); - //} return; } - savedCallback = undefined; - if (result.errCode !== 0) { - const err = new Error(result.errMsg); - err.errCode = result.errCode; - reject(err); - } else { - resolve(result); - } + savedCallback[type] = null; + resolve && resolve(result); }; }); } NativeAppEventEmitter.addListener('WeChat_Resp', resp => { - const callback = savedCallback; - savedCallback = undefined; + const callback = savedCallback[resp.type]; callback && callback(resp); }); @@ -80,7 +66,13 @@ function wrapApi(nativeFunc) { if (!checkInstalled) { throw new Error('没有安装微信!'); } - const checkSupport = await isWXAppSupportApi(); + let type = ''; + if (nativeFunc === WeChatAPI.pay) { + type = 'Pay'; + } else if (nativeFunc === WeChatAPI.launchMiniPro) { + type = 'WXLaunchMiniProgram'; + } + const checkSupport = await isWXAppSupportApi(type); if (!checkSupport) { throw new Error('微信版本不支持'); } @@ -92,6 +84,7 @@ const nativeSendAuthRequest = wrapApi(WeChatAPI.login); const nativeShareToTimelineRequest = wrapApi(WeChatAPI.shareToTimeline); const nativeShareToSessionRequest = wrapApi(WeChatAPI.shareToSession); const nativePayRequest = wrapApi(WeChatAPI.pay); +const nativeLaunchMiniProRequest = wrapApi(WeChatAPI.launchMiniPro); export function login(config) { const scope = (config && config.scope) || 'snsapi_userinfo'; @@ -114,3 +107,7 @@ export function pay(data) { .then(() => waitForResponse("Pay.Resp")); } +export function launchMiniPro(data) { + return nativeLaunchMiniProRequest(data) + .then(() => waitForResponse("WXLaunchMiniProgram.Resp")); +} diff --git a/ios/RCTWeChatAPI/RCTWeChatAPI.h b/ios/RCTWeChatAPI/RCTWeChatAPI.h index 0960c02..4299aca 100644 --- a/ios/RCTWeChatAPI/RCTWeChatAPI.h +++ b/ios/RCTWeChatAPI/RCTWeChatAPI.h @@ -6,7 +6,7 @@ // Copyright © 2016 erica. All rights reserved. // -#import "RCTBridgeModule.h" +#import @interface RCTWeChatAPI : NSObject diff --git a/ios/RCTWeChatAPI/RCTWeChatAPI.m b/ios/RCTWeChatAPI/RCTWeChatAPI.m index 5c2034a..05b6bf9 100644 --- a/ios/RCTWeChatAPI/RCTWeChatAPI.m +++ b/ios/RCTWeChatAPI/RCTWeChatAPI.m @@ -7,19 +7,20 @@ // -#import "RCTLog.h" +#import #import "RCTWeChatAPI.h" #import "WXApi.h" #import "WXApiObject.h" -#import "RCTEventDispatcher.h" -#import "RCTBridge.h" -#import "RCTImageLoader.h" +#import +#import +#import #define RCTWXShareTypeNews @"news" #define RCTWXShareTypeImage @"image" #define RCTWXShareTypeText @"text" #define RCTWXShareTypeVideo @"video" #define RCTWXShareTypeAudio @"audio" +#define RCTWXShareTypeMiniPro @"miniprogram" #define RCTWXShareType @"type" #define RCTWXShareTitle @"title" @@ -28,6 +29,9 @@ #define RCTWXShareWebpageUrl @"webpageUrl" #define RCTWXShareImageUrl @"imageUrl" #define RCTWXShareThumbImageSize @"thumbImageSize" +#define RCTWXShareUserName @"userName" +#define RCTWXSharePath @"path" +#define RCTWXShareMiniProType @"miniprogramType" #define NOT_REGISTERED (@"registerApp required.") #define INVOKE_FAILED (@"WeChat API invoke returns false.") @@ -49,9 +53,9 @@ - (NSDictionary *)constantsToExport return @{ @"isAppRegistered":@(gIsAppRegistered)}; } -- (dispatch_queue_t)methodQueue ++ (BOOL)requiresMainQueueSetup { - return dispatch_get_main_queue(); + return YES; } - (instancetype)init @@ -75,7 +79,8 @@ - (void)dealloc callback(@[[NSNull null], @([WXApi isWXAppInstalled])]); } -RCT_EXPORT_METHOD(isWXAppSupportApi:(RCTResponseSenderBlock)callback) +RCT_EXPORT_METHOD(isWXAppSupportApi:(NSString*)type + :(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], @([WXApi isWXAppSupportApi])]); } @@ -116,6 +121,18 @@ - (void)dealloc callback(@[success ? [NSNull null] : INVOKE_FAILED]); } +RCT_EXPORT_METHOD(launchMiniPro:(NSDictionary *)data + :(RCTResponseSenderBlock)callback) +{ + WXLaunchMiniProgramReq *req = [WXLaunchMiniProgramReq object]; + req.userName = data[@"userName"]; + req.path = data[@"path"]; + req.miniProgramType = (WXMiniProgramType)[data[@"miniprogramType"] integerValue]; + + BOOL success = [WXApi sendReq:req]; + callback(@[success ? [NSNull null] : INVOKE_FAILED]); +} + - (void)handleOpenURL:(NSNotification *)note { NSDictionary *userInfo = note.userInfo; @@ -180,16 +197,25 @@ - (void)shareToWeixinWithData:(NSDictionary *)aData image:(UIImage *)aImage scen videoObject.videoLowBandUrl = aData[@"videoLowBandUrl"]; mediaMessage.mediaObject = videoObject; } + else if ([type isEqualToString:RCTWXShareTypeMiniPro]) { + WXMiniProgramObject *wxMiniObject = [WXMiniProgramObject new]; + wxMiniObject.webpageUrl = aData[@"webpageUrl"]; + wxMiniObject.userName = aData[@"userName"]; + wxMiniObject.path = aData[@"path"]; + wxMiniObject.miniProgramType = (WXMiniProgramType)[aData[@"miniprogramType"] integerValue]; + if (aImage != nil) { + wxMiniObject.hdImageData = UIImageJPEGRepresentation(aImage, 0.7); + } + mediaMessage.mediaObject = wxMiniObject; + mediaMessage.thumbData = nil; + } } req.message = mediaMessage; } BOOL success = [WXApi sendReq:req]; - if (success == NO) - { - callback(@[INVOKE_FAILED]); - } + callback(@[success ? [NSNull null] : INVOKE_FAILED]); } @@ -199,11 +225,15 @@ - (void)shareToWeixinWithData:(NSDictionary *)aData scene:(int)aScene callback:( if (imageUrl.length && _bridge.imageLoader) { CGSize size = CGSizeZero; if (![aData[RCTWXShareType] isEqualToString:RCTWXShareTypeImage]) { - CGFloat thumbImageSize = 80; - if (aData[RCTWXShareThumbImageSize]) { - thumbImageSize = [aData[RCTWXShareThumbImageSize] floatValue]; + if ([aData[RCTWXShareType] isEqualToString:RCTWXShareTypeMiniPro]) { + size = CGSizeMake(375.0f, 300.0f); + } else { + CGFloat thumbImageSize = 80; + if (aData[RCTWXShareThumbImageSize]) { + thumbImageSize = [aData[RCTWXShareThumbImageSize] floatValue]; + } + size = CGSizeMake(thumbImageSize,thumbImageSize); } - size = CGSizeMake(thumbImageSize,thumbImageSize); } [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:imageUrl] size:size scale:1 clipped:FALSE resizeMode:UIViewContentModeScaleToFill progressBlock:nil partialLoadBlock: nil completionBlock:^(NSError *error, UIImage *image) { [self shareToWeixinWithData:aData image:image scene:aScene callBack:aCallBack]; @@ -295,6 +325,11 @@ - (void)onResp:(BaseResp*)resp body[@"returnKey"] = r.returnKey; body[@"type"]= @"Pay.Resp"; } + else if ([resp isKindOfClass:[WXLaunchMiniProgramResp class]]) { + WXLaunchMiniProgramResp *r = (WXLaunchMiniProgramResp *)resp; + body[@"extMsg"] = r.extMsg; + body[@"type"] = @"WXLaunchMiniProgram.Resp"; + } [self.bridge.eventDispatcher sendAppEventWithName:@"WeChat_Resp" body:body]; } diff --git a/ios/libWeChatSDK/WXApi.h b/ios/libWeChatSDK/WXApi.h index 8552916..739cbf9 100644 --- a/ios/libWeChatSDK/WXApi.h +++ b/ios/libWeChatSDK/WXApi.h @@ -39,7 +39,13 @@ @end +#pragma mark - WXApiLogDelegate +@protocol WXApiLogDelegate + +-(void) onLog:(NSString*)log logLevel:(WXLogLevel)level; + +@end #pragma mark - WXApi @@ -51,7 +57,7 @@ /*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 * - * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现。 + * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现,默认开启MTA数据上报。 * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。 * @attention 请保证在主线程中调用此函数 * @param appid 微信开发者ID @@ -60,16 +66,16 @@ */ +(BOOL) registerApp:(NSString *)appid; - /*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 * * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现。 - * @see registerApp + * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。 + * @attention 请保证在主线程中调用此函数 * @param appid 微信开发者ID - * @param appdesc 应用附加信息,长度不超过1024字节 + * @param isEnableMTA 是否支持MTA数据上报 * @return 成功返回YES,失败返回NO。 */ -+(BOOL) registerApp:(NSString *)appid withDescription:(NSString *)appdesc; ++(BOOL) registerApp:(NSString *)appid enableMTA:(BOOL)isEnableMTA; /*! @brief WXApi的成员函数,向微信终端程序注册应用支持打开的文件类型。 @@ -163,4 +169,25 @@ +(BOOL) sendResp:(BaseResp*)resp; +/*! @brief WXApi的成员函数,接受微信的log信息。byBlock + 注意1:SDK会强引用这个block,注意不要导致内存泄漏,注意不要导致内存泄漏 + 注意2:调用过一次startLog by block之后,如果再调用一次任意方式的startLoad,会释放上一次logBlock,不再回调上一个logBlock + * + * @param level 打印log的级别 + * @param logBlock 打印log的回调block + */ ++(void) startLogByLevel:(WXLogLevel)level logBlock:(WXLogBolock)logBlock; + +/*! @brief WXApi的成员函数,接受微信的log信息。byDelegate + 注意1:sdk会弱引用这个delegate,这里可加任意对象为代理,不需要与WXApiDelegate同一个对象 + 注意2:调用过一次startLog by delegate之后,再调用一次任意方式的startLoad,不会再回调上一个logDelegate对象 + * @param level 打印log的级别 + * @param logDelegate 打印log的回调代理, + */ ++ (void)startLogByLevel:(WXLogLevel)level logDelegate:(id)logDelegate; + +/*! @brief 停止打印log,会清理block或者delegate为空,释放block + * @param + */ ++ (void)stopLog; @end diff --git a/ios/libWeChatSDK/WXApiObject.h b/ios/libWeChatSDK/WXApiObject.h index cae767a..d5074c1 100644 --- a/ios/libWeChatSDK/WXApiObject.h +++ b/ios/libWeChatSDK/WXApiObject.h @@ -8,7 +8,6 @@ #import #import - /*! @brief 错误码 * */ @@ -27,13 +26,13 @@ enum WXErrCode { * */ enum WXScene { - WXSceneSession = 0, /**< 聊天界面 */ - WXSceneTimeline = 1, /**< 朋友圈 */ - WXSceneFavorite = 2, /**< 收藏 */ + WXSceneSession = 0, /**< 聊天界面 */ + WXSceneTimeline = 1, /**< 朋友圈 */ + WXSceneFavorite = 2, /**< 收藏 */ + WXSceneSpecifiedSession = 3, /**< 指定联系人 */ }; - enum WXAPISupport { WXAPISupportSession = 0, }; @@ -48,7 +47,14 @@ enum WXBizProfileType{ WXBizProfileType_Device = 1, //**< 硬件公众号 */ }; - +/*! @brief 分享小程序类型 + * + */ +typedef NS_ENUM(NSUInteger, WXMiniProgramType){ + WXMiniProgramTypeRelease = 0, //**< 正式版 */ + WXMiniProgramTypeTest = 1, //**< 开发版 */ + WXMiniProgramTypePreview = 2, //**< 体验版 */ +}; /*! @brief 跳转mp网页类型 * @@ -58,6 +64,7 @@ enum WXMPWebviewType { }; + /*! @brief 应用支持接收微信的文件类型 * */ @@ -81,6 +88,20 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) MMAPP_SUPPORT_PDF = 0x1000, // pdf }; +/*! @brief log的级别 + * + */ +typedef NS_ENUM(NSInteger,WXLogLevel){ + WXLogLevelNormal = 0, // 打印日常的日志 + WXLogLevelDetail = 1, // 打印详细的日志 +}; + + +/*! @brief 打印回调的block + * + */ +typedef void(^WXLogBolock)(NSString * log); + #pragma mark - BaseReq /*! @brief 该类为微信终端SDK所有请求类的基类 * @@ -115,6 +136,8 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) #pragma mark - WXMediaMessage @class WXMediaMessage; +#ifndef BUILD_WITHOUT_PAY + /*! @brief 第三方向微信终端发起支付的消息结构体 * * 第三方向微信终端发起支付的消息结构体,微信终端处理后会向第三方返回处理结果 @@ -138,7 +161,6 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @end - #pragma mark - PayResp /*! @brief 微信终端返回给第三方的关于支付结果的结构体 * @@ -152,36 +174,24 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @end - -/*! @brief 第三方向微信终端发起拆企业红包的消息结构体 +#pragma mark - WXOfflinePay +/*! @brief 第三方向微信终端发起离线支付 * - * 第三方向微信终端发起拆企业红包的消息结构体,微信终端处理后会向第三方返回处理结果 - * @see HBReq + * 第三方向微信终端发起离线支付的消息结构体 */ -@interface HBReq : BaseReq - -/** 随机串,防重发 */ -@property (nonatomic, retain) NSString *nonceStr; -/** 时间戳,防重发 */ -@property (nonatomic, assign) UInt32 timeStamp; -/** 商家根据微信企业红包开发文档填写的数据和签名 */ -@property (nonatomic, retain) NSString *package; -/** 商家根据微信企业红包开发文档对数据做的签名 */ -@property (nonatomic, retain) NSString *sign; +@interface WXOfflinePayReq : BaseReq @end - - -#pragma mark - HBResp -/*! @brief 微信终端返回给第三方的关于拆企业红包结果的结构体 +/*! @brief 第三方向微信终端发起离线支付返回 * - * 微信终端返回给第三方的关于拆企业红包结果的结构体 + * 第三方向微信终端发起离线支付返回的消息结构体 */ -@interface HBResp : BaseResp +@interface WXOfflinePayResp : BaseResp @end +#endif @@ -247,7 +257,8 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) * @see WXScene */ @property (nonatomic, assign) int scene; - +/** 指定发送消息的人,WXSceneSpecifiedSession时有效 */ +@property (nonatomic, retain) NSString* toUserOpenId; @end @@ -352,6 +363,15 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @property (nonatomic, retain) NSString* sessionFrom; @end +#pragma mark - OpenTempSessionResp +/*! @brief 微信终端向第三方程序返回的OpenTempSessionReq处理结果。 + * + * 第三方程序向微信终端发送OpenTempSessionReq后,微信发送回来的处理结果,该结果用OpenTempSessionResp表示。 + */ +@interface OpenTempSessionResp : BaseResp + +@end + #pragma mark - OpenWebviewReq /* ! @brief 第三方通知微信启动内部浏览器,打开指定网页 * @@ -375,15 +395,44 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @end -#pragma mark - OpenTempSessionResp -/*! @brief 微信终端向第三方程序返回的OpenTempSessionReq处理结果。 +#pragma mark - WXOpenBusinessWebViewReq +/*! @brief 第三方通知微信启动内部浏览器,打开指定业务的网页 + * * - * 第三方程序向微信终端发送OpenTempSessionReq后,微信发送回来的处理结果,该结果用OpenTempSessionResp表示。 */ -@interface OpenTempSessionResp : BaseResp +@interface WXOpenBusinessWebViewReq : BaseReq + +/** 网页业务类型 + * @attention + */ +@property (nonatomic, assign) UInt32 businessType; + +/** 网页业务参数 + * @attention + */ +@property (nonatomic, retain) NSDictionary *queryInfoDic; + +@end + +#pragma mark - WXOpenBusinessWebViewResp +/*! @brief 微信终端向第三方程序返回的WXOpenBusinessWebViewResp处理结果。 + * + * 第三方程序向微信终端发送WXOpenBusinessWebViewReq后,微信发送回来的处理结果,该结果用WXOpenBusinessWebViewResp表示。 + */ +@interface WXOpenBusinessWebViewResp : BaseResp +/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 + * @attention 长度不能超过2k + */ +@property (nonatomic, retain) NSString *result; + +/** 网页业务类型 + * @attention + */ +@property (nonatomic, assign) UInt32 businessType; @end + #pragma mark - OpenRankListReq /* ! @brief 第三方通知微信,打开硬件排行榜 * @@ -470,6 +519,32 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @property (nonatomic,retain) NSString* appID; @end; +#pragma mark - WXInvoiceItem + +@interface WXInvoiceItem : NSObject +/** 卡id + * @attention 长度不能超过1024字节 + */ +@property (nonatomic,retain) NSString* cardId; +/** ext信息 + * @attention 长度不能超过2024字节 + */ +@property (nonatomic,retain) NSString* extMsg; +/** + * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 + */ +@property (nonatomic,assign) UInt32 cardState; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic,retain) NSString* encryptCode; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic,retain) NSString* appID; + +@end + #pragma mark - AddCardToWXCardPackageReq /* ! @brief 请求添加卡券至微信卡包 * @@ -523,6 +598,109 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @property (nonatomic,retain) NSArray* cardAry; @end + +#pragma mark - WXChooseInvoiceReq +/* ! @brief 请求从微信选取发票 + * + */ +@interface WXChooseInvoiceReq : BaseReq +@property (nonatomic, strong) NSString *appID; +@property (nonatomic, assign) UInt32 shopID; +@property (nonatomic, strong) NSString *signType; +@property (nonatomic, strong) NSString *cardSign; +@property (nonatomic, assign) UInt32 timeStamp; +@property (nonatomic, strong) NSString *nonceStr; +@end + +#pragma mark - WXChooseInvoiceResp +/** ! @brief 微信返回第三方请求选择发票结果 + * + */ +@interface WXChooseInvoiceResp : BaseResp +@property (nonatomic, strong) NSArray* cardAry; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMsgReq : BaseReq +@property (nonatomic, assign) UInt32 scene; +@property (nonatomic, strong) NSString * templateId; +@property (nonatomic, strong) NSString * reserved; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMsgResp : BaseResp + +@property (nonatomic, strong) NSString *templateId; +@property (nonatomic, assign) UInt32 scene; +@property (nonatomic, strong) NSString *action; +@property (nonatomic, strong) NSString * reserved; +@property (nonatomic, strong) NSString * openId; + +@end + +#pragma mark - WXSubscribeMiniProgramMsg +/** ! @brief 微信返回第三方请求选择发票结果 + * + */ +@interface WXSubscribeMiniProgramMsgReq : BaseReq +@property (nonatomic, strong) NSString * miniProgramAppid; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMiniProgramMsgResp : BaseResp + +@property(nonatomic, strong) NSString *openId; // 小程序openid +@property(nonatomic, strong) NSString *unionId; // unionId +@property(nonatomic, strong) NSString *nickName; // 用户昵称 + +@end + +#pragma mark - WXinvoiceAuthInsertReq +@interface WXInvoiceAuthInsertReq : BaseReq + +@property (nonatomic, strong) NSString *urlString; + +@end + +#pragma mark - WXinvoiceAuthInsertResp + +@interface WXInvoiceAuthInsertResp : BaseResp + +@property (nonatomic, strong) NSString * wxOrderId; + +@end + +#pragma mark - WXNontaxPayReq +@interface WXNontaxPayReq:BaseReq + +@property (nonatomic, strong) NSString *urlString; + +@end + +#pragma mark - WXNontaxPayResp +@interface WXNontaxPayResp : BaseResp + +@property (nonatomic, strong) NSString *wxOrderId; + +@end + +#pragma mark - WXPayInsuranceReq +@interface WXPayInsuranceReq : BaseReq + +@property (nonatomic, strong) NSString *urlString; + +@end + +#pragma mark - WXPayInsuranceResp +@interface WXPayInsuranceResp : BaseResp + +@property (nonatomic, strong) NSString *wxOrderId; + +@end + +#pragma mark - WXMediaMessage + + #pragma mark - WXMediaMessage /*! @brief 多媒体消息结构体 @@ -780,6 +958,56 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @end +@interface WXMiniProgramObject : NSObject + +/*! @brief WXMiniProgramObject对象 + * + * @note 返回的WXMiniProgramObject对象是自动释放的 + */ ++(WXMiniProgramObject *) object; + +@property (nonatomic, strong) NSString *webpageUrl; //低版本网页链接 + +@property (nonatomic, strong) NSString *userName; //小程序username + +@property (nonatomic, strong) NSString *path; //小程序页面的路径 + +@property (nonatomic, strong) NSData *hdImageData; // 小程序新版本的预览图 128k + +@property (nonatomic, assign) BOOL withShareTicket; //是否使用带 shareTicket 的转发 + +@property (nonatomic, assign) WXMiniProgramType miniProgramType; // 分享小程序的版本(正式,开发,体验) + +@end + +#pragma mark - WXLaunchMiniProgramReq + +/*! @brief WXLaunchMiniProgramReq对象, 可实现通过sdk拉起微信小程序 + * + * @note 返回的WXLaunchMiniProgramReq对象是自动释放的 + */ +@interface WXLaunchMiniProgramReq : BaseReq + ++(WXLaunchMiniProgramReq *) object; + +@property (nonatomic, strong) NSString *userName; //拉起的小程序的username +@property (nonatomic, strong) NSString *path; //拉起小程序页面的路径,不填默认拉起小程序首页 +@property (nonatomic, assign) WXMiniProgramType miniProgramType; //拉起小程序的类型 + +@property (nonatomic, strong) NSString *extMsg; //json格式 +@end + +#pragma mark - WXLaunchMiniProgramResp +/*! @brief 微信终端向第三方程序返回的WXLaunchMiniProgramReq处理结果。 + * + * 第三方程序向微信终端发送WXLaunchMiniProgramReq后,微信发送回来的处理结果,该结果用WXLaunchMiniProgramResp表示。 + */ +@interface WXLaunchMiniProgramResp : BaseResp + +@property (nonatomic, retain) NSString *extMsg; + +@end + #pragma mark - WXTextObject /*! @brief 多媒体消息中包含的文本数据对象 @@ -801,4 +1029,3 @@ typedef NS_ENUM(UInt64, enAppSupportContentFlag) @property (nonatomic, retain) NSString *contentText; @end - diff --git a/ios/libWeChatSDK/libWeChatSDK.a b/ios/libWeChatSDK/libWeChatSDK.a index 6b96b4d..f950eeb 100644 Binary files a/ios/libWeChatSDK/libWeChatSDK.a and b/ios/libWeChatSDK/libWeChatSDK.a differ diff --git a/package.json b/package.json index b0d953b..399adb8 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "homepage": "https://github.com/reactnativecn/react-native-wx#readme", "dependencies": { - "es6-promisify": "^3.0.0" + "es6-promisify": "github:magicwing/es6-promisify" }, "peerDependencies": { "react-native": "^0.33.0"