diff --git a/README.md b/README.md index 381951c..50159f5 100644 --- a/README.md +++ b/README.md @@ -364,6 +364,17 @@ Sends request for proceeding payment, then returns an object: | errCode | Number | 0 if authorization successed | | errStr | String | Error message if any error occurred | +#### subscribeMessage(SubscribeMessageMetadata) 一次性订阅消息 + +- returns {Object} + + +| name | type | description | +|---------|--------|-------------------------------------| +| scene | Number | 重定向后会带上 scene 参数,开发者可以填 0-10000 的整形值,用来标识订阅场值 | +| templateId | String | 订阅消息模板 ID,在微信开放平台提交应用审核通过后获得 | +| reserved | String | 用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验,开发者可以填写 a-zA-Z0-9 的参数值,最多 128 字节,要求做 urlencode | + ## License MIT diff --git a/android/src/main/java/com/theweflex/react/WeChatModule.java b/android/src/main/java/com/theweflex/react/WeChatModule.java index 9064f69..eb75b2c 100644 --- a/android/src/main/java/com/theweflex/react/WeChatModule.java +++ b/android/src/main/java/com/theweflex/react/WeChatModule.java @@ -515,6 +515,20 @@ public class WeChatModule extends ReactContextBaseJavaModule implements IWXAPIEv if (!success) callback.invoke(INVALID_ARGUMENT); } + /** + * 一次性订阅消息 + * @param data + * @param callback + */ + @ReactMethod + public void subscribeMessage(ReadableMap data, Callback callback) { + SubscribeMessage.Req req = new SubscribeMessage.Req(); + req.scene = data.hasKey("scene") ? data.getInt("scene") : SendMessageToWX.Req.WXSceneSession; + req.templateID = data.getString("templateId"); + req.reserved = data.getString("reserved"); + callback.invoke(null, api.sendReq(req)); + } + @ReactMethod public void shareToSession(ReadableMap data, Callback callback) { if (api == null) { diff --git a/index.d.ts b/index.d.ts index d85c8ac..7df408a 100644 --- a/index.d.ts +++ b/index.d.ts @@ -112,6 +112,13 @@ declare module "react-native-wechat-lib" { miniProgramType?: number, path?: string } + + export interface SubscribeMessageMetadata { + scene?: WXScene, + templateId: string, + reserved?: string + } + export function shareText( message: ShareTextMetadata ): Promise<{ errCode?: number; errStr?: string }>; @@ -136,6 +143,9 @@ declare module "react-native-wechat-lib" { export function launchMiniProgram( message: LaunchMiniProgramMetadata ): Promise<{ errCode?: number; errStr?: string }>; + export function subscribeMessage( + message: SubscribeMessageMetadata + ): Promise<{ errCode?: number; errStr?: string }>; export interface PaymentLoad { partnerId: string; prepayId: string; diff --git a/index.js b/index.js index d78073b..11b89ef 100644 --- a/index.js +++ b/index.js @@ -156,6 +156,8 @@ const nativeShareMusic = wrapApi(WeChat.shareMusic); const nativeShareVideo = wrapApi(WeChat.shareVideo); const nativeShareWebpage = wrapApi(WeChat.shareWebpage); const nativeShareMiniProgram = wrapApi(WeChat.shareMiniProgram); +const nativeSubscribeMessage = wrapApi(WeChat.subscribeMessage); + /** * @method sendAuthRequest @@ -350,6 +352,27 @@ export function launchMiniProgram({userName, miniProgramType = 0, path = ''}) { }); } +/** + * 一次性订阅消息 + * @method shareVideo + * @param {Object} data + */ +export function subscribeMessage(data) { + if (data && data.scene == null) { + data.scene = 0 + } + return new Promise((resolve, reject) => { + nativeSubscribeMessage(data); + emitter.once('WXSubscribeMsgReq.Resp', resp => { + if (resp.errCode === 0) { + resolve(resp); + } else { + reject(new WechatError(resp)); + } + }); + }); +} + /** * Share something to favorite * @method shareToFavorite diff --git a/ios/RCTWeChat.m b/ios/RCTWeChat.m index 315b17c..16494c8 100644 --- a/ios/RCTWeChat.m +++ b/ios/RCTWeChat.m @@ -459,6 +459,23 @@ RCT_EXPORT_METHOD(shareMiniProgram:(NSDictionary *)data [WXApi sendReq:req completion:completion]; } +// 一次性订阅消息 +RCT_EXPORT_METHOD(subscribeMessage:(NSDictionary *)data + :(RCTResponseSenderBlock)callback) +{ + WXSubscribeMsgReq *req = [[WXSubscribeMsgReq alloc] init]; + req.scene = [data[@"scene"] integerValue]; + req.templateId = data[@"templateId"]; + req.reserved = data[@"reserved"]; + void ( ^ completion )( BOOL ); + completion = ^( BOOL success ) + { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; +} + RCT_EXPORT_METHOD(launchMiniProgram:(NSDictionary *)data :(RCTResponseSenderBlock)callback) { diff --git a/package.json b/package.json index 14eeccd..e6acb45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-wechat-lib", - "version": "1.1.12", + "version": "1.1.13", "description": "react-native library for wechat app. 支持分享和拉起小程序。", "main": "index.js", "scripts": {